diff options
Diffstat (limited to 'yoshi/cli.py')
-rw-r--r-- | yoshi/cli.py | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/yoshi/cli.py b/yoshi/cli.py new file mode 100644 index 0000000..56abae7 --- /dev/null +++ b/yoshi/cli.py @@ -0,0 +1,136 @@ +""" +This script uses argparse to parse command line arguments. + +It imports the required modules and sets up a parser with basic options for demonstration purposes. +""" + +import argparse +import yoshi.crypto as crypto +import yoshi.database as database +import yoshi.process as process + +def yoshi(): + parser = argparse.ArgumentParser( + description='Manage your username and passwords via a convenient CLI vault.' + ) + + # Top-level arguments + group_one = parser.add_mutually_exclusive_group() + group_one.add_argument( + '-n', '--new', + help='Create a new account.', + action='store_true' + ) + group_one.add_argument( + '-l', '--list', + help='List all saved accounts.', + action='store_true' + ) + group_one.add_argument( + '-e', '--edit', + help='Edit a saved account.', + action='store_true' + ) + group_one.add_argument( + '-d', '--delete', + help='Delete a saved account.', + action='store_true' + ) + group_one.add_argument( + '--purge', + help=( + 'Purge all accounts and delete the vault. ' + '(Caution: this will irreversibly destroy your data.)' + ), + action='store_true' + ) + group_one.add_argument( + '--encrypt', + help='Encrypt the vault.', + action='store_true' + ) + group_one.add_argument( + '--decrypt', + help='Decrypt the vault.', + action='store_true' + ) + + # Encryption flags + group_two = parser.add_mutually_exclusive_group() + group_two.add_argument( + '-g', '--generate', + help=( + 'When using the --encrypt option, generate a new encryption key.' + ), + action='store_true' + ) + group_two.add_argument( + '-k', '--keyfile', + help='Path to existing key file.', + action='store', + nargs=1, + type=str + ) + + # Edit flags + group_three = parser.add_argument_group() + group_three.add_argument( + '-u', '--uuid', + help=( + 'When using the --edit or --delete options, provide the account UUID.' + ), + action='store', + nargs=1, + type=str + ) + group_three.add_argument( + '-f', '--field', + help=( + 'When using the --edit option, specify the field to edit (integer index).' + ), + action='store', + nargs=1, + type=int + ) + + args = parser.parse_args() + + if args.decrypt: + if args.keyfile: + key = crypto.load_key(args.keyfile[0]) + else: + key = input('Please enter your decryption key: ') + crypto.decrypt(key) + elif args.encrypt: + if args.generate: + key = crypto.generate_key() + print( + 'WRITE THIS KEY DOWN SOMEWHERE SAFE. YOU WILL NOT BE ABLE TO DECRYPT ' + 'YOUR DATA WITHOUT IT!' + ) + print(key.decode()) + print('\n') + else: + if args.keyfile: + key = crypto.load_key(args.keyfile[0]) + else: + key = input('Please enter your encryption key: ') + crypto.encrypt(key) + elif database.check_table(): + if args.new: + process.create_account() + elif args.list: + process.list_accounts() + elif args.edit: + process.edit_account(args.uuid[0], args.field[0]) + elif args.delete: + process.delete_account(args.uuid[0]) + elif args.purge: + process.purge_accounts() + else: + raise TypeError( + 'Please specify a command or use the --help flag for more information.' + ) + +if __name__ == "__main__": + yoshi() |