From c7e5d9fbec9418d856be961358e35f603bbbf523 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Wed, 6 Nov 2024 21:52:32 -0600 Subject: configure as pypi hosted app --- src/database.py | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 src/database.py (limited to 'src/database.py') diff --git a/src/database.py b/src/database.py new file mode 100644 index 0000000..e1e2e78 --- /dev/null +++ b/src/database.py @@ -0,0 +1,125 @@ +""" +This module provides a basic interface for connecting to and interacting with a SQLite database. +It includes functions for creating connections, executing queries, and retrieving results. +""" + +import sqlite3 +import sys +import os + +VAULT_DECRYPTED = 'vault.sqlite' +VAULT_ENCRYPTED = 'vault.sqlite.aes' + + +def create_table() -> None: + """Create the accounts table within the vault database.""" + db_connection = sqlite3.connect(VAULT_DECRYPTED) + cursor = db_connection.cursor() + cursor.execute( + ''' CREATE TABLE IF NOT EXISTS accounts (uuid text, application text, + username text, password text, url text) ''' + ) + db_connection.commit() + db_connection.close() + + +def check_table() -> bool: + """Check if the 'accounts' table exists within the vault database.""" + check = False + db_connection = sqlite3.connect(VAULT_DECRYPTED) + cursor = db_connection.cursor() + cursor.execute( + ''' SELECT count(name) FROM sqlite_master WHERE type='table' + AND name='accounts' ''' + ) + if cursor.fetchone()[0] != 1: + user_choice = input( + 'Password vault does not exist. Would you like to create it now? (y/n): ') + if user_choice.lower() == 'y': + create_table() + check = True + else: + sys.exit('Program aborted upon user request.') + else: + check = True + db_connection.commit() + db_connection.close() + return check + + +def add_account(uuid: str, application: str, username: str, password: str, + url: str) -> None: + """Add a new account within the vault database.""" + db_connection = sqlite3.connect(VAULT_DECRYPTED) + cursor = db_connection.cursor() + cursor.execute( + ''' INSERT INTO accounts VALUES (:uuid,:application,:username, + :password,:url) ''', { + 'uuid': uuid, 'application': application, 'username': username, + 'password': password, 'url': url + } + ) + db_connection.commit() + db_connection.close() + + +def delete_account(uuid: str) -> None: + """Delete an account within the vault database by its unique ID.""" + db_connection = sqlite3.connect(VAULT_DECRYPTED) + cursor = db_connection.cursor() + cursor.execute( + ''' DELETE FROM accounts WHERE uuid = :uuid ''', {'uuid': uuid} + ) + db_connection.commit() + db_connection.close() + + +def find_account(uuid: str) -> list: + """Find an account within the vault database by its unique ID.""" + db_connection = sqlite3.connect(VAULT_DECRYPTED) + cursor = db_connection.cursor() + cursor.execute( + ''' SELECT * FROM accounts WHERE uuid = :uuid ''', {'uuid': uuid} + ) + account = cursor.fetchall() + db_connection.close() + return account + + +def find_accounts() -> list: + """Return all accounts stored within the vault database.""" + db_connection = sqlite3.connect(VAULT_DECRYPTED) + cursor = db_connection.cursor() + cursor.execute(''' SELECT * FROM accounts ''') + accounts = cursor.fetchall() + db_connection.close() + return accounts + + +def update_account(field_name: str, new_value: str, uuid: str) -> None: + """Update an account within the vault database by its unique ID.""" + queries = { + 'application': 'UPDATE accounts SET application = :new_value WHERE uuid = :uuid', + 'username': 'UPDATE accounts SET username = :new_value WHERE uuid = :uuid', + 'password': 'UPDATE accounts SET password = :new_value WHERE uuid = :uuid', + 'url': 'UPDATE accounts SET url = :new_value WHERE uuid = :uuid' + } + db_connection = sqlite3.connect(VAULT_DECRYPTED) + cursor = db_connection.cursor() + cursor.execute(queries[field_name], {'new_value': new_value, 'uuid': uuid}) + db_connection.commit() + db_connection.close() + + +def purge_table() -> None: + """Purge the 'accounts' table within the vault database.""" + db_connection = sqlite3.connect(VAULT_DECRYPTED) + cursor = db_connection.cursor() + cursor.execute(''' DROP TABLE accounts ''') + db_connection.commit() + db_connection.close() + + +def purge_database() -> None: + """Purge the entire vault database.""" + os.remove(VAULT_DECRYPTED) -- cgit v1.2.3-70-g09d2