Compare commits

...

16 Commits

Author SHA1 Message Date
Christian Hagenest
3e934bdea4 add entry point for rm_accounts in pyproject.toml 2024-07-08 17:28:13 +02:00
Christian Hagenest
3f197695d9 rm unnecessary round() 2024-07-08 17:24:01 +02:00
Christian Hagenest
8ad72deeb2 remove unused imports in rm_accounts.py 2024-07-08 17:22:19 +02:00
Christian Hagenest
ea817a2088 rmtree => ignore_errors = True 2024-07-08 14:35:15 +02:00
Christian Hagenest
d9bf2b57a5 rename dir to vmail_basedir 2024-07-08 14:35:15 +02:00
Christian Hagenest
b4b0a098d1 use with db.write_transaction() 2024-07-08 14:35:15 +02:00
Christian Hagenest
410eae3be4 rm unecessary round in doveatuh 2024-07-08 14:35:15 +02:00
Christian Hagenest
7bc3b11594 Update grammar for doc string in chatmail.ini for delete_accounts_after
Co-authored-by: holger krekel  <holger@merlinux.eu>
2024-07-08 14:32:02 +02:00
Christian Hagenest
7bcf027837 set delete_accounts after to 25 to be under gdpr limit of 30 2024-07-08 13:00:59 +02:00
Christian Hagenest
64de63815d ruff again :) 2024-06-26 16:05:51 +02:00
Christian Hagenest
07802569ef ruff 2024-06-26 15:11:37 +02:00
Christian Hagenest
a77e03c8a1 WIP rm_accounts.py 2024-06-20 17:30:35 +02:00
Christian Hagenest
7f5ae11591 rm comment 2024-06-20 16:53:01 +02:00
Christian Hagenest
a5a486e8c5 Merge branch 'main' into hagi/#295-remove-old-accounts 2024-06-20 16:46:46 +02:00
Christian Hagenest
1a50e5b783 new config option: delete_accounts_after 2024-06-20 16:42:27 +02:00
Christian Hagenest
06f3bbf6cd round login-time in doveauth 2024-06-20 16:42:05 +02:00
6 changed files with 44 additions and 3 deletions

View File

@@ -26,6 +26,7 @@ chatmail-metadata = "chatmaild.metadata:main"
filtermail = "chatmaild.filtermail:main"
echobot = "chatmaild.echo:main"
chatmail-metrics = "chatmaild.metrics:main"
rm_accounts = "chatmaild.rm_accounts:main"
[project.entry-points.pytest11]
"chatmaild.testplugin" = "chatmaild.tests.plugin"

View File

@@ -13,6 +13,7 @@ class Config:
self.max_user_send_per_minute = int(params["max_user_send_per_minute"])
self.max_mailbox_size = params["max_mailbox_size"]
self.delete_mails_after = params["delete_mails_after"]
self.delete_accounts_after = int(params["delete_accounts_after"])
self.username_min_length = int(params["username_min_length"])
self.username_max_length = int(params["username_max_length"])
self.password_min_length = int(params["password_min_length"])

View File

@@ -106,7 +106,8 @@ def lookup_passdb(db, config: Config, user, cleartext_password):
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=?",
(int(time.time() // 86400), user),
)
userdata["home"] = f"/home/vmail/mail/{config.mail_domain}/{user}"

View File

@@ -20,6 +20,9 @@ max_mailbox_size = 100M
# days after which mails are unconditionally deleted
delete_mails_after = 20
# days after which accounts are deleted if nobody logged in
delete_accounts_after = 25
# minimum length a username must have
username_min_length = 9

View File

@@ -0,0 +1,37 @@
import sys
import time
import shutil
from pathlib import Path
from .config import read_config
from .database import Database
def remove_users(db: Database, cutoff_date: int):
with db.write_transaction() as conn:
delete_query = "DELETE FROM users WHERE last_login <?"
conn.execute(delete_query, (cutoff_date))
def remove_user_data(db: Database, cutoff_date: int, vmail_basedir: Path):
"""Collects all users where last_login < cutoff_date and deletes corresponding directories."""
with db.write_transaction() as conn:
select_query = "SELECT user FROM users WHERE last_login <?"
cursor = conn.execute(select_query, (cutoff_date,))
usernames = cursor.fetchall()
for username in usernames:
user_dir = vmail_basedir / username[0]
if user_dir.exists() and user_dir.is_dir():
shutil.rmtree(user_dir, ignore_errors=True)
print(f"Deleted directory: {user_dir}")
def main():
db = Database(sys.argv[2])
config = read_config(sys.argv[3])
today = int(time.time() // 86400)
cutoff_date = today - config.delete_accounts_after
remove_user_data(db, cutoff_date)

View File

@@ -649,5 +649,3 @@ def deploy_chatmail(config_path: Path) -> None:
name="Ensure cron is installed",
packages=["cron"],
)