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) Target() string {
63 return t.target
64}
65
66func (t *Token) Kind() CredentialKind {
67 return KindToken
68}
69
70func (t *Token) CreateTime() time.Time {
71 return t.createTime
72}
73
74// Validate ensure token important fields are valid
75func (t *Token) Validate() error {
76 if t.Value == "" {
77 return fmt.Errorf("missing value")
78 }
79 if t.target == "" {
80 return fmt.Errorf("missing target")
81 }
82 if t.createTime.IsZero() || t.createTime.Equal(time.Time{}) {
83 return fmt.Errorf("missing creation time")
84 }
85 if !core.TargetExist(t.target) {
86 return fmt.Errorf("unknown target")
87 }
88 return nil
89}
90
91func (t *Token) ToConfig() map[string]string {
92 return map[string]string{
93 tokenValueKey: t.Value,
94 }
95}