From ea9aa850202b8563826c2c914632337abefabe5c Mon Sep 17 00:00:00 2001
From: Julian Rother <julian@jrother.eu>
Date: Tue, 21 Sep 2021 14:36:28 +0200
Subject: [PATCH] Adapt code to ldapserver API changes

---
 server.py | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/server.py b/server.py
index 82fd6eb..342998d 100644
--- a/server.py
+++ b/server.py
@@ -6,7 +6,7 @@ from cachecontrol import CacheControl
 from cachecontrol.heuristics import ExpiresAfter
 
 from ldapserver import SimpleLDAPRequestHandler
-from ldapserver.dn import DN, RDN
+from ldapserver.dn import DN
 from ldapserver.ldap import FilterEqual, FilterAnd
 from ldapserver.directory import BaseDirectory, SimpleFilterMixin, StaticDirectory, eval_ldap_filter
 from ldapserver.util import encode_attribute, CaseInsensitiveDict
@@ -51,9 +51,9 @@ class UserDirectory(SimpleFilterMixin, BaseDirectory):
 			sn=[encode_attribute(' ')],
 			uid=[encode_attribute(user['loginname'])],
 			uidNumber=[encode_attribute(user['id'])],
-			memberOf=[encode_attribute(DN(RDN(cn=group)) + self.group_dn_base) for group in user['groups']],
+			memberOf=[encode_attribute(DN(cn=group) + self.group_dn_base) for group in user['groups']],
 		)
-		dn = str(DN(RDN(uid=user['loginname'])) + self.dn_base)
+		dn = str(DN(uid=user['loginname']) + self.dn_base)
 		return dn, attributes
 
 	def get_best_api_param(self, expr):
@@ -64,7 +64,7 @@ class UserDirectory(SimpleFilterMixin, BaseDirectory):
 		if isinstance(expr, FilterEqual) and expr.attribute.lower() == 'mail':
 			return 'email', expr.value
 		if isinstance(expr, FilterEqual) and expr.attribute.lower() == 'memberof':
-			group_dn = DN(expr.value.decode())
+			group_dn = DN.from_str(expr.value.decode())
 			if group_dn.is_direct_child_of(self.group_dn_base) and len(group_dn[0]) == 1 and group_dn[0][0].attribute == 'cn':
 				return 'group', group_dn[0][0].value
 		if isinstance(expr, FilterAnd):
@@ -88,7 +88,7 @@ class UserDirectory(SimpleFilterMixin, BaseDirectory):
 
 	def filter_equal(self, attribute, value):
 		if attribute == 'memberof':
-			value = str(DN(value.decode())).encode()
+			value = str(DN.from_str(value.decode())).encode()
 		return super().filter_equal(attribute, value)
 
 class GroupDirectory(SimpleFilterMixin, BaseDirectory):
@@ -107,9 +107,9 @@ class GroupDirectory(SimpleFilterMixin, BaseDirectory):
 			cn=[encode_attribute(group['name'])],
 			description=[encode_attribute(' ')],
 			gidNumber=[encode_attribute(group['id'])],
-			uniqueMember=[encode_attribute(DN(RDN(uid=user)) + self.user_dn_base) for user in group['members']],
+			uniqueMember=[encode_attribute(DN(uid=user) + self.user_dn_base) for user in group['members']],
 		)
-		dn = str(DN(RDN(cn=group['name'])) + self.dn_base)
+		dn = str(DN(cn=group['name']) + self.dn_base)
 		return dn, attributes
 
 	def get_best_api_param(self, expr):
@@ -118,7 +118,7 @@ class GroupDirectory(SimpleFilterMixin, BaseDirectory):
 		elif isinstance(expr, FilterEqual) and expr.attribute.lower() == 'gidnumber':
 			return 'id', expr.value
 		elif isinstance(expr, FilterEqual) and expr.attribute.lower() == 'uniquemember':
-			user_dn = DN(expr.value.decode())
+			user_dn = DN.from_str(expr.value.decode())
 			if user_dn.is_direct_child_of(self.user_dn_base) and len(user_dn[0]) == 1 and user_dn[0][0].attribute == 'uid':
 				return 'member', user_dn[0][0].value
 		if isinstance(expr, FilterAnd):
@@ -142,7 +142,7 @@ class GroupDirectory(SimpleFilterMixin, BaseDirectory):
 
 	def filter_equal(self, attribute, value):
 		if attribute == 'uniquemember':
-			value = str(DN(value.decode())).encode()
+			value = str(DN.from_str(value.decode())).encode()
 		return super().filter_equal(attribute, value)
 
 class RequestHandler(SimpleLDAPRequestHandler):
@@ -171,7 +171,7 @@ class RequestHandler(SimpleLDAPRequestHandler):
 
 	def do_bind_simple_authenticated(self, dn, password):
 		print('BIND plain', dn)
-		dn = DN(dn)
+		dn = DN.from_str(dn)
 		if dn == self.bind_dn and password == self.bind_password:
 			return True
 		if not dn.is_direct_child_of(DN('ou=users') + self.dn_base) or len(dn[0]) != 1 or dn[0][0].attribute != 'uid':
@@ -200,7 +200,7 @@ class RequestHandler(SimpleLDAPRequestHandler):
 			yield from self.group_directory.search(baseobj, scope, filter)
 
 def main(config):
-	dn_base = DN(config['dn_base'])
+	dn_base = DN.from_str(config['dn_base'])
 	api = UffdAPI(config['api_baseurl'], config['api_key'], config.get('cache_ttl', 60))
 	user_directory = UserDirectory(api, dn_base)
 	group_directory = GroupDirectory(api, dn_base)
@@ -210,8 +210,8 @@ def main(config):
 		'objectClass': ['top', 'dcObject', 'organization'],
 		'structuralObjectClass': ['organization'],
 	}
-	for attr, value in dn_base[0]:
-		base_attrs[attr] = [value]
+	for rdnassertion in dn_base[0]:
+		base_attrs[rdnassertion.attribute] = [rdnassertion.value]
 	static_directory.add(dn_base, base_attrs)
 	static_directory.add(DN('ou=users') + dn_base, {
 		'ou': ['users'],
-- 
GitLab