mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
feat: add schema for key rotation (#14662)
This commit is contained in:
@@ -2,6 +2,7 @@ package dbgen
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/rand"
|
||||
"crypto/sha256"
|
||||
"database/sql"
|
||||
"encoding/hex"
|
||||
@@ -16,6 +17,7 @@ import (
|
||||
"github.com/google/uuid"
|
||||
"github.com/sqlc-dev/pqtype"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/coder/coder/v2/coderd/database"
|
||||
"github.com/coder/coder/v2/coderd/database/dbauthz"
|
||||
@@ -893,6 +895,40 @@ func CustomRole(t testing.TB, db database.Store, seed database.CustomRole) datab
|
||||
return role
|
||||
}
|
||||
|
||||
func CryptoKey(t testing.TB, db database.Store, seed database.CryptoKey) database.CryptoKey {
|
||||
t.Helper()
|
||||
|
||||
seed.Feature = takeFirst(seed.Feature, database.CryptoKeyFeatureWorkspaceApps)
|
||||
|
||||
if !seed.Secret.Valid {
|
||||
secret, err := newCryptoKeySecret(seed.Feature)
|
||||
require.NoError(t, err, "generate secret")
|
||||
seed.Secret = sql.NullString{
|
||||
String: secret,
|
||||
Valid: true,
|
||||
}
|
||||
}
|
||||
|
||||
key, err := db.InsertCryptoKey(genCtx, database.InsertCryptoKeyParams{
|
||||
Sequence: takeFirst(seed.Sequence, 123),
|
||||
Secret: seed.Secret,
|
||||
SecretKeyID: takeFirst(seed.SecretKeyID, sql.NullString{}),
|
||||
Feature: seed.Feature,
|
||||
StartsAt: takeFirst(seed.StartsAt, time.Now()),
|
||||
})
|
||||
require.NoError(t, err, "insert crypto key")
|
||||
|
||||
if seed.DeletesAt.Valid {
|
||||
key, err = db.UpdateCryptoKeyDeletesAt(genCtx, database.UpdateCryptoKeyDeletesAtParams{
|
||||
Feature: key.Feature,
|
||||
Sequence: key.Sequence,
|
||||
DeletesAt: sql.NullTime{Time: seed.DeletesAt.Time, Valid: true},
|
||||
})
|
||||
require.NoError(t, err, "update crypto key deletes_at")
|
||||
}
|
||||
return key
|
||||
}
|
||||
|
||||
func ProvisionerJobTimings(t testing.TB, db database.Store, seed database.InsertProvisionerJobTimingsParams) []database.ProvisionerJobTiming {
|
||||
timings, err := db.InsertProvisionerJobTimings(genCtx, seed)
|
||||
require.NoError(t, err, "insert provisioner job timings")
|
||||
@@ -942,3 +978,24 @@ func takeFirst[Value comparable](values ...Value) Value {
|
||||
return v != empty
|
||||
})
|
||||
}
|
||||
|
||||
func newCryptoKeySecret(feature database.CryptoKeyFeature) (string, error) {
|
||||
switch feature {
|
||||
case database.CryptoKeyFeatureWorkspaceApps:
|
||||
return generateCryptoKey(96)
|
||||
case database.CryptoKeyFeatureOidcConvert:
|
||||
return generateCryptoKey(32)
|
||||
case database.CryptoKeyFeatureTailnetResume:
|
||||
return generateCryptoKey(64)
|
||||
}
|
||||
return "", xerrors.Errorf("unknown feature: %s", feature)
|
||||
}
|
||||
|
||||
func generateCryptoKey(length int) (string, error) {
|
||||
b := make([]byte, length)
|
||||
_, err := rand.Read(b)
|
||||
if err != nil {
|
||||
return "", xerrors.Errorf("rand read: %w", err)
|
||||
}
|
||||
return hex.EncodeToString(b), nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user