Skip to content

Commit 5963708

Browse files
committed
added unique index for login type token
1 parent eda2702 commit 5963708

File tree

13 files changed

+107
-10
lines changed

13 files changed

+107
-10
lines changed

coderd/database/dbauthz/querier.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ func (q *querier) GetAPIKeyByID(ctx context.Context, id string) (database.APIKey
3636
return fetch(q.log, q.auth, q.db.GetAPIKeyByID)(ctx, id)
3737
}
3838

39+
func (q *querier) GetAPIKeyByName(ctx context.Context, arg database.GetAPIKeyByNameParams) (database.APIKey, error) {
40+
return fetch(q.log, q.auth, q.db.GetAPIKeyByName)(ctx, arg)
41+
}
42+
3943
func (q *querier) GetAPIKeysByLoginType(ctx context.Context, loginType database.LoginType) ([]database.APIKey, error) {
4044
return fetchWithPostFilter(q.auth, q.db.GetAPIKeysByLoginType)(ctx, loginType)
4145
}

coderd/database/dbauthz/querier_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ func (s *MethodTestSuite) TestAPIKey() {
2323
key, _ := dbgen.APIKey(s.T(), db, database.APIKey{})
2424
check.Args(key.ID).Asserts(key, rbac.ActionRead).Returns(key)
2525
}))
26+
s.Run("GetAPIKeyByName", s.Subtest(func(db database.Store, check *expects) {
27+
key, _ := dbgen.APIKey(s.T(), db, database.APIKey{
28+
TokenName: "marge-cat",
29+
LoginType: database.LoginTypeToken,
30+
})
31+
check.Args(database.GetAPIKeyByNameParams{
32+
TokenName: key.TokenName,
33+
UserID: key.UserID,
34+
}).Asserts(key, rbac.ActionRead).Returns(key)
35+
}))
2636
s.Run("GetAPIKeysByLoginType", s.Subtest(func(db database.Store, check *expects) {
2737
a, _ := dbgen.APIKey(s.T(), db, database.APIKey{LoginType: database.LoginTypePassword})
2838
b, _ := dbgen.APIKey(s.T(), db, database.APIKey{LoginType: database.LoginTypePassword})

coderd/database/dbfake/databasefake.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,21 @@ func (q *fakeQuerier) GetAPIKeyByID(_ context.Context, id string) (database.APIK
454454
return database.APIKey{}, sql.ErrNoRows
455455
}
456456

457+
func (q *fakeQuerier) GetAPIKeyByName(_ context.Context, params database.GetAPIKeyByNameParams) (database.APIKey, error) {
458+
q.mutex.RLock()
459+
defer q.mutex.RUnlock()
460+
461+
if params.TokenName == "" {
462+
return database.APIKey{}, sql.ErrNoRows
463+
}
464+
for _, apiKey := range q.apiKeys {
465+
if params.UserID == apiKey.UserID && params.TokenName == apiKey.TokenName {
466+
return apiKey, nil
467+
}
468+
}
469+
return database.APIKey{}, sql.ErrNoRows
470+
}
471+
457472
func (q *fakeQuerier) GetAPIKeysLastUsedAfter(_ context.Context, after time.Time) ([]database.APIKey, error) {
458473
q.mutex.RLock()
459474
defer q.mutex.RUnlock()

coderd/database/dbgen/generator.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ func APIKey(t testing.TB, db database.Store, seed database.APIKey) (key database
9090
UpdatedAt: takeFirst(seed.UpdatedAt, database.Now()),
9191
LoginType: takeFirst(seed.LoginType, database.LoginTypePassword),
9292
Scope: takeFirst(seed.Scope, database.APIKeyScopeAll),
93+
TokenName: takeFirst(seed.TokenName),
9394
})
9495
require.NoError(t, err, "insert api key")
9596
return key, fmt.Sprintf("%s-%s", key.ID, secret)

coderd/database/dump.sql

Lines changed: 2 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/migrations/000100_add_apikey_name.up.sql

Lines changed: 0 additions & 3 deletions
This file was deleted.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
BEGIN;
2+
3+
ALTER TABLE ONLY api_keys
4+
ADD COLUMN IF NOT EXISTS token_name text NOT NULL DEFAULT '';
5+
6+
UPDATE
7+
api_keys
8+
SET
9+
token_name = gen_random_uuid ()::text
10+
WHERE
11+
login_type = 'token';
12+
13+
CREATE UNIQUE INDEX idx_api_key_name ON api_keys USING btree (user_id, token_name)
14+
WHERE
15+
(login_type = 'token');
16+
17+
COMMIT;

coderd/database/querier.go

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries.sql.go

Lines changed: 39 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/apikeys.sql

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,19 @@ WHERE
88
LIMIT
99
1;
1010

11+
-- name: GetAPIKeyByName :one
12+
SELECT
13+
*
14+
FROM
15+
api_keys
16+
WHERE
17+
user_id = @user_id AND
18+
token_name = @token_name AND
19+
-- there is no unique constraint on empty token names
20+
token_name != ''
21+
LIMIT
22+
1;
23+
1124
-- name: GetAPIKeysLastUsedAfter :many
1225
SELECT * FROM api_keys WHERE last_used > $1;
1326

coderd/database/unique_constraint.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

codersdk/apikey.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,9 @@ func (c *Client) APIKey(ctx context.Context, userID string, id string) (*APIKey,
135135
return apiKey, json.NewDecoder(res.Body).Decode(apiKey)
136136
}
137137

138-
// DeleteAPIKey deletes API key by id.
139-
func (c *Client) DeleteAPIKey(ctx context.Context, userID string, id string) error {
140-
res, err := c.Request(ctx, http.MethodDelete, fmt.Sprintf("/api/v2/users/%s/keys/%s", userID, id), nil)
138+
// DeleteAPIKey deletes API key by name.
139+
func (c *Client) DeleteAPIKey(ctx context.Context, userID string, name string) error {
140+
res, err := c.Request(ctx, http.MethodDelete, fmt.Sprintf("/api/v2/users/%s/keys/%s", userID, name), nil)
141141
if err != nil {
142142
return err
143143
}

0 commit comments

Comments
 (0)