mirror of
https://github.com/mjl-/mox.git
synced 2025-07-10 07:54:40 +03:00
implement outgoing dmarc aggregate reporting
in smtpserver, we store dmarc evaluations (under the right conditions). in dmarcdb, we periodically (hourly) send dmarc reports if there are evaluations. for failed deliveries, we deliver the dsn quietly to a submailbox of the postmaster mailbox. this is on by default, but can be disabled in mox.conf.
This commit is contained in:
@ -97,9 +97,12 @@ possibly making them potentially no longer readable by the previous version.
|
||||
|
||||
// Check a database file by opening it with BoltDB and bstore and lightly checking
|
||||
// its contents.
|
||||
checkDB := func(path string, types []any) {
|
||||
checkDB := func(required bool, path string, types []any) {
|
||||
_, err := os.Stat(path)
|
||||
checkf(err, path, "checking if file exists")
|
||||
if !required && err != nil && errors.Is(err, fs.ErrNotExist) {
|
||||
return
|
||||
}
|
||||
checkf(err, path, "checking if database file exists")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@ -156,7 +159,7 @@ possibly making them potentially no longer readable by the previous version.
|
||||
|
||||
checkQueue := func() {
|
||||
dbpath := filepath.Join(dataDir, "queue/index.db")
|
||||
checkDB(dbpath, queue.DBTypes)
|
||||
checkDB(true, dbpath, queue.DBTypes)
|
||||
|
||||
// Check that all messages present in the database also exist on disk.
|
||||
seen := map[string]struct{}{}
|
||||
@ -222,12 +225,12 @@ possibly making them potentially no longer readable by the previous version.
|
||||
// Check an account, with its database file and messages.
|
||||
checkAccount := func(name string) {
|
||||
accdir := filepath.Join(dataDir, "accounts", name)
|
||||
checkDB(filepath.Join(accdir, "index.db"), store.DBTypes)
|
||||
checkDB(true, filepath.Join(accdir, "index.db"), store.DBTypes)
|
||||
|
||||
jfdbpath := filepath.Join(accdir, "junkfilter.db")
|
||||
jfbloompath := filepath.Join(accdir, "junkfilter.bloom")
|
||||
if exists(jfdbpath) || exists(jfbloompath) {
|
||||
checkDB(jfdbpath, junk.DBTypes)
|
||||
checkDB(true, jfdbpath, junk.DBTypes)
|
||||
}
|
||||
// todo: add some kind of check for the bloom filter?
|
||||
|
||||
@ -399,7 +402,7 @@ possibly making them potentially no longer readable by the previous version.
|
||||
p = p[len(dataDir)+1:]
|
||||
}
|
||||
switch p {
|
||||
case "dmarcrpt.db", "mtasts.db", "tlsrpt.db", "receivedid.key", "lastknownversion":
|
||||
case "dmarcrpt.db", "dmarceval.db", "mtasts.db", "tlsrpt.db", "receivedid.key", "lastknownversion":
|
||||
return nil
|
||||
case "acme", "queue", "accounts", "tmp", "moved":
|
||||
return fs.SkipDir
|
||||
@ -417,9 +420,10 @@ possibly making them potentially no longer readable by the previous version.
|
||||
checkf(err, dataDir, "walking data directory")
|
||||
}
|
||||
|
||||
checkDB(filepath.Join(dataDir, "dmarcrpt.db"), dmarcdb.DBTypes)
|
||||
checkDB(filepath.Join(dataDir, "mtasts.db"), mtastsdb.DBTypes)
|
||||
checkDB(filepath.Join(dataDir, "tlsrpt.db"), tlsrptdb.DBTypes)
|
||||
checkDB(true, filepath.Join(dataDir, "dmarcrpt.db"), dmarcdb.ReportsDBTypes)
|
||||
checkDB(false, filepath.Join(dataDir, "dmarceval.db"), dmarcdb.EvalDBTypes) // After v0.0.7.
|
||||
checkDB(true, filepath.Join(dataDir, "mtasts.db"), mtastsdb.DBTypes)
|
||||
checkDB(true, filepath.Join(dataDir, "tlsrpt.db"), tlsrptdb.DBTypes)
|
||||
checkQueue()
|
||||
checkAccounts()
|
||||
checkOther()
|
||||
|
Reference in New Issue
Block a user