"""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 Nonce, User from passbook.lib.config import CONFIG LOGGER = get_logger() class Command(BaseCommand): """Create Nonce 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, nonce: Nonce) -> str: """Get full recovery link""" path = reverse("passbook_recovery:use-nonce", kwargs={"uuid": str(nonce.uuid)}) return f"https://{CONFIG.y('domain')}{path}" def handle(self, *args, **options): """Create Nonce 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")) nonce = Nonce.objects.create( expires=expiry, user=user, description=f"Recovery Nonce 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(nonce))