maddy

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

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

 1package authz
 2
 3import (
 4	"context"
 5	"fmt"
 6
 7	"github.com/foxcpp/maddy/framework/address"
 8	"github.com/foxcpp/maddy/framework/module"
 9)
10
11func AuthorizeEmailUse(ctx context.Context, username string, addrs []string, mapping module.Table) (bool, error) {
12	var validEmails []string
13
14	if multi, ok := mapping.(module.MultiTable); ok {
15		var err error
16		validEmails, err = multi.LookupMulti(ctx, username)
17		if err != nil {
18			return false, fmt.Errorf("authz: %w", err)
19		}
20	} else {
21		validEmail, ok, err := mapping.Lookup(ctx, username)
22		if err != nil {
23			return false, fmt.Errorf("authz: %w", err)
24		}
25		if ok {
26			validEmails = []string{validEmail}
27		}
28	}
29
30	for _, addr := range addrs {
31		_, domain, err := address.Split(addr)
32		if err != nil {
33			return false, fmt.Errorf("authz: %w", err)
34		}
35
36		for _, ent := range validEmails {
37			if ent == domain || ent == "*" || ent == addr {
38				return true, nil
39			}
40		}
41	}
42
43	return false, nil
44}