permissions: flush all user permissions in case of default user permission changes.

- this is a special case that due to inheritance we need to flush ALL users permissions
- before the default permission changes didn't flush the caches result in cached values beeing present until the cache expires
This commit is contained in:
Daniel Dourvaris 2020-01-10 15:51:14 +01:00
parent c599b25174
commit 0beeba3cdc
4 changed files with 40 additions and 4 deletions

View file

@ -28,6 +28,7 @@ from rhodecode.lib import helpers as h
from rhodecode.lib import audit_logger
from rhodecode.lib.auth import (
LoginRequired, HasRepoGroupPermissionAnyDecorator, CSRFRequired)
from rhodecode.model.db import User
from rhodecode.model.permission import PermissionModel
from rhodecode.model.repo_group import RepoGroupModel
from rhodecode.model.forms import RepoGroupPermsForm
@ -96,7 +97,13 @@ class RepoGroupPermissionsView(RepoGroupAppView):
Session().commit()
h.flash(_('Repository Group permissions updated'), category='success')
PermissionModel().flush_user_permission_caches(changes)
affected_user_ids = None
if changes.get('default_user_changed', False):
# if we change the default user, we need to flush everyone permissions
affected_user_ids = [x.user_id for x in User.get_all()]
PermissionModel().flush_user_permission_caches(
changes, affected_user_ids=affected_user_ids)
raise HTTPFound(
h.route_path('edit_repo_group_perms',

View file

@ -28,6 +28,7 @@ from rhodecode.lib import helpers as h
from rhodecode.lib import audit_logger
from rhodecode.lib.auth import (
LoginRequired, HasRepoPermissionAnyDecorator, CSRFRequired)
from rhodecode.model.db import User
from rhodecode.model.forms import RepoPermsForm
from rhodecode.model.meta import Session
from rhodecode.model.permission import PermissionModel
@ -89,7 +90,12 @@ class RepoSettingsPermissionsView(RepoAppView):
Session().commit()
h.flash(_('Repository access permissions updated'), category='success')
PermissionModel().flush_user_permission_caches(changes)
affected_user_ids = None
if changes.get('default_user_changed', False):
# if we change the default user, we need to flush everyone permissions
affected_user_ids = [x.user_id for x in User.get_all()]
PermissionModel().flush_user_permission_caches(
changes, affected_user_ids=affected_user_ids)
raise HTTPFound(
h.route_path('edit_repo_perms', repo_name=self.db_repo_name))

View file

@ -619,13 +619,26 @@ class RepoModel(BaseModel):
changes = {
'added': [],
'updated': [],
'deleted': []
'deleted': [],
'default_user_changed': None
}
repo = self._get_repo(repo)
# update permissions
for member_id, perm, member_type in perm_updates:
member_id = int(member_id)
if member_type == 'user':
member_name = User.get(member_id).username
if member_name == User.DEFAULT_USER:
# NOTE(dan): detect if we changed permissions for default user
perm_obj = self.sa.query(UserRepoToPerm) \
.filter(UserRepoToPerm.user_id == member_id) \
.filter(UserRepoToPerm.repository == repo) \
.scalar()
if perm_obj and perm_obj.permission.permission_name != perm:
changes['default_user_changed'] = True
# this updates also current one if found
self.grant_user_permission(
repo=repo, user=member_id, perm=perm)

View file

@ -353,7 +353,8 @@ class RepoGroupModel(BaseModel):
changes = {
'added': [],
'updated': [],
'deleted': []
'deleted': [],
'default_user_changed': None
}
def _set_perm_user(obj, user, perm):
@ -430,6 +431,15 @@ class RepoGroupModel(BaseModel):
member_id = int(member_id)
if member_type == 'user':
member_name = User.get(member_id).username
if isinstance(obj, RepoGroup) and obj == repo_group and member_name == User.DEFAULT_USER:
# NOTE(dan): detect if we changed permissions for default user
perm_obj = self.sa.query(UserRepoGroupToPerm) \
.filter(UserRepoGroupToPerm.user_id == member_id) \
.filter(UserRepoGroupToPerm.group == repo_group) \
.scalar()
if perm_obj and perm_obj.permission.permission_name != perm:
changes['default_user_changed'] = True
# this updates also current one if found
_set_perm_user(obj, user=member_id, perm=perm)
elif member_type == 'user_group':