mirror of
https://github.com/coder/coder.git
synced 2025-07-08 11:39:50 +00:00
This reverts commit 145faf4400
.
This commit is contained in:
@ -219,26 +219,12 @@ func convertAuditLog(dblog database.GetAuditLogsOffsetRow) codersdk.AuditLog {
|
||||
}
|
||||
}
|
||||
|
||||
type WorkspaceResourceInfo struct {
|
||||
WorkspaceName string
|
||||
}
|
||||
|
||||
func auditLogDescription(alog database.GetAuditLogsOffsetRow) string {
|
||||
str := fmt.Sprintf("{user} %s %s",
|
||||
codersdk.AuditAction(alog.Action).FriendlyString(),
|
||||
codersdk.ResourceType(alog.ResourceType).FriendlyString(),
|
||||
)
|
||||
|
||||
// Strings for build updates follow the below format:
|
||||
// "{user} started workspace build for workspace {target}"
|
||||
// where target is a workspace instead of the workspace build
|
||||
if alog.ResourceType == database.ResourceTypeWorkspaceBuild {
|
||||
workspaceBytes := []byte(alog.AdditionalFields)
|
||||
var workspaceResourceInfo WorkspaceResourceInfo
|
||||
_ = json.Unmarshal(workspaceBytes, &workspaceResourceInfo)
|
||||
str += " for workspace " + workspaceResourceInfo.WorkspaceName
|
||||
}
|
||||
|
||||
// We don't display the name for git ssh keys. It's fairly long and doesn't
|
||||
// make too much sense to display.
|
||||
if alog.ResourceType != database.ResourceTypeGitSshKey {
|
||||
@ -302,8 +288,6 @@ func resourceTypeFromString(resourceTypeString string) string {
|
||||
return resourceTypeString
|
||||
case codersdk.ResourceTypeWorkspace:
|
||||
return resourceTypeString
|
||||
case codersdk.ResourceTypeWorkspaceBuild:
|
||||
return resourceTypeString
|
||||
case codersdk.ResourceTypeGitSSHKey:
|
||||
return resourceTypeString
|
||||
case codersdk.ResourceTypeAPIKey:
|
||||
|
@ -15,7 +15,6 @@ type Auditable interface {
|
||||
database.TemplateVersion |
|
||||
database.User |
|
||||
database.Workspace |
|
||||
database.WorkspaceBuild |
|
||||
database.GitSSHKey |
|
||||
database.Group
|
||||
}
|
||||
|
@ -20,9 +20,8 @@ type RequestParams struct {
|
||||
Audit Auditor
|
||||
Log slog.Logger
|
||||
|
||||
Request *http.Request
|
||||
Action database.AuditAction
|
||||
AdditionalFields json.RawMessage
|
||||
Request *http.Request
|
||||
Action database.AuditAction
|
||||
}
|
||||
|
||||
type Request[T Auditable] struct {
|
||||
@ -44,9 +43,6 @@ func ResourceTarget[T Auditable](tgt T) string {
|
||||
return typed.Username
|
||||
case database.Workspace:
|
||||
return typed.Name
|
||||
case database.WorkspaceBuild:
|
||||
// this isn't used
|
||||
return string(typed.BuildNumber)
|
||||
case database.GitSSHKey:
|
||||
return typed.PublicKey
|
||||
case database.Group:
|
||||
@ -68,8 +64,6 @@ func ResourceID[T Auditable](tgt T) uuid.UUID {
|
||||
return typed.ID
|
||||
case database.Workspace:
|
||||
return typed.ID
|
||||
case database.WorkspaceBuild:
|
||||
return typed.ID
|
||||
case database.GitSSHKey:
|
||||
return typed.UserID
|
||||
case database.Group:
|
||||
@ -91,8 +85,6 @@ func ResourceType[T Auditable](tgt T) database.ResourceType {
|
||||
return database.ResourceTypeUser
|
||||
case database.Workspace:
|
||||
return database.ResourceTypeWorkspace
|
||||
case database.WorkspaceBuild:
|
||||
return database.ResourceTypeWorkspaceBuild
|
||||
case database.GitSSHKey:
|
||||
return database.ResourceTypeGitSshKey
|
||||
case database.Group:
|
||||
@ -137,10 +129,6 @@ func InitRequest[T Auditable](w http.ResponseWriter, p *RequestParams) (*Request
|
||||
}
|
||||
}
|
||||
|
||||
if p.AdditionalFields == nil {
|
||||
p.AdditionalFields = json.RawMessage("{}")
|
||||
}
|
||||
|
||||
ip := parseIP(p.Request.RemoteAddr)
|
||||
err := p.Audit.Export(ctx, database.AuditLog{
|
||||
ID: uuid.New(),
|
||||
@ -155,7 +143,7 @@ func InitRequest[T Auditable](w http.ResponseWriter, p *RequestParams) (*Request
|
||||
Diff: diffRaw,
|
||||
StatusCode: int32(sw.Status),
|
||||
RequestID: httpmw.RequestID(p.Request),
|
||||
AdditionalFields: p.AdditionalFields,
|
||||
AdditionalFields: json.RawMessage("{}"),
|
||||
})
|
||||
if err != nil {
|
||||
p.Log.Error(logCtx, "export audit log", slog.Error(err))
|
||||
|
7
coderd/database/dump.sql
generated
7
coderd/database/dump.sql
generated
@ -14,9 +14,7 @@ CREATE TYPE app_sharing_level AS ENUM (
|
||||
CREATE TYPE audit_action AS ENUM (
|
||||
'create',
|
||||
'write',
|
||||
'delete',
|
||||
'start',
|
||||
'stop'
|
||||
'delete'
|
||||
);
|
||||
|
||||
CREATE TYPE build_reason AS ENUM (
|
||||
@ -90,8 +88,7 @@ CREATE TYPE resource_type AS ENUM (
|
||||
'workspace',
|
||||
'git_ssh_key',
|
||||
'api_key',
|
||||
'group',
|
||||
'workspace_build'
|
||||
'group'
|
||||
);
|
||||
|
||||
CREATE TYPE user_status AS ENUM (
|
||||
|
@ -1,2 +0,0 @@
|
||||
-- It's not possible to drop enum values from enum types, so the UP has "IF NOT
|
||||
-- EXISTS".
|
@ -1,4 +0,0 @@
|
||||
ALTER TYPE audit_action ADD VALUE IF NOT EXISTS 'start';
|
||||
ALTER TYPE audit_action ADD VALUE IF NOT EXISTS 'stop';
|
||||
|
||||
ALTER TYPE resource_type ADD VALUE IF NOT EXISTS 'workspace_build';
|
@ -60,8 +60,6 @@ const (
|
||||
AuditActionCreate AuditAction = "create"
|
||||
AuditActionWrite AuditAction = "write"
|
||||
AuditActionDelete AuditAction = "delete"
|
||||
AuditActionStart AuditAction = "start"
|
||||
AuditActionStop AuditAction = "stop"
|
||||
)
|
||||
|
||||
func (e *AuditAction) Scan(src interface{}) error {
|
||||
@ -304,7 +302,6 @@ const (
|
||||
ResourceTypeGitSshKey ResourceType = "git_ssh_key"
|
||||
ResourceTypeApiKey ResourceType = "api_key"
|
||||
ResourceTypeGroup ResourceType = "group"
|
||||
ResourceTypeWorkspaceBuild ResourceType = "workspace_build"
|
||||
)
|
||||
|
||||
func (e *ResourceType) Scan(src interface{}) error {
|
||||
|
@ -278,59 +278,28 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
auditor := api.Auditor.Load()
|
||||
|
||||
// if user deletes a workspace, audit the workspace
|
||||
// we only want to create audit logs for delete builds right now
|
||||
if action == rbac.ActionDelete {
|
||||
aReq, commitAudit := audit.InitRequest[database.Workspace](rw, &audit.RequestParams{
|
||||
Audit: *auditor,
|
||||
Log: api.Logger,
|
||||
Request: r,
|
||||
Action: database.AuditActionDelete,
|
||||
})
|
||||
var (
|
||||
auditor = api.Auditor.Load()
|
||||
aReq, commitAudit = audit.InitRequest[database.Workspace](rw, &audit.RequestParams{
|
||||
Audit: *auditor,
|
||||
Log: api.Logger,
|
||||
Request: r,
|
||||
Action: database.AuditActionDelete,
|
||||
})
|
||||
)
|
||||
|
||||
defer commitAudit()
|
||||
aReq.Old = workspace
|
||||
}
|
||||
|
||||
latestBuild, latestBuildErr := api.Database.GetLatestWorkspaceBuildByWorkspaceID(ctx, workspace.ID)
|
||||
|
||||
// if a user starts/stops a workspace, audit the workspace build
|
||||
if action == rbac.ActionUpdate {
|
||||
var auditAction database.AuditAction
|
||||
if createBuild.Transition == codersdk.WorkspaceTransitionStart {
|
||||
auditAction = database.AuditActionStart
|
||||
} else if createBuild.Transition == codersdk.WorkspaceTransitionStop {
|
||||
auditAction = database.AuditActionStop
|
||||
} else {
|
||||
auditAction = database.AuditActionWrite
|
||||
}
|
||||
|
||||
// We pass the workspace name to the Auditor so that it
|
||||
// can form a friendly string for the user.
|
||||
workspaceResourceInfo := map[string]string{
|
||||
"workspaceName": workspace.Name,
|
||||
}
|
||||
|
||||
wriBytes, _ := json.Marshal(workspaceResourceInfo)
|
||||
|
||||
aReq, commitAudit := audit.InitRequest[database.WorkspaceBuild](rw, &audit.RequestParams{
|
||||
Audit: *auditor,
|
||||
Log: api.Logger,
|
||||
Request: r,
|
||||
Action: auditAction,
|
||||
AdditionalFields: wriBytes,
|
||||
})
|
||||
|
||||
defer commitAudit()
|
||||
aReq.Old = latestBuild
|
||||
}
|
||||
|
||||
if createBuild.TemplateVersionID == uuid.Nil {
|
||||
if latestBuildErr != nil {
|
||||
latestBuild, err := api.Database.GetLatestWorkspaceBuildByWorkspaceID(ctx, workspace.ID)
|
||||
if err != nil {
|
||||
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
|
||||
Message: "Internal error fetching the latest workspace build.",
|
||||
Detail: latestBuildErr.Error(),
|
||||
Detail: err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
@ -579,6 +579,6 @@ func TestWorkspaceBuildStatus(t *testing.T) {
|
||||
require.EqualValues(t, codersdk.WorkspaceStatusDeleted, workspace.LatestBuild.Status)
|
||||
|
||||
// assert an audit log has been created for deletion
|
||||
require.Len(t, auditor.AuditLogs, 7)
|
||||
assert.Equal(t, database.AuditActionDelete, auditor.AuditLogs[6].Action)
|
||||
require.Len(t, auditor.AuditLogs, 5)
|
||||
assert.Equal(t, database.AuditActionDelete, auditor.AuditLogs[4].Action)
|
||||
}
|
||||
|
Reference in New Issue
Block a user