1package config
2
3import (
4 "log"
5 "net/mail"
6
7 "github.com/charmbracelet/soft-serve/proto"
8 "github.com/charmbracelet/soft-serve/server/db/types"
9 "golang.org/x/crypto/ssh"
10)
11
12var _ proto.User = &user{}
13
14type user struct {
15 cfg *Config
16 user *types.User
17 keys []*types.PublicKey
18}
19
20func (u *user) Name() string {
21 if u.user == nil {
22 return ""
23 }
24 return u.user.Name
25}
26
27func (u *user) Email() *mail.Address {
28 if u.user == nil {
29 return nil
30 }
31 return u.user.Address()
32}
33
34func (u *user) Login() *string {
35 if u.user == nil {
36 return nil
37 }
38 return u.user.Login
39}
40
41func (u *user) Password() *string {
42 if u.user == nil {
43 return nil
44 }
45 return u.user.Password
46}
47
48func (u *user) IsAdmin() bool {
49 if u.user == nil {
50 return false
51 }
52 return u.user.Admin
53}
54
55func (u *user) PublicKeys() []ssh.PublicKey {
56 if u.user == nil {
57 return nil
58 }
59 keys := u.keys
60 if keys == nil || len(keys) == 0 {
61 ks, err := u.cfg.DB().GetUserPublicKeys(u.user)
62 if err != nil {
63 log.Printf("error getting public keys for %q: %v", u.Name(), err)
64 return nil
65 }
66 u.keys = ks
67 keys = ks
68 }
69 ks := make([]ssh.PublicKey, len(keys))
70 for i, k := range keys {
71 ks[i] = k
72 }
73 return ks
74}