""" 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)