SigNoz/signoz · error · errors.Error
CodeForbidden
CodeForbidden
Error message
cannot self delete
What it means
DeleteUser refuses to soft-delete a user when the deleter (deletedBy claim) is the same user being deleted. Self-deletion is blocked as TypeForbidden to prevent lockout/loss of the last admin.
Source
Thrown at pkg/modules/user/impluser/setter.go:225
if err != nil {
return err
}
if err := user.ErrIfRoot(); err != nil {
return errors.WithAdditionalf(err, "cannot delete root user")
}
if err := user.ErrIfDeleted(); err != nil {
return errors.WithAdditionalf(err, "cannot delete already deleted user")
}
deleter, err := module.store.GetUser(ctx, valuer.MustNewUUID(deletedBy))
if err != nil {
return err
}
if deleter.ID == user.ID {
return errors.New(errors.TypeForbidden, errors.CodeForbidden, "cannot self delete")
}
err = user.UpdateStatus(types.UserStatusDeleted)
if err != nil {
return err
}
userRoles, err := module.getter.GetRolesByUserID(ctx, user.ID)
if err != nil {
return err
}
roleNames := roleNamesFromUserRoles(userRoles)
// since revoke is idempotant multiple calls to revoke won't cause issues in case of retries
err = module.authz.Revoke(
ctx,
orgID,View on GitHub (pinned to 5069bf80b0)
Solutions
- Use a different admin/service account to perform the deletion
- Verify deletedBy != target userID in tooling before calling DeleteUser
- Hide/disable self-delete actions in the admin UI
Example fix
// before deleteUser(myUserID, deletedBy=myUserID) // 403 // after otherAdmin.deleteUser(myUserID) // deletedBy=otherAdmin.ID
Defensive patterns
Strategy: validation
Validate before calling
if deletedBy == targetUserID {
return errors.New("forbidden", "cannot self delete; use another admin")
}
deleteUser(ctx, targetUserID, deletedBy) Prevention
- Disable delete action on the current user's row in admin UI
- Use a dedicated service account for automated deletions
When it happens
Trigger: DELETE user endpoint where the acting user's ID equals the target user.ID (module.store.GetUser(deletedBy).ID == user.ID).
Common situations: Admin testing deletion on their own account; automation using a service token tied to the account being removed; UI not hiding the delete button for the logged-in user's row.
Related errors
- ErrCodeRoleHasUserAssignees
- CodeInvalidInput
- ErrCodeResetPasswordTokenExpired
- ErrCodeUserDeprecated
- CodeUnsupported
AI-assisted analysis of SigNoz/signoz@5069bf80b0 (2026-08-28).
Data as JSON: /api/errors/e84d13a35b75203c.
Report an issue: GitHub.