auth.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import sqlite3
  2. from datetime import timedelta
  3. from typing import Optional
  4. from flask import abort, session
  5. from .core import isoformat, parse_datetime, utcnow
  6. from .db import execute, fetch_one
  7. def current_user() -> Optional[sqlite3.Row]:
  8. user_id = session.get("user_id")
  9. if not user_id:
  10. return None
  11. return fetch_one("SELECT * FROM users WHERE id = ?", (user_id,))
  12. def current_admin() -> Optional[sqlite3.Row]:
  13. admin_id = session.get("admin_user_id")
  14. if not admin_id:
  15. return None
  16. return fetch_one("SELECT * FROM admin_users WHERE id = ?", (admin_id,))
  17. def require_user() -> sqlite3.Row:
  18. user = current_user()
  19. if user is None:
  20. abort(401)
  21. if user["status"] != "ACTIVE":
  22. abort(403)
  23. return user
  24. def require_admin() -> sqlite3.Row:
  25. admin = current_admin()
  26. if admin is None:
  27. abort(401)
  28. if admin["status"] != "ACTIVE":
  29. abort(403)
  30. return admin
  31. def is_vip_active(user: sqlite3.Row) -> bool:
  32. vip_expire_at = parse_datetime(user["vip_expire_at"])
  33. return vip_expire_at is not None and vip_expire_at > utcnow()
  34. def extend_vip(user_id: int, duration_days: int) -> None:
  35. user = fetch_one("SELECT vip_expire_at FROM users WHERE id = ?", (user_id,))
  36. if user is None:
  37. abort(404)
  38. now = utcnow()
  39. current = parse_datetime(user["vip_expire_at"])
  40. start = current if (current is not None and current > now) else now
  41. new_expire = start + timedelta(days=duration_days)
  42. execute("UPDATE users SET vip_expire_at = ? WHERE id = ?", (isoformat(new_expire), user_id))