diff --git a/plinth/modules/email_server/aliases/__init__.py b/plinth/modules/email_server/aliases/__init__.py index 206409056..a1db8a6c7 100644 --- a/plinth/modules/email_server/aliases/__init__.py +++ b/plinth/modules/email_server/aliases/__init__.py @@ -9,38 +9,27 @@ from plinth import actions from . import models -map_db_schema_script = """ -PRAGMA journal_mode=WAL; -BEGIN; -CREATE TABLE IF NOT EXISTS Alias ( - email_name TEXT NOT NULL, - uid_number INTEGER NOT NULL, - status INTEGER NOT NULL, - PRIMARY KEY (email_name) -); -COMMIT; -""" - -sqlite_db_path = '/var/lib/postfix/freedombox-aliases/aliases.sqlite3' - @contextlib.contextmanager -def db_cursor(): +def _get_cursor(): + """Return a DB cursor as context manager.""" # Turn ON autocommit mode - con = sqlite3.connect(sqlite_db_path, isolation_level=None) - con.row_factory = sqlite3.Row + db_path = '/var/lib/postfix/freedombox-aliases/aliases.sqlite3' + connection = sqlite3.connect(db_path, isolation_level=None) + connection.row_factory = sqlite3.Row try: - cur = con.cursor() - yield cur + cursor = connection.cursor() + yield cursor finally: - con.close() + connection.close() def get(uid_number): - s = 'SELECT * FROM Alias WHERE uid_number=?' - with db_cursor() as cur: - rows = cur.execute(s, (uid_number, )) - result = [models.Alias(**r) for r in rows] + """Get all aliases of a user.""" + query = 'SELECT * FROM Alias WHERE uid_number=?' + with _get_cursor() as cursor: + rows = cursor.execute(query, (uid_number, )) + result = [models.Alias(**row) for row in rows] return result @@ -52,53 +41,69 @@ def exists(email_name): except KeyError: pass - with db_cursor() as cur: + with _get_cursor() as cursor: query = 'SELECT COUNT(*) FROM Alias WHERE email_name=?' - cur.execute(query, (email_name, )) - return cur.fetchone()[0] != 0 + cursor.execute(query, (email_name, )) + return cursor.fetchone()[0] != 0 def put(uid_number, email_name): - s = """INSERT INTO Alias(email_name, uid_number, status) - SELECT ?,?,? WHERE NOT EXISTS( + """Insert if not exists a new alias.""" + query = ''' +INSERT INTO Alias(email_name, uid_number, status) + SELECT ?,?,? WHERE NOT EXISTS ( SELECT 1 FROM Alias WHERE email_name=? - )""" - with db_cursor() as cur: - cur.execute(s, (email_name, uid_number, 1, email_name)) + ) +''' + with _get_cursor() as cursor: + cursor.execute(query, (email_name, uid_number, 1, email_name)) def delete(uid_number, alias_list): - s = 'DELETE FROM Alias WHERE uid_number=? AND email_name=?' - parameter_seq = ((uid_number, a) for a in alias_list) - with db_cursor() as cur: - cur.execute('BEGIN') - cur.executemany(s, parameter_seq) - cur.execute('COMMIT') + """Delete a set of aliases.""" + query = 'DELETE FROM Alias WHERE uid_number=? AND email_name=?' + parameter_seq = ((uid_number, alias) for alias in alias_list) + with _get_cursor() as cursor: + cursor.execute('BEGIN') + cursor.executemany(query, parameter_seq) + cursor.execute('COMMIT') -def set_enabled(uid_number, alias_list): +def enable(uid_number, alias_list): + """Enable a list of aliases.""" return _set_status(uid_number, alias_list, 1) -def set_disabled(uid_number, alias_list): +def disable(uid_number, alias_list): + """Disable a list of aliases.""" return _set_status(uid_number, alias_list, 0) def _set_status(uid_number, alias_list, status): - s = 'UPDATE Alias SET status=? WHERE uid_number=? AND email_name=?' - parameter_seq = ((status, uid_number, a) for a in alias_list) - with db_cursor() as cur: - cur.execute('BEGIN') - cur.executemany(s, parameter_seq) - cur.execute('COMMIT') + """Set the status value of a list of aliases.""" + query = 'UPDATE Alias SET status=? WHERE uid_number=? AND email_name=?' + parameter_seq = ((status, uid_number, alias) for alias in alias_list) + with _get_cursor() as cursor: + cursor.execute('BEGIN') + cursor.executemany(query, parameter_seq) + cursor.execute('COMMIT') def first_setup(): + """Create the database file and schema inside it.""" actions.superuser_run('email_server', ['-i', 'aliases', 'setup']) - _create_db_schema_if_not_exists() - -def _create_db_schema_if_not_exists(): # Create schema if not exists - with db_cursor() as cur: - cur.executescript(map_db_schema_script) + query = ''' +PRAGMA journal_mode=WAL; +BEGIN; +CREATE TABLE IF NOT EXISTS Alias ( + email_name TEXT NOT NULL, + uid_number INTEGER NOT NULL, + status INTEGER NOT NULL, + PRIMARY KEY (email_name) +); +COMMIT; +''' + with _get_cursor() as cursor: + cursor.executescript(query) diff --git a/plinth/modules/email_server/views.py b/plinth/modules/email_server/views.py index 0d47b18f9..a3fc9bb18 100644 --- a/plinth/modules/email_server/views.py +++ b/plinth/modules/email_server/views.py @@ -203,9 +203,9 @@ class AliasView(FormView): if action == 'delete': aliases_module.delete(uid, alias_list) elif action == 'disable': - aliases_module.set_disabled(uid, alias_list) + aliases_module.disable(uid, alias_list) elif action == 'enable': - aliases_module.set_enabled(uid, alias_list) + aliases_module.enable(uid, alias_list) def _create_form_valid(self, form): """Handle a valid create alias form operation."""