Compare commits

..

No commits in common. "de5483107a788b6fda8b282538d517f131072529" and "4907b2d7f5fd6139de6d8dd8fa7d33f4158c64ac" have entirely different histories.

83
main.py
View File

@ -1,7 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import json
from dolibarrpy import Dolibarrpy from dolibarrpy import Dolibarrpy
from flask import Flask, abort, request from flask import Flask, abort, request
from ldap3 import ALL, Connection, ObjectDef, Reader, Server, WritableEntry, Writer from ldap3 import ALL, Connection, ObjectDef, Reader, Server, WritableEntry, Writer
@ -24,10 +22,10 @@ def main():
def manage_users_extra_fields(ldap_conn: Connection, dolibarr_client: Dolibarrpy): def manage_users_extra_fields(ldap_conn: Connection, dolibarr_client: Dolibarrpy):
dolibarr_users = dolibarr_client.find_all_users() dolibarr_users = dolibarr_client.find_all_users()
for dolibarr_user in dolibarr_users: for dolibarr_user in dolibarr_users:
manage_user_extra_fields(ldap_conn, dolibarr_user, dolibarr_client) manage_user_extra_fields(ldap_conn, dolibarr_user)
def manage_user_extra_fields(ldap_conn: Connection, dolibarr_user: dict, dolibarr_client: Dolibarrpy): def manage_user_extra_fields(ldap_conn: Connection, dolibarr_user: dict):
login = dolibarr_user['login'] login = dolibarr_user['login']
obj_inetorgperson = ObjectDef(['top', 'inetOrgPerson', 'posixAccount'], ldap_conn) obj_inetorgperson = ObjectDef(['top', 'inetOrgPerson', 'posixAccount'], ldap_conn)
obj_user = ObjectDef(['top', 'inetOrgPerson', 'posixAccount'] + config.LDAP_GROUPS_EXTRA_OBJECT_CLASSES, ldap_conn) obj_user = ObjectDef(['top', 'inetOrgPerson', 'posixAccount'] + config.LDAP_GROUPS_EXTRA_OBJECT_CLASSES, ldap_conn)
@ -58,7 +56,6 @@ def manage_user_extra_fields(ldap_conn: Connection, dolibarr_user: dict, dolibar
users_writer = Writer.from_cursor(users_reader, object_def=obj_user) users_writer = Writer.from_cursor(users_reader, object_def=obj_user)
ldap_user = users_writer[0] ldap_user = users_writer[0]
append_extra_fields_to_ldap_user(ldap_user, dolibarr_user) append_extra_fields_to_ldap_user(ldap_user, dolibarr_user)
append_extra_group_fields_to_ldap_user(ldap_user, dolibarr_user, dolibarr_client)
users_writer.commit() users_writer.commit()
@ -68,65 +65,14 @@ def append_extra_fields_to_ldap_user(ldap_user: WritableEntry, dolibarr_user: di
ldap_user.objectClass += extra_object_class ldap_user.objectClass += extra_object_class
for extra_field in config.LDAP_USERS_EXTRA_FIELDS: for extra_field in config.LDAP_USERS_EXTRA_FIELDS:
dolibarr_attrs, ldap_attr = extra_field.split(':') dolibarr_attr, ldap_attr = extra_field.split(':')
dolibarr_attrs = dolibarr_attrs.split('|')
values = []
for dolibarr_attr in dolibarr_attrs:
if dolibarr_attr.startswith('GROUP__'):
continue
if dolibarr_attr.endswith('[]'): if dolibarr_attr.endswith('[]'):
dolibarr_attr = dolibarr_attr[:-2] dolibarr_attr = dolibarr_attr[:-2]
value = dolibarr_user['array_options'][f'options_{dolibarr_attr}'] value = dolibarr_user['array_options'][f'options_{dolibarr_attr}']
value = value.split() if value else [] value = value.split() if value else []
values += value
else:
value = dolibarr_user['array_options'][f'options_{dolibarr_attr}']
if value:
values.append(value)
if not values:
continue
if ldap_attr.endswith('[]'):
ldap_attr = ldap_attr[:-2]
value = values
else:
value = values[0]
setattr(ldap_user, ldap_attr, value) setattr(ldap_user, ldap_attr, value)
def append_extra_group_fields_to_ldap_user(ldap_user: WritableEntry, dolibarr_user: dict, dolibarr_client: Dolibarrpy):
if not any(dolibarr_attr.startswith('GROUP')
for extra_field in config.LDAP_USERS_EXTRA_FIELDS
for dolibarr_attr in extra_field.split(':')[0].split('|')):
return
user_id = dolibarr_user['id']
dolibarr_groups: list[dict] = dolibarr_client.get_user_groups_uid(user_id)
for extra_field in config.LDAP_USERS_EXTRA_FIELDS:
dolibarr_attrs, ldap_attr = extra_field.split(':')
dolibarr_attrs = dolibarr_attrs.split('|')
values = []
for dolibarr_attr in dolibarr_attrs:
if not dolibarr_attr.startswith('GROUP__'):
continue
dolibarr_attr = dolibarr_attr[7:]
for dolibarr_group in dolibarr_groups:
if dolibarr_attr.endswith('[]'):
dolibarr_attr = dolibarr_attr[:-2]
value = dolibarr_group.get(dolibarr_attr, dolibarr_group['array_options'][f'options_{dolibarr_attr}'])
value = value.split() if value else []
values += value
else: else:
value = dolibarr_group.get(dolibarr_attr, dolibarr_group['array_options'][f'options_{dolibarr_attr}']) value = dolibarr_user['array_options'][f'options_{dolibarr_attr}'] or ""
if value:
values.append(value)
if not values:
continue
if ldap_attr.endswith('[]'):
ldap_attr = ldap_attr[:-2]
value = values
else:
value = values[0]
setattr(ldap_user, ldap_attr, value) setattr(ldap_user, ldap_attr, value)
@ -166,26 +112,14 @@ def append_extra_fields_to_ldap_group(ldap_group: WritableEntry, dolibarr_group:
ldap_group.objectClass += extra_object_class ldap_group.objectClass += extra_object_class
for extra_field in config.LDAP_GROUPS_EXTRA_FIELDS: for extra_field in config.LDAP_GROUPS_EXTRA_FIELDS:
dolibarr_attrs, ldap_attr = extra_field.split(':') dolibarr_attr, ldap_attr = extra_field.split(':')
dolibarr_attrs = dolibarr_attrs.split('|')
values = []
for dolibarr_attr in dolibarr_attrs:
if dolibarr_attr.endswith('[]'): if dolibarr_attr.endswith('[]'):
dolibarr_attr = dolibarr_attr[:-2] dolibarr_attr = dolibarr_attr[:-2]
value = dolibarr_group['array_options'][f'options_{dolibarr_attr}'] value = dolibarr_group['array_options'][f'options_{dolibarr_attr}']
value = value.split() if value else [] value = value.split() if value else []
values += value setattr(ldap_group, ldap_attr, value)
else: else:
value = dolibarr_group['array_options'][f'options_{dolibarr_attr}'] value = dolibarr_group['array_options'][f'options_{dolibarr_attr}'] or ""
if value:
values.append(value)
if not values:
continue
if ldap_attr.endswith('[]'):
ldap_attr = ldap_attr[:-2]
value = values
else:
value = values[0]
setattr(ldap_group, ldap_attr, value) setattr(ldap_group, ldap_attr, value)
@ -198,9 +132,6 @@ def webhook_receiver():
abort(400) abort(400)
triggercode = data['triggercode'] triggercode = data['triggercode']
obj = data['object'] obj = data['object']
if config.DOLIBARR_API_DEBUG:
print("Received webhook trigger of type", triggercode, "with content:")
print(json.dumps(obj))
dolibarr_client = Dolibarrpy(url=config.DOLIBARR_API_BASE, token=config.DOLIBARR_API_TOKEN, timeout=16, debug=config.DOLIBARR_API_DEBUG) dolibarr_client = Dolibarrpy(url=config.DOLIBARR_API_BASE, token=config.DOLIBARR_API_TOKEN, timeout=16, debug=config.DOLIBARR_API_DEBUG)
ldap_server = Server(config.LDAP_HOST, config.LDAP_PORT, get_info=ALL) ldap_server = Server(config.LDAP_HOST, config.LDAP_PORT, get_info=ALL)
if triggercode.startswith('USER_'): if triggercode.startswith('USER_'):