~bigbes/core-go

ref: 3a272385626b6accfbb9a46b473ad1ff6e7642d3 core-go/auth/bearer_test.go -rw-r--r-- 2.3 KiB
3a272385 — Drew DeVault webhooks: add query validation function 5 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package auth

import (
	"encoding/base64"
	"strings"
	"testing"
	"time"

	"git.sr.ht/~sircmpwn/go-bare"
	"github.com/stretchr/testify/assert"
	"github.com/vaughan0/go-ini"

	"git.sr.ht/~sircmpwn/core-go/crypto"
)

func init() {
	config, err := ini.Load(strings.NewReader(`
[webhooks]
private-key=ebzsjPaN6E13ln/FeNWly1C92q6bVMVdOnDo1HPl5fc=

[sr.ht]
network-key=tbuG-7Vh44vrDq1L_HKWkHnWrDOtJhEkPKPiauaLeuk=`))
	if err != nil {
		panic(err)
	}
	crypto.InitCrypto(config)
}

func TestEncode(t *testing.T) {
	bt := &BearerToken{
		Version:  TokenVersion,
		Expires:  ToTimestamp(time.Now().Add(30 * time.Minute)),
		Grants:   "",
		ClientID: "",
		Username: "jdoe",
	}
	token := bt.Encode()
	bytes, err := base64.RawStdEncoding.DecodeString(token)
	assert.Nil(t, err)

	mac := bytes[len(bytes)-32:]
	payload := bytes[:len(bytes)-32]
	assert.True(t, crypto.BearerVerify(payload, mac))

	var bt2 BearerToken
	err = bare.Unmarshal(payload, &bt2)
	assert.Nil(t, err)
	assert.Equal(t, bt.Version, bt2.Version)
	assert.Equal(t, bt.Expires, bt2.Expires)
	assert.Equal(t, bt.Grants, bt2.Grants)
	assert.Equal(t, bt.ClientID, bt2.ClientID)
	assert.Equal(t, bt.Username, bt2.Username)
}

func TestDecode(t *testing.T) {
	bt := &BearerToken{
		Version:  TokenVersion,
		Expires:  ToTimestamp(time.Now().Add(30 * time.Minute)),
		Grants:   "",
		ClientID: "",
		Username: "jdoe",
	}
	token := bt.Encode()
	bt2 := DecodeBearerToken(token)
	assert.NotNil(t, bt2)
	assert.Equal(t, bt.Version, bt2.Version)
	assert.Equal(t, bt.Expires, bt2.Expires)
	assert.Equal(t, bt.Grants, bt2.Grants)
	assert.Equal(t, bt.ClientID, bt2.ClientID)
	assert.Equal(t, bt.Username, bt2.Username)

	// Expired token:
	bt = &BearerToken{
		Version:  TokenVersion,
		Expires:  ToTimestamp(time.Now().Add(-30 * time.Minute)),
		Grants:   "",
		ClientID: "",
		Username: "jdoe",
	}
	token = bt.Encode()
	bt2 = DecodeBearerToken(token)
	assert.Nil(t, bt2)

	// Invalid MAC:
	bt = &BearerToken{
		Version:  TokenVersion,
		Expires:  ToTimestamp(time.Now().Add(30 * time.Minute)),
		Grants:   "",
		ClientID: "",
		Username: "jdoe",
	}
	plain, err := bare.Marshal(bt)
	assert.Nil(t, err)
	mac := crypto.BearerHMAC(plain)
	bt.Username = "rdoe"
	plain, err = bare.Marshal(bt)
	assert.Nil(t, err)
	token = base64.RawStdEncoding.EncodeToString(append(plain, mac...))
	bt2 = DecodeBearerToken(token)
	assert.Nil(t, bt2)
}