1
0
mirror of https://github.com/kakwa/ldapcherry synced 2024-06-13 22:29:52 +02:00
ldapcherry/ldapcherry/backend/backendLdap.py

167 lines
5.1 KiB
Python
Raw Normal View History

2015-04-15 21:13:14 +02:00
# -*- coding: utf-8 -*-
# vim:set expandtab tabstop=4 shiftwidth=4:
#
# The MIT License (MIT)
# LdapCherry
# Copyright (c) 2014 Carpentier Pierre-Francois
2015-05-20 17:13:18 +02:00
import cherrypy
import ldap
import logging
import ldapcherry.backend
2015-04-15 21:13:14 +02:00
class Backend(ldapcherry.backend.Backend):
2015-05-22 10:27:46 +02:00
def __init__(self, config, logger, name, attrslist):
2015-05-20 17:13:18 +02:00
self.config = config
self._logger = logger
self.backend_name = name
self.binddn = self.get_param('binddn')
self.bindpassword = self.get_param('password')
self.ca = self.get_param('ca', False)
self.checkcert = self.get_param('checkcert', 'on')
self.starttls = self.get_param('starttls', 'off')
self.uri = self.get_param('uri')
self.timeout = self.get_param('timeout', 1)
self.userdn = self.get_param('userdn')
self.groupdn = self.get_param('groupdn')
self.user_filter_tmpl = self.get_param('user_filter_tmpl')
2015-05-25 18:52:14 +02:00
self.group_filter_tmpl = self.get_param('group_filter_tmpl')
self.search_filter_tmpl = self.get_param('search_filter_tmpl')
2015-05-25 22:53:34 +02:00
self.objectclasses = self.get_param('objectclasses')
self.attrlist = []
for a in attrslist:
try:
self.attrlist.append(str(a))
except UnicodeEncodeError:
tmp = unicode(a).encode('unicode_escape')
self.attrlist.append(tmp)
2015-05-20 17:13:18 +02:00
def auth(self, username, password):
binddn = self.get_user(username, False)
2015-05-24 15:11:49 +02:00
if not binddn is None:
2015-05-20 17:13:18 +02:00
ldap_client = self._connect()
try:
ldap_client.simple_bind_s(binddn, password)
except ldap.INVALID_CREDENTIALS:
ldap_client.unbind_s()
return False
ldap_client.unbind_s()
return True
else:
return False
def add_to_group(self):
pass
def set_attrs(self, attrs):
pass
2015-05-24 15:20:17 +02:00
def rm_from_group(self,username):
2015-05-20 17:13:18 +02:00
pass
def add_user(self, username):
2015-04-15 21:13:14 +02:00
pass
2015-05-20 17:13:18 +02:00
def del_user(self, username):
pass
2015-05-25 22:17:17 +02:00
def _bind(self):
ldap_client = self._connect()
try:
ldap_client.simple_bind_s(self.binddn, self.bindpassword)
except ldap.INVALID_CREDENTIALS as e:
self._logger(
logging.ERROR,
"Configuration error, wrong credentials, unable to connect to ldap with '" + self.binddn + "'",
)
2015-05-25 19:52:54 +02:00
ldap_client.unbind_s()
raise e
except ldap.SERVER_DOWN as e:
self._logger(
logging.ERROR,
"Unable to contact ldap server '" + self.uri + "', check 'auth.ldap.uri' and ssl/tls configuration",
)
2015-05-25 19:52:54 +02:00
ldap_client.unbind_s()
raise e
2015-05-25 22:17:17 +02:00
return ldap_client
2015-05-25 22:17:17 +02:00
def _search(self, searchfilter, attrs):
ldap_client = self._bind()
try:
r = ldap_client.search_s(self.userdn,
ldap.SCOPE_SUBTREE,
2015-05-25 19:52:54 +02:00
searchfilter,
attrlist=attrs
)
except ldap.FILTER_ERROR as e:
2015-05-25 19:52:54 +02:00
self._logger(
logging.ERROR,
"Bad search filter, check '" + self.backend_name + ".*_filter_tmpl' params",
)
ldap_client.unbind_s()
raise e
2015-05-25 19:52:54 +02:00
ldap_client.unbind_s()
return r
2015-05-24 17:32:03 +02:00
2015-05-25 19:52:54 +02:00
def search(self, searchstring):
searchfilter = self.search_filter_tmpl % {
'searchstring': searchstring
}
return self._search(searchfilter, None)
def get_user(self, username, attrs=True):
if attrs:
a = self.attrlist
else:
a = None
2015-05-20 17:13:18 +02:00
user_filter = self.user_filter_tmpl % {
'username': username
}
2015-05-20 17:13:18 +02:00
2015-05-25 19:52:54 +02:00
r = self._search(user_filter, a)
2015-05-20 17:13:18 +02:00
if len(r) == 0:
2015-05-24 15:11:49 +02:00
return None
2015-05-20 17:13:18 +02:00
if attrs:
dn_entry = r[0]
else:
dn_entry = r[0][0]
2015-05-20 17:13:18 +02:00
return dn_entry
def _connect(self):
ldap_client = ldap.initialize(self.uri)
2015-05-20 17:13:18 +02:00
ldap_client.set_option(ldap.OPT_REFERRALS, 0)
ldap_client.set_option(ldap.OPT_TIMEOUT, self.timeout)
if self.starttls == 'on':
2015-05-20 17:13:18 +02:00
ldap.set_option(ldap.OPT_X_TLS_DEMAND, True)
else:
ldap.set_option(ldap.OPT_X_TLS_DEMAND, False)
if self.ca and self.checkcert == 'on':
ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, self.ca)
#else:
# ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, '')
if self.checkcert == 'off':
2015-05-20 17:13:18 +02:00
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_ALLOW)
else:
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT,ldap.OPT_X_TLS_DEMAND)
if self.starttls == 'on':
2015-05-20 17:13:18 +02:00
try:
ldap_client.start_tls_s()
except ldap.OPERATIONS_ERROR as e:
2015-05-20 17:13:18 +02:00
self._logger(
logging.ERROR,
"cannot use starttls with ldaps:// uri (uri: " + self.uri + ")",
2015-05-20 17:13:18 +02:00
)
raise e
#raise cherrypy.HTTPError("500", "Configuration Error, contact administrator")
2015-05-20 17:13:18 +02:00
return ldap_client