diff --git a/rhodecode/authentication/base.py b/rhodecode/authentication/base.py --- a/rhodecode/authentication/base.py +++ b/rhodecode/authentication/base.py @@ -578,14 +578,20 @@ def get_authn_registry(registry=None): return authn_registry -def get_auth_cache_manager(custom_ttl=None): +def get_auth_cache_manager(custom_ttl=None, suffix=None): + cache_name = 'rhodecode.authentication' + if suffix: + cache_name = 'rhodecode.authentication.{}'.format(suffix) return caches.get_cache_manager( - 'auth_plugins', 'rhodecode.authentication', custom_ttl) + 'auth_plugins', cache_name, custom_ttl) -def get_perms_cache_manager(custom_ttl=None): +def get_perms_cache_manager(custom_ttl=None, suffix=None): + cache_name = 'rhodecode.permissions' + if suffix: + cache_name = 'rhodecode.permissions.{}'.format(suffix) return caches.get_cache_manager( - 'auth_plugins', 'rhodecode.permissions', custom_ttl) + 'auth_plugins', cache_name, custom_ttl) def authenticate(username, password, environ=None, auth_type=None, @@ -646,7 +652,8 @@ def authenticate(username, password, env plugin_cache_active, cache_ttl = plugin.get_ttl_cache(plugin_settings) # get instance of cache manager configured for a namespace - cache_manager = get_auth_cache_manager(custom_ttl=cache_ttl) + cache_manager = get_auth_cache_manager( + custom_ttl=cache_ttl, suffix=user.user_id) log.debug('AUTH_CACHE_TTL for plugin `%s` active: %s (TTL: %s)', plugin.get_id(), plugin_cache_active, cache_ttl) diff --git a/rhodecode/authentication/views.py b/rhodecode/authentication/views.py --- a/rhodecode/authentication/views.py +++ b/rhodecode/authentication/views.py @@ -32,6 +32,7 @@ from rhodecode.authentication.base impor from rhodecode.lib import helpers as h from rhodecode.lib.auth import ( LoginRequired, HasPermissionAllDecorator, CSRFRequired) +from rhodecode.lib.caches import clear_cache_manager from rhodecode.model.forms import AuthSettingsForm from rhodecode.model.meta import Session from rhodecode.model.settings import SettingsModel @@ -101,6 +102,16 @@ class AuthnPluginViewBase(BaseAppView): self.plugin.create_or_update_setting(name, value) Session().commit() + # cleanup cache managers in case of change for plugin + # TODO(marcink): because we can register multiple namespaces + # we should at some point figure out how to retrieve ALL namespace + # cache managers and clear them... + cache_manager = get_auth_cache_manager() + clear_cache_manager(cache_manager) + + cache_manager = get_perms_cache_manager() + clear_cache_manager(cache_manager) + # Display success message and redirect. h.flash(_('Auth settings updated successfully.'), category='success') redirect_to = self.request.resource_path( @@ -161,12 +172,6 @@ class AuthSettingsView(BaseAppView): Session().add(setting) Session().commit() - cache_manager = get_auth_cache_manager() - cache_manager.clear() - - cache_manager = get_perms_cache_manager() - cache_manager.clear() - h.flash(_('Auth settings updated successfully.'), category='success') except formencode.Invalid as errors: e = errors.error_dict or {} diff --git a/rhodecode/lib/middleware/simplevcs.py b/rhodecode/lib/middleware/simplevcs.py --- a/rhodecode/lib/middleware/simplevcs.py +++ b/rhodecode/lib/middleware/simplevcs.py @@ -288,7 +288,8 @@ class SimpleVCS(object): """ # get instance of cache manager configured for a namespace - cache_manager = get_perms_cache_manager(custom_ttl=cache_ttl) + cache_manager = get_perms_cache_manager( + custom_ttl=cache_ttl, suffix=user.user_id) log.debug('AUTH_CACHE_TTL for permissions `%s` active: %s (TTL: %s)', plugin_id, plugin_cache_active, cache_ttl)