24a3e787dd
* *: migrate to per-model UUID Primary key, remove UUIDModel * *: fix import order, fix unittests
59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
"""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, 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,
|
|
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))
|