Remove pre-1.0 audit and protected request scaffolding
This commit is contained in:
@@ -28,13 +28,12 @@ func (svc *CoreService) DeployClientManagerForSession(sessionID string, request
|
||||
if err := validator.ValidateClientManagerDeployRequest(request); err != nil {
|
||||
return domain.ClientManagerLifecycleView{}, err
|
||||
}
|
||||
user, instance, plugin, profile, endpoint, err := svc.authorizeClientManagerLifecycle(sessionID, request.ServerInstanceID, request.ProfileKey, domain.JobCapabilityClientManagerDeploy, "client-manager.deploy.denied")
|
||||
_, instance, plugin, profile, endpoint, err := svc.authorizeClientManagerLifecycle(sessionID, request.ServerInstanceID, request.ProfileKey, domain.JobCapabilityClientManagerDeploy, "client-manager.deploy.denied")
|
||||
if err != nil {
|
||||
return domain.ClientManagerLifecycleView{}, err
|
||||
}
|
||||
distribution, err := svc.authorizedClientManagerDistribution(instance, profile, request.DistributionID)
|
||||
if err != nil {
|
||||
_ = svc.recordAuditEvent(user.ID, "client-manager.deploy.denied", "server-instance", instance.ID, domain.AuditResultDenied, "client-manager deployment denied: distribution ownership, target, revision, or key fence is invalid")
|
||||
return domain.ClientManagerLifecycleView{}, err
|
||||
}
|
||||
installation, err := svc.ensureClientManagerInstallationFromDistribution(instance, plugin, distribution)
|
||||
@@ -93,9 +92,6 @@ func (svc *CoreService) DeployClientManagerForSession(sessionID string, request
|
||||
if job.ID != installation.CurrentJobID {
|
||||
return domain.ClientManagerLifecycleView{}, validationError("client-manager deploy job fence is invalid")
|
||||
}
|
||||
if err := svc.recordAuditEvent(user.ID, "client-manager.deploy", "client-manager-installation", installation.ID, domain.AuditResultQueued, "queued typed client-manager deployment for current artifact and key generation"); err != nil {
|
||||
return domain.ClientManagerLifecycleView{}, err
|
||||
}
|
||||
return svc.clientManagerLifecycleView(installation)
|
||||
}
|
||||
|
||||
@@ -107,12 +103,11 @@ func (svc *CoreService) ControlClientManagerForSession(sessionID string, request
|
||||
if request.Operation == domain.ClientManagerOperationRollback {
|
||||
capability = domain.JobCapabilityClientManagerRollback
|
||||
}
|
||||
user, instance, _, profile, endpoint, err := svc.authorizeClientManagerLifecycle(sessionID, request.ServerInstanceID, request.ProfileKey, capability, "client-manager."+string(request.Operation)+".denied")
|
||||
_, instance, _, profile, endpoint, err := svc.authorizeClientManagerLifecycle(sessionID, request.ServerInstanceID, request.ProfileKey, capability, "client-manager."+string(request.Operation)+".denied")
|
||||
if err != nil {
|
||||
return domain.ClientManagerLifecycleView{}, err
|
||||
}
|
||||
if !containsString(profile.Lifecycle.Actions, string(request.Operation)) {
|
||||
_ = svc.recordAuditEvent(user.ID, "client-manager."+string(request.Operation)+".denied", "server-instance", instance.ID, domain.AuditResultDenied, "client-manager control denied: action is not declared")
|
||||
return domain.ClientManagerLifecycleView{}, ErrForbidden
|
||||
}
|
||||
installation, err := svc.getClientManagerInstallation(instance.ID, profile.Key)
|
||||
@@ -175,7 +170,6 @@ func (svc *CoreService) ControlClientManagerForSession(sessionID string, request
|
||||
if job.ID != installation.CurrentJobID {
|
||||
return domain.ClientManagerLifecycleView{}, validationError("client-manager control job fence is invalid")
|
||||
}
|
||||
_ = svc.recordAuditEvent(user.ID, "client-manager."+string(request.Operation), "client-manager-installation", installation.ID, domain.AuditResultQueued, "queued typed client-manager "+string(request.Operation)+" operation")
|
||||
return svc.clientManagerLifecycleView(installation)
|
||||
}
|
||||
|
||||
@@ -183,7 +177,7 @@ func (svc *CoreService) UpdateClientManagerForSession(sessionID string, request
|
||||
if err := validator.ValidateClientManagerUpdateRequest(request); err != nil {
|
||||
return domain.ClientManagerLifecycleView{}, err
|
||||
}
|
||||
user, instance, _, profile, endpoint, err := svc.authorizeClientManagerLifecycle(sessionID, request.ServerInstanceID, request.ProfileKey, domain.JobCapabilityClientManagerUpdate, "client-manager.update.denied")
|
||||
_, instance, _, profile, endpoint, err := svc.authorizeClientManagerLifecycle(sessionID, request.ServerInstanceID, request.ProfileKey, domain.JobCapabilityClientManagerUpdate, "client-manager.update.denied")
|
||||
if err != nil {
|
||||
return domain.ClientManagerLifecycleView{}, err
|
||||
}
|
||||
@@ -199,11 +193,9 @@ func (svc *CoreService) UpdateClientManagerForSession(sessionID string, request
|
||||
}
|
||||
distribution, err := svc.authorizedClientManagerDistribution(instance, profile, request.DistributionID)
|
||||
if err != nil {
|
||||
_ = svc.recordAuditEvent(user.ID, "client-manager.update.denied", "client-manager-installation", installation.ID, domain.AuditResultDenied, "client-manager update denied: artifact scope or generation is invalid")
|
||||
return domain.ClientManagerLifecycleView{}, err
|
||||
}
|
||||
if distribution.ArtifactID == installation.ActiveArtifactID || !clientManagerVersionAllowed(profile, installation.ActiveVersion, clientManagerDistributionVersion(distribution, profile)) {
|
||||
_ = svc.recordAuditEvent(user.ID, "client-manager.update.denied", "client-manager-installation", installation.ID, domain.AuditResultDenied, "client-manager update denied: artifact is not compatible with the active deployment")
|
||||
return domain.ClientManagerLifecycleView{}, validationError("client-manager update artifact is incompatible")
|
||||
}
|
||||
if existing, err := svc.store.Jobs().GetByIdempotency(endpoint.ID, request.IdempotencyKey); err == nil {
|
||||
@@ -246,7 +238,6 @@ func (svc *CoreService) UpdateClientManagerForSession(sessionID string, request
|
||||
if job.ID != installation.CurrentJobID {
|
||||
return domain.ClientManagerLifecycleView{}, validationError("client-manager update job fence is invalid")
|
||||
}
|
||||
_ = svc.recordAuditEvent(user.ID, "client-manager.update", "client-manager-installation", installation.ID, domain.AuditResultQueued, "queued approved staged client-manager update with rollback retention")
|
||||
return svc.clientManagerLifecycleView(installation)
|
||||
}
|
||||
|
||||
@@ -254,7 +245,7 @@ func (svc *CoreService) UninstallClientManagerForSession(sessionID string, reque
|
||||
if err := validator.ValidateClientManagerUninstallRequest(request); err != nil {
|
||||
return domain.ClientManagerLifecycleView{}, err
|
||||
}
|
||||
user, instance, _, profile, endpoint, err := svc.authorizeClientManagerLifecycle(sessionID, request.ServerInstanceID, request.ProfileKey, domain.JobCapabilityClientManagerUninstall, "client-manager.uninstall.denied")
|
||||
_, instance, _, profile, endpoint, err := svc.authorizeClientManagerLifecycle(sessionID, request.ServerInstanceID, request.ProfileKey, domain.JobCapabilityClientManagerUninstall, "client-manager.uninstall.denied")
|
||||
if err != nil {
|
||||
return domain.ClientManagerLifecycleView{}, err
|
||||
}
|
||||
@@ -304,13 +295,11 @@ func (svc *CoreService) UninstallClientManagerForSession(sessionID string, reque
|
||||
if job.ID != installation.CurrentJobID {
|
||||
return domain.ClientManagerLifecycleView{}, validationError("client-manager uninstall job fence is invalid")
|
||||
}
|
||||
_ = svc.recordAuditEvent(user.ID, "client-manager.uninstall", "client-manager-installation", installation.ID, domain.AuditResultQueued, "queued safe controlled-workspace uninstall")
|
||||
return svc.clientManagerLifecycleView(installation)
|
||||
}
|
||||
|
||||
func (svc *CoreService) RevokeClientManagerSessionForSession(sessionID string, request domain.ClientManagerRevokeSessionRequest) (domain.ClientManagerLifecycleView, error) {
|
||||
user, err := svc.GetCurrentUser(sessionID)
|
||||
if err != nil {
|
||||
if _, err := svc.GetCurrentUser(sessionID); err != nil {
|
||||
return domain.ClientManagerLifecycleView{}, err
|
||||
}
|
||||
instance, err := svc.GetServerInstanceForSession(sessionID, request.ServerInstanceID)
|
||||
@@ -334,7 +323,6 @@ func (svc *CoreService) RevokeClientManagerSessionForSession(sessionID string, r
|
||||
return domain.ClientManagerLifecycleView{}, err
|
||||
}
|
||||
}
|
||||
_ = svc.recordAuditEvent(user.ID, "client-manager.revoke", "client-manager-installation", installation.ID, domain.AuditResultSuccess, "revoked Client Manager component session without exposing token material")
|
||||
return svc.clientManagerLifecycleView(installation)
|
||||
}
|
||||
|
||||
@@ -360,7 +348,7 @@ func (svc *CoreService) RetryClientManagerLifecycleForSession(sessionID string,
|
||||
case domain.ClientManagerOperationUninstall:
|
||||
capability = domain.JobCapabilityClientManagerUninstall
|
||||
}
|
||||
user, _, _, _, endpoint, err := svc.authorizeClientManagerLifecycle(sessionID, request.ServerInstanceID, request.ProfileKey, capability, "client-manager.retry.denied")
|
||||
_, _, _, _, endpoint, err := svc.authorizeClientManagerLifecycle(sessionID, request.ServerInstanceID, request.ProfileKey, capability, "client-manager.retry.denied")
|
||||
if err != nil {
|
||||
return domain.ClientManagerLifecycleView{}, err
|
||||
}
|
||||
@@ -402,7 +390,6 @@ func (svc *CoreService) RetryClientManagerLifecycleForSession(sessionID string,
|
||||
if job.ID != installation.CurrentJobID {
|
||||
return domain.ClientManagerLifecycleView{}, validationError("client-manager retry job fence is invalid")
|
||||
}
|
||||
_ = svc.recordAuditEvent(user.ID, "client-manager.retry", "client-manager-installation", installation.ID, domain.AuditResultQueued, "queued bounded retry using the existing deployment generation fence")
|
||||
return svc.clientManagerLifecycleView(installation)
|
||||
}
|
||||
|
||||
@@ -472,7 +459,6 @@ func (svc *CoreService) authorizeClientManagerLifecycle(sessionID, serverInstanc
|
||||
}
|
||||
profile, err := findRuntimeClientManagerProfile(plugin, profileKey)
|
||||
if err != nil || profile.Deployment.Mode != "run-supervised" || !containsString(profile.Deployment.RequiredRunCapabilities, capability) {
|
||||
_ = svc.recordAuditEvent(user.ID, deniedAction, "server-instance", instance.ID, domain.AuditResultDenied, "client-manager lifecycle denied: profile or capability is not declared")
|
||||
return domain.User{}, domain.ServerInstance{}, domain.GamePlugin{}, domain.RuntimeClientManagerProfile{}, domain.RunEndpoint{}, ErrForbidden
|
||||
}
|
||||
endpoint, err := svc.store.RunEndpoints().Get(instance.RunEndpointID)
|
||||
@@ -480,7 +466,6 @@ func (svc *CoreService) authorizeClientManagerLifecycle(sessionID, serverInstanc
|
||||
return domain.User{}, domain.ServerInstance{}, domain.GamePlugin{}, domain.RuntimeClientManagerProfile{}, domain.RunEndpoint{}, err
|
||||
}
|
||||
if err := svc.validateRunnableEndpoint(endpoint, capability); err != nil {
|
||||
_ = svc.recordAuditEvent(user.ID, deniedAction, "server-instance", instance.ID, domain.AuditResultDenied, "client-manager lifecycle denied: assigned Run endpoint is offline or unsupported")
|
||||
return domain.User{}, domain.ServerInstance{}, domain.GamePlugin{}, domain.RuntimeClientManagerProfile{}, domain.RunEndpoint{}, err
|
||||
}
|
||||
return user, instance, plugin, profile, endpoint, nil
|
||||
@@ -974,7 +959,7 @@ func (svc *CoreService) projectClientManagerLifecycleResult(job domain.Job, stam
|
||||
installation.LastHeartbeatSequence = 0
|
||||
case domain.ClientManagerOperationUninstall:
|
||||
installation.Status = domain.ClientManagerLifecycleUninstalled
|
||||
installation.Phase = "controlled workspace removed"
|
||||
installation.Phase = "managed workspace removed"
|
||||
installation.Health = domain.ClientManagerHealthOffline
|
||||
installation.HealthReason = "uninstalled"
|
||||
installation.ActiveArtifactID = ""
|
||||
@@ -994,11 +979,7 @@ func (svc *CoreService) projectClientManagerLifecycleResult(job domain.Job, stam
|
||||
if err := svc.store.ClientManagerInstallations().Update(installation); err != nil {
|
||||
return err
|
||||
}
|
||||
result := domain.AuditResultSuccess
|
||||
if !success {
|
||||
result = domain.AuditResultFailed
|
||||
}
|
||||
return svc.recordAuditEvent("run:"+installation.RunEndpointID, "client-manager."+string(installation.LastOperation), "client-manager-installation", installation.ID, result, "client-manager lifecycle job reached a bounded terminal result")
|
||||
return nil
|
||||
}
|
||||
return repo.ErrNotFound
|
||||
}
|
||||
@@ -1134,7 +1115,6 @@ func (svc *CoreService) RegisterClientManager(request domain.ClientManagerRegist
|
||||
}
|
||||
stamp := svc.now()
|
||||
if request.Timestamp.Before(stamp.Add(-clientManagerRegistrationWindow)) || request.Timestamp.After(stamp.Add(clientManagerRegistrationWindow)) {
|
||||
_ = svc.recordAuditEvent("client-manager:"+request.InstallationID, "client-manager.register.denied", "client-manager-installation", request.InstallationID, domain.AuditResultDenied, "client-manager registration denied: timestamp expired")
|
||||
return domain.ClientManagerRegisterResult{}, ErrUnauthorized
|
||||
}
|
||||
installation, err := svc.store.ClientManagerInstallations().Get(request.InstallationID)
|
||||
@@ -1142,7 +1122,6 @@ func (svc *CoreService) RegisterClientManager(request domain.ClientManagerRegist
|
||||
return domain.ClientManagerRegisterResult{}, ErrUnauthorized
|
||||
}
|
||||
if installation.ServerInstanceID != request.ServerInstanceID || installation.ProfileKey != request.ProfileKey || installation.ActiveArtifactID != request.ArtifactID || installation.ActiveVersion != request.Version || installation.ActiveRevision != request.SourceRevision || installation.TargetOS != request.TargetOS || installation.TargetArch != request.TargetArch || installation.KeyGeneration != request.KeyGeneration || installation.DeploymentGeneration != request.DeploymentGeneration || installation.RequiresRedeploy || installation.Status == domain.ClientManagerLifecycleUninstalled {
|
||||
_ = svc.recordAuditEvent("client-manager:"+request.InstallationID, "client-manager.register.denied", "client-manager-installation", request.InstallationID, domain.AuditResultDenied, "client-manager registration denied: identity or deployment fence is stale")
|
||||
return domain.ClientManagerRegisterResult{}, ErrUnauthorized
|
||||
}
|
||||
instance, err := svc.store.ServerInstances().Get(installation.ServerInstanceID)
|
||||
@@ -1155,7 +1134,6 @@ func (svc *CoreService) RegisterClientManager(request domain.ClientManagerRegist
|
||||
}
|
||||
profile, err := findRuntimeClientManagerProfile(plugin, installation.ProfileKey)
|
||||
if err != nil || !clientManagerCapabilitiesMatch(profile.Health.RequiredCapabilities, request.Capabilities) {
|
||||
_ = svc.recordAuditEvent("client-manager:"+request.InstallationID, "client-manager.register.denied", "client-manager-installation", request.InstallationID, domain.AuditResultDenied, "client-manager registration denied: capabilities do not match declaration")
|
||||
return domain.ClientManagerRegisterResult{}, ErrUnauthorized
|
||||
}
|
||||
key, err := svc.activeComponentKey(installation.ServerInstanceID, domain.DistributionComponentClientManager, installation.ProfileKey)
|
||||
@@ -1168,12 +1146,10 @@ func (svc *CoreService) RegisterClientManager(request domain.ClientManagerRegist
|
||||
}
|
||||
expected := clientManagerRegistrationSignature(plainKey, request)
|
||||
if subtle.ConstantTimeCompare([]byte(expected), []byte(request.Signature)) != 1 {
|
||||
_ = svc.recordAuditEvent("client-manager:"+request.InstallationID, "client-manager.register.denied", "client-manager-installation", request.InstallationID, domain.AuditResultDenied, "client-manager registration denied: signature mismatch")
|
||||
return domain.ClientManagerRegisterResult{}, ErrUnauthorized
|
||||
}
|
||||
nonceID := clientManagerNonceID(request.InstallationID, request.Nonce)
|
||||
if _, err := svc.store.ClientManagerNonces().Get(nonceID); err == nil {
|
||||
_ = svc.recordAuditEvent("client-manager:"+request.InstallationID, "client-manager.register.denied", "client-manager-installation", request.InstallationID, domain.AuditResultDenied, "client-manager registration denied: nonce replay")
|
||||
return domain.ClientManagerRegisterResult{}, ErrUnauthorized
|
||||
} else if !errors.Is(err, repo.ErrNotFound) {
|
||||
return domain.ClientManagerRegisterResult{}, err
|
||||
@@ -1209,7 +1185,6 @@ func (svc *CoreService) RegisterClientManager(request domain.ClientManagerRegist
|
||||
if err := svc.store.ClientManagerInstallations().Update(installation); err != nil {
|
||||
return domain.ClientManagerRegisterResult{}, err
|
||||
}
|
||||
_ = svc.recordAuditEvent("client-manager:"+installation.ID, "client-manager.register", "client-manager-installation", installation.ID, domain.AuditResultSuccess, "Client Manager registered with an isolated expiring component session")
|
||||
return domain.ClientManagerRegisterResult{Accepted: true, InstallationID: installation.ID, SessionToken: token, ExpiresAt: session.ExpiresAt, HeartbeatEvery: profile.Health.IntervalSeconds, ServerTime: stamp}, nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user