fix: self-heal rate_limits table if missing (pre-migration DBs)

This commit is contained in:
ComputerTech 2026-04-06 19:24:52 +01:00
parent cc9b184277
commit be6b102d16
1 changed files with 23 additions and 6 deletions

29
app.py
View File

@ -209,19 +209,36 @@ def _is_same_origin():
return referer.startswith(base_url)
return False
def _ensure_rate_limits_table(conn):
"""Create the rate_limits table if it doesn't exist (migration safety net)."""
conn.execute('''
CREATE TABLE IF NOT EXISTS rate_limits (
ip_address TEXT,
timestamp REAL,
PRIMARY KEY (ip_address, timestamp)
)
''')
conn.execute('CREATE INDEX IF NOT EXISTS idx_rate_limit_ts ON rate_limits(timestamp)')
conn.commit()
def _check_rate_limit(remote_ip, key_prefix='rl', window=600, limit=10):
"""Generic rate limiting via SQLite. Window is in seconds."""
now_ts = time.time()
conn = get_db_connection()
try:
count = conn.execute(
'SELECT COUNT(*) FROM rate_limits WHERE ip_address = ? AND timestamp > ?',
(f"{key_prefix}:{remote_ip}", now_ts - window)
).fetchone()[0]
try:
count = conn.execute(
'SELECT COUNT(*) FROM rate_limits WHERE ip_address = ? AND timestamp > ?',
(f"{key_prefix}:{remote_ip}", now_ts - window)
).fetchone()[0]
except sqlite3.OperationalError:
# Table missing (pre-migration DB) — create it and proceed.
_ensure_rate_limits_table(conn)
count = 0
if count >= limit:
return False
conn.execute('INSERT INTO rate_limits (ip_address, timestamp) VALUES (?, ?)', (f"{key_prefix}:{remote_ip}", now_ts))
conn.commit()
return True