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 userId entity.Id
22 target string
23 createTime time.Time
24 Value string
25}
26
27// NewToken instantiate a new token
28func NewToken(userId entity.Id, value, target string) *Token {
29 return &Token{
30 userId: userId,
31 target: target,
32 createTime: time.Now(),
33 Value: value,
34 }
35}
36
37func NewTokenFromConfig(conf map[string]string) *Token {
38 token := &Token{}
39
40 token.userId = entity.Id(conf[configKeyUserId])
41 token.target = conf[configKeyTarget]
42 if createTime, ok := conf[configKeyCreateTime]; ok {
43 if t, err := repository.ParseTimestamp(createTime); err == nil {
44 token.createTime = t
45 }
46 }
47
48 token.Value = conf[tokenValueKey]
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) UserId() entity.Id {
59 return t.userId
60}
61
62func (t *Token) updateUserId(id entity.Id) {
63 t.userId = id
64}
65
66func (t *Token) Target() string {
67 return t.target
68}
69
70func (t *Token) Kind() CredentialKind {
71 return KindToken
72}
73
74func (t *Token) CreateTime() time.Time {
75 return t.createTime
76}
77
78// Validate ensure token important fields are valid
79func (t *Token) Validate() error {
80 if t.Value == "" {
81 return fmt.Errorf("missing value")
82 }
83 if t.target == "" {
84 return fmt.Errorf("missing target")
85 }
86 if t.createTime.IsZero() || t.createTime.Equal(time.Time{}) {
87 return fmt.Errorf("missing creation time")
88 }
89 if !core.TargetExist(t.target) {
90 return fmt.Errorf("unknown target")
91 }
92 return nil
93}
94
95func (t *Token) toConfig() map[string]string {
96 return map[string]string{
97 tokenValueKey: t.Value,
98 }
99}