diff --git a/app/app.py b/app/app.py index edc45dd..ecc7807 100644 --- a/app/app.py +++ b/app/app.py @@ -25,6 +25,7 @@ def get_version(): except: return "?" + def get_upload_dir(): upload_dir = os.path.join(tempfile.gettempdir(), "libretranslate-files-translate") @@ -33,6 +34,7 @@ def get_upload_dir(): return upload_dir + def get_req_api_key(): if request.is_json: json = get_json_dict(request) @@ -42,6 +44,7 @@ def get_req_api_key(): return ak + def get_json_dict(request): d = request.get_json() if not isinstance(d, dict): @@ -162,8 +165,13 @@ def create_app(args): def access_check(f): @wraps(f) 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") + else: + if flood.has_violation(ip): + flood.decrease(ip) if args.api_keys and args.require_api_key_origin: ak = get_req_api_key() @@ -621,7 +629,7 @@ def create_app(args): """ if args.disable_files_translation: abort(400, description="Files translation are disabled on this server.") - + filepath = os.path.join(get_upload_dir(), filename) try: checked_filepath = security.path_traversal_check(filepath, get_upload_dir()) diff --git a/app/flood.py b/app/flood.py index ef0ed6b..3f068f1 100644 --- a/app/flood.py +++ b/app/flood.py @@ -33,6 +33,15 @@ def report(request_ip): banned[request_ip] += 1 +def decrease(request_ip): + if banned[request_ip] > 0: + banned[request_ip] -= 1 + + +def has_violation(request_ip): + return request_ip in banned and banned[request_ip] > 0 + + def is_banned(request_ip): # More than X offences? return active and banned.get(request_ip, 0) >= threshold