@@ -494,6 +494,37 @@ var listSameQRateLimiter = rateLimit({
494494 }
495495} ) ;
496496
497+ var waitVoteCapMin = isDev ? settings . waitVoteCapMin . dev : settings . waitVoteCapMin . pro ;
498+ var voteCapLimiter = rateLimit ( {
499+ store : ( isDev ? undefined : new MongoStore ( {
500+ uri : appendUrlLeaf ( limiter , '/voteCapLimiter' ) ,
501+ resetExpireDateOnChange : true , // Rolling
502+ expireTimeMs : waitVoteCapMin * 60 * 1000 // n minutes for mongo store
503+ } ) ) ,
504+ windowMs : waitVoteCapMin * 60 * 1000 , // n minutes for all stores
505+ max : 3 , // limit each IP to n requests per windowMs for memory store or expireTimeMs for mongo store
506+ handler : function ( aReq , aRes , aNext , aOptions ) {
507+ statusCodePage ( aReq , aRes , aNext , {
508+ statusCode : 429 ,
509+ statusMessage : 'Too many requests.' ,
510+ suppressNavigation : true ,
511+ isCustomView : true ,
512+ statusData : {
513+ isListView : true ,
514+ retryAfter : waitAuthCapMin * 60 + ( isDev ? fudgeSec : fudgeMin )
515+ }
516+ } ) ;
517+ } ,
518+ skip : function ( aReq , aRes ) {
519+ var authedUser = aReq . session . user ;
520+
521+ if ( authedUser && authedUser . isMod ) {
522+ this . store . resetKey ( this . keyGenerator ) ;
523+ return true ;
524+ }
525+ }
526+ } ) ;
527+
497528
498529module . exports = function ( aApp ) {
499530 //--- Middleware
@@ -600,7 +631,7 @@ module.exports = function (aApp) {
600631 aApp . route ( '/mod/removed/:id' ) . head ( statusTMR ) . get ( authentication . validateUser , moderation . removedItemPage ) ;
601632
602633 // Vote route
603- aApp . route ( / ^ \/ v o t e \/ ( s c r i p t s | l i b s ) \/ ( ( .+ ?) (?: \/ ( .+ ) ) ? ) $ / ) . post ( authentication . validateUser , vote . vote ) ;
634+ aApp . route ( / ^ \/ v o t e \/ ( s c r i p t s | l i b s ) \/ ( ( .+ ?) (?: \/ ( .+ ) ) ? ) $ / ) . post ( voteCapLimiter , authentication . validateUser , vote . vote ) ;
604635
605636 // Flag route
606637 aApp . route ( / ^ \/ f l a g \/ ( u s e r s | s c r i p t s | l i b s ) \/ ( ( .+ ?) (?: \/ ( .+ ) ) ? ) $ / ) . post ( authentication . validateUser , flag . flag ) ;
0 commit comments