Skip to content
Report library
Purpose / Other

Extension Invite Links Skill Security Audit

What the author says it does (original text)

Requests invite-link / RSVP based access where guests can submit responses without login while admin can view responses with login.

Independent security check

Security risks found

Files checked
2
Risks found
2
Could it run dangerous commands?Looks for programs run straight after downloading, remote control of your computer, and hidden commands.No risks found
Could it expose your files or keys?Looks for uploads of files containing passwords or keys, and keys written directly in the code.No risks found
Could it delete files or keep running?Looks for broad file deletion, disk overwrites, and programs set to start automatically.No risks found
Could it bypass safety checks?Looks for skipped website security checks, excessive file access, or actions that skip your approval.Risks found: 2
Medium risk

Invite codes in URL query parameters can leak through browsers and request metadata

Source references: 3
What we found

The example creates links containing `?code=...` and reads the code directly from the page URL. Query strings commonly remain in browser history, copied text, proxy or server logs, and may be disclosed to other sites through the Referer header on later requests.

Why this matters

Someone who obtains a still-valid code could impersonate an invitee and submit an RSVP, corrupting the attendance list. The response is also associated with that code.

The example copies the invite code in a `?code=` query parameter and reads it from the page URL. If that code controls RSVP submission, anyone obtaining it through browser history, logs, or a later request carrying the full referring URL could submit or replace a response. The material does not state whether codes are single-use, redacted from logs, or protected by a restrictive referrer policy. Users can ask for short-lived single-use codes, URL cleanup after capture, log redaction, and referrer restrictions.

SKILL.md:152In the instructionsOpen original file
  // Auto-populate invite code from URL  useEffect(() => {    const codeFromUrl = new URLSearchParams(window.location.search).get('code');    if (codeFromUrl) setInviteCode(codeFromUrl);  }, []);
Show 2 other places
SKILL.md:210In the instructionsOpen original file
        <button onClick={() => generateInviteCode.mutate()}>Generate New Code</button>        {unusedCodes.map(code => (          <div key={code.code}>            <code>{code.code}</code>            <button onClick={() => navigator.clipboard.writeText(`${window.location.origin}?code=${code.code}`)}>              Copy Link            </button>          </div>
SKILL.md:213In the instructionsOpen original file
            <code>{code.code}</code>            <button onClick={() => navigator.clipboard.writeText(`${window.location.origin}?code=${code.code}`)}>              Copy Link            </button>          </div>
Medium risk

Critical backend authorization is entirely controlled by an implementation not supplied for review

Source references: 5
What we found

The Skill tells applications to remove their own public endpoints, forbids redeclaring them, and delegates invite generation, all-RSVP access, and invite-code access to MixinInviteLinks. The material says the dependency performs admin checks but does not show those checks.

Why this matters

If the resolved package is defective, unexpected, or fails to validate callers correctly, unauthorized people could generate invitations or read guest names, attendance choices, and valid codes. Hiding the admin screen in the frontend would not protect these backend endpoints.

What this evidence establishes

The migration does require removal of hand-written public endpoints and delegates them to the external `MixinInviteLinks`, while only asserting that the dependency performs admin checks. Because the mixin source is absent, these materials cannot establish whether server-side checks for generating or listing codes and reading all RSVPs exist and are correct; frontend “admin only” labels are not backend enforcement. Users can request the auditable mixin version and endpoint-level authorization tests, and pin the reviewed dependency.

This assessment concerns the code and conditions shown, not proof that harm has occurred.
migration/v0.x.y-to-v1.x.y.md:18In the instructionsOpen original file
The package now depends on `caffeineai-authorization` for admin checks inside the mixin.### 2. Replace manual invite-link endpoints with `MixinInviteLinks`Remove all hand-written invite-link actor endpoints. Keep invite state at actor top level and pass it into the mixin in `main.mo` (not in a custom mixin file):
Show 4 other places
SKILL.md:60In the instructionsOpen original file
- `generateInviteCode()`- `submitRSVP(name, attending, inviteCode)`- `getAllRSVPs()`- `getInviteCodes()`Do NOT redeclare any of these functions. They are provided exclusively by `MixinInviteLinks`.
SKILL.md:240In the instructionsOpen original file
## Required Hooks- `useIsCurrentUserAdmin()` - Check if current user is admin- `useSubmitRSVP()` - Submit RSVP mutation- `useGetAllRSVPs()` - Fetch all RSVPs (admin only)- `useGetInviteCodes()` - Fetch invite codes (admin only)  - `useGenerateInviteCode()` - Generate new invite code (admin only)- `useInternetIdentity()` - Internet Identity authentication
SKILL.md:58In the instructionsOpen original file
`include MixinInviteLinks(accessControlState, inviteState)` MUST be placed in `main.mo`, not in a custom mixin file. The mixin provides these public endpoints automatically:- `generateInviteCode()`- `submitRSVP(name, attending, inviteCode)`- `getAllRSVPs()`- `getInviteCodes()`Do NOT redeclare any of these functions. They are provided exclusively by `MixinInviteLinks`.
migration/v0.x.y-to-v1.x.y.md:20In the instructionsOpen original file
### 2. Replace manual invite-link endpoints with `MixinInviteLinks`Remove all hand-written invite-link actor endpoints. Keep invite state at actor top level and pass it into the mixin in `main.mo` (not in a custom mixin file):
Could it mislead the AI or hide text?Checks the skill instructions for requests to ignore you, influence the report, or hide text in invisible characters.No risks found
Could it change links or payment recipients without asking?Looks for forced referral or payment changes combined with instructions to hide the change.No risks found

Inside this skill

2 instruction sections

The Skill lets guests submit a name, attendance choice, and invite code without signing in; it also stores a timestamp and exposes all RSVPs to the admin side.

View source
SKILL.md:17In the instructionsOpen original file
This skill adds invite-link generation and RSVP collection. Admins generate unique invite codes; guests use them to submit responses without authentication.
SKILL.md:29In the instructionsOpen original file
module {    public type RSVP = {        name : Text;        attending : Bool;        timestamp : Time.Time;        inviteCode : Text;    };
SKILL.md:51In the instructionsOpen original file
    public func getInviteCodes(state: InviteLinksSystemState) : [InviteCode];    public func submitRSVP(state: InviteLinksSystemState, name: Text, attending: Bool, inviteCode: Text);    public func getAllRSVPs(state: InviteLinksSystemState) : [RSVP];}

The actual public endpoints and admin checks are delegated to the prefabricated MixinInviteLinks. The supplied material describes its interface but does not include its implementation. The frontend admin-view switch is not a substitute for backend authorization.

View source
SKILL.md:25In the instructionsOpen original file
The prefabricated module `mo:caffeineai-invite-links/invite-links-module.mo` provides low-level invite-link and RSVP state management. Do not modify it.
SKILL.md:58In the instructionsOpen original file
`include MixinInviteLinks(accessControlState, inviteState)` MUST be placed in `main.mo`, not in a custom mixin file. The mixin provides these public endpoints automatically:
SKILL.md:117In the instructionsOpen original file
export default function App() {  const { data: isAdmin } = useIsCurrentUserAdmin();  return (    <div className="min-h-screen bg-gradient-to-br from-purple-100 to-pink-100">      <header className="p-4 bg-white/80 backdrop-blur-sm shadow-sm">        <div className="max-w-7xl mx-auto flex justify-between items-center">          <h1 className="text-3xl font-bold text-purple-800">RSVP</h1>          <LoginButton />        </div>      </header>      <main className="max-w-7xl mx-auto p-4 mt-8">        {isAdmin ? <AdminDashboard /> : <GuestRSVP />}      </main>

The upgrade installs and builds the caffeineai-invite-links and authorization dependencies, while removing the application's four handwritten endpoint implementations in favor of the mixin exclusively providing them.

View source
migration/v0.x.y-to-v1.x.y.md:60In the instructionsOpen original file
- [ ] Bump `caffeineai-invite-links` to `~1.0.0` in `mops.toml`- [ ] Ensure `caffeineai-authorization ~1.0.0` is installed and `include MixinAuthorization(accessControlState, null)` is present in `main.mo`- [ ] Add `let inviteState = InviteLinksModule.initState()` and `include MixinInviteLinks(accessControlState, inviteState)` in `main.mo`- [ ] Remove the four mixin-provided functions from `main.mo` and any custom mixins (keep top-level `InviteLinksModule.initState()`)- [ ] Run `mops install`, `mops build`, and `mops lint`- [ ] Regenerate frontend bindings if your workflow requires it
SKILL.md:65In the instructionsOpen original file
Do NOT redeclare any of these functions. They are provided exclusively by `MixinInviteLinks`.
Start here · InstructionsSKILL.md
extension-invite-links
Lines connect the instruction file to its sections, not an observed execution order. Select a section to read the source.
Files and check records2 files

Coverage and gaps

Content covered in each file

These are the source ranges included in this check, not a guarantee that every issue has been resolved.

  • SKILL.mdFull text included
  • migration/v0.x.y-to-v1.x.y.mdFull text included

This report is for the version above. We read the available code and instructions without running the skill or checking extra packages it installs. This is not a promise of safety: a different version or setup may behave differently.

  • SKILL.mdInstructions
  • migration/v0.x.y-to-v1.x.y.mdSupporting file

Operations mentioned in code and instructions

Connect to websites
SKILL.md:13In the instructionsOpen original file
# Invite Links & RSVPInvite links & RSVP extension for [Caffeine AI](https://caffeine.ai?utm_source=caffeine-skill&utm_medium=referral).
Lines read
320
File checksum (to compare versions)
380b37fd13327969cd62f36bc5ca4231ca580a21316eb77b545e991d25ad3596