From 885ca30ff0bce84341a6e99f222bc8a440d3b10d Mon Sep 17 00:00:00 2001
From: Valentin Deniaud <vdeniaud@entrouvert.com>
Date: Wed, 5 Jun 2019 11:16:41 +0200
Subject: [PATCH] attributes_ng: retrieve both static and session roles
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Le parti pris ici c'est qu'on prend par défaut les rôles dynamiques. Ça
permet de ne rien changer dans hobo et d'avoir le comportement attendu
(les rôles dynamiques sont envoyés dans le SAML), mais à part ça c'est
pas forcément logique.
---
 .../attributes_ng/sources/django_user.py      | 27 ++++++++++++-------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/src/authentic2/attributes_ng/sources/django_user.py b/src/authentic2/attributes_ng/sources/django_user.py
index af8a9f59..9949ebee 100644
--- a/src/authentic2/attributes_ng/sources/django_user.py
+++ b/src/authentic2/attributes_ng/sources/django_user.py
@@ -100,13 +100,22 @@ def get_attributes(instance, ctx):
     ctx['django_user_full_name'] = user.get_full_name()
     Role = get_role_model()
     user_auth_level = ctx['request'].session.get('auth_level', 1)
-    roles = Role.objects.for_user(user, max_auth_level=user_auth_level)
-    ctx['a2_role_slugs'] = roles.values_list('slug', flat=True)
-    ctx['a2_role_names'] = roles.values_list('name', flat=True)
-    ctx['a2_role_uuids'] = roles.values_list('uuid', flat=True)
-    if 'service' in ctx and getattr(ctx['service'], 'ou', None):
-        ou = ctx['service'].ou
-        ctx['a2_service_ou_role_slugs'] = roles.filter(ou=ou).values_list('slug', flat=True)
-        ctx['a2_service_ou_role_names'] = roles.filter(ou=ou).values_list('name', flat=True)
-        ctx['a2_service_ou_role_uuids'] = roles.filter(ou=ou).values_list('uuid', flat=True)
+    for role_type in ('session', 'static'):
+        if role_type == 'session':
+            prefix = 'a2_'
+            roles = Role.objects.for_user(user, max_auth_level=user_auth_level)
+        else:
+            prefix = 'a2_static_'
+            roles = Role.objects.for_user(user)
+        ctx[prefix + 'role_slugs'] = roles.values_list('slug', flat=True)
+        ctx[prefix + 'role_names'] = roles.values_list('name', flat=True)
+        ctx[prefix + 'role_uuids'] = roles.values_list('uuid', flat=True)
+        if 'service' in ctx and getattr(ctx['service'], 'ou', None):
+            ou = ctx['service'].ou
+            ctx[prefix + 'service_ou_role_slugs'] = \
+                roles.filter(ou=ou).values_list('slug', flat=True)
+            ctx[prefix + 'service_ou_role_names'] = \
+                roles.filter(ou=ou).values_list('name', flat=True)
+            ctx[prefix + 'service_ou_role_uuids'] = \
+                roles.filter(ou=ou).values_list('uuid', flat=True)
     return ctx
-- 
2.20.1

