summaryrefslogtreecommitdiff
path: root/yoshi/cli.py
diff options
context:
space:
mode:
authorChristian Cleberg <hello@cleberg.net>2024-11-06 23:23:27 -0600
committerChristian Cleberg <hello@cleberg.net>2024-11-06 23:23:27 -0600
commit6dde4dd0bc5e5f91f89587c75a30c9ef7a24494c (patch)
tree6cf4b78ddd63a4606e19fcad423ed2e19ad2a268 /yoshi/cli.py
parentb5a5fadff88615c8da8a9feb80c86fd8adb238f5 (diff)
downloadyoshi-cli-6dde4dd0bc5e5f91f89587c75a30c9ef7a24494c.tar.gz
yoshi-cli-6dde4dd0bc5e5f91f89587c75a30c9ef7a24494c.tar.bz2
yoshi-cli-6dde4dd0bc5e5f91f89587c75a30c9ef7a24494c.zip
package as a cli app
Diffstat (limited to 'yoshi/cli.py')
-rw-r--r--yoshi/cli.py136
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()