@@ -12,6 +12,7 @@ import { and, eq } from 'drizzle-orm'
1212import { type NextRequest , NextResponse } from 'next/server'
1313import { getSession } from '@/lib/auth'
1414import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
15+ import { normalizeEmail } from '@/lib/invitations/core'
1516import { syncAllWebhooksForCredentialSet } from '@/lib/webhooks/utils.server'
1617
1718const logger = createLogger ( 'CredentialSetInviteToken' )
@@ -111,6 +112,21 @@ export const POST = withRouteHandler(
111112 return NextResponse . json ( { error : 'Invitation has expired' } , { status : 410 } )
112113 }
113114
115+ if ( invitation . email ) {
116+ const sessionEmail = session . user . email
117+ if ( ! sessionEmail || normalizeEmail ( sessionEmail ) !== normalizeEmail ( invitation . email ) ) {
118+ logger . warn ( 'Rejected credential set invitation accept due to email mismatch' , {
119+ invitationId : invitation . id ,
120+ credentialSetId : invitation . credentialSetId ,
121+ userId : session . user . id ,
122+ } )
123+ return NextResponse . json (
124+ { error : 'This invitation was sent to a different email address' } ,
125+ { status : 403 }
126+ )
127+ }
128+ }
129+
114130 const existingMember = await db
115131 . select ( )
116132 . from ( credentialSetMember )
0 commit comments