diff --git a/chatmaild/src/chatmaild/config.py b/chatmaild/src/chatmaild/config.py index f3389898..815e29f1 100644 --- a/chatmaild/src/chatmaild/config.py +++ b/chatmaild/src/chatmaild/config.py @@ -1,3 +1,5 @@ +from pathlib import Path + import iniconfig @@ -25,10 +27,16 @@ class Config: self.privacy_mail = params.get("privacy_mail") self.privacy_pdo = params.get("privacy_pdo") self.privacy_supervisor = params.get("privacy_supervisor") + self.mail_basedir = Path(f"/home/vmail/mail/{self.mail_domain}") def _getbytefile(self): return open(self._inipath, "rb") + def get_user_maildir(self, addr): + if not addr or "/" in addr: + raise ValueError(addr) + return self.mail_basedir.joinpath(addr) + def write_initial_config(inipath, mail_domain): from importlib.resources import files diff --git a/chatmaild/src/chatmaild/doveauth.py b/chatmaild/src/chatmaild/doveauth.py index 51453f65..13a49de4 100644 --- a/chatmaild/src/chatmaild/doveauth.py +++ b/chatmaild/src/chatmaild/doveauth.py @@ -86,7 +86,7 @@ def lookup_userdb(db, config: Config, user): return get_user_data(db, config, user) -def lookup_passdb(db, config: Config, user, cleartext_password): +def lookup_passdb(db, config: Config, user, cleartext_password, last_login=None): if user == f"echo@{config.mail_domain}": # Echobot writes password it wants to log in with into /run/echobot/password try: @@ -102,12 +102,15 @@ def lookup_passdb(db, config: Config, user, cleartext_password): password=encrypt_password(password), ) + if last_login is None: + last_login = int(time.time()) + with db.write_transaction() as conn: userdata = conn.get_user(user) if userdata: # Update last login time. conn.execute( - "UPDATE users SET last_login=? WHERE addr=?", (int(time.time()), user) + "UPDATE users SET last_login=? WHERE addr=?", (last_login, user) ) userdata["home"] = f"/home/vmail/mail/{config.mail_domain}/{user}" @@ -120,7 +123,7 @@ def lookup_passdb(db, config: Config, user, cleartext_password): encrypted_password = encrypt_password(cleartext_password) q = """INSERT INTO users (addr, password, last_login) VALUES (?, ?, ?)""" - conn.execute(q, (user, encrypted_password, int(time.time()))) + conn.execute(q, (user, encrypted_password, last_login)) print(f"Created account {user}", file=sys.stderr) return dict( home=f"/home/vmail/mail/{config.mail_domain}/{user}", @@ -130,7 +133,7 @@ def lookup_passdb(db, config: Config, user, cleartext_password): ) -def iter_userdb(db, config: Config) -> list: +def iter_userdb(db) -> list: """Get a list of all user addresses.""" with db.read_connection() as conn: rows = conn.execute( @@ -139,6 +142,15 @@ def iter_userdb(db, config: Config) -> list: return [x[0] for x in rows] +def iter_userdb_lastlogin_before(db, cutoff_date): + """Get a list of users where last login was before cutoff_date.""" + with db.read_connection() as conn: + rows = conn.execute( + "SELECT addr FROM users WHERE last_login