internal/dkim/sign_test.go (view raw)
1package dkim
2
3import (
4 "bytes"
5 "context"
6 "crypto/rand"
7 "os"
8 "path"
9 "testing"
10
11 "postern/internal/db"
12 "postern/internal/persistence"
13
14 "go.turscar.ie/dkim2"
15)
16
17type lookup struct {
18 pubRecord string
19}
20
21func (l lookup) LookupTXT(_ context.Context, _ string) ([]string, error) {
22 return []string{l.pubRecord}, nil
23}
24
25func TestSign(t *testing.T) {
26 d := setupTestCommand(t)
27
28 pubRecord, err := d.Add(t.Context(), "sel1", "example.com")
29 if err != nil {
30 t.Fatal(err)
31 }
32 err = d.SetEnabled(t.Context(), "sel1", "example.com", true)
33 if err != nil {
34 t.Fatal(err)
35 }
36
37 signedMessage, err := d.Sign(t.Context(), []byte(exampleMessage), "<raphael@example.com>", []string{"<someone@example.net>"})
38 if err != nil {
39 t.Fatal(err)
40 }
41
42 result := dkim2.Verify(t.Context(), bytes.NewReader(signedMessage), dkim2.VerifyOptions{
43 IgnoreTimestamp: false,
44 Resolver: lookup{pubRecord},
45 MailFrom: "<raphael@example.com>",
46 RcptTo: []string{"<someone@example.net>"},
47 })
48
49 if result.Err != nil {
50 t.Fatal(result.Err)
51 }
52}
53
54func setupTestCommand(t *testing.T) *DKIM {
55 t.Helper()
56 f := t.TempDir()
57
58 mkeyPath := path.Join(f, "masterkey")
59 secretKey := make([]byte, 32)
60 _, _ = rand.Read(secretKey)
61 if err := os.WriteFile(mkeyPath, secretKey, 0666); err != nil {
62 t.Fatal(err)
63 }
64
65 p, err := persistence.New(persistence.Config{
66 BlobRoot: path.Join(f, "blobs"),
67 MasterkeyFile: mkeyPath,
68 })
69 if err != nil {
70 t.Fatal(err)
71 }
72
73 posternDB, err := db.OpenDB(&db.Config{
74 DBPath: path.Join(f, "meta.db"),
75 })
76 if err != nil {
77 t.Fatal(err)
78 }
79
80 dkim := New(&Config{
81 DB: posternDB,
82 Persistence: p,
83 })
84 return dkim
85}
86
87var exampleMessage = `Message-ID: <WIULIIOKPTXYAOVEIXQJJ@p25.dev>
88From: "aw@example.com" <aw@example.com>
89To: <raphael@p25.dev>
90Subject: Hello from Postern!
91Date: Sat, 18 Jun 2005 01:57:22 +0100
92
93Hello test message.
94`