From 6d13eecdb7c3d857448d7571639e4838b3f5e63e Mon Sep 17 00:00:00 2001
From: Julian Rother <julianr@fsmpi.rwth-aachen.de>
Date: Fri, 19 Feb 2021 18:31:57 +0100
Subject: [PATCH] Fixed and refactored default and update mechanism

---
 uffd/ldap.py        | 27 ++++++++++++++++++---------
 uffd/user/models.py |  2 +-
 2 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/uffd/ldap.py b/uffd/ldap.py
index c09103b5..5c3aed3e 100644
--- a/uffd/ldap.py
+++ b/uffd/ldap.py
@@ -163,21 +163,28 @@ class LDAPAttribute:
 			if callable(values):
 				values = values()
 			self.__set__(obj, values)
+
+	def additem(self, obj, value):
+		obj.ldap_attradd(self.name, value)
+		for name in self.aliases:
+			obj.ldap_attradd(name, value)
+
+	def delitem(self, obj, value):
+		obj.ldap_attradd(self.name, value)
 		for name in self.aliases:
-			obj.ldap_setattr(name, obj.ldap_getattr(self.name))
+			obj.ldap_attradd(name, value)
 
 	def __set_name__(self, cls, name):
-		if self.default is None:
-			return
-		cls.ldap_defaults = cls.ldap_defaults + [self.default]
+		if self.default_values is not None:
+			cls.ldap_pre_create_hooks = cls.ldap_pre_create_hooks + [self.default]
 
 	def __get__(self, obj, objtype=None):
 		if obj is None:
 			return self
 		if self.multi:
 			return LDAPSet(getitems=lambda: obj.ldap_getattr(self.name),
-			               additem=lambda value: obj.ldap_attradd(self.name, value),
-			               delitem=lambda value: obj.ldap_attrdel(self.name, value),
+			               additem=lambda value: self.additem(obj, value),
+			               delitem=lambda value: self.delitem(obj, value),
 			               encode=self.encode, decode=self.decode)
 		return self.decode((obj.ldap_getattr(self.name) or [None])[0])
 
@@ -185,6 +192,8 @@ class LDAPAttribute:
 		if not self.multi:
 			values = [values]
 		obj.ldap_setattr(self.name, [self.encode(value) for value in values])
+		for name in self.aliases:
+			obj.ldap_setattr(name, [self.encode(value) for value in values])
 
 class LDAPBackref:
 	def __init__(self, srccls, srcattr):
@@ -229,8 +238,8 @@ class LDAPModel:
 	ldap_base = None
 	ldap_object_classes = None
 	ldap_filter = None
-	# Caution: Never mutate ldap_defaults and ldap_relations, always reassign!
-	ldap_defaults = []
+	# Caution: Never mutate ldap_pre_create_hooks and ldap_relations, always reassign!
+	ldap_pre_create_hooks = []
 	ldap_relations = []
 
 	def __init__(self, _ldap_dn=None, _ldap_attributes=None, **kwargs):
@@ -376,7 +385,7 @@ class LDAPModel:
 		if self.ldap_created:
 			raise Exception()
 		conn = get_conn()
-		for func in self.ldap_defaults:
+		for func in self.ldap_pre_create_hooks:
 			func(self)
 		success = conn.add(self.dn, self.ldap_object_classes, self.__attributes)
 		if not success:
diff --git a/uffd/user/models.py b/uffd/user/models.py
index 0dba9a71..18cd4d03 100644
--- a/uffd/user/models.py
+++ b/uffd/user/models.py
@@ -39,7 +39,7 @@ class User(LDAPModel):
 		if self.ldap_getattr('gidNumber') == []:
 			self.ldap_setattr('gidNumber', [current_app.config['LDAP_USER_GID']])
 
-	ldap_defaults = LDAPModel.ldap_defaults + [dummy_attribute_defaults]
+	ldap_pre_create_hooks = LDAPModel.ldap_pre_create_hooks + [dummy_attribute_defaults]
 
 	# Write-only property
 	def password(self, value):
-- 
GitLab