token.go

 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}