"""auth — comptes utilisateurs, connexion, 2FA (TOTP) et isolation par utilisateur d'un SEUL projet (sauf le rôle "admin", illimité) — voir create_user.py pour le détail des règles. Base SQLite entièrement séparée de db/ (une base par JEU) : ces comptes n'appartiennent à aucun jeu, ils en POSSÈDENT un (project_slug).""" from .connection import users_db_path from .ensure_schema import ensure_users_schema from .is_first_user import is_first_user from .create_user import create_user, UserCreationError from .get_user_by_email import get_user_by_email from .get_user_by_id import get_user_by_id from .verify_password import verify_password from .confirm_totp import confirm_totp from .verify_totp import verify_totp from .set_project_slug import set_project_slug from .password_strength import password_strength, MIN_SCORE_REQUIRED from .totp_qrcode_svg import totp_provisioning_uri, totp_qrcode_svg from .rate_limit import lockout_minutes_for, seconds_locked_remaining, lockout_message from .record_failed_attempt import record_failed_attempt from .reset_failed_attempts import reset_failed_attempts from .recovery_codes import generate_recovery_codes, verify_recovery_code from .set_password import set_password from .password_reset import ( create_password_reset_token, get_user_id_for_valid_token, consume_password_reset_token, TOKEN_TTL_MINUTES, ) from .send_email import send_password_reset_email, EmailNotConfiguredError from .update_profile import update_profile from .count_admins import count_admins from .delete_user import delete_user from .update_email import update_email, EmailUpdateError from .ensure_user_assets_schema import ensure_user_assets_schema from .user_assets_dir import user_assets_dir from .create_user_asset import create_user_asset from .list_user_assets import list_user_assets from .get_user_asset import get_user_asset from .delete_user_asset import delete_user_asset from .save_user_asset import save_user_asset from .user_asset_kind import user_asset_kind from .validate_audio_duration import validate_audio_duration, MAX_AUDIO_SECONDS from .validate_video_duration import validate_video_duration, MAX_VIDEO_SECONDS from .image_dimensions import image_dimensions from .update_user_asset_scene_kind import update_user_asset_scene_kind __all__ = [ "users_db_path", "ensure_users_schema", "is_first_user", "create_user", "UserCreationError", "get_user_by_email", "get_user_by_id", "verify_password", "confirm_totp", "verify_totp", "set_project_slug", "password_strength", "MIN_SCORE_REQUIRED", "totp_provisioning_uri", "totp_qrcode_svg", "lockout_minutes_for", "seconds_locked_remaining", "lockout_message", "record_failed_attempt", "reset_failed_attempts", "generate_recovery_codes", "verify_recovery_code", "set_password", "create_password_reset_token", "get_user_id_for_valid_token", "consume_password_reset_token", "TOKEN_TTL_MINUTES", "send_password_reset_email", "EmailNotConfiguredError", "update_profile", "count_admins", "delete_user", "update_email", "EmailUpdateError", "ensure_user_assets_schema", "user_assets_dir", "create_user_asset", "list_user_assets", "get_user_asset", "delete_user_asset", "save_user_asset", "user_asset_kind", "validate_audio_duration", "MAX_AUDIO_SECONDS", "validate_video_duration", "MAX_VIDEO_SECONDS", "image_dimensions", "update_user_asset_scene_kind", ]