all repos — postern @ fc287763b9ce6b6f9823e11c0b1173da0446ebc5

Modern mail management

internal/db/dkim.go (view raw)

 1package db
 2
 3import (
 4	"context"
 5	"database/sql"
 6	"strings"
 7	"time"
 8
 9	"postern/internal/model"
10)
11
12// GetDKIMForDomain deterministically returns the first enabled selector for the given domain
13func (db *DB) GetDKIMForDomain(ctx context.Context, domain string) (model.DKIM, error) {
14	row := db.read.QueryRowContext(
15		ctx,
16		`SELECT id, selector, blob_address, key_type FROM dkim WHERE domain = ? AND enabled = 1 ORDER BY selector LIMIT 1`, domain)
17	var d model.DKIM
18	err := row.Scan(&d.ID, &d.Selector, &d.BlobAddress, &d.KeyType)
19	return d, err
20}
21
22func (db *DB) GetDKIMForSelectorDomain(ctx context.Context, selector, domain string) (model.DKIM, error) {
23	domain = strings.TrimSuffix(domain, ".")
24	row := db.read.QueryRowContext(
25		ctx,
26		`SELECT id, selector, blob_address, key_type, enabled FROM dkim WHERE domain = ? AND selector = ?`, domain, selector)
27	if row.Err() != nil {
28		return model.DKIM{}, row.Err()
29	}
30
31	var d model.DKIM
32	var enabledToggle int
33	err := row.Scan(&d.ID, &d.Selector, &d.BlobAddress, &d.KeyType, &enabledToggle)
34	if err != nil {
35		return model.DKIM{}, err
36	}
37	if enabledToggle == 1 {
38		d.Enabled = true
39	}
40	return d, nil
41}
42
43func (db *DB) ListDKIM(ctx context.Context) ([]model.DKIM, error) {
44	rows, err := db.read.QueryContext(
45		ctx,
46		`SELECT id, domain, selector, blob_address, key_type, enabled FROM dkim ORDER BY domain, selector, key_type, enabled DESC`)
47	if err != nil {
48		return nil, err
49	}
50	defer func(rows *sql.Rows) {
51		_ = rows.Close()
52	}(rows)
53
54	out := make([]model.DKIM, 0)
55	for rows.Next() {
56		var d model.DKIM
57		var enabledToggle int
58		err = rows.Scan(&d.ID, &d.Domain, &d.Selector, &d.BlobAddress, &d.KeyType, &enabledToggle)
59		if err != nil {
60			return nil, err
61		}
62		if enabledToggle == 1 {
63			d.Enabled = true
64		}
65		out = append(out, d)
66	}
67	return out, nil
68}
69
70func (db *DB) SetDKIMEnabled(ctx context.Context, selector, domain string, enabled bool) error {
71	enableToggle := 0
72	if enabled {
73		enableToggle = 1
74	}
75	_, err := db.write.ExecContext(
76		ctx,
77		`UPDATE dkim SET enabled = ? WHERE domain = ? AND selector = ?`, enableToggle, domain, selector)
78	return err
79}
80
81func (db *DB) InsertDKIMForDomain(ctx context.Context, d model.DKIM) error {
82	_, err := db.write.ExecContext(
83		ctx, `
84INSERT INTO dkim (domain, selector, blob_address, key_type, created_at, enabled)
85VALUES (?, ?, ?, ?, ?, ?)`, d.Domain, d.Selector, d.BlobAddress, d.KeyType, time.Now().Unix(), d.Enabled)
86	return err
87}
88
89func RemoveDKIM(ctx context.Context, tx *sql.Tx, selector, domain string) error {
90	domain = strings.TrimSuffix(domain, ".")
91	_, err := tx.ExecContext(ctx, `DELETE FROM dkim WHERE domain = ? AND selector = ?`, domain, selector)
92	return err
93}