1package auth
2
3import (
4 "crypto/sha256"
5 "fmt"
6 "time"
7
8 "github.com/MichaelMure/git-bug/bridge/core"
9 "github.com/MichaelMure/git-bug/entity"
10 "github.com/MichaelMure/git-bug/repository"
11)
12
13const (
14 tokenValueKey = "value"
15)
16
17var _ Credential = &Token{}
18
19// Token holds an API access token data
20type Token struct {
21 target string
22 createTime time.Time
23 Value string
24 meta map[string]string
25}
26
27// NewToken instantiate a new token
28func NewToken(value, target string) *Token {
29 return &Token{
30 target: target,
31 createTime: time.Now(),
32 Value: value,
33 }
34}
35
36func NewTokenFromConfig(conf map[string]string) *Token {
37 token := &Token{}
38
39 token.target = conf[configKeyTarget]
40 if createTime, ok := conf[configKeyCreateTime]; ok {
41 if t, err := repository.ParseTimestamp(createTime); err == nil {
42 token.createTime = t
43 }
44 }
45
46 token.Value = conf[tokenValueKey]
47 token.meta = metaFromConfig(conf)
48
49 return token
50}
51
52func (t *Token) ID() entity.Id {
53 sum := sha256.Sum256([]byte(t.target + t.Value))
54 return entity.Id(fmt.Sprintf("%x", sum))
55}
56
57func (t *Token) Target() string {
58 return t.target
59}
60
61func (t *Token) Kind() CredentialKind {
62 return KindToken
63}
64
65func (t *Token) CreateTime() time.Time {
66 return t.createTime
67}
68
69// Validate ensure token important fields are valid
70func (t *Token) Validate() error {
71 if t.Value == "" {
72 return fmt.Errorf("missing value")
73 }
74 if t.target == "" {
75 return fmt.Errorf("missing target")
76 }
77 if t.createTime.IsZero() || t.createTime.Equal(time.Time{}) {
78 return fmt.Errorf("missing creation time")
79 }
80 if !core.TargetExist(t.target) {
81 return fmt.Errorf("unknown target")
82 }
83 return nil
84}
85
86func (t *Token) Metadata() map[string]string {
87 return t.meta
88}
89
90func (t *Token) GetMetadata(key string) (string, bool) {
91 val, ok := t.meta[key]
92 return val, ok
93}
94
95func (t *Token) SetMetadata(key string, value string) {
96 if t.meta == nil {
97 t.meta = make(map[string]string)
98 }
99 t.meta[key] = value
100}
101
102func (t *Token) toConfig() map[string]string {
103 return map[string]string{
104 tokenValueKey: t.Value,
105 }
106}