12 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/logger"
15// UserMap holds information from the authenticated emails file
21// NewUserMap parses the authenticated emails file into a new UserMap
23// TODO (@NickMeves): Audit usage of `unsafe.Pointer` and potentially refactor
24func NewUserMap(usersFile string, done <-chan bool, onUpdate func()) *UserMap {
25 um := &UserMap{usersFile: usersFile}
26 m := make(map[string]bool)
27 atomic.StorePointer(&um.m, unsafe.Pointer(&m)) // #nosec G103
29 logger.Printf("using authenticated emails file %s", usersFile)
30 WatchForUpdates(usersFile, done, func() {
31 um.LoadAuthenticatedEmailsFile()
34 um.LoadAuthenticatedEmailsFile()
39// IsValid checks if an email is allowed
40func (um *UserMap) IsValid(email string) (result bool) {
41 m := *(*map[string]bool)(atomic.LoadPointer(&um.m))
46// LoadAuthenticatedEmailsFile loads the authenticated emails file from disk
47// and parses the contents as CSV
48func (um *UserMap) LoadAuthenticatedEmailsFile() {
49 r, err := os.Open(um.usersFile)
51 logger.Fatalf("failed opening authenticated-emails-file=%q, %s", um.usersFile, err)
53 defer func(c io.Closer) {
56 logger.Fatalf("Error closing authenticated emails file: %s", cerr)
59 csvReader := csv.NewReader(r)
61 csvReader.Comment = '#'
62 csvReader.TrimLeadingSpace = true
63 records, err := csvReader.ReadAll()
65 logger.Errorf("error reading authenticated-emails-file=%q, %s", um.usersFile, err)
68 updated := make(map[string]bool)
69 for _, r := range records {
70 address := strings.ToLower(strings.TrimSpace(r[0]))
71 updated[address] = true
73 atomic.StorePointer(&um.m, unsafe.Pointer(&updated)) // #nosec G103
76func newValidatorImpl(domains []string, usersFile string,
77 done <-chan bool, onUpdate func()) func(string) bool {
78 validUsers := NewUserMap(usersFile, done, onUpdate)
81 for i, domain := range domains {
86 domains[i] = fmt.Sprintf("@%s", strings.ToLower(domain))
89 validator := func(email string) (valid bool) {
93 email = strings.ToLower(email)
94 for _, domain := range domains {
95 valid = valid || strings.HasSuffix(email, domain)
98 valid = validUsers.IsValid(email)
108// NewValidator constructs a function to validate email addresses
109func NewValidator(domains []string, usersFile string) func(string) bool {
110 return newValidatorImpl(domains, usersFile, nil, func() {})
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list