1/*2Maddy Mail Server - Composable all-in-one email server.3Copyright © 2019-2020 Max Mazurov <fox.cpp@disroot.org>, Maddy Mail Server contributors45This program is free software: you can redistribute it and/or modify6it under the terms of the GNU General Public License as published by7the Free Software Foundation, either version 3 of the License, or8(at your option) any later version.910This program is distributed in the hope that it will be useful,11but WITHOUT ANY WARRANTY; without even the implied warranty of12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13GNU General Public License for more details.1415You should have received a copy of the GNU General Public License16along with this program. If not, see <https://www.gnu.org/licenses/>.17*/1819package table2021import (22 "context"2324 "github.com/foxcpp/maddy/framework/address"25 "github.com/foxcpp/maddy/framework/config"26 "github.com/foxcpp/maddy/framework/module"27)2829type EmailLocalpart struct {30 modName string31 instName string32 allowNonEmail bool33}3435func 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 }, nil41}4243func (s *EmailLocalpart) Init(cfg *config.Map) error {44 return nil45}4647func (s *EmailLocalpart) Name() string {48 return s.modName49}5051func (s *EmailLocalpart) InstanceName() string {52 return s.modName53}5455func (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, nil60 }61 // Invalid email, no local part mapping.62 return "", false, nil63 }64 return mbox, true, nil65}6667func init() {68 module.Register("table.email_localpart", NewEmailLocalpart)69 module.Register("table.email_localpart_optional", NewEmailLocalpart)70}