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 meta: make(map[string]string),
34 }
35}
36
37func NewTokenFromConfig(conf map[string]string) *Token {
38 token := &Token{}
39
40 token.target = conf[configKeyTarget]
41 if createTime, ok := conf[configKeyCreateTime]; ok {
42 if t, err := repository.ParseTimestamp(createTime); err == nil {
43 token.createTime = t
44 }
45 }
46
47 token.Value = conf[tokenValueKey]
48 token.meta = metaFromConfig(conf)
49
50 return token
51}
52
53func (t *Token) ID() entity.Id {
54 sum := sha256.Sum256([]byte(t.target + t.Value))
55 return entity.Id(fmt.Sprintf("%x", sum))
56}
57
58func (t *Token) Target() string {
59 return t.target
60}
61
62func (t *Token) Kind() CredentialKind {
63 return KindToken
64}
65
66func (t *Token) CreateTime() time.Time {
67 return t.createTime
68}
69
70// Validate ensure token important fields are valid
71func (t *Token) Validate() error {
72 if t.Value == "" {
73 return fmt.Errorf("missing value")
74 }
75 if t.target == "" {
76 return fmt.Errorf("missing target")
77 }
78 if t.createTime.IsZero() || t.createTime.Equal(time.Time{}) {
79 return fmt.Errorf("missing creation time")
80 }
81 if !core.TargetExist(t.target) {
82 return fmt.Errorf("unknown target")
83 }
84 return nil
85}
86
87func (t *Token) Metadata() map[string]string {
88 return t.meta
89}
90
91func (t *Token) toConfig() map[string]string {
92 return map[string]string{
93 tokenValueKey: t.Value,
94 }
95}