Skip to content
Snippets Groups Projects
generate_keys.py 1.93 KiB
Newer Older
  • Learn to ignore specific revisions
  • from django.core.management.base import BaseCommand, CommandError
    from django.db import transaction
    
    from dynamic_preferences.registries import global_preferences_registry
    
    from funkwhale_api.federation import keys
    
    
    class Command(BaseCommand):
        help = (
            'Generate a public/private key pair for your instance,'
            ' for federation purposes. If a key pair already exists, does nothing.'
        )
    
        def add_arguments(self, parser):
            parser.add_argument(
                '--replace',
                action='store_true',
                dest='replace',
                default=False,
                help='Replace existing key pair, if any',
            )
            parser.add_argument(
                '--noinput', '--no-input', action='store_false', dest='interactive',
                help="Do NOT prompt the user for input of any kind.",
            )
    
        @transaction.atomic
        def handle(self, *args, **options):
            preferences = global_preferences_registry.manager()
            existing_public = preferences['federation__public_key']
            existing_private = preferences['federation__public_key']
    
            if existing_public or existing_private and not options['replace']:
                raise CommandError(
                    'Keys are already present! '
                    'Replace them with --replace if you know what you are doing.')
    
            if options['interactive']:
                message = (
                    'Are you sure you want to do this?\n\n'
                    "Type 'yes' to continue, or 'no' to cancel: "
                )
                if input(''.join(message)) != 'yes':
                    raise CommandError("Operation cancelled.")
            private, public = keys.get_key_pair()
            preferences['federation__public_key'] = public.decode('utf-8')
            preferences['federation__private_key'] = private.decode('utf-8')
    
            self.stdout.write(
                'Your new key pair was generated.'
                'Your public key is now:\n\n{}'.format(public.decode('utf-8'))
            )