Skip to content

Commit b74d127

Browse files
committed
Track API key usage
1 parent 9b690bd commit b74d127

File tree

6 files changed

+95
-1
lines changed

6 files changed

+95
-1
lines changed

coderd/database/databasefake/databasefake.go

+13
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,19 @@ func (q *fakeQuerier) GetAPIKeyByID(_ context.Context, id string) (database.APIK
130130
return database.APIKey{}, sql.ErrNoRows
131131
}
132132

133+
func (q *fakeQuerier) GetAPIKeysLastUsedAfter(_ context.Context, after time.Time) ([]database.APIKey, error) {
134+
q.mutex.RLock()
135+
defer q.mutex.RUnlock()
136+
137+
apiKeys := make([]database.APIKey, 0)
138+
for _, key := range q.apiKeys {
139+
if key.LastUsed.After(after) {
140+
apiKeys = append(apiKeys, key)
141+
}
142+
}
143+
return apiKeys, nil
144+
}
145+
133146
func (q *fakeQuerier) DeleteAPIKeyByID(_ context.Context, id string) error {
134147
q.mutex.Lock()
135148
defer q.mutex.Unlock()

coderd/database/querier.go

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries.sql.go

+41
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/apikeys.sql

+3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ WHERE
88
LIMIT
99
1;
1010

11+
-- name: GetAPIKeysLastUsedAfter :many
12+
SELECT * FROM api_keys WHERE last_used > $1;
13+
1114
-- name: InsertAPIKey :one
1215
INSERT INTO
1316
api_keys (

coderd/telemetry/telemetry.go

+31
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,17 @@ func (r *remoteReporter) createSnapshot() (*Snapshot, error) {
274274
}
275275
)
276276

277+
eg.Go(func() error {
278+
apiKeys, err := r.options.Database.GetAPIKeysLastUsedAfter(ctx, createdAfter)
279+
if err != nil {
280+
return xerrors.Errorf("get api keys last used: %w", err)
281+
}
282+
snapshot.APIKeys = make([]APIKey, 0, len(apiKeys))
283+
for _, apiKey := range apiKeys {
284+
snapshot.APIKeys = append(snapshot.APIKeys, ConvertAPIKey(apiKey))
285+
}
286+
return nil
287+
})
277288
eg.Go(func() error {
278289
schemas, err := r.options.Database.GetParameterSchemasCreatedAfter(ctx, createdAfter)
279290
if err != nil {
@@ -414,6 +425,17 @@ func (r *remoteReporter) createSnapshot() (*Snapshot, error) {
414425
return snapshot, nil
415426
}
416427

428+
// ConvertAPIKey anonymizes an API key.
429+
func ConvertAPIKey(apiKey database.APIKey) APIKey {
430+
return APIKey{
431+
ID: apiKey.ID,
432+
UserID: apiKey.UserID,
433+
CreatedAt: apiKey.CreatedAt,
434+
LastUsed: apiKey.LastUsed,
435+
LoginType: apiKey.LoginType,
436+
}
437+
}
438+
417439
// ConvertWorkspace anonymizes a workspace.
418440
func ConvertWorkspace(workspace database.Workspace) Workspace {
419441
return Workspace{
@@ -551,6 +573,7 @@ func ConvertTemplateVersion(version database.TemplateVersion) TemplateVersion {
551573
type Snapshot struct {
552574
DeploymentID string `json:"deployment_id"`
553575

576+
APIKeys []APIKey `json:"api_keys"`
554577
ParameterSchemas []ParameterSchema `json:"parameter_schemas"`
555578
ProvisionerJobs []ProvisionerJob `json:"provisioner_jobs"`
556579
Templates []Template `json:"templates"`
@@ -585,6 +608,14 @@ type Deployment struct {
585608
ShutdownAt *time.Time `json:"shutdown_at"`
586609
}
587610

611+
type APIKey struct {
612+
ID string `json:"id"`
613+
UserID uuid.UUID `json:"user_id"`
614+
CreatedAt time.Time `json:"created_at"`
615+
LastUsed time.Time `json:"last_used"`
616+
LoginType database.LoginType `json:"login_type"`
617+
}
618+
588619
type User struct {
589620
ID uuid.UUID `json:"uuid"`
590621
CreatedAt time.Time `json:"created_at"`

coderd/telemetry/telemetry_test.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,12 @@ func TestTelemetry(t *testing.T) {
3131
t.Parallel()
3232
db := databasefake.New()
3333
ctx := context.Background()
34-
_, err := db.InsertParameterSchema(ctx, database.InsertParameterSchemaParams{
34+
_, err := db.InsertAPIKey(ctx, database.InsertAPIKeyParams{
35+
ID: uuid.NewString(),
36+
LastUsed: database.Now(),
37+
})
38+
require.NoError(t, err)
39+
_, err = db.InsertParameterSchema(ctx, database.InsertParameterSchemaParams{
3540
ID: uuid.New(),
3641
CreatedAt: database.Now(),
3742
})

0 commit comments

Comments
 (0)