summaryrefslogtreecommitdiffstats
path: root/ipalib/plugins/permission.py
diff options
context:
space:
mode:
authorPetr Viktorin <pviktori@redhat.com>2014-01-09 14:43:37 +0100
committerPetr Viktorin <pviktori@redhat.com>2014-02-20 13:11:41 +0100
commit78b657b02d2918fb26e0969e096f7eb15dbf830c (patch)
tree771f52be92145a40eec3e951df214d4909208604 /ipalib/plugins/permission.py
parente951f1841674fc57a867b9a36eea9d82ca31ad38 (diff)
downloadfreeipa-78b657b02d2918fb26e0969e096f7eb15dbf830c.tar.gz
freeipa-78b657b02d2918fb26e0969e096f7eb15dbf830c.tar.xz
freeipa-78b657b02d2918fb26e0969e096f7eb15dbf830c.zip
Add permission_filter_objectclasses for explicit type filters
Part of the work for: https://fedorahosted.org/freeipa/ticket/4074 Reviewed-By: Martin Kosek <mkosek@redhat.com>
Diffstat (limited to 'ipalib/plugins/permission.py')
-rw-r--r--ipalib/plugins/permission.py30
1 files changed, 19 insertions, 11 deletions
diff --git a/ipalib/plugins/permission.py b/ipalib/plugins/permission.py
index 071544aac..64deb99ef 100644
--- a/ipalib/plugins/permission.py
+++ b/ipalib/plugins/permission.py
@@ -99,9 +99,6 @@ EXAMPLES:
register = Registry()
-VALID_OBJECT_TYPES = (u'user', u'group', u'host', u'service', u'hostgroup',
- u'netgroup', u'dnsrecord',)
-
_DEPRECATED_OPTION_ALIASES = {
'permissions': 'ipapermright',
'filter': 'ipapermtargetfilter',
@@ -141,6 +138,15 @@ class DNOrURL(DNParam):
return super(DNOrURL, self)._convert_scalar(value, index=index)
+def validate_type(ugettext, typestr):
+ try:
+ obj = api.Object[typestr]
+ except KeyError:
+ return _('"%s" is not an object type') % typestr
+ if not getattr(obj, 'permission_filter_objectclasses', None):
+ return _('"%s" is not a valid permission type') % typestr
+
+
@register()
class permission(baseldap.LDAPObject):
"""
@@ -247,12 +253,11 @@ class permission(baseldap.LDAPObject):
doc=_('User group to apply permissions to (sets target)'),
flags={'ask_create', 'virtual_attribute'},
),
- StrEnum(
- 'type?',
+ Str(
+ 'type?', validate_type,
label=_('Type'),
doc=_('Type of IPA object '
'(sets subtree and objectClass targetfilter)'),
- values=VALID_OBJECT_TYPES,
flags={'ask_create', 'virtual_attribute'},
),
) + tuple(
@@ -310,19 +315,22 @@ class permission(baseldap.LDAPObject):
# type
if ipapermtargetfilter and ipapermlocation:
- for objname in VALID_OBJECT_TYPES:
- obj = self.api.Object[objname]
+ for obj in self.api.Object():
+ filter_objectclasses = getattr(
+ obj, 'permission_filter_objectclasses', None)
+ if not filter_objectclasses:
+ continue
wantdn = DN(obj.container_dn, self.api.env.basedn)
if DN(ipapermlocation) != wantdn:
continue
- for objclass in obj.object_class:
+ for objclass in filter_objectclasses:
filter_re = '\(objectclass=%s\)' % re.escape(objclass)
if not any(re.match(filter_re, tf, re.I)
for tf in ipapermtargetfilter):
break
else:
- entry.single_value['type'] = objname
+ entry.single_value['type'] = unicode(obj.name)
break
# old output names
@@ -684,7 +692,7 @@ class permission(baseldap.LDAPObject):
error=_('subtree and type are mutually exclusive'))
obj = self.api.Object[objtype.lower()]
new_values = [u'(objectclass=%s)' % o
- for o in obj.object_class]
+ for o in obj.permission_filter_objectclasses]
filter_ops['add'].extend(new_values)
container_dn = DN(obj.container_dn, self.api.env.basedn)
options['ipapermlocation'] = container_dn