@@ -9,13 +9,16 @@ const validator = require.main.require('validator');
99const async = require ( 'async' ) ;
1010const fs = require ( 'fs' ) ;
1111const path = require ( 'path' ) ;
12+ const util = require ( 'util' ) ;
1213const base64url = require ( 'base64url' ) ;
1314
15+ const db = require . main . require ( './src/database' ) ;
1416const groups = require . main . require ( './src/groups' ) ;
1517const user = require . main . require ( './src/user' ) ;
1618const meta = require . main . require ( './src/meta' ) ;
1719const helpers = require . main . require ( './src/controllers/helpers' ) ;
1820
21+ const wait = util . promisify ( setTimeout ) ;
1922const guard = ( path ) => {
2023 let url = new URL ( path , nconf . get ( 'url' ) ) ;
2124 url = url . hostname === nconf . get ( 'url_parsed' ) . hostname ? url : nconf . get ( 'url' ) ;
@@ -131,11 +134,24 @@ Controllers.renderAuthnChallenge = async (req, res, next) => {
131134 } ) ;
132135} ;
133136
134- Controllers . processTotpLogin = function ( req , res , next ) {
135- passport . authenticate ( 'totp' , {
136- failureRedirect : `${ nconf . get ( 'relative_path' ) } /login/2fa/totp` ,
137- failureFlash : '[[2factor:login.failure]]' ,
138- keepSessionInfo : true ,
137+ Controllers . processTotpLogin = async ( req , res , next ) => {
138+ const count = await db . incrObjectField ( 'locks' , `totp:${ req . uid } ` ) ;
139+ if ( count > 1 ) {
140+ req . flash ( 'error' , '[[error:api.429]]' ) ;
141+ await wait ( 10000 ) ; // 10s for spamming
142+ return res . redirect ( `${ nconf . get ( 'relative_path' ) } /login/2fa/totp` ) ;
143+ }
144+
145+ passport . authenticate ( 'totp' , async ( err , user , info ) => {
146+ if ( err || ! user ) {
147+ req . flash ( 'error' , '[[2factor:login.failure]]' ) ;
148+ await wait ( 2000 ) ;
149+ await db . deleteObjectField ( 'locks' , `totp:${ req . uid } ` ) ;
150+ return res . redirect ( `${ nconf . get ( 'relative_path' ) } /login/2fa/totp` ) ;
151+ }
152+
153+ await db . deleteObjectField ( 'locks' , `totp:${ req . uid } ` ) ;
154+ return next ( ) ;
139155 } ) ( req , res , next ) ;
140156} ;
141157
0 commit comments