package dkim import ( "bytes" "context" "crypto/rand" "os" "path" "testing" "postern/internal/db" "postern/internal/persistence" "go.turscar.ie/dkim2" ) type lookup struct { pubRecord string } func (l lookup) LookupTXT(_ context.Context, _ string) ([]string, error) { return []string{l.pubRecord}, nil } func TestSign(t *testing.T) { d := setupTestCommand(t) pubRecord, err := d.Add(t.Context(), "sel1", "example.com") if err != nil { t.Fatal(err) } err = d.SetEnabled(t.Context(), "sel1", "example.com", true) if err != nil { t.Fatal(err) } signedMessage, err := d.Sign(t.Context(), []byte(exampleMessage), "", []string{""}) if err != nil { t.Fatal(err) } result := dkim2.Verify(t.Context(), bytes.NewReader(signedMessage), dkim2.VerifyOptions{ IgnoreTimestamp: false, Resolver: lookup{pubRecord}, MailFrom: "", RcptTo: []string{""}, }) if result.Err != nil { t.Fatal(result.Err) } } func setupTestCommand(t *testing.T) *DKIM { t.Helper() f := t.TempDir() mkeyPath := path.Join(f, "masterkey") secretKey := make([]byte, 32) _, _ = rand.Read(secretKey) if err := os.WriteFile(mkeyPath, secretKey, 0666); err != nil { t.Fatal(err) } p, err := persistence.New(persistence.Config{ BlobRoot: path.Join(f, "blobs"), MasterkeyFile: mkeyPath, }) if err != nil { t.Fatal(err) } posternDB, err := db.OpenDB(&db.Config{ DBPath: path.Join(f, "meta.db"), }) if err != nil { t.Fatal(err) } dkim := New(&Config{ DB: posternDB, Persistence: p, }) return dkim } var exampleMessage = `Message-ID: From: "aw@example.com" To: Subject: Hello from Postern! Date: Sat, 18 Jun 2005 01:57:22 +0100 Hello test message. `