"""passbook recovery createkey command""" from datetime import timedelta from getpass import getuser from django.core.management.base import BaseCommand from django.urls import reverse from django.utils.timezone import now from django.utils.translation import gettext as _ from structlog import get_logger from passbook.core.models import Token, TokenIntents, User from passbook.lib.config import CONFIG LOGGER = get_logger() class Command(BaseCommand): """Create Token used to recover access""" help = _("Create a Key which can be used to restore access to passbook.") def add_arguments(self, parser): parser.add_argument( "duration", default=1, action="store", help="How long the token is valid for (in years).", ) parser.add_argument( "user", action="store", help="Which user the Token gives access to." ) def get_url(self, token: Token) -> str: """Get full recovery link""" path = reverse( "passbook_recovery:use-token", kwargs={"uuid": str(token.token_uuid)} ) return f"https://{CONFIG.y('domain')}{path}" def handle(self, *args, **options): """Create Token used to recover access""" duration = int(options.get("duration", 1)) delta = timedelta(days=duration * 365.2425) _now = now() expiry = _now + delta user = User.objects.get(username=options.get("user")) token = Token.objects.create( expires=expiry, user=user, identifier="recovery", intent=TokenIntents.INTENT_RECOVERY, description=f"Recovery Token generated by {getuser()} on {_now}", ) self.stdout.write( ( f"Store this link safely, as it will allow" f" anyone to access passbook as {user}." ) ) self.stdout.write(self.get_url(token))