diff --git a/dist/invite/signed-invite.d.ts.map b/dist/invite/signed-invite.d.ts.map index 0bd2a5d..603dbd9 100644 --- a/dist/invite/signed-invite.d.ts.map +++ b/dist/invite/signed-invite.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"signed-invite.d.ts","sourceRoot":"","sources":["../../src/invite/signed-invite.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,YAAY,EAKlB,MAAM,oBAAoB,CAAC;AAa5B,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,qBAAqB,CAAC,EAAE,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,aAAa,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAuCrE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAkB/D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,UAAU,GAC5B,OAAO,CAaT;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,GACrB,OAAO,CAGT;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,GACrB,MAAM,CAMR"} \ No newline at end of file +{"version":3,"file":"signed-invite.d.ts","sourceRoot":"","sources":["../../src/invite/signed-invite.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,YAAY,EAKlB,MAAM,oBAAoB,CAAC;AAa5B,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,qBAAqB,CAAC,EAAE,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,aAAa,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAuCrE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAuB/D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,UAAU,GAC5B,OAAO,CAaT;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,GACrB,OAAO,CAGT;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,GACrB,MAAM,CAMR"} \ No newline at end of file diff --git a/dist/invite/signed-invite.js b/dist/invite/signed-invite.js index 0b83033..a181130 100644 --- a/dist/invite/signed-invite.js +++ b/dist/invite/signed-invite.js @@ -46,13 +46,17 @@ export function parseInviteSlug(slugOrUrl) { const bytes = decodeFromSlug(slug); const signedInvite = decodeSignedInvite(bytes); const payload = decodeInvitePayload(signedInvite.payload); + const creatorInboxId = bytesToHex(payload.creatorInboxId); + if (!creatorInboxId || !payload.tag || payload.conversationToken.length === 0) { + throw new Error("Invalid invite payload"); + } const now = BigInt(Math.floor(Date.now() / 1000)); const isExpired = payload.expiresAtUnix !== undefined && payload.expiresAtUnix < now; const isConversationExpired = payload.conversationExpiresAtUnix !== undefined && payload.conversationExpiresAtUnix < now; return { signedInvite, payload, - creatorInboxId: bytesToHex(payload.creatorInboxId), + creatorInboxId, isExpired, isConversationExpired, }; diff --git a/dist/invite/signed-invite.js.map b/dist/invite/signed-invite.js.map index b16026a..4b0160a 100644 --- a/dist/invite/signed-invite.js.map +++ b/dist/invite/signed-invite.js.map @@ -1 +1 @@ -{"version":3,"file":"signed-invite.js","sourceRoot":"","sources":["../../src/invite/signed-invite.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"signed-invite.js","sourceRoot":"","sources":["../../src/invite/signed-invite.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/invite/signed-invite.ts b/src/invite/signed-invite.ts index 57bfa3d..4453998 100644 --- a/src/invite/signed-invite.ts +++ b/src/invite/signed-invite.ts @@ -91,6 +91,11 @@ export function parseInviteSlug(slugOrUrl: string): ParsedInvite { const bytes = decodeFromSlug(slug); const signedInvite = decodeSignedInvite(bytes); const payload = decodeInvitePayload(signedInvite.payload); + const creatorInboxId = bytesToHex(payload.creatorInboxId); + + if (!creatorInboxId || !payload.tag || payload.conversationToken.length === 0) { + throw new Error("Invalid invite payload"); + } const now = BigInt(Math.floor(Date.now() / 1000)); const isExpired = payload.expiresAtUnix !== undefined && payload.expiresAtUnix < now; @@ -100,7 +105,7 @@ export function parseInviteSlug(slugOrUrl: string): ParsedInvite { return { signedInvite, payload, - creatorInboxId: bytesToHex(payload.creatorInboxId), + creatorInboxId, isExpired, isConversationExpired, }; diff --git a/tests/invite/signed-invite.test.ts b/tests/invite/signed-invite.test.ts index 97e7ebb..4483508 100644 --- a/tests/invite/signed-invite.test.ts +++ b/tests/invite/signed-invite.test.ts @@ -109,6 +109,11 @@ describe("signedInvite", () => { const parsed = parseInviteSlug(url); expect(parsed.payload.tag).toBe(testTag); }); + + it("should reject invite-like strings that decode to an empty payload", () => { + expect(() => parseInviteSlug("8118")).toThrow("Invalid invite payload"); + expect(() => parseInviteSlug("6018")).toThrow("Invalid invite payload"); + }); }); describe("verifyInvite", () => {