selectors.py
branchreldefsecurity
changeset 3877 7ca53fc72a0a
parent 3757 122a01751d59
child 3890 d7a270f50f54
--- a/selectors.py	Wed Nov 18 09:16:38 2009 +0100
+++ b/selectors.py	Thu Nov 19 12:55:47 2009 +0100
@@ -665,19 +665,6 @@
         self.target_etype = target_etype
         self.action = action
 
-    @lltrace
-    def __call__(self, cls, req, *args, **kwargs):
-        rschema = cls.schema.rschema(self.rtype)
-        if not (rschema.has_perm(req, self.action)
-                or rschema.has_local_role(self.action)):
-            return 0
-        if self.action != 'read':
-            if not (rschema.has_perm(req, 'read')
-                    or rschema.has_local_role('read')):
-                return 0
-        score = super(relation_possible, self).__call__(cls, req, *args, **kwargs)
-        return score
-
     def score_class(self, eclass, req):
         eschema = eclass.e_schema
         try:
@@ -689,12 +676,13 @@
             return 0
         if self.target_etype is not None:
             try:
-                if self.role == 'subject':
-                    return int(self.target_etype in rschema.objects(eschema))
-                else:
-                    return int(self.target_etype in rschema.subjects(eschema))
+                rdef = rschema.role_rdef(eschema, self.target_etype, self.role)
+                if not rdef.may_have_permission(self.action, req):
+                    return 0
             except KeyError:
                 return 0
+        else:
+            return rschema.may_have_permission(self.action, req, eschema, self.role)
         return 1
 
 
@@ -1070,11 +1058,11 @@
     perm = getattr(cls, 'require_permission', 'read')
     if hasattr(cls, 'etype'):
         eschema = schema.eschema(cls.etype)
-        if not (eschema.has_perm(req, perm) or eschema.has_local_role(perm)):
+        if not eschema.may_have_permission(perm, req):
             return 0
     if hasattr(cls, 'rtype'):
         rschema = schema.rschema(cls.rtype)
-        if not (rschema.has_perm(req, perm) or rschema.has_local_role(perm)):
+        if not rschema.may_have_permission(perm, req):
             return 0
     return 1
 etype_rtype_selector = deprecated()(etype_rtype_selector)