@@ -29,73 +29,69 @@ export const authOptions: NextAuthOptions = {
2929 process . env . ENABLE_TEST_AUTH === 'true'
3030
3131 if ( isTestMode && credentials ?. authToken ) {
32- console . log ( '[AUTH] Test mode active, checking test token: ', credentials . authToken )
33- console . log ( '[AUTH] NODE_ENV:' , process . env . NODE_ENV )
34- console . log ( '[AUTH] NEXT_PUBLIC_ENABLE_TEST_AUTH:' , process . env . NEXT_PUBLIC_ENABLE_TEST_AUTH )
35- console . log ( '[AUTH] ENABLE_TEST_AUTH:' , process . env . ENABLE_TEST_AUTH )
32+ logger . debug ( ' Test mode active', {
33+ hasToken : ! ! credentials . authToken ,
34+ nodeEnv : process . env . NODE_ENV ,
35+ } )
3636
3737 if ( credentials . authToken === 'TEST_ADMIN_TOKEN' ) {
3838 // Return the seeded admin user
39- console . log ( '[AUTH] Looking up admin test user')
39+ logger . debug ( ' Looking up admin test user')
4040 try {
4141 const adminUser = await prisma . user . findUnique ( {
4242 where : { email : 'admin@example.com' }
4343 } )
44- console . log ( '[AUTH] Admin user lookup result:' , adminUser ? { id : adminUser . id , email : adminUser . email , isAdmin : adminUser . isAdmin } : 'not found' )
4544
4645 if ( adminUser && adminUser . isAdmin ) {
47- console . log ( '[AUTH] Admin test user found: ', adminUser . email )
46+ logger . debug ( ' Admin test user found', { email : adminUser . email } )
4847 const userData = {
4948 id : adminUser . id ,
5049 email : adminUser . email ,
5150 name : adminUser . name ,
5251 image : adminUser . image ,
5352 isAdmin : true ,
5453 }
55- console . log ( '[AUTH] Returning user data:' , userData )
5654 return userData
5755 } else {
58- console . error ( '[AUTH] Admin test user not found or not admin. User: ' , adminUser )
56+ logger . error ( 'Admin test user not found or not admin' , { hasUser : ! ! adminUser } )
5957 return null
6058 }
6159 } catch ( error ) {
62- console . error ( '[AUTH] Error looking up admin user: ' , error )
60+ logger . error ( 'Error looking up admin user' , error )
6361 return null
6462 }
6563 }
6664
6765 if ( credentials . authToken === 'TEST_REGULAR_TOKEN' ) {
6866 // Return the seeded regular user
69- console . log ( '[AUTH] Looking up regular test user')
67+ logger . debug ( ' Looking up regular test user')
7068 try {
7169 const regularUser = await prisma . user . findUnique ( {
7270 where : { email : 'regular@example.com' }
7371 } )
74- console . log ( '[AUTH] Regular user lookup result:' , regularUser ? { id : regularUser . id , email : regularUser . email , isAdmin : regularUser . isAdmin } : 'not found' )
7572
7673 if ( regularUser ) {
77- console . log ( '[AUTH] Regular test user found: ', regularUser . email )
74+ logger . debug ( ' Regular test user found', { email : regularUser . email } )
7875 const userData = {
7976 id : regularUser . id ,
8077 email : regularUser . email ,
8178 name : regularUser . name ,
8279 image : regularUser . image ,
8380 isAdmin : regularUser . isAdmin ,
8481 }
85- console . log ( '[AUTH] Returning user data:' , userData )
8682 return userData
8783 } else {
88- console . error ( '[AUTH] Regular test user not found' )
84+ logger . error ( 'Regular test user not found' )
8985 return null
9086 }
9187 } catch ( error ) {
92- console . error ( '[AUTH] Error looking up regular user: ' , error )
88+ logger . error ( 'Error looking up regular user' , error )
9389 return null
9490 }
9591 }
9692
9793 // If test mode but unrecognized token, fail
98- console . error ( '[AUTH] Test mode active but unrecognized test token:' , credentials . authToken )
94+ logger . error ( 'Test mode active but unrecognized test token' )
9995 return null
10096 }
10197
@@ -280,9 +276,17 @@ export const authOptions: NextAuthOptions = {
280276
281277 if ( ! dbUser ) {
282278 // Check if user with same username/email exists (for account linking)
283- // Jellyfin usernames may or may not be emails
284- const userByEmail = jellyfinUser . username . includes ( '@' )
285- ? await prisma . user . findUnique ( { where : { email : jellyfinUser . username } } )
279+ // Validate if Jellyfin username is a valid email format
280+ const emailSchema = z . string ( ) . email ( )
281+ const emailValidation = emailSchema . safeParse ( jellyfinUser . username )
282+ const normalizedEmail = emailValidation . success
283+ ? jellyfinUser . username . toLowerCase ( ) . trim ( )
284+ : null
285+
286+ const userByEmail = normalizedEmail
287+ ? await prisma . user . findUnique ( {
288+ where : { email : normalizedEmail }
289+ } )
286290 : null
287291
288292 if ( userByEmail ) {
@@ -307,7 +311,7 @@ export const authOptions: NextAuthOptions = {
307311 data : {
308312 jellyfinUserId : jellyfinUser . id ,
309313 name : jellyfinUser . username ,
310- email : jellyfinUser . username . includes ( '@' ) ? jellyfinUser . username : null ,
314+ email : normalizedEmail ,
311315 isAdmin,
312316 primaryAuthService : "jellyfin" ,
313317 onboardingStatus : { plex : false , jellyfin : false } ,
@@ -395,20 +399,26 @@ export const authOptions: NextAuthOptions = {
395399 session . user . image = token . picture as string
396400 session . user . isAdmin = token . isAdmin as boolean
397401 } else {
398- console . warn ( `[AUTH] Session callback - missing token.sub or session.user: hasTokenSub=${ ! ! token . sub } hasSessionUser=${ ! ! session . user } ` )
402+ logger . warn ( 'Session callback - missing token.sub or session.user' , {
403+ hasTokenSub : ! ! token . sub ,
404+ hasSessionUser : ! ! session . user
405+ } )
399406 }
400407 return session
401408 } ,
402409 async jwt ( { token, user } ) {
403410 if ( user ) {
404- console . log ( '[AUTH] JWT callback - user:' , { id : user . id , email : user . email , isAdmin : ( user as any ) . isAdmin } )
411+ logger . debug ( 'JWT callback - user signed in' , {
412+ userId : user . id ,
413+ email : user . email ,
414+ isAdmin : ( user as any ) . isAdmin
415+ } )
405416 // Store user info in JWT when user first signs in
406417 token . sub = user . id
407418 token . name = user . name
408419 token . email = user . email
409420 token . picture = user . image
410421 token . isAdmin = ( user as any ) . isAdmin || false
411- console . log ( '[AUTH] JWT callback - token updated:' , { sub : token . sub , email : token . email , isAdmin : token . isAdmin } )
412422 }
413423 return token
414424 } ,
0 commit comments