Skip to content

Commit a24f9c9

Browse files
committed
fix identity primary'
1 parent fc8ec5b commit a24f9c9

File tree

3 files changed

+40
-15
lines changed

3 files changed

+40
-15
lines changed

src/bin/upsertidentity.py

100644100755
File mode changed.

src/lib/backend_ldap_utils.py

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,27 @@
1212
def set_config(config):
1313
u.__CONFIG__ = config
1414

15+
def format_ldap_error(err):
16+
details = err.args[0] if len(err.args) > 0 else err
17+
if isinstance(details, dict):
18+
result = details.get("result", "")
19+
desc = details.get("desc", "")
20+
info = details.get("info", "")
21+
return (str(result) + ' ' + str(desc) + ' ' + str(info)).strip()
22+
if isinstance(details, (list, tuple)):
23+
return " ".join([str(part) for part in details]).strip()
24+
return str(details).strip()
25+
1526
def connect_ldap(url,dn,password):
1627
try:
17-
l=ldap.initialize(url)
28+
# python-ldap expects an LDAP URI (ldap:// or ldaps://).
29+
ldap_uri = url if '://' in str(url) else 'ldap://' + str(url)
30+
l=ldap.initialize(ldap_uri)
1831
l.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_ALLOW)
1932
l.simple_bind_s(dn,password)
2033
return l
2134
except ldap.LDAPError as e:
22-
e_dict = e.args[0]
23-
print(u.returncode(1, str(e_dict.get("result")) + ' ' + e_dict.get("desc")))
35+
print(u.returncode(1, format_ldap_error(e)))
2436
return(1)
2537

2638
def convert_to_utf8(entry):
@@ -102,8 +114,7 @@ def search_entity(l,entity):
102114
r=l.search_s(base,ldap.SCOPE_SUBTREE,filter)
103115
return r
104116
except ldap.LDAPError as e:
105-
e_dict = e.args[0]
106-
print(u.returncode(1, str(e_dict.get("result")) + ' ' + e_dict.get("desc") + " " + e_dict.get("info")))
117+
print(u.returncode(1, format_ldap_error(e)))
107118
exit(1)
108119

109120
def upsert_entry(l,entity):
@@ -121,8 +132,7 @@ def upsert_entry(l,entity):
121132
action="add"
122133
l.add_s(dn, ldif)
123134
except ldap.LDAPError as e:
124-
e_dict = e.args[0]
125-
print(u.returncode(1, "add " + str(e_dict.get("result")) + ' ' + e_dict.get("desc") + " "+ e_dict.get("info",'')))
135+
print(u.returncode(1, "add " + format_ldap_error(e)))
126136
exit(1)
127137
else:
128138
if len(r) > 1:
@@ -142,8 +152,7 @@ def upsert_entry(l,entity):
142152
action="mod"
143153
l.modify_s(r[0][0],ldif)
144154
except ldap.LDAPError as e:
145-
e_dict = e.args[0]
146-
print(u.returncode(1, 'mod ' + str(e_dict.get("result")) + ' ' + e_dict.get("desc") + " "+ e_dict.get("info",'')))
155+
print(u.returncode(1, 'mod ' + format_ldap_error(e)))
147156
return(1)
148157
else:
149158
## changement du DN
@@ -156,8 +165,7 @@ def upsert_entry(l,entity):
156165
action="rename"
157166
l.rename_s(oldDn,new_rdn,newsuperior=newSuperior)
158167
except ldap.LDAPError as e:
159-
e_dict = e.args[0]
160-
print(u.returncode(1, 'rename ' + str(e_dict.get("result")) + ' ' + e_dict.get("desc") + " "+ e_dict.get("info")))
168+
print(u.returncode(1, 'rename ' + format_ldap_error(e)))
161169
exit(1)
162170
return u.returncode(0,"Entree " + dn + " " + action)
163171

@@ -223,8 +231,7 @@ def delete_entity(l,entity):
223231
l.delete_s(r[0][0])
224232
return u.returncode(0, "user : " + r[0][0] + " deleted")
225233
except ldap.LDAPError as e:
226-
e_dict = e.args[0]
227-
print(u.returncode(1, str(e_dict.get("result")) + ' ' + e_dict.get("desc") + " "+ e_dict.get("info")))
234+
print(u.returncode(1, format_ldap_error(e)))
228235
exit(1)
229236
else:
230237
print(u.returncode(1, "User not found"))
@@ -272,8 +279,7 @@ def activate_entry(l,entity,activate):
272279
l.modify_s(r[0][0], ldif)
273280
return(u.returncode(0, message))
274281
except ldap.LDAPError as e:
275-
e_dict = e.args[0]
276-
return (u.returncode(1, str(e_dict.get("result")) + ' ' + e_dict.get("desc") + " " + e_dict.get("info")))
282+
return (u.returncode(1, format_ldap_error(e)))
277283

278284
else:
279285
return (u.returncode(1,"Not Found"))

src/lib/backend_utils.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,16 @@ def _finditem(obj, key):
8383
if item is not None:
8484
return item
8585

86+
def first_non_empty_value(value):
87+
if isinstance(value, list):
88+
for item in value:
89+
s = str(item).strip()
90+
if s != "":
91+
return s
92+
return ""
93+
s = str(value).strip()
94+
return s if s != "" else ""
95+
8696
def make_entry_array(entity):
8797
data = {}
8898
if "identity" in entity['payload']:
@@ -113,6 +123,15 @@ def make_entry_array(entity):
113123
if type(v) is int:
114124
v = str(v)
115125
data[k] = v
126+
127+
# employeeNumber is usually SINGLE-VALUE in LDAP schema.
128+
# Prefer primaryEmployeeNumber when provided by upstream payload.
129+
if 'employeeNumber' in data:
130+
primary_employee_number = first_non_empty_value(find_key(entity, 'primaryEmployeeNumber'))
131+
if primary_employee_number != "":
132+
data['employeeNumber'] = primary_employee_number
133+
else:
134+
data['employeeNumber'] = first_non_empty_value(data['employeeNumber'])
116135
return data
117136

118137

0 commit comments

Comments
 (0)