2021-09-01 09:38:56 -05:00
|
|
|
//go:build integration
|
2020-10-16 02:46:14 -05:00
|
|
|
// +build integration
|
|
|
|
|
2015-02-13 08:55:32 -06:00
|
|
|
package sqlstore
|
|
|
|
|
|
|
|
import (
|
2021-04-28 06:30:09 -05:00
|
|
|
"context"
|
2015-02-13 08:55:32 -06:00
|
|
|
"testing"
|
2019-06-26 01:47:03 -05:00
|
|
|
"time"
|
2020-04-29 14:37:21 -05:00
|
|
|
|
|
|
|
"github.com/grafana/grafana/pkg/models"
|
|
|
|
"github.com/stretchr/testify/assert"
|
2015-02-13 08:55:32 -06:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestApiKeyDataAccess(t *testing.T) {
|
2019-06-26 01:47:03 -05:00
|
|
|
mockTimeNow()
|
|
|
|
defer resetTimeNow()
|
2015-02-13 08:55:32 -06:00
|
|
|
|
2019-06-26 01:47:03 -05:00
|
|
|
t.Run("Testing API Key data access", func(t *testing.T) {
|
2015-02-13 08:55:32 -06:00
|
|
|
InitTestDB(t)
|
|
|
|
|
2019-06-26 01:47:03 -05:00
|
|
|
t.Run("Given saved api key", func(t *testing.T) {
|
|
|
|
cmd := models.AddApiKeyCommand{OrgId: 1, Name: "hello", Key: "asd"}
|
2015-02-13 08:55:32 -06:00
|
|
|
err := AddApiKey(&cmd)
|
2019-06-26 01:47:03 -05:00
|
|
|
assert.Nil(t, err)
|
2015-02-13 08:55:32 -06:00
|
|
|
|
2019-06-26 01:47:03 -05:00
|
|
|
t.Run("Should be able to get key by name", func(t *testing.T) {
|
|
|
|
query := models.GetApiKeyByNameQuery{KeyName: "hello", OrgId: 1}
|
2015-02-26 10:23:28 -06:00
|
|
|
err = GetApiKeyByName(&query)
|
2015-02-13 08:55:32 -06:00
|
|
|
|
2019-06-26 01:47:03 -05:00
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.NotNil(t, query.Result)
|
2015-02-13 08:55:32 -06:00
|
|
|
})
|
|
|
|
})
|
2019-06-26 01:47:03 -05:00
|
|
|
|
|
|
|
t.Run("Add non expiring key", func(t *testing.T) {
|
|
|
|
cmd := models.AddApiKeyCommand{OrgId: 1, Name: "non-expiring", Key: "asd1", SecondsToLive: 0}
|
|
|
|
err := AddApiKey(&cmd)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
|
|
|
query := models.GetApiKeyByNameQuery{KeyName: "non-expiring", OrgId: 1}
|
|
|
|
err = GetApiKeyByName(&query)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
|
|
|
assert.Nil(t, query.Result.Expires)
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("Add an expiring key", func(t *testing.T) {
|
2020-09-22 09:22:19 -05:00
|
|
|
// expires in one hour
|
2019-06-26 01:47:03 -05:00
|
|
|
cmd := models.AddApiKeyCommand{OrgId: 1, Name: "expiring-in-an-hour", Key: "asd2", SecondsToLive: 3600}
|
|
|
|
err := AddApiKey(&cmd)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
|
|
|
query := models.GetApiKeyByNameQuery{KeyName: "expiring-in-an-hour", OrgId: 1}
|
|
|
|
err = GetApiKeyByName(&query)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
|
|
|
assert.True(t, *query.Result.Expires >= timeNow().Unix())
|
|
|
|
|
|
|
|
// timeNow() has been called twice since creation; once by AddApiKey and once by GetApiKeyByName
|
2020-04-29 14:37:21 -05:00
|
|
|
// therefore two seconds should be subtracted by next value returned by timeNow()
|
2019-06-26 01:47:03 -05:00
|
|
|
// that equals the number by which timeSeed has been advanced
|
|
|
|
then := timeNow().Add(-2 * time.Second)
|
|
|
|
expected := then.Add(1 * time.Hour).UTC().Unix()
|
|
|
|
assert.Equal(t, *query.Result.Expires, expected)
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("Add a key with negative lifespan", func(t *testing.T) {
|
2020-09-22 09:22:19 -05:00
|
|
|
// expires in one day
|
2019-06-26 01:47:03 -05:00
|
|
|
cmd := models.AddApiKeyCommand{OrgId: 1, Name: "key-with-negative-lifespan", Key: "asd3", SecondsToLive: -3600}
|
|
|
|
err := AddApiKey(&cmd)
|
|
|
|
assert.EqualError(t, err, models.ErrInvalidApiKeyExpiration.Error())
|
|
|
|
|
|
|
|
query := models.GetApiKeyByNameQuery{KeyName: "key-with-negative-lifespan", OrgId: 1}
|
|
|
|
err = GetApiKeyByName(&query)
|
2020-11-05 06:07:06 -06:00
|
|
|
assert.EqualError(t, err, "invalid API key")
|
2019-06-26 01:47:03 -05:00
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("Add keys", func(t *testing.T) {
|
2020-09-22 09:22:19 -05:00
|
|
|
// never expires
|
2019-06-26 01:47:03 -05:00
|
|
|
cmd := models.AddApiKeyCommand{OrgId: 1, Name: "key1", Key: "key1", SecondsToLive: 0}
|
|
|
|
err := AddApiKey(&cmd)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
2020-09-22 09:22:19 -05:00
|
|
|
// expires in 1s
|
2019-06-26 01:47:03 -05:00
|
|
|
cmd = models.AddApiKeyCommand{OrgId: 1, Name: "key2", Key: "key2", SecondsToLive: 1}
|
|
|
|
err = AddApiKey(&cmd)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
2020-09-22 09:22:19 -05:00
|
|
|
// expires in one hour
|
2019-06-26 01:47:03 -05:00
|
|
|
cmd = models.AddApiKeyCommand{OrgId: 1, Name: "key3", Key: "key3", SecondsToLive: 3600}
|
|
|
|
err = AddApiKey(&cmd)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
|
|
|
// advance mocked getTime by 1s
|
|
|
|
timeNow()
|
|
|
|
|
2019-11-20 05:14:57 -06:00
|
|
|
query := models.GetApiKeysQuery{OrgId: 1, IncludeExpired: false}
|
2019-06-26 01:47:03 -05:00
|
|
|
err = GetApiKeys(&query)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
|
|
|
for _, k := range query.Result {
|
|
|
|
if k.Name == "key2" {
|
|
|
|
t.Fatalf("key2 should not be there")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-11-20 05:14:57 -06:00
|
|
|
query = models.GetApiKeysQuery{OrgId: 1, IncludeExpired: true}
|
2019-06-26 01:47:03 -05:00
|
|
|
err = GetApiKeys(&query)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
|
|
|
found := false
|
|
|
|
for _, k := range query.Result {
|
|
|
|
if k.Name == "key2" {
|
|
|
|
found = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
assert.True(t, found)
|
|
|
|
})
|
2015-02-13 08:55:32 -06:00
|
|
|
})
|
|
|
|
}
|
2019-07-11 03:20:34 -05:00
|
|
|
|
|
|
|
func TestApiKeyErrors(t *testing.T) {
|
|
|
|
mockTimeNow()
|
|
|
|
defer resetTimeNow()
|
|
|
|
|
2021-04-28 06:30:09 -05:00
|
|
|
t.Run("Testing API Key errors", func(t *testing.T) {
|
2019-07-11 03:20:34 -05:00
|
|
|
InitTestDB(t)
|
|
|
|
|
2021-04-28 06:30:09 -05:00
|
|
|
t.Run("Delete non-existing key should return error", func(t *testing.T) {
|
|
|
|
cmd := models.DeleteApiKeyCommand{Id: 1}
|
|
|
|
err := DeleteApiKeyCtx(context.Background(), &cmd)
|
|
|
|
|
|
|
|
assert.EqualError(t, err, models.ErrApiKeyNotFound.Error())
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("Testing API Duplicate Key Errors", func(t *testing.T) {
|
|
|
|
t.Run("Given saved api key", func(t *testing.T) {
|
2019-07-11 03:20:34 -05:00
|
|
|
cmd := models.AddApiKeyCommand{OrgId: 0, Name: "duplicate", Key: "asd"}
|
2021-04-28 06:30:09 -05:00
|
|
|
err := AddApiKey(&cmd)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
|
|
|
t.Run("Add API Key with existing Org ID and Name", func(t *testing.T) {
|
|
|
|
cmd := models.AddApiKeyCommand{OrgId: 0, Name: "duplicate", Key: "asd"}
|
|
|
|
err = AddApiKey(&cmd)
|
|
|
|
assert.EqualError(t, err, models.ErrDuplicateApiKey.Error())
|
|
|
|
})
|
2019-07-11 03:20:34 -05:00
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|