Skip to content

Commit 55f4326

Browse files
authored
improvement(auth): make Microsoft emailVerified derivation total (#5157)
* improvement(auth): make Microsoft emailVerified derivation total deriveMicrosoftEmailVerified cast the verified-email claims to string[] and called .includes through optional chaining, which only guards null/undefined. A claim arriving as a non-array, non-string value (e.g. a number) would throw inside getUserInfo and fail the OAuth flow. Array-check the claims with a proper type guard so any claim shape resolves to unverified instead of throwing. * test(auth): lock in unverified for a string verified-email claim Add a boundary case asserting a string verified_primary_email/ verified_secondary_email equal to the email resolves to unverified — the old string[] cast would have returned true via String.includes.
1 parent d643be0 commit 55f4326

2 files changed

Lines changed: 17 additions & 4 deletions

File tree

apps/sim/lib/oauth/microsoft.test.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,20 @@ describe('deriveMicrosoftEmailVerified', () => {
5454
expect(deriveMicrosoftEmailVerified({ email_verified: 'true' }, EMAIL)).toBe(true)
5555
})
5656

57-
it('treats a malformed verified-email claim as unverified', () => {
57+
it('treats malformed (non-array) verified-email claims as unverified without throwing', () => {
5858
expect(deriveMicrosoftEmailVerified({ verified_primary_email: 'not-an-array' }, EMAIL)).toBe(
5959
false
6060
)
61+
expect(deriveMicrosoftEmailVerified({ verified_primary_email: 123 }, EMAIL)).toBe(false)
62+
expect(deriveMicrosoftEmailVerified({ verified_secondary_email: { foo: 'bar' } }, EMAIL)).toBe(
63+
false
64+
)
65+
expect(deriveMicrosoftEmailVerified({ verified_primary_email: null }, EMAIL)).toBe(false)
66+
})
67+
68+
it('does not treat a string claim equal to the email as verified (guards the old unsafe cast)', () => {
69+
expect(deriveMicrosoftEmailVerified({ verified_primary_email: EMAIL }, EMAIL)).toBe(false)
70+
expect(deriveMicrosoftEmailVerified({ verified_secondary_email: EMAIL }, EMAIL)).toBe(false)
6171
})
6272
})
6373

apps/sim/lib/oauth/microsoft.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ export function deriveMicrosoftEmailVerified(
3636
if (claims.email_verified !== undefined) {
3737
return Boolean(claims.email_verified)
3838
}
39-
const verifiedPrimaryEmail = claims.verified_primary_email as string[] | undefined
40-
const verifiedSecondaryEmail = claims.verified_secondary_email as string[] | undefined
41-
return Boolean(verifiedPrimaryEmail?.includes(email) || verifiedSecondaryEmail?.includes(email))
39+
const { verified_primary_email: verifiedPrimary, verified_secondary_email: verifiedSecondary } =
40+
claims
41+
return (
42+
(Array.isArray(verifiedPrimary) && verifiedPrimary.includes(email)) ||
43+
(Array.isArray(verifiedSecondary) && verifiedSecondary.includes(email))
44+
)
4245
}

0 commit comments

Comments
 (0)