forked from username/flaskpaste
- add type hints to error handlers in app/__init__.py - add docstrings to nested callback functions - remove deprecated X-XSS-Protection header (superseded by CSP) - fix typo in cleanup log message (entr(ies) -> entries) - standardize loop variable naming in fpaste CLI - update test for intentional header removal
66 lines
1.9 KiB
Python
66 lines
1.9 KiB
Python
"""API blueprint registration."""
|
|
|
|
import threading
|
|
import time
|
|
|
|
from flask import Blueprint, current_app
|
|
|
|
bp = Blueprint("api", __name__)
|
|
|
|
# Thread-safe cleanup scheduling
|
|
_cleanup_lock = threading.Lock()
|
|
_cleanup_times = {
|
|
"pastes": 0,
|
|
"hashes": 0,
|
|
"rate_limits": 0,
|
|
}
|
|
_CLEANUP_INTERVALS = {
|
|
"pastes": 3600, # 1 hour
|
|
"hashes": 900, # 15 minutes
|
|
"rate_limits": 300, # 5 minutes
|
|
}
|
|
|
|
|
|
def reset_cleanup_times() -> None:
|
|
"""Reset cleanup timestamps. For testing only."""
|
|
with _cleanup_lock:
|
|
for key in _cleanup_times:
|
|
_cleanup_times[key] = 0
|
|
|
|
|
|
@bp.before_request
|
|
def run_scheduled_cleanup():
|
|
"""Periodically run cleanup tasks on schedule."""
|
|
now = time.time()
|
|
|
|
with _cleanup_lock:
|
|
# Cleanup expired pastes
|
|
if now - _cleanup_times["pastes"] >= _CLEANUP_INTERVALS["pastes"]:
|
|
_cleanup_times["pastes"] = now
|
|
from app.database import cleanup_expired_pastes
|
|
|
|
count = cleanup_expired_pastes()
|
|
if count > 0:
|
|
current_app.logger.info(f"Cleaned up {count} expired paste(s)")
|
|
|
|
# Cleanup expired content hashes
|
|
if now - _cleanup_times["hashes"] >= _CLEANUP_INTERVALS["hashes"]:
|
|
_cleanup_times["hashes"] = now
|
|
from app.database import cleanup_expired_hashes
|
|
|
|
count = cleanup_expired_hashes()
|
|
if count > 0:
|
|
current_app.logger.info(f"Cleaned up {count} expired hash(es)")
|
|
|
|
# Cleanup rate limit entries
|
|
if now - _cleanup_times["rate_limits"] >= _CLEANUP_INTERVALS["rate_limits"]:
|
|
_cleanup_times["rate_limits"] = now
|
|
from app.api.routes import cleanup_rate_limits
|
|
|
|
count = cleanup_rate_limits()
|
|
if count > 0:
|
|
current_app.logger.info(f"Cleaned up {count} rate limit entries")
|
|
|
|
|
|
from app.api import routes # noqa: E402, F401
|