mirror of
https://github.com/mjl-/mox.git
synced 2025-07-14 06:54:37 +03:00
Allow multiple localpart catch all separators, e.g. both "+" and "-", for addresses you+anything@example.com and you-anything@example.com
The original config option stays, and we still use it for the common case where we have a single separator. The "+" is configured by default. It is optional, just like the new option "LocalpartCatchallSeparators" (plural). When parsing the config file, we combine LocalpartCatchallSeparator and LocalpartCatchallSeparators into a single list LocalpartCatchallSeparatorsEffective, which we use throughout the code. For issue #301 by janc13
This commit is contained in:
@ -2469,7 +2469,7 @@ func (c *conn) submit(ctx context.Context, recvHdrFor func(string) string, msgWr
|
||||
var genFromID bool
|
||||
if useFromID {
|
||||
// With submission, user can bring their own fromid.
|
||||
t := strings.SplitN(string(c.mailFrom.Localpart), confDom.LocalpartCatchallSeparator, 2)
|
||||
t := strings.SplitN(string(c.mailFrom.Localpart), confDom.LocalpartCatchallSeparatorsEffective[0], 2)
|
||||
localpartBase = t[0]
|
||||
if len(t) == 2 {
|
||||
fromID = t[1]
|
||||
@ -2500,7 +2500,7 @@ func (c *conn) submit(ctx context.Context, recvHdrFor func(string) string, msgWr
|
||||
if genFromID {
|
||||
fromID = xrandomID(16)
|
||||
}
|
||||
fp.Localpart = smtp.Localpart(localpartBase + confDom.LocalpartCatchallSeparator + fromID)
|
||||
fp.Localpart = smtp.Localpart(localpartBase + confDom.LocalpartCatchallSeparatorsEffective[0] + fromID)
|
||||
}
|
||||
|
||||
// For multiple recipients, we don't make each message prefix unique, leaving out
|
||||
|
@ -1494,12 +1494,13 @@ func TestCatchall(t *testing.T) {
|
||||
testDeliver("mjl@mox.example", nil) // Exact match.
|
||||
testDeliver("mjl+test@mox.example", nil) // Domain localpart catchall separator.
|
||||
testDeliver("MJL+TEST@mox.example", nil) // Again, and case insensitive.
|
||||
testDeliver("unknown@mox.example", nil) // Catchall address, to account catchall.
|
||||
|
||||
n, err := bstore.QueryDB[store.Message](ctxbg, ts.acc.DB).Count()
|
||||
tcheck(t, err, "checking delivered messages")
|
||||
tcompare(t, n, 3)
|
||||
|
||||
testDeliver("unknown@mox.example", nil) // Catchall address, to account catchall.
|
||||
|
||||
acc, err := store.OpenAccount(pkglog, "catchall", false)
|
||||
tcheck(t, err, "open account")
|
||||
defer func() {
|
||||
@ -1509,6 +1510,13 @@ func TestCatchall(t *testing.T) {
|
||||
n, err = bstore.QueryDB[store.Message](ctxbg, acc.DB).Count()
|
||||
tcheck(t, err, "checking delivered messages to catchall account")
|
||||
tcompare(t, n, 1)
|
||||
|
||||
testDeliver("mjl-test@mox2.example", nil) // Second catchall separator.
|
||||
testDeliver("mjl-test+test@mox2.example", nil) // Silly, both separators in address.
|
||||
testDeliver("mjl+test-test@mox2.example", nil)
|
||||
n, err = bstore.QueryDB[store.Message](ctxbg, ts.acc.DB).Count()
|
||||
tcheck(t, err, "checking delivered messages")
|
||||
tcompare(t, n, 6)
|
||||
}
|
||||
|
||||
// Test DKIM signing for outgoing messages.
|
||||
|
Reference in New Issue
Block a user