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

  1. Use a different admin/service account to perform the deletion
  2. Verify deletedBy != target userID in tooling before calling DeleteUser
  3. 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

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


AI-assisted analysis of SigNoz/signoz@5069bf80b0 (2026-08-28). Data as JSON: /api/errors/e84d13a35b75203c. Report an issue: GitHub.