maddy

Fork https://github.com/foxcpp/maddy

git clone git://git.lin.moe/go/maddy.git

 1/*
 2Maddy Mail Server - Composable all-in-one email server.
 3Copyright © 2019-2020 Max Mazurov <fox.cpp@disroot.org>, Maddy Mail Server contributors
 4
 5This program is free software: you can redistribute it and/or modify
 6it under the terms of the GNU General Public License as published by
 7the Free Software Foundation, either version 3 of the License, or
 8(at your option) any later version.
 9
10This program is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program.  If not, see <https://www.gnu.org/licenses/>.
17*/
18
19package table
20
21import (
22	"context"
23
24	"github.com/foxcpp/maddy/framework/address"
25	"github.com/foxcpp/maddy/framework/config"
26	"github.com/foxcpp/maddy/framework/module"
27)
28
29type EmailLocalpart struct {
30	modName       string
31	instName      string
32	allowNonEmail bool
33}
34
35func NewEmailLocalpart(modName, instName string, _, _ []string) (module.Module, error) {
36	return &EmailLocalpart{
37		modName:       modName,
38		instName:      instName,
39		allowNonEmail: modName == "table.email_localpart_optional",
40	}, nil
41}
42
43func (s *EmailLocalpart) Init(cfg *config.Map) error {
44	return nil
45}
46
47func (s *EmailLocalpart) Name() string {
48	return s.modName
49}
50
51func (s *EmailLocalpart) InstanceName() string {
52	return s.modName
53}
54
55func (s *EmailLocalpart) Lookup(ctx context.Context, key string) (string, bool, error) {
56	mbox, _, err := address.Split(key)
57	if err != nil {
58		if s.allowNonEmail {
59			return key, true, nil
60		}
61		// Invalid email, no local part mapping.
62		return "", false, nil
63	}
64	return mbox, true, nil
65}
66
67func init() {
68	module.Register("table.email_localpart", NewEmailLocalpart)
69	module.Register("table.email_localpart_optional", NewEmailLocalpart)
70}