user.go

 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}