]> git.ekhem.eu.org Git - server.git/commitdiff
[databases] Define email address book.
authorJakub Czajka <jakub@ekhem.eu.org>
Sat, 29 Oct 2022 08:26:48 +0000 (10:26 +0200)
committerJakub Czajka <jakub@ekhem.eu.org>
Sun, 3 Dec 2023 17:00:57 +0000 (18:00 +0100)
`dovecot` and `postfix` can lookup user addresses in a SQL
table. Adding a new address means adding a new record.

databases/README [new file with mode: 0644]
databases/mail/mail_db_create.sql [new file with mode: 0644]
databases/mail/mail_db_drop.sql [new file with mode: 0644]

diff --git a/databases/README b/databases/README
new file mode 100644 (file)
index 0000000..13334d8
--- /dev/null
@@ -0,0 +1,8 @@
+databases
+=========
+
+Files in this directory should be executed within an existing database.
+
+```
+psql --dbname=<database> --file=<file>
+```
diff --git a/databases/mail/mail_db_create.sql b/databases/mail/mail_db_create.sql
new file mode 100644 (file)
index 0000000..d826faa
--- /dev/null
@@ -0,0 +1,29 @@
+-- Copyright (c) 2022 Jakub Czajka <jakub@ekhem.eu.org>
+-- License: 0BSD.
+
+CREATE TABLE IF NOT EXISTS users (
+    username VARCHAR(128) NOT NULL,
+    domain VARCHAR(128) NOT NULL,
+    password VARCHAR(64) NOT NULL,
+    home VARCHAR(255) NOT NULL,
+    uid INTEGER NOT NULL,
+    gid INTEGER NOT NULL,
+    active CHAR(1) DEFAULT 'Y' NOT NULL
+);
+
+DO $$
+BEGIN
+    IF NOT EXISTS (SELECT * FROM pg_user WHERE usename = 'dovecot')
+    THEN
+        CREATE ROLE dovecot LOGIN;
+
+        GRANT SELECT
+       ON TABLE users
+       TO dovecot;
+
+        /* Execute for the current database. */
+       EXECUTE FORMAT('GRANT CONNECT
+                       ON DATABASE %I
+                       TO dovecot', current_database());
+    END IF;
+END$$;
diff --git a/databases/mail/mail_db_drop.sql b/databases/mail/mail_db_drop.sql
new file mode 100644 (file)
index 0000000..ba1f0cc
--- /dev/null
@@ -0,0 +1,21 @@
+-- Copyright (c) 2022 Jakub Czajka <jakub@ekhem.eu.org>
+-- License: 0BSD.
+
+DO $$
+BEGIN
+    IF EXISTS (SELECT * FROM pg_user WHERE usename = 'dovecot')
+    THEN
+        REVOKE SELECT
+       ON TABLE users
+       FROM dovecot;
+
+       EXECUTE
+            FORMAT('REVOKE CONNECT
+                   ON DATABASE %I
+                   FROM dovecot;', current_database());
+
+       DROP ROLE dovecot;
+    END IF;
+END$$;
+
+DROP TABLE IF EXISTS users;