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  }