##// END OF EJS Templates
caches: clear perms cache manager while updating settings for auth plugins
marcink -
r2169:94d9c7f1 default
parent child Browse files
Show More
@@ -1,192 +1,196 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 3 # Copyright (C) 2012-2017 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
7 7 # (only), as published by the Free Software Foundation.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU Affero General Public License
15 15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 16 #
17 17 # This program is dual-licensed. If you wish to learn more about the
18 18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 21 import colander
22 22 import formencode.htmlfill
23 23 import logging
24 24
25 25 from pyramid.httpexceptions import HTTPFound
26 26 from pyramid.renderers import render
27 27 from pyramid.response import Response
28 28
29 29 from rhodecode.authentication.base import (
30 get_auth_cache_manager, get_authn_registry)
30 get_auth_cache_manager, get_perms_cache_manager, get_authn_registry)
31 31 from rhodecode.lib import auth
32 32 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
33 33 from rhodecode.model.forms import AuthSettingsForm
34 34 from rhodecode.model.meta import Session
35 35 from rhodecode.model.settings import SettingsModel
36 36 from rhodecode.translation import _
37 37
38 38 log = logging.getLogger(__name__)
39 39
40 40
41 41 class AuthnPluginViewBase(object):
42 42
43 43 def __init__(self, context, request):
44 44 self.request = request
45 45 self.context = context
46 46 self.plugin = context.plugin
47 47 self._rhodecode_user = request.user
48 48
49 49 @LoginRequired()
50 50 @HasPermissionAllDecorator('hg.admin')
51 51 def settings_get(self, defaults=None, errors=None):
52 52 """
53 53 View that displays the plugin settings as a form.
54 54 """
55 55 defaults = defaults or {}
56 56 errors = errors or {}
57 57 schema = self.plugin.get_settings_schema()
58 58
59 59 # Compute default values for the form. Priority is:
60 60 # 1. Passed to this method 2. DB value 3. Schema default
61 61 for node in schema:
62 62 if node.name not in defaults:
63 63 defaults[node.name] = self.plugin.get_setting_by_name(
64 64 node.name, node.default)
65 65
66 66 template_context = {
67 67 'defaults': defaults,
68 68 'errors': errors,
69 69 'plugin': self.context.plugin,
70 70 'resource': self.context,
71 71 }
72 72
73 73 return template_context
74 74
75 75 @LoginRequired()
76 76 @HasPermissionAllDecorator('hg.admin')
77 77 @auth.CSRFRequired()
78 78 def settings_post(self):
79 79 """
80 80 View that validates and stores the plugin settings.
81 81 """
82 82 schema = self.plugin.get_settings_schema()
83 83 data = self.request.params
84 84
85 85 try:
86 86 valid_data = schema.deserialize(data)
87 87 except colander.Invalid as e:
88 88 # Display error message and display form again.
89 89 self.request.session.flash(
90 90 _('Errors exist when saving plugin settings. '
91 91 'Please check the form inputs.'),
92 92 queue='error')
93 93 defaults = {key: data[key] for key in data if key in schema}
94 94 return self.settings_get(errors=e.asdict(), defaults=defaults)
95 95
96 96 # Store validated data.
97 97 for name, value in valid_data.items():
98 98 self.plugin.create_or_update_setting(name, value)
99 99 Session().commit()
100 100
101 101 # Display success message and redirect.
102 102 self.request.session.flash(
103 103 _('Auth settings updated successfully.'),
104 104 queue='success')
105 105 redirect_to = self.request.resource_path(
106 106 self.context, route_name='auth_home')
107 107 return HTTPFound(redirect_to)
108 108
109 109
110 110 # TODO: Ongoing migration in these views.
111 111 # - Maybe we should also use a colander schema for these views.
112 112 class AuthSettingsView(object):
113 113 def __init__(self, context, request):
114 114 self.context = context
115 115 self.request = request
116 116
117 117 # TODO: Move this into a utility function. It is needed in all view
118 118 # classes during migration. Maybe a mixin?
119 119
120 120 # Some of the decorators rely on this attribute to be present on the
121 121 # class of the decorated method.
122 122 self._rhodecode_user = request.user
123 123
124 124 @LoginRequired()
125 125 @HasPermissionAllDecorator('hg.admin')
126 126 def index(self, defaults=None, errors=None, prefix_error=False):
127 127 defaults = defaults or {}
128 128 authn_registry = get_authn_registry(self.request.registry)
129 129 enabled_plugins = SettingsModel().get_auth_plugins()
130 130
131 131 # Create template context and render it.
132 132 template_context = {
133 133 'resource': self.context,
134 134 'available_plugins': authn_registry.get_plugins(),
135 135 'enabled_plugins': enabled_plugins,
136 136 }
137 137 html = render('rhodecode:templates/admin/auth/auth_settings.mako',
138 138 template_context,
139 139 request=self.request)
140 140
141 141 # Create form default values and fill the form.
142 142 form_defaults = {
143 143 'auth_plugins': ','.join(enabled_plugins)
144 144 }
145 145 form_defaults.update(defaults)
146 146 html = formencode.htmlfill.render(
147 147 html,
148 148 defaults=form_defaults,
149 149 errors=errors,
150 150 prefix_error=prefix_error,
151 151 encoding="UTF-8",
152 152 force_defaults=False)
153 153
154 154 return Response(html)
155 155
156 156 @LoginRequired()
157 157 @HasPermissionAllDecorator('hg.admin')
158 158 @auth.CSRFRequired()
159 159 def auth_settings(self):
160 160 try:
161 161 form = AuthSettingsForm()()
162 162 form_result = form.to_python(self.request.params)
163 163 plugins = ','.join(form_result['auth_plugins'])
164 164 setting = SettingsModel().create_or_update_setting(
165 165 'auth_plugins', plugins)
166 166 Session().add(setting)
167 167 Session().commit()
168 168
169 169 cache_manager = get_auth_cache_manager()
170 170 cache_manager.clear()
171
172 cache_manager = get_perms_cache_manager()
173 cache_manager.clear()
174
171 175 self.request.session.flash(
172 176 _('Auth settings updated successfully.'),
173 177 queue='success')
174 178 except formencode.Invalid as errors:
175 179 e = errors.error_dict or {}
176 180 self.request.session.flash(
177 181 _('Errors exist when saving plugin setting. '
178 182 'Please check the form inputs.'),
179 183 queue='error')
180 184 return self.index(
181 185 defaults=errors.value,
182 186 errors=e,
183 187 prefix_error=False)
184 188 except Exception:
185 189 log.exception('Exception in auth_settings')
186 190 self.request.session.flash(
187 191 _('Error occurred during update of auth settings.'),
188 192 queue='error')
189 193
190 194 redirect_to = self.request.resource_path(
191 195 self.context, route_name='auth_home')
192 196 return HTTPFound(redirect_to)
General Comments 0
You need to be logged in to leave comments. Login now