mirror of
https://github.com/kakwa/ldapcherry
synced 2024-11-25 02:34:31 +01:00
8c0bf94904
* log where the backend is declared (role or attribute) when inconsistency with main .ini file * fix check of configuration, only role file was checked 2 times instead on checking role one time and attribute one time * <dict>.keys() seems to have a different behavior between 2 (return "list") and 3 (return "dict_keys"), casting to "list" to avoid that.
271 lines
7.8 KiB
Python
271 lines
7.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
# vim:set expandtab tabstop=4 shiftwidth=4:
|
|
#
|
|
# The MIT License (MIT)
|
|
# LdapCherry
|
|
# Copyright (c) 2014 Carpentier Pierre-Francois
|
|
|
|
import string
|
|
import cherrypy
|
|
|
|
|
|
class MissingParameter(Exception):
|
|
def __init__(self, section, key):
|
|
self.section = section
|
|
self.key = key
|
|
self.log = \
|
|
"missing parameter '%(key)s' in section '%(section)s'" % \
|
|
{'key': key, 'section': section}
|
|
|
|
|
|
class MissingKey(Exception):
|
|
def __init__(self, key, section, ymlfile):
|
|
self.key = key
|
|
self.section = section
|
|
self.ymlfile = ymlfile
|
|
self.log = \
|
|
"missing key '%(key)s' in section '%(section)s'" \
|
|
" inside file '%(ymlfile)s'" % \
|
|
{'key': key, 'section': section, 'ymlfile': ymlfile}
|
|
|
|
|
|
class DumplicateRoleKey(Exception):
|
|
def __init__(self, role):
|
|
self.role = role
|
|
self.log = \
|
|
"duplicate role key '%(role)s' in role file" % \
|
|
{'role': role}
|
|
|
|
|
|
class MissingRole(Exception):
|
|
def __init__(self, role):
|
|
self.role = role
|
|
self.log = \
|
|
"role '%(role)s' does not exist in role file" % \
|
|
{'role': role}
|
|
|
|
|
|
class MissingBackend(Exception):
|
|
def __init__(self, backend, type_conf):
|
|
self.backend = backend
|
|
self.log = \
|
|
"backend '%(backend)s' does not exist in main config file " \
|
|
"but is still declared in '%(type_conf)s' file" % \
|
|
{'backend': backend, 'type_conf': type_conf}
|
|
|
|
|
|
class WrongBackend(Exception):
|
|
def __init__(self, backend):
|
|
self.backend = backend
|
|
self.log = \
|
|
"backend '%(backend)s' does not exist" % \
|
|
{'backend': backend}
|
|
|
|
|
|
class DumplicateRoleContent(Exception):
|
|
def __init__(self, role1, role2):
|
|
self.role1 = role1
|
|
self.role2 = role2
|
|
self.log = \
|
|
"role '%(role1)s' and '%(role2)s' are identical" % \
|
|
{'role1': role1, 'role2': role2}
|
|
|
|
|
|
class MissingRolesFile(Exception):
|
|
def __init__(self, rolefile):
|
|
self.rolefile = rolefile
|
|
self.log = \
|
|
"fail to open role file '%(rolefile)s'" % \
|
|
{'rolefile': rolefile}
|
|
|
|
|
|
class PasswordMissMatch(Exception):
|
|
def __init__(self):
|
|
self.log = "password missmatch"
|
|
|
|
|
|
class PPolicyError(Exception):
|
|
def __init__(self):
|
|
self.log = "password doesn't match ppolicy"
|
|
|
|
|
|
class MissingMainFile(Exception):
|
|
def __init__(self, config):
|
|
self.config = config
|
|
self.log = \
|
|
"fail to open main file '%(config)s'" % \
|
|
{'config': config}
|
|
|
|
|
|
class MissingAttributesFile(Exception):
|
|
def __init__(self, attributesfile):
|
|
self.attributesfile = attributesfile
|
|
self.log = \
|
|
"fail to open attributes file '%(attributesfile)s'" % \
|
|
{'attributesfile': attributesfile}
|
|
|
|
|
|
class BackendModuleLoadingFail(Exception):
|
|
def __init__(self, module):
|
|
self.module = module
|
|
self.log = \
|
|
"module '%(module)s' not in python path" % \
|
|
{'module': module}
|
|
|
|
|
|
class BackendModuleInitFail(Exception):
|
|
def __init__(self, module):
|
|
self.module = module
|
|
self.log = \
|
|
"fail to init module '%(module)s'" % \
|
|
{'module': module}
|
|
|
|
|
|
class WrongParamValue(Exception):
|
|
def __init__(self, param, section, possible_values):
|
|
self.possible_values = possible_values
|
|
self.section = section
|
|
self.param = param
|
|
possible_values_str = string.join(possible_values, ', ')
|
|
self.log = \
|
|
"wrong value for param '%(param)s' in section '%(section)s'" \
|
|
", possible values are [%(values)s]" % \
|
|
{
|
|
'param': param,
|
|
'section': section,
|
|
'values': possible_values_str
|
|
}
|
|
|
|
|
|
class DumplicateUserKey(Exception):
|
|
def __init__(self, attrid1, attrid2):
|
|
self.attrid1 = attrid1
|
|
self.attrid2 = attrid2
|
|
self.log = \
|
|
"duplicate key in '%(attrid1)s' and '%(attrid2)s'" % \
|
|
{'attrid1': attrid1, 'attrid2': attrid2}
|
|
|
|
|
|
class MissingUserKey(Exception):
|
|
def __init__(self):
|
|
self.log = "missing key"
|
|
|
|
|
|
class WrongAttributeType(Exception):
|
|
def __init__(self, key, section, ymlfile):
|
|
self.key = key
|
|
self.section = section
|
|
self.ymlfile = ymlfile
|
|
self.log = \
|
|
"wrong attribute type '%(key)s'" \
|
|
" in section '%(section)s'" \
|
|
" inside file '%(ymlfile)s'" % \
|
|
{'key': key, 'section': section, 'ymlfile': ymlfile}
|
|
|
|
|
|
class PasswordAttributesCollision(Exception):
|
|
def __init__(self, key):
|
|
self.key = key
|
|
self.log = \
|
|
"key '" + key + "' type is password," \
|
|
" keys '" + key + "1' and '" + key + "2'" \
|
|
" are reserved and cannot be used"
|
|
|
|
|
|
class WrongAttrValue(Exception):
|
|
def __init__(self, attr, attrtype):
|
|
self.attr = attr
|
|
self.attrtype = attrtype
|
|
self.log = \
|
|
"input for attribute '" + attr + "'" \
|
|
" doesn't match type '" + attrtype + "'"
|
|
|
|
|
|
class AttrNotDefined(Exception):
|
|
def __init__(self, attr):
|
|
self.attr = attr
|
|
self.log = \
|
|
"attribute '" + attr + "' is not defined in configuration"
|
|
|
|
|
|
class UserDoesntExist(Exception):
|
|
def __init__(self, user, backend):
|
|
self.user = user
|
|
self.bakend = backend
|
|
self.log = \
|
|
"user '" + user + "'" \
|
|
" does not exist" \
|
|
" in backend '" + backend + "'"
|
|
|
|
|
|
class UserAlreadyExists(Exception):
|
|
def __init__(self, user, backend):
|
|
self.user = user
|
|
self.bakend = backend
|
|
self.log = \
|
|
"user '" + user + "'" \
|
|
" already exists" \
|
|
" in backend '" + backend + "'"
|
|
|
|
|
|
class GroupDoesntExist(Exception):
|
|
def __init__(self, group, backend):
|
|
self.group = group
|
|
self.bakend = backend
|
|
self.log = \
|
|
"group '" + group + "'" \
|
|
" does not exist" \
|
|
" in backend '" + backend + "'"
|
|
|
|
|
|
class TemplateRenderError(Exception):
|
|
def __init__(self, error):
|
|
self.log = "Template Render Error: " + error
|
|
|
|
|
|
def exception_decorator(func):
|
|
def ret(self, *args, **kwargs):
|
|
try:
|
|
return func(self, *args, **kwargs)
|
|
except cherrypy.HTTPRedirect as e:
|
|
raise e
|
|
except cherrypy.HTTPError as e:
|
|
raise e
|
|
except Exception as e:
|
|
cherrypy.response.status = 500
|
|
self._handle_exception(e)
|
|
username = self._check_session()
|
|
if not username:
|
|
return self.temp['service_unavailable.tmpl'].render()
|
|
is_admin = self._check_admin()
|
|
et = type(e)
|
|
if et is UserDoesntExist:
|
|
user = e.user
|
|
return self.temp['error.tmpl'].render(
|
|
is_admin=is_admin,
|
|
alert='danger',
|
|
message="User '" + user + "' does not exist"
|
|
)
|
|
elif et is UserAlreadyExists:
|
|
user = e.user
|
|
cherrypy.response.status = 400
|
|
return self.temp['error.tmpl'].render(
|
|
is_admin=is_admin,
|
|
alert='warning',
|
|
message="User '" + user + "' already exist"
|
|
)
|
|
elif et is GroupDoesntExist:
|
|
group = e.group
|
|
return self.temp['error.tmpl'].render(
|
|
is_admin=is_admin,
|
|
alert='danger',
|
|
message="Missing group, please check logs for details"
|
|
)
|
|
else:
|
|
return self.temp['error.tmpl'].render(
|
|
is_admin=is_admin,
|
|
alert='danger',
|
|
message="An error occured, please check logs for details"
|
|
)
|
|
return ret
|