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) {
ot := &OAuth2Token{
Version: TokenVersion,
Expires: ToTimestamp(time.Now().Add(30 * time.Minute)),
Grants: "",
ClientID: "",
Username: "jdoe",
}
token := ot.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.HMACVerify(payload, mac))
var ot2 OAuth2Token
err = bare.Unmarshal(payload, &ot2)
assert.Nil(t, err)
assert.Equal(t, ot.Version, ot2.Version)
assert.Equal(t, ot.Expires, ot2.Expires)
assert.Equal(t, ot.Grants, ot2.Grants)
assert.Equal(t, ot.ClientID, ot2.ClientID)
assert.Equal(t, ot.Username, ot2.Username)
}
func TestDecode(t *testing.T) {
ot := &OAuth2Token{
Version: TokenVersion,
Expires: ToTimestamp(time.Now().Add(30 * time.Minute)),
Grants: "",
ClientID: "",
Username: "jdoe",
}
token := ot.Encode()
ot2 := DecodeToken(token)
assert.NotNil(t, ot2)
assert.Equal(t, ot.Version, ot2.Version)
assert.Equal(t, ot.Expires, ot2.Expires)
assert.Equal(t, ot.Grants, ot2.Grants)
assert.Equal(t, ot.ClientID, ot2.ClientID)
assert.Equal(t, ot.Username, ot2.Username)
// Expired token:
ot = &OAuth2Token{
Version: TokenVersion,
Expires: ToTimestamp(time.Now().Add(-30 * time.Minute)),
Grants: "",
ClientID: "",
Username: "jdoe",
}
token = ot.Encode()
ot2 = DecodeToken(token)
assert.Nil(t, ot2)
// Invalid MAC:
ot = &OAuth2Token{
Version: TokenVersion,
Expires: ToTimestamp(time.Now().Add(30 * time.Minute)),
Grants: "",
ClientID: "",
Username: "jdoe",
}
plain, err := bare.Marshal(ot)
assert.Nil(t, err)
mac := crypto.HMAC(plain)
ot.Username = "rdoe"
plain, err = bare.Marshal(ot)
assert.Nil(t, err)
token = base64.RawStdEncoding.EncodeToString(append(plain, mac...))
ot2 = DecodeToken(token)
assert.Nil(t, ot2)
}