18func NewUserMap(usersFile string, done <-chan bool, onUpdate func()) *UserMap {
19 um := &UserMap{usersFile: usersFile}
20 m := make(map[string]bool)
21 atomic.StorePointer(&um.m, unsafe.Pointer(&m))
23 log.Printf("using authenticated emails file %s", usersFile)
24 WatchForUpdates(usersFile, done, func() {
25 um.LoadAuthenticatedEmailsFile()
28 um.LoadAuthenticatedEmailsFile()
33func (um *UserMap) IsValid(email string) (result bool) {
34 m := *(*map[string]bool)(atomic.LoadPointer(&um.m))
39func (um *UserMap) LoadAuthenticatedEmailsFile() {
40 r, err := os.Open(um.usersFile)
42 log.Fatalf("failed opening authenticated-emails-file=%q, %s", um.usersFile, err)
45 csv_reader := csv.NewReader(r)
46 csv_reader.Comma = ','
47 csv_reader.Comment = '#'
48 csv_reader.TrimLeadingSpace = true
49 records, err := csv_reader.ReadAll()
51 log.Printf("error reading authenticated-emails-file=%q, %s", um.usersFile, err)
54 updated := make(map[string]bool)
55 for _, r := range records {
56 address := strings.ToLower(strings.TrimSpace(r[0]))
57 updated[address] = true
59 atomic.StorePointer(&um.m, unsafe.Pointer(&updated))
62func newValidatorImpl(domains []string, usersFile string,
63 done <-chan bool, onUpdate func()) func(string) bool {
64 validUsers := NewUserMap(usersFile, done, onUpdate)
67 for i, domain := range domains {
72 domains[i] = fmt.Sprintf("@%s", strings.ToLower(domain))
75 validator := func(email string) (valid bool) {
79 email = strings.ToLower(email)
80 for _, domain := range domains {
81 valid = valid || strings.HasSuffix(email, domain)
84 valid = validUsers.IsValid(email)
94func NewValidator(domains []string, usersFile string) func(string) bool {
95 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