|
1 | 1 | import logging |
2 | | -import requests |
3 | 2 | from collections import defaultdict |
4 | 3 |
|
5 | 4 | from django.conf import settings |
@@ -387,94 +386,3 @@ def user_default_groups_handler(backend, user, response, *args, **kwargs): |
387 | 386 | user.groups.add(*group_list) |
388 | 387 | else: |
389 | 388 | logger.info(f"No valid group assignments for {user} - REMOTE_AUTH_DEFAULT_GROUPS may be incorrectly set?") |
390 | | - |
391 | | - |
392 | | -def azuread_map_groups(response, user, backend, *args, **kwargs): |
393 | | - ''' |
394 | | - Map Azure AD group ID to Netbox group |
395 | | - Also set is_superuser or is_staff based on config map |
396 | | - ''' |
397 | | - BASE_MICROSOFT_GRAPH_URL = 'https://graph.microsoft.com/v1.0/' |
398 | | - logger = logging.getLogger('netbox.auth.azuread_map_groups') |
399 | | - |
400 | | - if not hasattr(settings, "SOCIAL_AUTH_PIPELINE_CONFIG"): |
401 | | - raise ImproperlyConfigured( |
402 | | - "Azure AD group mapping has been configured, but SOCIAL_AUTH_PIPELINE_CONFIG is not defined." |
403 | | - ) |
404 | | - |
405 | | - config = getattr(settings, "SOCIAL_AUTH_PIPELINE_CONFIG") |
406 | | - if "AZUREAD_USER_FLAGS_BY_GROUP" not in config and "AZUREAD_GROUP_MAP" not in config: |
407 | | - raise ImproperlyConfigured( |
408 | | - "Azure AD group mapping has been configured, but AZUREAD_USER_FLAGS_BY_GROUP or AZUREAD_GROUP_MAP is not defined." |
409 | | - ) |
410 | | - |
411 | | - flags_by_group = config.get("AZUREAD_USER_FLAGS_BY_GROUP", {'is_superuser': [], 'is_staff': []}) |
412 | | - group_mapping = config.get("AZUREAD_GROUP_MAP", {}) |
413 | | - |
414 | | - if 'is_staff' not in flags_by_group and 'is_superuser' not in flags_by_group: |
415 | | - raise ImproperlyConfigured( |
416 | | - "Azure AD group mapping AZUREAD_USER_FLAGS_BY_GROUP is defined but does not contain either is_staff or is_superuser." |
417 | | - ) |
418 | | - |
419 | | - superuser_map = flags_by_group.get('is_superuser', []) |
420 | | - staff_map = flags_by_group.get('is_staff', []) |
421 | | - |
422 | | - access_token = response.get('access_token') |
423 | | - headers = { |
424 | | - "Content-Type": "application/x-www-form-urlencoded", |
425 | | - "Accept": "application/json", |
426 | | - 'Authorization': f'Bearer {access_token}', |
427 | | - } |
428 | | - |
429 | | - try: |
430 | | - # Query Microsoft Graph API to get user-id for following API |
431 | | - response = requests.get( |
432 | | - f'{BASE_MICROSOFT_GRAPH_URL}me', |
433 | | - headers=headers, |
434 | | - ) |
435 | | - uid = response.json().get('id') |
436 | | - |
437 | | - # Call Graph API to get groups for current user |
438 | | - response = requests.get( |
439 | | - f"{BASE_MICROSOFT_GRAPH_URL}users/{uid}/memberOf", |
440 | | - headers=headers, |
441 | | - ) |
442 | | - except Exception as e: |
443 | | - logger.error(f"Azure AD group mapping error getting groups for user {user} from Microsoft Graph API: {e}") |
444 | | - raise e |
445 | | - |
446 | | - # Set groups and permissions based on returned group list |
447 | | - is_superuser = False |
448 | | - is_staff = False |
449 | | - try: |
450 | | - values = response.json().get('value', []) |
451 | | - except Exception as e: |
452 | | - logger.error(f"Azure AD group mapping error getting groups json response for user {user} from Microsoft Graph API: {e}") |
453 | | - raise e |
454 | | - |
455 | | - user.groups.through.objects.filter(user=user).delete() |
456 | | - for value in values: |
457 | | - # AD response contains both directories and groups - we only want groups |
458 | | - if value.get('@odata.type', None) == '#microsoft.graph.group': |
459 | | - group_id = value.get('id', None) |
460 | | - |
461 | | - if group_id in superuser_map: |
462 | | - logger.info(f"Azure AD group mapping - setting superuser status for: {user}.") |
463 | | - is_superuser = True |
464 | | - |
465 | | - if group_id in staff_map: |
466 | | - logger.info(f"Azure AD group mapping - setting staff status for: {user}.") |
467 | | - is_staff = True |
468 | | - |
469 | | - if group_id in group_mapping: |
470 | | - group_name = group_mapping[group_id] |
471 | | - try: |
472 | | - group = Group.objects.get(name=group_name) |
473 | | - group.user_set.add(user) |
474 | | - logger.info(f"Azure AD group mapping - adding group {group_name} to user: {user}.") |
475 | | - except Group.DoesNotExist: |
476 | | - logger.info(f"Azure AD group mapping - group: {group_name} not found.") |
477 | | - |
478 | | - user.is_superuser = is_superuser |
479 | | - user.is_staff = is_staff |
480 | | - user.save() |
0 commit comments