@@ -4,6 +4,8 @@ import { requestNewOtp, validateOtp } from '../services/otp';
4
4
import { canRequestOtp , secondsRemainingToRequestNewOtp } from '../utils/otp' ;
5
5
import { emailValidator , otpValidator } from '../utils/shared' ;
6
6
import { errors } from '../modules/errors' ;
7
+ import { getInteractionById } from '../modules/sequelize/queries/interaction' ;
8
+ import { LoginTimeoutError } from '../utils/helpers' ;
7
9
8
10
export const authorize = async ( oidcProvider : Provider ) => {
9
11
return async ( req : Request , res : Response , next : NextFunction ) => {
@@ -35,6 +37,8 @@ export const authorize = async (oidcProvider: Provider) => {
35
37
export const generateOtp = async ( oidcProvider : Provider ) => {
36
38
return async ( req : Request , res : Response , next : NextFunction ) => {
37
39
try {
40
+ if ( req . params ?. uid && ( await isInteractionSessionExpired ( String ( req . params ?. uid ) ) ) )
41
+ throw new LoginTimeoutError ( ) ;
38
42
const {
39
43
uid,
40
44
prompt : { name } ,
@@ -54,7 +58,7 @@ export const generateOtp = async (oidcProvider: Provider) => {
54
58
error,
55
59
nonce : res . locals . cspNonce ,
56
60
waitTime : 0 ,
57
- } )
61
+ } ) ;
58
62
}
59
63
60
64
if ( ! error ) {
@@ -99,7 +103,6 @@ export const generateOtp = async (oidcProvider: Provider) => {
99
103
} ,
100
104
} as any ) ;
101
105
102
-
103
106
return res . render ( 'otp' , {
104
107
uid,
105
108
email,
@@ -119,6 +122,9 @@ export const generateOtp = async (oidcProvider: Provider) => {
119
122
export const login = async ( oidcProvider : Provider ) => {
120
123
return async ( req : Request , res : Response , next : NextFunction ) => {
121
124
try {
125
+ if ( req . params ?. uid && ( await isInteractionSessionExpired ( String ( req . params ?. uid ) ) ) )
126
+ throw new LoginTimeoutError ( ) ;
127
+
122
128
const {
123
129
uid,
124
130
prompt : { name } ,
@@ -131,20 +137,21 @@ export const login = async (oidcProvider: Provider) => {
131
137
132
138
if ( name === 'login' ) {
133
139
let validatedOtp = { verified : false , attemptsLeft : 0 , expired : false } ;
134
- const { code1, code2, code3, code4, code5, code6, } = req . body ;
140
+ const { code1, code2, code3, code4, code5, code6 } = req . body ;
135
141
const email = ( oidcResult ?. login ?. email as string ) || '' ;
136
142
137
143
// Run form validation server side
138
144
const [ otp , otpError ] = otpValidator ( [ code1 , code2 , code3 , code4 , code5 , code6 ] ) ;
139
- if ( otpError ) return res . render ( 'otp' , {
145
+ if ( otpError )
146
+ return res . render ( 'otp' , {
140
147
uid,
141
148
email,
142
149
nonce : res . locals . cspNonce ,
143
150
waitTime : time ,
144
151
disableResend : false ,
145
152
disableForm : false ,
146
- error : otpError
147
- } ) ;
153
+ error : otpError ,
154
+ } ) ;
148
155
149
156
let disableResend = false ;
150
157
validatedOtp = await validateOtp ( otp as string , email ) ;
@@ -210,3 +217,9 @@ export const abortLogin = async (oidcProvider: Provider) => {
210
217
}
211
218
} ;
212
219
} ;
220
+
221
+ const isInteractionSessionExpired = async ( interactionUid : string ) => {
222
+ const interaction = await getInteractionById ( interactionUid ) ;
223
+ if ( interaction && new Date ( ) . getTime ( ) >= new Date ( interaction . expiresAt ) . getTime ( ) ) return true ;
224
+ return false ;
225
+ } ;
0 commit comments