fix: audit log workspace build URL should form with the correct workspace owner (#5674)

* removing workspaceOwner

* querying for workspace build
This commit is contained in:
Kira Pilot
2023-01-12 09:51:30 -05:00
committed by GitHub
parent 41b58cd027
commit 575bfabfcb
2 changed files with 38 additions and 32 deletions

View File

@ -182,7 +182,6 @@ func (api *API) convertAuditLogs(ctx context.Context, dblogs []database.GetAudit
type AdditionalFields struct { type AdditionalFields struct {
WorkspaceName string WorkspaceName string
BuildNumber string BuildNumber string
WorkspaceOwner string
} }
func (api *API) convertAuditLog(ctx context.Context, dblog database.GetAuditLogsOffsetRow) codersdk.AuditLog { func (api *API) convertAuditLog(ctx context.Context, dblog database.GetAuditLogsOffsetRow) codersdk.AuditLog {
@ -220,7 +219,6 @@ func (api *API) convertAuditLog(ctx context.Context, dblog database.GetAuditLogs
resourceInfo := map[string]string{ resourceInfo := map[string]string{
"workspaceName": "unknown", "workspaceName": "unknown",
"buildNumber": "unknown", "buildNumber": "unknown",
"workspaceOwner": "unknown",
} }
dblog.AdditionalFields, err = json.Marshal(resourceInfo) dblog.AdditionalFields, err = json.Marshal(resourceInfo)
api.Logger.Error(ctx, "marshal additional fields", slog.Error(err)) api.Logger.Error(ctx, "marshal additional fields", slog.Error(err))
@ -233,7 +231,7 @@ func (api *API) convertAuditLog(ctx context.Context, dblog database.GetAuditLogs
if isDeleted { if isDeleted {
resourceLink = "" resourceLink = ""
} else { } else {
resourceLink = auditLogResourceLink(dblog, additionalFields) resourceLink = api.auditLogResourceLink(ctx, dblog, additionalFields)
} }
return codersdk.AuditLog{ return codersdk.AuditLog{
@ -343,7 +341,7 @@ func (api *API) auditLogIsResourceDeleted(ctx context.Context, alog database.Get
} }
} }
func auditLogResourceLink(alog database.GetAuditLogsOffsetRow, additionalFields AdditionalFields) string { func (api *API) auditLogResourceLink(ctx context.Context, alog database.GetAuditLogsOffsetRow, additionalFields AdditionalFields) string {
switch alog.ResourceType { switch alog.ResourceType {
case database.ResourceTypeTemplate: case database.ResourceTypeTemplate:
return fmt.Sprintf("/templates/%s", return fmt.Sprintf("/templates/%s",
@ -352,18 +350,34 @@ func auditLogResourceLink(alog database.GetAuditLogsOffsetRow, additionalFields
return fmt.Sprintf("/users?filter=%s", return fmt.Sprintf("/users?filter=%s",
alog.ResourceTarget) alog.ResourceTarget)
case database.ResourceTypeWorkspace: case database.ResourceTypeWorkspace:
workspaceOwner := alog.UserUsername.String workspace, getWorkspaceErr := api.Database.GetWorkspaceByID(ctx, alog.ResourceID)
if len(additionalFields.WorkspaceOwner) != 0 && additionalFields.WorkspaceOwner != "unknown" { if getWorkspaceErr != nil {
workspaceOwner = additionalFields.WorkspaceOwner return ""
}
workspaceOwner, getWorkspaceOwnerErr := api.Database.GetUserByID(ctx, workspace.OwnerID)
if getWorkspaceOwnerErr != nil {
return ""
} }
return fmt.Sprintf("/@%s/%s", return fmt.Sprintf("/@%s/%s",
workspaceOwner, alog.ResourceTarget) workspaceOwner.Username, alog.ResourceTarget)
case database.ResourceTypeWorkspaceBuild: case database.ResourceTypeWorkspaceBuild:
if len(additionalFields.WorkspaceName) == 0 || len(additionalFields.BuildNumber) == 0 { if len(additionalFields.WorkspaceName) == 0 || len(additionalFields.BuildNumber) == 0 {
return "" return ""
} }
workspaceBuild, getWorkspaceBuildErr := api.Database.GetWorkspaceBuildByID(ctx, alog.ResourceID)
if getWorkspaceBuildErr != nil {
return ""
}
workspace, getWorkspaceErr := api.Database.GetWorkspaceByID(ctx, workspaceBuild.WorkspaceID)
if getWorkspaceErr != nil {
return ""
}
workspaceOwner, getWorkspaceOwnerErr := api.Database.GetUserByID(ctx, workspace.OwnerID)
if getWorkspaceOwnerErr != nil {
return ""
}
return fmt.Sprintf("/@%s/%s/builds/%s", return fmt.Sprintf("/@%s/%s/builds/%s",
alog.UserUsername.String, additionalFields.WorkspaceName, additionalFields.BuildNumber) workspaceOwner.Username, additionalFields.WorkspaceName, additionalFields.BuildNumber)
default: default:
return "" return ""
} }

View File

@ -284,22 +284,14 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req
apiKey = httpmw.APIKey(r) apiKey = httpmw.APIKey(r)
auditor = api.Auditor.Load() auditor = api.Auditor.Load()
user = httpmw.UserParam(r) user = httpmw.UserParam(r)
workspaceResourceInfo = map[string]string{ aReq, commitAudit = audit.InitRequest[database.Workspace](rw, &audit.RequestParams{
"workspaceOwner": user.Username,
}
)
wriBytes, err := json.Marshal(workspaceResourceInfo)
if err != nil {
api.Logger.Warn(ctx, "marshal workspace owner name")
}
aReq, commitAudit := audit.InitRequest[database.Workspace](rw, &audit.RequestParams{
Audit: *auditor, Audit: *auditor,
Log: api.Logger, Log: api.Logger,
Request: r, Request: r,
Action: database.AuditActionCreate, Action: database.AuditActionCreate,
AdditionalFields: wriBytes,
}) })
)
defer commitAudit() defer commitAudit()
if !api.Authorize(r, rbac.ActionCreate, if !api.Authorize(r, rbac.ActionCreate,