auth_settings.py
139 lines
| 5.2 KiB
| text/x-python
|
PythonLexer
Bradley M. Kuhn
|
r4116 | # -*- coding: utf-8 -*- | ||
# This program is free software: you can redistribute it and/or modify | ||||
# it under the terms of the GNU General Public License as published by | ||||
# the Free Software Foundation, either version 3 of the License, or | ||||
# (at your option) any later version. | ||||
# | ||||
# This program is distributed in the hope that it will be useful, | ||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
# GNU General Public License for more details. | ||||
# | ||||
# You should have received a copy of the GNU General Public License | ||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||
""" | ||||
rhodecode.controllers.admin.auth_settings | ||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||
pluggable authentication controller for RhodeCode | ||||
:created_on: Nov 26, 2010 | ||||
:author: akesterson | ||||
""" | ||||
import pprint | ||||
import logging | ||||
import formencode.htmlfill | ||||
import traceback | ||||
from pylons import request, response, session, tmpl_context as c, url | ||||
from pylons.controllers.util import abort, redirect | ||||
from pylons.i18n.translation import _ | ||||
from sqlalchemy.exc import DatabaseError | ||||
from rhodecode.lib import helpers as h | ||||
from rhodecode.lib.compat import json, formatted_json | ||||
from rhodecode.lib.base import BaseController, render | ||||
from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator | ||||
from rhodecode.lib import auth_modules | ||||
from rhodecode.model.forms import AuthSettingsForm | ||||
from rhodecode.model.db import RhodeCodeSetting | ||||
from rhodecode.model.meta import Session | ||||
log = logging.getLogger(__name__) | ||||
class AuthSettingsController(BaseController): | ||||
@LoginRequired() | ||||
@HasPermissionAllDecorator('hg.admin') | ||||
def __before__(self): | ||||
super(AuthSettingsController, self).__before__() | ||||
def __load_defaults(self): | ||||
c.available_plugins = [ | ||||
'rhodecode.lib.auth_modules.auth_rhodecode', | ||||
'rhodecode.lib.auth_modules.auth_container', | ||||
'rhodecode.lib.auth_modules.auth_ldap', | ||||
'rhodecode.lib.auth_modules.auth_crowd', | ||||
] | ||||
c.enabled_plugins = RhodeCodeSetting.get_auth_plugins() | ||||
def index(self, defaults=None, errors=None, prefix_error=False): | ||||
self.__load_defaults() | ||||
_defaults = {} | ||||
# default plugins loaded | ||||
formglobals = { | ||||
"auth_plugins": ["rhodecode.lib.auth_modules.auth_rhodecode"] | ||||
} | ||||
formglobals.update(RhodeCodeSetting.get_auth_settings()) | ||||
formglobals["plugin_settings"] = {} | ||||
formglobals["auth_plugins_shortnames"] = {} | ||||
_defaults["auth_plugins"] = formglobals["auth_plugins"] | ||||
for module in formglobals["auth_plugins"]: | ||||
plugin = auth_modules.loadplugin(module) | ||||
plugin_name = plugin.name | ||||
formglobals["auth_plugins_shortnames"][module] = plugin_name | ||||
formglobals["plugin_settings"][module] = plugin.plugin_settings() | ||||
for v in formglobals["plugin_settings"][module]: | ||||
fullname = ("auth_" + plugin_name + "_" + v["name"]) | ||||
if "default" in v: | ||||
_defaults[fullname] = v["default"] | ||||
# Current values will be the default on the form, if there are any | ||||
setting = RhodeCodeSetting.get_by_name(fullname) | ||||
if setting: | ||||
_defaults[fullname] = setting.app_settings_value | ||||
# we want to show , seperated list of enabled plugins | ||||
_defaults['auth_plugins'] = ','.join(_defaults['auth_plugins']) | ||||
if defaults: | ||||
_defaults.update(defaults) | ||||
formglobals["defaults"] = _defaults | ||||
# set template context variables | ||||
for k, v in formglobals.iteritems(): | ||||
setattr(c, k, v) | ||||
log.debug(pprint.pformat(formglobals, indent=4)) | ||||
log.debug(formatted_json(defaults)) | ||||
return formencode.htmlfill.render( | ||||
render('admin/auth/auth_settings.html'), | ||||
defaults=_defaults, | ||||
errors=errors, | ||||
prefix_error=prefix_error, | ||||
encoding="UTF-8", | ||||
force_defaults=True, | ||||
) | ||||
def auth_settings(self): | ||||
"""POST create and store auth settings""" | ||||
self.__load_defaults() | ||||
_form = AuthSettingsForm(c.enabled_plugins)() | ||||
log.debug("POST Result: %s" % formatted_json(dict(request.POST))) | ||||
try: | ||||
form_result = _form.to_python(dict(request.POST)) | ||||
for k, v in form_result.items(): | ||||
if k == 'auth_plugins': | ||||
# we want to store it comma separated inside our settings | ||||
v = ','.join(v) | ||||
log.debug("%s = %s" % (k, str(v))) | ||||
setting = RhodeCodeSetting.create_or_update(k, v) | ||||
Session().add(setting) | ||||
Session().commit() | ||||
h.flash(_('Auth settings updated successfully'), | ||||
category='success') | ||||
except formencode.Invalid, errors: | ||||
log.error(traceback.format_exc()) | ||||
e = errors.error_dict or {} | ||||
return self.index( | ||||
defaults=errors.value, | ||||
errors=e, | ||||
prefix_error=False) | ||||
except Exception: | ||||
log.error(traceback.format_exc()) | ||||
h.flash(_('error occurred during update of auth settings'), | ||||
category='error') | ||||
return redirect(url('auth_home')) | ||||