Only commit changed fields

This commit is contained in:
Éloi Rivard 2020-08-24 11:28:15 +02:00
parent 538d5682d7
commit 3ae32a8797
2 changed files with 29 additions and 10 deletions

View file

@ -25,10 +25,11 @@ KEY = "secret-key"
ALG = "HS256" ALG = "HS256"
ISS = "http://mydomain.tld" ISS = "http://mydomain.tld"
EXP = 3600 EXP = 3600
MAPPING =
SUB = "uid" [JWT.MAPPING]
NAME = "cn" SUB = "uid"
PHONE_NUMBER = "telephoneNumber" NAME = "cn"
PHONE_NUMBER = "telephoneNumber"
# EXAMPLE OF MAPPING FOR inetOrgPerson # EXAMPLE OF MAPPING FOR inetOrgPerson
# PHONE_NUMBER = "telephoneNumber" # PHONE_NUMBER = "telephoneNumber"
# EMAIL = "mail" # EMAIL = "mail"

View file

@ -13,6 +13,7 @@ class LDAPObjectHelper:
def __init__(self, dn=None, **kwargs): def __init__(self, dn=None, **kwargs):
self.attrs = {} self.attrs = {}
self.changes = {}
for k, v in kwargs.items(): for k, v in kwargs.items():
self.attrs[k] = [v] if not isinstance(v, list) else v self.attrs[k] = [v] if not isinstance(v, list) else v
self.attrs.setdefault("objectClass", self.objectClass) self.attrs.setdefault("objectClass", self.objectClass)
@ -120,18 +121,35 @@ class LDAPObjectHelper:
match = False match = False
if match: if match:
mods = {
k: v
for k, v in self.changes.items()
if v and v[0] and self.attrs.get(k) != v
}
attributes = [ attributes = [
(ldap.MOD_REPLACE, k, [elt.encode("utf-8") for elt in v]) (ldap.MOD_REPLACE, k, [elt.encode("utf-8") for elt in v])
for k, v in self.attrs.items() for k, v in mods.items()
] ]
conn.modify_s(self.dn, attributes) conn.modify_s(self.dn, attributes)
else: else:
mods = {}
for k, v in self.attrs.items():
if v and v[0]:
mods[k] = v
for k, v in self.changes.items():
if v and v[0]:
mods[k] = v
attributes = [ attributes = [
(k, [elt.encode("utf-8") for elt in v]) for k, v in self.attrs.items() (k, [elt.encode("utf-8") for elt in v]) for k, v in mods.items()
] ]
conn.add_s(self.dn, attributes) conn.add_s(self.dn, attributes)
for k, v in self.changes.items():
self.attrs[k] = v
self.changes = {}
@classmethod @classmethod
def get(cls, dn=None, filter=None, conn=None): def get(cls, dn=None, filter=None, conn=None):
conn = conn or cls.ldap() conn = conn or cls.ldap()
@ -175,15 +193,15 @@ class LDAPObjectHelper:
not self.attr_type_by_name() not self.attr_type_by_name()
or not self.attr_type_by_name()[name].single_value or not self.attr_type_by_name()[name].single_value
): ):
return self.attrs.get(name, []) return self.changes.get(name, self.attrs.get(name, []))
return self.attrs.get(name, [None])[0] return self.changes.get(name, self.attrs.get(name, [None]))[0]
def __setattr__(self, name, value): def __setattr__(self, name, value):
super().__setattr__(name, value) super().__setattr__(name, value)
if (self.may and name in self.may) or (self.must and name in self.must): if (self.may and name in self.may) or (self.must and name in self.must):
if self.attr_type_by_name()[name].single_value: if self.attr_type_by_name()[name].single_value:
self.attrs[name] = [value] self.changes[name] = [value]
else: else:
self.attrs[name] = value self.changes[name] = value