Skip to content

Commit 4fd736a

Browse files
committed
test: go: Add tests for no-local-verify and no-delegate
1 parent 5b248cf commit 4fd736a

File tree

2 files changed

+150
-15
lines changed

2 files changed

+150
-15
lines changed

smtp/server_dkim_test.go

Lines changed: 138 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ func newSigned(domain, selector, from, to, tool, body string) (io.Reader, error)
8484
}
8585

8686
func TestSigned(t *testing.T) {
87-
conn, s := setup(t, domain1)
87+
conn, s := setup(t, domain1, true, true)
8888
defer conn.Close()
8989

9090
assert(t, s.Mail(user1, nil))
@@ -106,7 +106,7 @@ func TestSigned(t *testing.T) {
106106
}
107107

108108
func TestNotSigned(t *testing.T) {
109-
conn, s := setup(t, domain1)
109+
conn, s := setup(t, domain1, true, true)
110110
defer conn.Close()
111111

112112
assert(t, s.Mail(user1, nil))
@@ -120,8 +120,28 @@ func TestNotSigned(t *testing.T) {
120120
assertSlicesEqual(t, nil, items)
121121
}
122122

123+
func TestLocalNotSigned(t *testing.T) {
124+
conn, s := setup(t, domain1, true, false)
125+
defer conn.Close()
126+
127+
assert(t, s.Mail(user1, nil))
128+
assert(t, s.Rcpt(to, nil))
129+
assert(t, s.Data(newPlain(user1, to, borrow+tool1, "")))
130+
131+
items := conn.GetItems()
132+
expected := []db.Item{
133+
{
134+
Location: db.Location{
135+
Tool: tool1,
136+
LastSeenBy: user1,
137+
},
138+
},
139+
}
140+
assertSlicesEqual(t, expected, items)
141+
}
142+
123143
func TestNoKey(t *testing.T) {
124-
conn, s := setup(t, domain1)
144+
conn, s := setup(t, domain1, true, true)
125145
defer conn.Close()
126146

127147
assert(t, s.Mail(user1, nil))
@@ -138,7 +158,7 @@ func TestNoKey(t *testing.T) {
138158
}
139159

140160
func TestBadDomain(t *testing.T) {
141-
conn, s := setup(t, domain1)
161+
conn, s := setup(t, domain1, true, true)
142162
defer conn.Close()
143163

144164
assert(t, s.Mail(user3, nil))
@@ -155,7 +175,7 @@ func TestBadDomain(t *testing.T) {
155175
}
156176

157177
func TestDelegate(t *testing.T) {
158-
conn, s := setup(t, domain1)
178+
conn, s := setup(t, domain1, true, true)
159179
defer conn.Close()
160180

161181
// Alias a new user@domain
@@ -209,3 +229,116 @@ func TestDelegate(t *testing.T) {
209229
t.Fatalf("Expected %v, got %v", mail.InvalidError, err)
210230
}
211231
}
232+
233+
func TestNoDelegate(t *testing.T) {
234+
conn, s := setup(t, domain1, false, true)
235+
defer conn.Close()
236+
237+
// Alias a new user@domain
238+
assert(t, s.Mail(user1, nil))
239+
assert(t, s.Rcpt(to, nil))
240+
userAlias := "User alias"
241+
r, err := newSigned(domain1, "valid", user1, to, alias+user3, userAlias)
242+
assert(t, err)
243+
assert(t, s.Data(r))
244+
245+
items := conn.GetItems()
246+
assertSlicesEqual(t, nil, items)
247+
if delegate := conn.GetDelegatedEmailFor(user3); delegate != user1 {
248+
t.Fatalf("Expecting delegate for %s to be %s, got %s", user3, user1, delegate)
249+
}
250+
251+
// Use new user@domain
252+
assert(t, s.Mail(user3, nil))
253+
assert(t, s.Rcpt(to, nil))
254+
r, err = newSigned(domain2, "valid", user3, to, borrow+tool1, "")
255+
assert(t, err)
256+
err = s.Data(r)
257+
if err != mail.InvalidError {
258+
t.Fatalf("Expected %v, got %v", mail.InvalidError, err)
259+
}
260+
261+
items = conn.GetItems()
262+
assertSlicesEqual(t, nil, items)
263+
264+
// Test that other users and domains still not valid
265+
assert(t, s.Mail(user4, nil))
266+
assert(t, s.Rcpt(to, nil))
267+
r, err = newSigned(domain2, "valid", user4, to, borrow+tool1, "")
268+
assert(t, err)
269+
err = s.Data(r)
270+
if err != mail.InvalidError {
271+
t.Fatalf("Expected %v, got %v", mail.InvalidError, err)
272+
}
273+
assert(t, s.Mail(user5, nil))
274+
assert(t, s.Rcpt(to, nil))
275+
r, err = newSigned(domain3, "valid", user5, to, borrow+tool1, "")
276+
assert(t, err)
277+
err = s.Data(r)
278+
if err != mail.InvalidError {
279+
t.Fatalf("Expected %v, got %v", mail.InvalidError, err)
280+
}
281+
}
282+
283+
func TestNoUnsignedDelegate(t *testing.T) {
284+
conn, s := setup(t, domain1, true, false)
285+
defer conn.Close()
286+
287+
// Alias a new user@domain -- unsigned
288+
assert(t, s.Mail(user1, nil))
289+
assert(t, s.Rcpt(to, nil))
290+
userAlias := "User alias"
291+
292+
assert(t, s.Data(newPlain(user1, to, alias+user3, userAlias)))
293+
294+
items := conn.GetItems()
295+
assertSlicesEqual(t, nil, items)
296+
if delegate := conn.GetDelegatedEmailFor(user3); delegate != user1 {
297+
t.Fatalf("Expecting delegate for %s to be %s, got %s", user3, user1, delegate)
298+
}
299+
300+
// Use signed user@domain
301+
assert(t, s.Mail(user3, nil))
302+
assert(t, s.Rcpt(to, nil))
303+
r, err := newSigned(domain2, "valid", user3, to, borrow+tool1, "")
304+
assert(t, err)
305+
assert(t, s.Data(r))
306+
307+
// Use plain user@domain
308+
assert(t, s.Mail(user3, nil))
309+
assert(t, s.Rcpt(to, nil))
310+
err = s.Data(newPlain(user3, to, borrow+tool1, ""))
311+
if err != mail.InvalidError {
312+
t.Fatalf("Expected %v, got %v", mail.InvalidError, err)
313+
}
314+
315+
items = conn.GetItems()
316+
expected := []db.Item{
317+
{
318+
Location: db.Location{
319+
Tool: tool1,
320+
LastSeenBy: user3,
321+
},
322+
Alias: &userAlias,
323+
},
324+
}
325+
assertSlicesEqual(t, expected, items)
326+
327+
// Test that other users and domains still not valid
328+
assert(t, s.Mail(user4, nil))
329+
assert(t, s.Rcpt(to, nil))
330+
r, err = newSigned(domain2, "valid", user4, to, borrow+tool1, "")
331+
assert(t, err)
332+
err = s.Data(r)
333+
if err != mail.InvalidError {
334+
t.Fatalf("Expected %v, got %v", mail.InvalidError, err)
335+
}
336+
assert(t, s.Mail(user5, nil))
337+
assert(t, s.Rcpt(to, nil))
338+
r, err = newSigned(domain3, "valid", user5, to, borrow+tool1, "")
339+
assert(t, err)
340+
err = s.Data(r)
341+
if err != mail.InvalidError {
342+
t.Fatalf("Expected %v, got %v", mail.InvalidError, err)
343+
}
344+
}

smtp/server_test.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func newPlain(from, to, tool, body string) io.Reader {
4848
return newMailStringReader(fmt.Sprintf(plainTemplate, from, to, tool, body))
4949
}
5050

51-
func setup(t *testing.T, dkim string) (db.DB, Session) {
51+
func setup(t *testing.T, dkim string, delegate, localDkim bool) (db.DB, Session) {
5252
conn, err := db.Open(fmt.Sprintf("file:%s?mode=memory&cache=shared", t.Name()))
5353
if err != nil {
5454
t.Fatal(err)
@@ -59,10 +59,12 @@ func setup(t *testing.T, dkim string) (db.DB, Session) {
5959
}
6060

6161
be := Backend{
62-
Db: conn,
63-
To: to,
64-
FromRe: fromRe,
65-
Dkim: dkim,
62+
Db: conn,
63+
To: to,
64+
FromRe: fromRe,
65+
Dkim: dkim,
66+
Delegate: delegate,
67+
LocalDkim: localDkim,
6668
}
6769

6870
s := Session{
@@ -99,7 +101,7 @@ func assertSlicesEqual[T fmt.Stringer](t *testing.T, expected []T, got []T) {
99101
}
100102

101103
func TestBorrowed(t *testing.T) {
102-
conn, s := setup(t, "")
104+
conn, s := setup(t, "", true, true)
103105
defer conn.Close()
104106

105107
assert(t, s.Mail(user1, nil))
@@ -119,7 +121,7 @@ func TestBorrowed(t *testing.T) {
119121
}
120122

121123
func TestBorrowedPlain(t *testing.T) {
122-
conn, s := setup(t, "")
124+
conn, s := setup(t, "", true, true)
123125
defer conn.Close()
124126

125127
assert(t, s.Mail(user1, nil))
@@ -140,7 +142,7 @@ func TestBorrowedPlain(t *testing.T) {
140142
}
141143

142144
func TestBorrowedHTML(t *testing.T) {
143-
conn, s := setup(t, "")
145+
conn, s := setup(t, "", true, true)
144146
defer conn.Close()
145147

146148
assert(t, s.Mail(user1, nil))
@@ -177,7 +179,7 @@ Content-Type: text/html; charset="utf-8"
177179
}
178180

179181
func TestBorrowedUpdate(t *testing.T) {
180-
conn, s := setup(t, "")
182+
conn, s := setup(t, "", true, true)
181183
defer conn.Close()
182184

183185
assert(t, s.Mail(user1, nil))
@@ -201,7 +203,7 @@ func TestBorrowedUpdate(t *testing.T) {
201203
}
202204

203205
func TestBorrowedMultiple(t *testing.T) {
204-
conn, s := setup(t, "")
206+
conn, s := setup(t, "", true, true)
205207
defer conn.Close()
206208

207209
err := s.Mail(user1, nil)

0 commit comments

Comments
 (0)