email_server: aliases: Minor refactoring

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
This commit is contained in:
Sunil Mohan Adapa 2021-10-14 19:00:58 -07:00 committed by James Valleroy
parent 6e8b825d44
commit 778d22ac49
No known key found for this signature in database
GPG Key ID: 77C0C75E7B650808
2 changed files with 58 additions and 53 deletions

View File

@ -9,38 +9,27 @@ from plinth import actions
from . import models 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 @contextlib.contextmanager
def db_cursor(): def _get_cursor():
"""Return a DB cursor as context manager."""
# Turn ON autocommit mode # Turn ON autocommit mode
con = sqlite3.connect(sqlite_db_path, isolation_level=None) db_path = '/var/lib/postfix/freedombox-aliases/aliases.sqlite3'
con.row_factory = sqlite3.Row connection = sqlite3.connect(db_path, isolation_level=None)
connection.row_factory = sqlite3.Row
try: try:
cur = con.cursor() cursor = connection.cursor()
yield cur yield cursor
finally: finally:
con.close() connection.close()
def get(uid_number): def get(uid_number):
s = 'SELECT * FROM Alias WHERE uid_number=?' """Get all aliases of a user."""
with db_cursor() as cur: query = 'SELECT * FROM Alias WHERE uid_number=?'
rows = cur.execute(s, (uid_number, )) with _get_cursor() as cursor:
result = [models.Alias(**r) for r in rows] rows = cursor.execute(query, (uid_number, ))
result = [models.Alias(**row) for row in rows]
return result return result
@ -52,53 +41,69 @@ def exists(email_name):
except KeyError: except KeyError:
pass pass
with db_cursor() as cur: with _get_cursor() as cursor:
query = 'SELECT COUNT(*) FROM Alias WHERE email_name=?' query = 'SELECT COUNT(*) FROM Alias WHERE email_name=?'
cur.execute(query, (email_name, )) cursor.execute(query, (email_name, ))
return cur.fetchone()[0] != 0 return cursor.fetchone()[0] != 0
def put(uid_number, email_name): def put(uid_number, email_name):
s = """INSERT INTO Alias(email_name, uid_number, status) """Insert if not exists a new alias."""
SELECT ?,?,? WHERE NOT EXISTS( query = '''
INSERT INTO Alias(email_name, uid_number, status)
SELECT ?,?,? WHERE NOT EXISTS (
SELECT 1 FROM Alias WHERE email_name=? 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): def delete(uid_number, alias_list):
s = 'DELETE FROM Alias WHERE uid_number=? AND email_name=?' """Delete a set of aliases."""
parameter_seq = ((uid_number, a) for a in alias_list) query = 'DELETE FROM Alias WHERE uid_number=? AND email_name=?'
with db_cursor() as cur: parameter_seq = ((uid_number, alias) for alias in alias_list)
cur.execute('BEGIN') with _get_cursor() as cursor:
cur.executemany(s, parameter_seq) cursor.execute('BEGIN')
cur.execute('COMMIT') 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) 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) return _set_status(uid_number, alias_list, 0)
def _set_status(uid_number, alias_list, status): def _set_status(uid_number, alias_list, status):
s = 'UPDATE Alias SET status=? WHERE uid_number=? AND email_name=?' """Set the status value of a list of aliases."""
parameter_seq = ((status, uid_number, a) for a in alias_list) query = 'UPDATE Alias SET status=? WHERE uid_number=? AND email_name=?'
with db_cursor() as cur: parameter_seq = ((status, uid_number, alias) for alias in alias_list)
cur.execute('BEGIN') with _get_cursor() as cursor:
cur.executemany(s, parameter_seq) cursor.execute('BEGIN')
cur.execute('COMMIT') cursor.executemany(query, parameter_seq)
cursor.execute('COMMIT')
def first_setup(): def first_setup():
"""Create the database file and schema inside it."""
actions.superuser_run('email_server', ['-i', 'aliases', 'setup']) 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 # Create schema if not exists
with db_cursor() as cur: query = '''
cur.executescript(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;
'''
with _get_cursor() as cursor:
cursor.executescript(query)

View File

@ -203,9 +203,9 @@ class AliasView(FormView):
if action == 'delete': if action == 'delete':
aliases_module.delete(uid, alias_list) aliases_module.delete(uid, alias_list)
elif action == 'disable': elif action == 'disable':
aliases_module.set_disabled(uid, alias_list) aliases_module.disable(uid, alias_list)
elif action == 'enable': elif action == 'enable':
aliases_module.set_enabled(uid, alias_list) aliases_module.enable(uid, alias_list)
def _create_form_valid(self, form): def _create_form_valid(self, form):
"""Handle a valid create alias form operation.""" """Handle a valid create alias form operation."""