Spaces:
Running
Running
| """One-shot helper to clear the login-failure counter for a given IP. | |
| Usage: python scripts/reset_login_throttle.py [ip] | |
| Default IP is 127.0.0.1 (local dev). Deletes recent `login_failed` rows so | |
| the IP throttle check_ip_throttle() no longer flags this address. | |
| """ | |
| import os | |
| import sys | |
| from pathlib import Path | |
| HERE = Path(__file__).resolve().parent | |
| ROOT = HERE.parent | |
| sys.path.insert(0, str(ROOT)) | |
| os.chdir(ROOT) | |
| try: | |
| from dotenv import load_dotenv | |
| load_dotenv(ROOT / ".env", override=True) | |
| except ImportError: | |
| pass | |
| os.environ.setdefault("APP_MODE", "dda") | |
| from app.database import SessionLocal # noqa: E402 | |
| from app.models import LoginHistory # noqa: E402 | |
| from app.dda.rbac.models import Role, Module, RolePermission, MenuItem # noqa: E402,F401 — needed for User.role_obj mapper resolution | |
| def main() -> None: | |
| ip = sys.argv[1] if len(sys.argv) > 1 else "127.0.0.1" | |
| db = SessionLocal() | |
| try: | |
| deleted = ( | |
| db.query(LoginHistory) | |
| .filter( | |
| LoginHistory.ip_address == ip, | |
| LoginHistory.event_type.in_(("login_failed", "login_blocked", "otp_request_failed")), | |
| ) | |
| .delete(synchronize_session=False) | |
| ) | |
| db.commit() | |
| print(f"Cleared {deleted} throttle-relevant rows for IP {ip}.") | |
| finally: | |
| db.close() | |
| if __name__ == "__main__": | |
| main() | |