102 lines
2.2 KiB
Go
102 lines
2.2 KiB
Go
package storage
|
|
|
|
import (
|
|
"crypto/rsa"
|
|
"encoding/json"
|
|
"os"
|
|
"strings"
|
|
|
|
"golang.org/x/text/language"
|
|
)
|
|
|
|
type User struct {
|
|
ID string
|
|
Username string
|
|
Password string
|
|
FirstName string
|
|
LastName string
|
|
Email string
|
|
EmailVerified bool
|
|
Phone string
|
|
PhoneVerified bool
|
|
PreferredLanguage language.Tag
|
|
IsAdmin bool
|
|
}
|
|
|
|
type Service struct {
|
|
keys map[string]*rsa.PublicKey
|
|
}
|
|
|
|
type UserStore interface {
|
|
GetUserByID(string) *User
|
|
GetUserByUsername(string) *User
|
|
ExampleClientID() string
|
|
}
|
|
|
|
type userStore struct {
|
|
users map[string]*User
|
|
}
|
|
|
|
func StoreFromFile(path string) (UserStore, error) {
|
|
users := map[string]*User{}
|
|
data, err := os.ReadFile(path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if err := json.Unmarshal(data, &users); err != nil {
|
|
return nil, err
|
|
}
|
|
return userStore{users}, nil
|
|
}
|
|
|
|
func NewUserStore(issuer string) UserStore {
|
|
hostname := strings.Split(strings.Split(issuer, "://")[1], ":")[0]
|
|
return userStore{
|
|
users: map[string]*User{
|
|
"id1": {
|
|
ID: "id1",
|
|
Username: "test-user@" + hostname,
|
|
Password: "verysecure",
|
|
FirstName: "Test",
|
|
LastName: "User",
|
|
Email: "test-user@zitadel.ch",
|
|
EmailVerified: true,
|
|
Phone: "",
|
|
PhoneVerified: false,
|
|
PreferredLanguage: language.German,
|
|
IsAdmin: true,
|
|
},
|
|
"id2": {
|
|
ID: "id2",
|
|
Username: "test-user2",
|
|
Password: "verysecure",
|
|
FirstName: "Test",
|
|
LastName: "User2",
|
|
Email: "test-user2@zitadel.ch",
|
|
EmailVerified: true,
|
|
Phone: "",
|
|
PhoneVerified: false,
|
|
PreferredLanguage: language.German,
|
|
IsAdmin: false,
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
// ExampleClientID is only used in the example server
|
|
func (u userStore) ExampleClientID() string {
|
|
return "service"
|
|
}
|
|
|
|
func (u userStore) GetUserByID(id string) *User {
|
|
return u.users[id]
|
|
}
|
|
|
|
func (u userStore) GetUserByUsername(username string) *User {
|
|
for _, user := range u.users {
|
|
if user.Username == username {
|
|
return user
|
|
}
|
|
}
|
|
return nil
|
|
}
|