mirror of
https://github.com/coder/coder.git
synced 2025-07-03 16:13:58 +00:00
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:
@ -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 ""
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
Reference in New Issue
Block a user