feature: adds audit

This commit is contained in:
ievgenii vdovenko 2025-07-29 13:31:09 +02:00
parent 2c3304132a
commit 0b1e5fdf80
3 changed files with 41 additions and 2 deletions

View file

@ -365,11 +365,16 @@ class UsersView(UserAppView):
_user_groups = len(c.user.user_groups)
_pull_requests = len(c.user.user_pull_requests)
_artifacts = len(c.user.artifacts)
_reviewer = len(c.user.reviewer_pull_requests)
def set_flash_repos_if_detached():
if detach_repos:
h.flash(_("Detached %s repositories") % _repos, category="success")
def set_flash_reviews_if_deleted():
if delete_reviewer:
h.flash(_("Removed from %s review(s)") % _reviewer, category="success")
def set_flash_repo_groups_if_detached():
if detach_repo_groups:
h.flash(_("Detached %s repository groups") % _repo_groups, category="success")
@ -391,11 +396,11 @@ class UsersView(UserAppView):
detach_user_groups = _user_groups > 0
detach_pull_requests = _pull_requests > 0
detach_artifacts = _artifacts > 0
delete_reviewer = _reviewer > 0
old_values = c.user.get_api_data()
try:
ghost_user = User.get_ghost_user()
UserModel().delete(
c.user,
detach_repos=detach_repos,
@ -403,7 +408,7 @@ class UsersView(UserAppView):
detach_user_groups=detach_user_groups,
detach_pull_requests=detach_pull_requests,
detach_artifacts=detach_artifacts,
new_owner=ghost_user,
delete_reviewer=delete_reviewer,
)
audit_logger.store_web("user.delete", action_data={"old_data": old_values}, user=c.rhodecode_user)
@ -414,6 +419,7 @@ class UsersView(UserAppView):
set_flash_user_groups_if_detached()
set_flash_pull_requests_if_detached()
set_flash_artifacts_if_detached()
set_flash_reviews_if_deleted()
username = h.escape(old_values["username"])
h.flash(_("Successfully deleted user `{}`").format(username), category="success")
except (

View file

@ -63,6 +63,7 @@ ACTIONS_V1 = {
"repo.edit.permissions.branch": {},
"repo.archive": {"old_data": {}},
"repo.delete": {"old_data": {}},
"review.delete": {"review.role": "", "pull_request": {}, "prev_user": {}},
"repo.archive.download": {"user_agent": "", "archive_name": "", "archive_spec": "", "archive_cached": ""},
"repo.permissions.branch_rule.create": {},
"repo.permissions.branch_rule.edit": {},

View file

@ -24,10 +24,12 @@ import logging
import traceback
import datetime
import ipaddress
from typing import List
from sqlalchemy.exc import DatabaseError
from rhodecode import events
from rhodecode.lib import audit_logger
from rhodecode.lib.pyramid_utils import get_current_request
from rhodecode.lib.user_log_filter import user_log_filter
from rhodecode.lib.utils2 import get_current_rhodecode_user, action_logger_generic, AttributeDict, str2bool
@ -56,6 +58,7 @@ from rhodecode.model.db import (
UserEmailMap,
UserIpMap,
UserLog,
PullRequestReviewers,
)
from rhodecode.model.meta import Session
from rhodecode.model.auth_token import AuthTokenModel
@ -508,6 +511,31 @@ class UserModel(BaseModel):
a.file_description += " \n::detached artifact from deleted user: %s" % (username,)
self.sa.add(a)
def _delete_from_reviews(self, user: User, reviewer_pull_requests: List[PullRequestReviewers]):
for review in reviewer_pull_requests:
if review.role == PullRequestReviewers.ROLE_REVIEWER:
audit_logger.store_web(
"review.delete",
user=get_current_rhodecode_user(),
action_data={
"review_role": review.role,
"pull_request": {
"id": review.pull_request.pull_request_id,
"title": review.pull_request.title_safe,
},
"prev_user": {
"username": user.username,
"name": user.name,
"email": user.email,
},
},
repo=audit_logger.RepoWrap(
repo_id=review.pull_request.target_repo_id,
repo_name=review.pull_request.target_repo.repo_name,
),
)
self.sa.delete(review)
def delete(
self,
user,
@ -517,6 +545,7 @@ class UserModel(BaseModel):
detach_user_groups=False,
detach_pull_requests=False,
detach_artifacts=False,
delete_reviewer=False,
new_owner=None,
):
from rhodecode.lib import hooks_base
@ -530,6 +559,9 @@ class UserModel(BaseModel):
if user.username in [User.DEFAULT_USER, User.GHOST_USER]:
raise DefaultUserException("You can't remove this user since it's crucial for entire application")
if delete_reviewer:
self._delete_from_reviews(user, user.reviewer_pull_requests)
if detach_repos or detach_repo_groups or detach_user_groups or detach_pull_requests or detach_artifacts:
new_owner = new_owner or self.cls.get_ghost_user()
log.debug("New detached objects owner %s", new_owner)