1package auth
2
3import (
4 "fmt"
5 "time"
6
7 "github.com/MichaelMure/git-bug/bridge/core"
8 "github.com/MichaelMure/git-bug/repository"
9)
10
11type credentialBase struct {
12 target string
13 createTime time.Time
14 salt []byte
15 meta map[string]string
16}
17
18func newCredentialBase(target string) *credentialBase {
19 return &credentialBase{
20 target: target,
21 createTime: time.Now(),
22 salt: makeSalt(),
23 }
24}
25
26func newCredentialBaseFromConfig(conf map[string]string) (*credentialBase, error) {
27 base := &credentialBase{
28 target: conf[configKeyTarget],
29 meta: metaFromConfig(conf),
30 }
31
32 if createTime, ok := conf[configKeyCreateTime]; ok {
33 t, err := repository.ParseTimestamp(createTime)
34 if err != nil {
35 return nil, err
36 }
37 base.createTime = t
38 } else {
39 return nil, fmt.Errorf("missing create time")
40 }
41
42 salt, err := saltFromConfig(conf)
43 if err != nil {
44 return nil, err
45 }
46 base.salt = salt
47
48 return base, nil
49}
50
51func (cb *credentialBase) Target() string {
52 return cb.target
53}
54
55func (cb *credentialBase) CreateTime() time.Time {
56 return cb.createTime
57}
58
59func (cb *credentialBase) Salt() []byte {
60 return cb.salt
61}
62
63func (cb *credentialBase) validate() error {
64 if cb.target == "" {
65 return fmt.Errorf("missing target")
66 }
67 if cb.createTime.IsZero() || cb.createTime.Equal(time.Time{}) {
68 return fmt.Errorf("missing creation time")
69 }
70 if !core.TargetExist(cb.target) {
71 return fmt.Errorf("unknown target")
72 }
73 return nil
74}
75
76func (cb *credentialBase) Metadata() map[string]string {
77 return cb.meta
78}
79
80func (cb *credentialBase) GetMetadata(key string) (string, bool) {
81 val, ok := cb.meta[key]
82 return val, ok
83}
84
85func (cb *credentialBase) SetMetadata(key string, value string) {
86 if cb.meta == nil {
87 cb.meta = make(map[string]string)
88 }
89 cb.meta[key] = value
90}