decrease counter if the user wait after the slowdown notice

This commit is contained in:
Sébastien Thuret 2021-11-05 14:55:45 +01:00
parent ec382054db
commit adfdc8c9e5
No known key found for this signature in database
GPG key ID: 4742E2D66933BB08
2 changed files with 23 additions and 2 deletions

View file

@ -25,6 +25,7 @@ def get_version():
except: except:
return "?" return "?"
def get_upload_dir(): def get_upload_dir():
upload_dir = os.path.join(tempfile.gettempdir(), "libretranslate-files-translate") upload_dir = os.path.join(tempfile.gettempdir(), "libretranslate-files-translate")
@ -33,6 +34,7 @@ def get_upload_dir():
return upload_dir return upload_dir
def get_req_api_key(): def get_req_api_key():
if request.is_json: if request.is_json:
json = get_json_dict(request) json = get_json_dict(request)
@ -42,6 +44,7 @@ def get_req_api_key():
return ak return ak
def get_json_dict(request): def get_json_dict(request):
d = request.get_json() d = request.get_json()
if not isinstance(d, dict): if not isinstance(d, dict):
@ -162,8 +165,13 @@ def create_app(args):
def access_check(f): def access_check(f):
@wraps(f) @wraps(f)
def func(*a, **kw): def func(*a, **kw):
if flood.is_banned(get_remote_address()): ip = get_remote_address()
if flood.is_banned(ip):
abort(403, description="Too many request limits violations") abort(403, description="Too many request limits violations")
else:
if flood.has_violation(ip):
flood.decrease(ip)
if args.api_keys and args.require_api_key_origin: if args.api_keys and args.require_api_key_origin:
ak = get_req_api_key() ak = get_req_api_key()

View file

@ -19,6 +19,8 @@ def setup(violations_threshold=100):
active = True active = True
threshold = violations_threshold threshold = violations_threshold
print(violations_threshold)
scheduler = BackgroundScheduler() scheduler = BackgroundScheduler()
scheduler.add_job(func=clear_banned, trigger="interval", weeks=4) scheduler.add_job(func=clear_banned, trigger="interval", weeks=4)
scheduler.start() scheduler.start()
@ -31,6 +33,17 @@ def report(request_ip):
if active: if active:
banned[request_ip] = banned.get(request_ip, 0) banned[request_ip] = banned.get(request_ip, 0)
banned[request_ip] += 1 banned[request_ip] += 1
print(banned[request_ip])
def decrease(request_ip):
if banned[request_ip] > 0:
banned[request_ip] -= 1
print('decrease', request_ip)
def has_violation(request_ip):
return request_ip in banned and banned[request_ip] > 0
def is_banned(request_ip): def is_banned(request_ip):