import os import click from sqlalchemy.exc import IntegrityError from sqlalchemy import select from l4d2web.auth import hash_password from l4d2web.db import session_scope from l4d2web.models import User @click.command("promote-admin") @click.argument("username") def promote_admin(username: str) -> None: with session_scope() as db: user = db.scalar(select(User).where(User.username == username)) if user is None: raise click.ClickException("user not found") user.admin = True @click.command("create-user") @click.argument("username") @click.option("--admin", is_flag=True, default=False) def create_user(username: str, admin: bool) -> None: password = os.getenv("LEFT4ME_ADMIN_PASSWORD") if password is None: password = click.prompt("Password", hide_input=True, confirmation_prompt=True) if password == "": raise click.ClickException("password must not be empty") try: with session_scope() as db: existing = db.scalar(select(User).where(User.username == username)) if existing is not None: raise click.ClickException("user already exists") db.add(User(username=username, password_digest=hash_password(password), admin=admin)) except IntegrityError as exc: raise click.ClickException("user already exists") from exc click.echo(f"created user {username}") def register_cli(app) -> None: app.cli.add_command(promote_admin) app.cli.add_command(create_user)