Skip to content

Commit c42722d

Browse files
committed
Implement GetCryptoKeysByFeature and refactor tests
- Add GetCryptoKeysByFeature method in dbCrypt for fetching keys based on feature. - Improve dbCrypt test coverage by including GetCryptoKeysByFeature. - Remove unused WSProxyKeychain in keychain package for cleanup.
1 parent 54f5648 commit c42722d

File tree

4 files changed

+59
-41
lines changed

4 files changed

+59
-41
lines changed

coderd/database/dbmem/dbmem.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2428,8 +2428,21 @@ func (q *FakeQuerier) GetCryptoKeys(_ context.Context) ([]database.CryptoKey, er
24282428
return keys, nil
24292429
}
24302430

2431-
func (q *FakeQuerier) GetCryptoKeysByFeature(ctx context.Context, feature database.CryptoKeyFeature) ([]database.CryptoKey, error) {
2432-
panic("not implemented")
2431+
func (q *FakeQuerier) GetCryptoKeysByFeature(_ context.Context, feature database.CryptoKeyFeature) ([]database.CryptoKey, error) {
2432+
q.mutex.RLock()
2433+
defer q.mutex.RUnlock()
2434+
2435+
keys := make([]database.CryptoKey, 0)
2436+
for _, key := range q.cryptoKeys {
2437+
if key.Feature == feature {
2438+
keys = append(keys, key)
2439+
}
2440+
}
2441+
// We want to return the highest sequence number first.
2442+
slices.SortFunc(keys, func(i, j database.CryptoKey) int {
2443+
return int(j.Sequence - i.Sequence)
2444+
})
2445+
return keys, nil
24332446
}
24342447

24352448
func (q *FakeQuerier) GetDBCryptKeys(_ context.Context) ([]database.DBCryptKey, error) {

coderd/keychain/memkeychain.go

Lines changed: 0 additions & 39 deletions
This file was deleted.

enterprise/dbcrypt/dbcrypt.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,21 @@ func (db *dbCrypt) UpdateCryptoKeyDeletesAt(ctx context.Context, arg database.Up
321321
return key, nil
322322
}
323323

324+
func (db *dbCrypt) GetCryptoKeysByFeature(ctx context.Context, feature database.CryptoKeyFeature) ([]database.CryptoKey, error) {
325+
keys, err := db.Store.GetCryptoKeysByFeature(ctx, feature)
326+
if err != nil {
327+
return nil, err
328+
}
329+
330+
for i := range keys {
331+
if err := db.decryptField(&keys[i].Secret.String, keys[i].SecretKeyID); err != nil {
332+
return nil, err
333+
}
334+
}
335+
336+
return keys, nil
337+
}
338+
324339
func (db *dbCrypt) encryptField(field *string, digest *sql.NullString) error {
325340
// If no cipher is loaded, then we can't encrypt anything!
326341
if db.ciphers == nil || db.primaryCipherDigest == "" {

enterprise/dbcrypt/dbcrypt_internal_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,35 @@ func TestCryptoKeys(t *testing.T) {
450450
require.Equal(t, ciphers[0].HexDigest(), key.SecretKeyID.String)
451451
})
452452

453+
t.Run("GetCryptoKeysByFeature", func(t *testing.T) {
454+
t.Parallel()
455+
db, crypt, ciphers := setup(t)
456+
expected := dbgen.CryptoKey(t, crypt, database.CryptoKey{
457+
Sequence: 2,
458+
Feature: database.CryptoKeyFeatureTailnetResume,
459+
Secret: sql.NullString{String: "test", Valid: true},
460+
})
461+
_ = dbgen.CryptoKey(t, crypt, database.CryptoKey{
462+
Feature: database.CryptoKeyFeatureWorkspaceApps,
463+
Sequence: 43,
464+
})
465+
keys, err := crypt.GetCryptoKeysByFeature(ctx, database.CryptoKeyFeatureTailnetResume)
466+
require.NoError(t, err)
467+
require.Len(t, keys, 1)
468+
require.Equal(t, "test", keys[0].Secret.String)
469+
require.Equal(t, ciphers[0].HexDigest(), keys[0].SecretKeyID.String)
470+
require.Equal(t, expected.Sequence, keys[0].Sequence)
471+
require.Equal(t, expected.Feature, keys[0].Feature)
472+
473+
keys, err = db.GetCryptoKeysByFeature(ctx, database.CryptoKeyFeatureTailnetResume)
474+
require.NoError(t, err)
475+
require.Len(t, keys, 1)
476+
requireEncryptedEquals(t, ciphers[0], keys[0].Secret.String, "test")
477+
require.Equal(t, ciphers[0].HexDigest(), keys[0].SecretKeyID.String)
478+
require.Equal(t, expected.Sequence, keys[0].Sequence)
479+
require.Equal(t, expected.Feature, keys[0].Feature)
480+
})
481+
453482
t.Run("DecryptErr", func(t *testing.T) {
454483
t.Parallel()
455484
db, crypt, ciphers := setup(t)

0 commit comments

Comments
 (0)