Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 575bfab

Browse files
authored
fix: audit log workspace build URL should form with the correct workspace owner (#5674)
* removing workspaceOwner * querying for workspace build
1 parent 41b58cd commit 575bfab

File tree

2 files changed

+38
-32
lines changed

2 files changed

+38
-32
lines changed

coderd/audit.go

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -180,9 +180,8 @@ func (api *API) convertAuditLogs(ctx context.Context, dblogs []database.GetAudit
180180
}
181181

182182
type AdditionalFields struct {
183-
WorkspaceName string
184-
BuildNumber string
185-
WorkspaceOwner string
183+
WorkspaceName string
184+
BuildNumber string
186185
}
187186

188187
func (api *API) convertAuditLog(ctx context.Context, dblog database.GetAuditLogsOffsetRow) codersdk.AuditLog {
@@ -218,9 +217,8 @@ func (api *API) convertAuditLog(ctx context.Context, dblog database.GetAuditLogs
218217
if err != nil {
219218
api.Logger.Error(ctx, "unmarshal additional fields", slog.Error(err))
220219
resourceInfo := map[string]string{
221-
"workspaceName": "unknown",
222-
"buildNumber": "unknown",
223-
"workspaceOwner": "unknown",
220+
"workspaceName": "unknown",
221+
"buildNumber": "unknown",
224222
}
225223
dblog.AdditionalFields, err = json.Marshal(resourceInfo)
226224
api.Logger.Error(ctx, "marshal additional fields", slog.Error(err))
@@ -233,7 +231,7 @@ func (api *API) convertAuditLog(ctx context.Context, dblog database.GetAuditLogs
233231
if isDeleted {
234232
resourceLink = ""
235233
} else {
236-
resourceLink = auditLogResourceLink(dblog, additionalFields)
234+
resourceLink = api.auditLogResourceLink(ctx, dblog, additionalFields)
237235
}
238236

239237
return codersdk.AuditLog{
@@ -343,7 +341,7 @@ func (api *API) auditLogIsResourceDeleted(ctx context.Context, alog database.Get
343341
}
344342
}
345343

346-
func auditLogResourceLink(alog database.GetAuditLogsOffsetRow, additionalFields AdditionalFields) string {
344+
func (api *API) auditLogResourceLink(ctx context.Context, alog database.GetAuditLogsOffsetRow, additionalFields AdditionalFields) string {
347345
switch alog.ResourceType {
348346
case database.ResourceTypeTemplate:
349347
return fmt.Sprintf("/templates/%s",
@@ -352,18 +350,34 @@ func auditLogResourceLink(alog database.GetAuditLogsOffsetRow, additionalFields
352350
return fmt.Sprintf("/users?filter=%s",
353351
alog.ResourceTarget)
354352
case database.ResourceTypeWorkspace:
355-
workspaceOwner := alog.UserUsername.String
356-
if len(additionalFields.WorkspaceOwner) != 0 && additionalFields.WorkspaceOwner != "unknown" {
357-
workspaceOwner = additionalFields.WorkspaceOwner
353+
workspace, getWorkspaceErr := api.Database.GetWorkspaceByID(ctx, alog.ResourceID)
354+
if getWorkspaceErr != nil {
355+
return ""
356+
}
357+
workspaceOwner, getWorkspaceOwnerErr := api.Database.GetUserByID(ctx, workspace.OwnerID)
358+
if getWorkspaceOwnerErr != nil {
359+
return ""
358360
}
359361
return fmt.Sprintf("/@%s/%s",
360-
workspaceOwner, alog.ResourceTarget)
362+
workspaceOwner.Username, alog.ResourceTarget)
361363
case database.ResourceTypeWorkspaceBuild:
362364
if len(additionalFields.WorkspaceName) == 0 || len(additionalFields.BuildNumber) == 0 {
363365
return ""
364366
}
367+
workspaceBuild, getWorkspaceBuildErr := api.Database.GetWorkspaceBuildByID(ctx, alog.ResourceID)
368+
if getWorkspaceBuildErr != nil {
369+
return ""
370+
}
371+
workspace, getWorkspaceErr := api.Database.GetWorkspaceByID(ctx, workspaceBuild.WorkspaceID)
372+
if getWorkspaceErr != nil {
373+
return ""
374+
}
375+
workspaceOwner, getWorkspaceOwnerErr := api.Database.GetUserByID(ctx, workspace.OwnerID)
376+
if getWorkspaceOwnerErr != nil {
377+
return ""
378+
}
365379
return fmt.Sprintf("/@%s/%s/builds/%s",
366-
alog.UserUsername.String, additionalFields.WorkspaceName, additionalFields.BuildNumber)
380+
workspaceOwner.Username, additionalFields.WorkspaceName, additionalFields.BuildNumber)
367381
default:
368382
return ""
369383
}

coderd/workspaces.go

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -279,27 +279,19 @@ func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request)
279279
// Create a new workspace for the currently authenticated user.
280280
func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Request) {
281281
var (
282-
ctx = r.Context()
283-
organization = httpmw.OrganizationParam(r)
284-
apiKey = httpmw.APIKey(r)
285-
auditor = api.Auditor.Load()
286-
user = httpmw.UserParam(r)
287-
workspaceResourceInfo = map[string]string{
288-
"workspaceOwner": user.Username,
289-
}
282+
ctx = r.Context()
283+
organization = httpmw.OrganizationParam(r)
284+
apiKey = httpmw.APIKey(r)
285+
auditor = api.Auditor.Load()
286+
user = httpmw.UserParam(r)
287+
aReq, commitAudit = audit.InitRequest[database.Workspace](rw, &audit.RequestParams{
288+
Audit: *auditor,
289+
Log: api.Logger,
290+
Request: r,
291+
Action: database.AuditActionCreate,
292+
})
290293
)
291-
wriBytes, err := json.Marshal(workspaceResourceInfo)
292-
if err != nil {
293-
api.Logger.Warn(ctx, "marshal workspace owner name")
294-
}
295294

296-
aReq, commitAudit := audit.InitRequest[database.Workspace](rw, &audit.RequestParams{
297-
Audit: *auditor,
298-
Log: api.Logger,
299-
Request: r,
300-
Action: database.AuditActionCreate,
301-
AdditionalFields: wriBytes,
302-
})
303295
defer commitAudit()
304296

305297
if !api.Authorize(r, rbac.ActionCreate,

0 commit comments

Comments
 (0)