@@ -272,6 +272,7 @@ object Fail2BanState {
272272object Fail2BanPlugin {
273273 val Fail2BanTriggerStatusKey = TypedKey [Int ](" otoroshi.plugins.Fail2BanPlugin.Fail2BanTriggerStatus" )
274274 val Fail2BanTriggerKey = TypedKey [String ](" otoroshi.plugins.Fail2BanPlugin.Fail2BanTrigger" )
275+ val Fail2BanAlreadyCountedKey = TypedKey [Boolean ](" otoroshi.plugins.Fail2BanPlugin.Fail2BanAlreadyCounted" )
275276}
276277
277278class Fail2BanPlugin extends NgAccessValidator with NgRequestTransformer {
@@ -324,6 +325,7 @@ class Fail2BanPlugin extends NgAccessValidator with NgRequestTransformer {
324325 " message" -> s " You are temporarily banned due to too many failed requests. " ,
325326 " retry_in_seconds" -> remain
326327 )
328+ ctx.attrs.put(Fail2BanPlugin .Fail2BanAlreadyCountedKey -> true )
327329 NgAccess .NgDenied (Results .Forbidden (body)).vfuture
328330 } else {
329331 NgAccess .NgAllowed .vfuture
@@ -349,7 +351,7 @@ class Fail2BanPlugin extends NgAccessValidator with NgRequestTransformer {
349351 val now = System .currentTimeMillis()
350352 val counter = Fail2BanState .counterFor(ip)
351353 val n = counter.increment(now, conf.detectTimeMs.toMillis)
352-
354+ ctx.attrs.put( Fail2BanPlugin . Fail2BanAlreadyCountedKey -> true )
353355 if (n >= conf.maxRetry) {
354356 Fail2BanState .ban(ip, (now + conf.banTimeMs.toMillis).millis)
355357 counter.reset()
@@ -377,7 +379,7 @@ class Fail2BanPlugin extends NgAccessValidator with NgRequestTransformer {
377379 val now = System .currentTimeMillis()
378380 val counter = Fail2BanState .counterFor(ip)
379381 val n = counter.increment(now, conf.detectTimeMs.toMillis)
380-
382+ ctx.attrs.put( Fail2BanPlugin . Fail2BanAlreadyCountedKey -> true )
381383 if (n >= conf.maxRetry) {
382384 Fail2BanState .ban(ip, (now + conf.banTimeMs.toMillis).millis)
383385 counter.reset()
@@ -392,7 +394,8 @@ class Fail2BanPlugin extends NgAccessValidator with NgRequestTransformer {
392394 .cachedConfig(internalName)(Fail2BanConfig .format)
393395 .getOrElse(Fail2BanConfig .default)
394396 val ip = conf.identifier.evaluateEl(ctx.attrs)
395- if (! conf.isIgnored(ip) && ! conf.isBlocked(ip)) {
397+ val alreadyCounted = ctx.attrs.get(Fail2BanPlugin .Fail2BanAlreadyCountedKey ).contains(true )
398+ if (! conf.isIgnored(ip) && ! conf.isBlocked(ip) && ! alreadyCounted) {
396399 ctx.attrs.get(otoroshi.plugins.Keys .ElCtxKey ).map { elCtx =>
397400 val pathAndQuery = ctx.request.thePath
398401 val ctxStatus = elCtx.get(" fail2ban-trigger-status" ).map(_.toInt).orElse(ctx.attrs.get(Fail2BanPlugin .Fail2BanTriggerStatusKey ))
0 commit comments