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	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}