# -*- 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 . """ 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'))