403b09
From c27595371bfe1f4fe12125e053cb7ec3ad08ebf6 Mon Sep 17 00:00:00 2001
403b09
From: Fraser Tweedale <ftweedal@redhat.com>
403b09
Date: Thu, 28 Jul 2016 10:55:45 +1000
403b09
Subject: [PATCH] caacl: fix regression in rule instantiation
403b09
403b09
The Principal refactor causes service collections
403b09
('memberservice_service' attribute) to return Principal objects
403b09
where previously it returned strings, but the HBAC machinery used
403b09
for CA ACL enforcement only handles strings.  Update the code to
403b09
stringify service Principal objects when adding them to HBAC rules.
403b09
403b09
Fixes: https://fedorahosted.org/freeipa/ticket/6146
403b09
Reviewed-By: Martin Basti <mbasti@redhat.com>
403b09
---
403b09
 ipaserver/plugins/caacl.py | 17 +++++++++++------
403b09
 1 file changed, 11 insertions(+), 6 deletions(-)
403b09
403b09
diff --git a/ipaserver/plugins/caacl.py b/ipaserver/plugins/caacl.py
403b09
index d316cc7c48cf2997d6be6b052dc1efa6d6fcdb6a..a7817c4cf64f070c74557f52e9f26c9013a4963c 100644
403b09
--- a/ipaserver/plugins/caacl.py
403b09
+++ b/ipaserver/plugins/caacl.py
403b09
@@ -132,16 +132,21 @@ def _acl_make_rule(principal_type, obj):
403b09
         rule.services.names = obj.get(attr, [])
403b09
 
403b09
     # add principals and principal's groups
403b09
-    m = {'user': 'group', 'host': 'hostgroup', 'service': None}
403b09
     category_attr = '{}category'.format(principal_type)
403b09
     if category_attr in obj and obj[category_attr][0].lower() == 'all':
403b09
         rule.users.category = {pyhbac.HBAC_CATEGORY_ALL}
403b09
     else:
403b09
-        principal_attr = 'member{}_{}'.format(principal_type, principal_type)
403b09
-        rule.users.names = obj.get(principal_attr, [])
403b09
-        if m[principal_type] is not None:
403b09
-            group_attr = 'member{}_{}'.format(principal_type, m[principal_type])
403b09
-            rule.users.groups = obj.get(group_attr, [])
403b09
+        if principal_type == 'user':
403b09
+            rule.users.names = obj.get('memberuser_user', [])
403b09
+            rule.users.groups = obj.get('memberuser_group', [])
403b09
+        elif principal_type == 'host':
403b09
+            rule.users.names = obj.get('memberhost_host', [])
403b09
+            rule.users.groups = obj.get('memberhost_hostgroup', [])
403b09
+        elif principal_type == 'service':
403b09
+            rule.users.names = [
403b09
+                unicode(principal)
403b09
+                for principal in obj.get('memberservice_service', [])
403b09
+            ]
403b09
 
403b09
     return rule
403b09
 
403b09
-- 
403b09
2.7.4
403b09