Compare commits
	
		
			2 Commits
		
	
	
		
			4907b2d7f5
			...
			de5483107a
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| de5483107a | |||
| 6145384f04 | 
							
								
								
									
										85
									
								
								main.py
									
									
									
									
									
								
							
							
						
						
									
										85
									
								
								main.py
									
									
									
									
									
								
							| @@ -1,5 +1,7 @@ | ||||
| #!/usr/bin/env python3 | ||||
|  | ||||
| import json | ||||
|  | ||||
| from dolibarrpy import Dolibarrpy | ||||
| from flask import Flask, abort, request | ||||
| from ldap3 import ALL, Connection, ObjectDef, Reader, Server, WritableEntry, Writer | ||||
| @@ -22,10 +24,10 @@ def main(): | ||||
| def manage_users_extra_fields(ldap_conn: Connection, dolibarr_client: Dolibarrpy): | ||||
|     dolibarr_users = dolibarr_client.find_all_users() | ||||
|     for dolibarr_user in dolibarr_users: | ||||
|         manage_user_extra_fields(ldap_conn, dolibarr_user) | ||||
|         manage_user_extra_fields(ldap_conn, dolibarr_user, dolibarr_client) | ||||
|  | ||||
|  | ||||
| def manage_user_extra_fields(ldap_conn: Connection, dolibarr_user: dict): | ||||
| def manage_user_extra_fields(ldap_conn: Connection, dolibarr_user: dict, dolibarr_client: Dolibarrpy): | ||||
|     login = dolibarr_user['login'] | ||||
|     obj_inetorgperson = ObjectDef(['top', 'inetOrgPerson', 'posixAccount'], ldap_conn) | ||||
|     obj_user = ObjectDef(['top', 'inetOrgPerson', 'posixAccount'] + config.LDAP_GROUPS_EXTRA_OBJECT_CLASSES, ldap_conn) | ||||
| @@ -56,6 +58,7 @@ def manage_user_extra_fields(ldap_conn: Connection, dolibarr_user: dict): | ||||
|         users_writer = Writer.from_cursor(users_reader, object_def=obj_user) | ||||
|         ldap_user = users_writer[0] | ||||
|     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() | ||||
|  | ||||
|  | ||||
| @@ -65,14 +68,65 @@ def append_extra_fields_to_ldap_user(ldap_user: WritableEntry, dolibarr_user: di | ||||
|             ldap_user.objectClass += extra_object_class | ||||
|  | ||||
|     for extra_field in config.LDAP_USERS_EXTRA_FIELDS: | ||||
|         dolibarr_attr, ldap_attr = extra_field.split(':') | ||||
|         dolibarr_attrs, 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('[]'): | ||||
|                 dolibarr_attr = dolibarr_attr[:-2] | ||||
|                 value = dolibarr_user['array_options'][f'options_{dolibarr_attr}'] | ||||
|                 value = value.split() if value else [] | ||||
|             setattr(ldap_user, ldap_attr, value) | ||||
|                 values += value | ||||
|             else: | ||||
|             value = dolibarr_user['array_options'][f'options_{dolibarr_attr}'] or "" | ||||
|                 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) | ||||
|  | ||||
|  | ||||
| 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: | ||||
|                     value = dolibarr_group.get(dolibarr_attr, dolibarr_group['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) | ||||
|          | ||||
|  | ||||
| @@ -112,14 +166,26 @@ def append_extra_fields_to_ldap_group(ldap_group: WritableEntry, dolibarr_group: | ||||
|             ldap_group.objectClass += extra_object_class | ||||
|  | ||||
|     for extra_field in config.LDAP_GROUPS_EXTRA_FIELDS: | ||||
|         dolibarr_attr, ldap_attr = extra_field.split(':') | ||||
|         dolibarr_attrs, ldap_attr = extra_field.split(':') | ||||
|         dolibarr_attrs = dolibarr_attrs.split('|') | ||||
|         values = [] | ||||
|         for dolibarr_attr in dolibarr_attrs: | ||||
|             if dolibarr_attr.endswith('[]'): | ||||
|                 dolibarr_attr = dolibarr_attr[:-2] | ||||
|                 value = dolibarr_group['array_options'][f'options_{dolibarr_attr}'] | ||||
|                 value = value.split() if value else [] | ||||
|             setattr(ldap_group, ldap_attr, value) | ||||
|                 values += value | ||||
|             else: | ||||
|             value = dolibarr_group['array_options'][f'options_{dolibarr_attr}'] or "" | ||||
|                 value = dolibarr_group['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_group, ldap_attr, value) | ||||
|  | ||||
|  | ||||
| @@ -132,6 +198,9 @@ def webhook_receiver(): | ||||
|         abort(400) | ||||
|     triggercode = data['triggercode'] | ||||
|     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) | ||||
|     ldap_server = Server(config.LDAP_HOST, config.LDAP_PORT, get_info=ALL) | ||||
|     if triggercode.startswith('USER_'): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user