github.com/wrgl/wrgl@v0.14.0/pkg/auth/test/authn.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright © 2022 Wrangle Ltd 3 4 package authtest 5 6 import ( 7 "encoding/base64" 8 "encoding/json" 9 "fmt" 10 "net/http" 11 "sort" 12 13 "github.com/wrgl/wrgl/pkg/auth" 14 ) 15 16 type AuthnStore struct { 17 pass map[string]string 18 name map[string]string 19 } 20 21 func NewAuthnStore() *AuthnStore { 22 return &AuthnStore{ 23 pass: map[string]string{}, 24 name: map[string]string{}, 25 } 26 } 27 28 func (s *AuthnStore) SetName(email, name string) error { 29 s.name[email] = name 30 return nil 31 } 32 33 func (s *AuthnStore) SetPassword(email, password string) error { 34 s.pass[email] = password 35 return nil 36 } 37 38 func (s *AuthnStore) Authenticate(email, password string) (token string, err error) { 39 if v, ok := s.pass[email]; ok && v == password { 40 b, err := json.Marshal(&auth.Claims{ 41 Email: email, 42 Name: s.name[email], 43 }) 44 if err != nil { 45 return "", err 46 } 47 return base64.RawStdEncoding.EncodeToString(b), nil 48 } 49 return "", fmt.Errorf("email/password invalid") 50 } 51 52 func (s *AuthnStore) CheckToken(r *http.Request, token string) (*http.Request, *auth.Claims, error) { 53 c := &auth.Claims{} 54 b, err := base64.RawStdEncoding.DecodeString(token) 55 if err != nil { 56 return r, nil, err 57 } 58 if err := json.Unmarshal([]byte(b), c); err != nil { 59 return r, nil, err 60 } 61 if _, ok := s.pass[c.Email]; ok { 62 return r, c, nil 63 } 64 return r, nil, fmt.Errorf("invalid token") 65 } 66 67 func (s *AuthnStore) RemoveUser(email string) error { 68 delete(s.pass, email) 69 return nil 70 } 71 72 func (s *AuthnStore) Flush() error { 73 return nil 74 } 75 76 func (s *AuthnStore) ListUsers() (users [][]string, err error) { 77 users = make([][]string, len(s.pass)) 78 for email, name := range s.name { 79 users = append(users, []string{email, name}) 80 } 81 sort.Slice(users, func(i, j int) bool { 82 return users[i][0] < users[j][0] 83 }) 84 return users, nil 85 } 86 87 func (s *AuthnStore) Exist(email string) bool { 88 _, ok := s.pass[email] 89 return ok 90 }