@@ -15,6 +15,7 @@ import (
15
15
"golang.org/x/exp/slices"
16
16
"golang.org/x/xerrors"
17
17
18
+ "cdr.dev/slog"
18
19
"github.com/coder/coder/coderd/audit"
19
20
"github.com/coder/coder/coderd/database"
20
21
"github.com/coder/coder/coderd/httpapi"
@@ -278,28 +279,62 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
278
279
return
279
280
}
280
281
281
- // we only want to create audit logs for delete builds right now
282
+ auditor := api .Auditor .Load ()
283
+
284
+ // if user deletes a workspace, audit the workspace
282
285
if action == rbac .ActionDelete {
283
- var (
284
- auditor = api .Auditor .Load ()
285
- aReq , commitAudit = audit .InitRequest [database.Workspace ](rw , & audit.RequestParams {
286
- Audit : * auditor ,
287
- Log : api .Logger ,
288
- Request : r ,
289
- Action : database .AuditActionDelete ,
290
- })
291
- )
286
+ aReq , commitAudit := audit .InitRequest [database.Workspace ](rw , & audit.RequestParams {
287
+ Audit : * auditor ,
288
+ Log : api .Logger ,
289
+ Request : r ,
290
+ Action : database .AuditActionDelete ,
291
+ })
292
292
293
293
defer commitAudit ()
294
294
aReq .Old = workspace
295
295
}
296
296
297
- if createBuild .TemplateVersionID == uuid .Nil {
298
- latestBuild , err := api .Database .GetLatestWorkspaceBuildByWorkspaceID (ctx , workspace .ID )
297
+ latestBuild , latestBuildErr := api .Database .GetLatestWorkspaceBuildByWorkspaceID (ctx , workspace .ID )
298
+
299
+ // if a user starts/stops a workspace, audit the workspace build
300
+ if action == rbac .ActionUpdate {
301
+ var auditAction database.AuditAction
302
+ if createBuild .Transition == codersdk .WorkspaceTransitionStart {
303
+ auditAction = database .AuditActionStart
304
+ } else if createBuild .Transition == codersdk .WorkspaceTransitionStop {
305
+ auditAction = database .AuditActionStop
306
+ } else {
307
+ auditAction = database .AuditActionWrite
308
+ }
309
+
310
+ // We pass the workspace name to the Auditor so that it
311
+ // can form a friendly string for the user.
312
+ workspaceResourceInfo := map [string ]string {
313
+ "workspaceName" : workspace .Name ,
314
+ }
315
+
316
+ wriBytes , err := json .Marshal (workspaceResourceInfo )
299
317
if err != nil {
318
+ api .Logger .Error (ctx , "could not marshal workspace name" , slog .Error (err ))
319
+ }
320
+
321
+ aReq , commitAudit := audit .InitRequest [database.WorkspaceBuild ](rw , & audit.RequestParams {
322
+ Audit : * auditor ,
323
+ Log : api .Logger ,
324
+ Request : r ,
325
+ Action : auditAction ,
326
+ AdditionalFields : wriBytes ,
327
+ })
328
+
329
+ defer commitAudit ()
330
+ aReq .Old = latestBuild
331
+ }
332
+
333
+ if createBuild .TemplateVersionID == uuid .Nil {
334
+ if latestBuildErr != nil {
300
335
httpapi .Write (ctx , rw , http .StatusInternalServerError , codersdk.Response {
301
336
Message : "Internal error fetching the latest workspace build." ,
302
- Detail : err .Error (),
337
+ Detail : latestBuildErr .Error (),
303
338
})
304
339
return
305
340
}
0 commit comments