@@ -9,22 +9,16 @@ import { Request, Response } from 'express';
99import { Op } from 'sequelize' ;
1010
1111import { getSystemConfig } from '../config/getSystemConfig.js' ;
12- import { setAuthCookies } from '../lib/cookie.js' ;
13- import { generateRefreshToken , hashRefreshToken , signAccessToken } from '../lib/token.js' ;
1412import { AuthEvent } from '../models/authEvents.js' ;
1513import { MagicLinkToken } from '../models/magicLinks.js' ;
16- import { Session } from '../models/sessions.js' ;
1714import { User } from '../models/users.js' ;
1815import { AuthEventService } from '../services/authEventService.js' ;
16+ import { maybePromoteBootstrapAdmin } from '../services/bootstrapPromotionService.js' ;
1917import { sendMagicLinkEmail } from '../services/messagingService.js' ;
18+ import { issueSessionAndRespond } from '../services/sessionIssuance.js' ;
2019import { AuthenticatedRequest } from '../types/types.js' ;
2120import getLogger from '../utils/logger.js' ;
22- import {
23- computeSessionTimes ,
24- hashDeviceFingerprint ,
25- hashSha256 ,
26- parseDurationToSeconds ,
27- } from '../utils/utils.js' ;
21+ import { hashDeviceFingerprint , hashSha256 } from '../utils/utils.js' ;
2822
2923const logger = getLogger ( 'magic-links' ) ;
3024
@@ -193,59 +187,47 @@ export async function pollMagicLinkConfirmation(req: Request, res: Response) {
193187 req,
194188 } ) ;
195189
196- const refreshToken = generateRefreshToken ( ) ;
197- const refreshTokenHash = await hashRefreshToken ( refreshToken ) ;
198- const { expiresAt, idleExpiresAt } = computeSessionTimes ( ) ;
199-
200- const session = await Session . create ( {
201- userId : user . id ,
202- infraId : process . env . APP_ID ! ,
203- mode : AUTH_MODE ,
204- refreshTokenHash,
205- userAgent : req . get ( 'user-agent' ) ,
206- ipAddress : req . ip ,
207- expiresAt,
208- idleExpiresAt,
209- lastUsedAt : undefined ,
210- } ) ;
211-
212- const token = await signAccessToken ( session . id , user . id , user . roles ) ;
213-
214190 user . challenge = '' ;
215191 user . verified = true ;
216192
217193 await user . save ( ) ;
218194
219- if ( token && refreshToken ) {
220- await AuthEvent . create ( {
221- user_id : user . id ,
222- type : 'registration_success' ,
223- ip_address : req . ip ,
224- user_agent : req . headers [ 'user-agent' ] ,
225- metadata : { } ,
226- } ) ;
227-
228- if ( AUTH_MODE === 'web' ) {
229- await setAuthCookies ( res , { accessToken : token , refreshToken } ) ;
230- res . status ( 200 ) . json ( { message : 'Success' } ) ;
231- return ;
232- }
233-
234- const { access_token_ttl, refresh_token_ttl } = await getSystemConfig ( ) ;
235-
236- return res . status ( 200 ) . json ( {
237- message : 'Success' ,
238- token,
239- refreshToken,
240- sub : user . id ,
241- roles : user . roles ,
195+ const bootstrapResult = await maybePromoteBootstrapAdmin ( {
196+ user,
197+ req,
198+ completionMethod : 'magic_link_fallback' ,
199+ } ) ;
200+
201+ if ( bootstrapResult . promoted ) {
202+ logger . info ( `Bootstrap admin granted to ${ user . email } ` ) ;
203+ }
204+
205+ await AuthEvent . create ( {
206+ user_id : user . id ,
207+ type : 'registration_success' ,
208+ ip_address : req . ip ,
209+ user_agent : req . headers [ 'user-agent' ] ,
210+ metadata : { } ,
211+ } ) ;
212+
213+ await issueSessionAndRespond ( {
214+ user : {
215+ id : user . id ,
242216 email : user . email ,
243217 phone : user . phone ,
244- ttl : parseDurationToSeconds ( access_token_ttl || '15m' ) ,
245- refreshTtl : parseDurationToSeconds ( refresh_token_ttl || '1h' ) ,
246- } ) ;
247- }
248- }
218+ roles : user . roles ?? [ ] ,
219+ } ,
220+ req,
221+ res,
222+ authMode : AUTH_MODE ,
223+ clearBootstrap : true ,
224+ } ) ;
225+
226+ user . update ( {
227+ lastLogin : new Date ( ) ,
228+ } ) ;
249229
250- return res . status ( 204 ) . json ( { message : 'Not verified.' } ) ;
230+ return ;
231+ }
232+ return res . status ( 204 ) . json ( { message : 'Success' } ) ;
251233}
0 commit comments