credential_base.go

 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}