@@ -35,6 +35,7 @@ import {
35
35
36
36
import { verifyEmailWithCode } from '../api/verificationChallenges' ;
37
37
import patch from '../utils/patchExpressAsync' ;
38
+ import { validateEmailCode } from '../couchdb/emailReset' ;
38
39
39
40
// This must occur before express app is used
40
41
patch ( ) ;
@@ -198,7 +199,7 @@ export function addAuthPages(app: Router, socialProviders: AuthProvider[]) {
198
199
// Render the change password form
199
200
return res . render ( 'change-password' , {
200
201
// The POST endpoint to handle password change
201
- postUrl : '/auth/change-password ' ,
202
+ postUrl : '/auth/changePassword ' ,
202
203
changePasswordPostPayload : {
203
204
username,
204
205
redirect,
@@ -267,4 +268,74 @@ export function addAuthPages(app: Router, socialProviders: AuthProvider[]) {
267
268
} ) ;
268
269
}
269
270
) ;
271
+
272
+ /**
273
+ * PAGE: Forgot password form
274
+ * Allows the user to enter their email to receive a password reset link
275
+ */
276
+ app . get (
277
+ '/forgot-password' ,
278
+ processRequest ( {
279
+ query : z . object ( {
280
+ redirect : z . string ( ) . optional ( ) ,
281
+ } ) ,
282
+ } ) ,
283
+ ( req , res ) => {
284
+ const { valid, redirect} = validateRedirect (
285
+ req . query . redirect || DEFAULT_REDIRECT_URL
286
+ ) ;
287
+
288
+ if ( ! valid ) {
289
+ return res . render ( 'redirect-error' , { redirect} ) ;
290
+ }
291
+
292
+ return res . render ( 'forgot-password' , {
293
+ postUrl : '/auth/forgotPassword' ,
294
+ forgotPasswordPostPayload : {
295
+ redirect,
296
+ } ,
297
+ messages : req . flash ( ) ,
298
+ } ) ;
299
+ }
300
+ ) ;
301
+
302
+ /**
303
+ * PAGE: Reset password form
304
+ * Allows the user to set a new password using a reset code
305
+ */
306
+ app . get (
307
+ '/auth/reset-password' ,
308
+ processRequest ( {
309
+ query : z . object ( {
310
+ code : z . string ( ) ,
311
+ redirect : z . string ( ) ,
312
+ } ) ,
313
+ } ) ,
314
+ async ( req , res ) => {
315
+ const code = req . query . code ;
316
+ const { valid, redirect} = validateRedirect ( req . query . redirect ) ;
317
+
318
+ if ( ! valid ) {
319
+ return res . render ( 'redirect-error' , { redirect} ) ;
320
+ }
321
+
322
+ // Validate the code
323
+ const validationResult = await validateEmailCode ( code ) ;
324
+
325
+ if ( ! validationResult . valid || ! validationResult . user ) {
326
+ return res . render ( 'reset-password-error' , {
327
+ error : validationResult . validationError || 'Invalid reset code.' ,
328
+ loginUrl : '/login' ,
329
+ forgotPasswordUrl : '/forgot-password' ,
330
+ } ) ;
331
+ }
332
+
333
+ return res . render ( 'reset-password' , {
334
+ postUrl : '/auth/resetPassword' ,
335
+ resetCode : code ,
336
+ redirect,
337
+ messages : req . flash ( ) ,
338
+ } ) ;
339
+ }
340
+ ) ;
270
341
}
0 commit comments