[Checkins] SVN: zope.security/branches/mgedmin-cleanup/src/zope/security/ Revert last change; this is not going to work.

Marius Gedminas marius at pov.lt
Mon Jul 28 12:58:04 EDT 2008


Log message for revision 88880:
  Revert last change; this is not going to work.
  
  

Changed:
  D   zope.security/branches/mgedmin-cleanup/src/zope/security/_checker.py
  U   zope.security/branches/mgedmin-cleanup/src/zope/security/checker.py

-=-
Deleted: zope.security/branches/mgedmin-cleanup/src/zope/security/_checker.py
===================================================================
--- zope.security/branches/mgedmin-cleanup/src/zope/security/_checker.py	2008-07-28 16:55:40 UTC (rev 88879)
+++ zope.security/branches/mgedmin-cleanup/src/zope/security/_checker.py	2008-07-28 16:58:03 UTC (rev 88880)
@@ -1,193 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2003-2008 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Python version of _zope_security_checker.c
-
-$Id$
-"""
-
-from zope.interface import implements
-from zope.security.interfaces import INameBasedChecker
-from zope.security.interfaces import Unauthorized, ForbiddenAttribute
-from zope.security._definitions import thread_local
-from zope.security._proxy import _Proxy as Proxy
-from zope.security.checker import CheckerPublic
-
-
-class Checker(object):
-    implements(INameBasedChecker)
-
-    def __init__(self, get_permissions, set_permissions=None):
-        """Create a checker
-
-        A dictionary must be provided for computing permissions for
-        names. The dictionary get will be called with attribute names
-        and must return a permission id, None, or the special marker,
-        CheckerPublic. If None is returned, then access to the name is
-        forbidden. If CheckerPublic is returned, then access will be
-        granted without checking a permission.
-
-        An optional setattr dictionary may be provided for checking
-        set attribute access.
-
-        """
-        assert isinstance(get_permissions, dict)
-        self.get_permissions = get_permissions
-        if set_permissions is not None:
-            assert isinstance(set_permissions, dict)
-        self.set_permissions = set_permissions
-
-    def permission_id(self, name):
-        'See INameBasedChecker'
-        return self.get_permissions.get(name)
-
-    def setattr_permission_id(self, name):
-        'See INameBasedChecker'
-        if self.set_permissions:
-            return self.set_permissions.get(name)
-
-    def check_getattr(self, object, name):
-        'See IChecker'
-        self.check(object, name)
-
-    def check_setattr(self, object, name):
-        'See IChecker'
-        if self.set_permissions:
-            permission = self.set_permissions.get(name)
-        else:
-            permission = None
-
-        if permission is not None:
-            if permission is CheckerPublic:
-                return # Public
-            if thread_local.interaction.checkPermission(permission, object):
-                return # allowed
-            else:
-                __traceback_supplement__ = (TracebackSupplement, object)
-                raise Unauthorized(object, name, permission)
-
-        __traceback_supplement__ = (TracebackSupplement, object)
-        raise ForbiddenAttribute(name, object)
-
-    def check(self, object, name):
-        'See IChecker'
-        permission = self.get_permissions.get(name)
-        if permission is not None:
-            if permission is CheckerPublic:
-                return # Public
-            if thread_local.interaction.checkPermission(permission, object):
-                return
-            else:
-                __traceback_supplement__ = (TracebackSupplement, object)
-                raise Unauthorized(object, name, permission)
-        elif name in _available_by_default:
-            return
-
-        if name != '__iter__' or hasattr(object, name):
-            __traceback_supplement__ = (TracebackSupplement, object)
-            raise ForbiddenAttribute(name, object)
-
-    def proxy(self, value):
-        'See IChecker'
-        if type(value) is Proxy:
-            return value
-        checker = getattr(value, '__Security_checker__', None)
-        if checker is None:
-            checker = selectChecker(value)
-            if checker is None:
-                return value
-
-        return Proxy(value, checker)
-
-
-# Helper class for __traceback_supplement__
-class TracebackSupplement(object):
-
-    def __init__(self, obj):
-        self.obj = obj
-
-    def getInfo(self):
-        result = []
-        try:
-            cls = self.obj.__class__
-            if hasattr(cls, "__module__"):
-                s = "%s.%s" % (cls.__module__, cls.__name__)
-            else:
-                s = str(cls.__name__)
-            result.append("   - class: " + s)
-        except:
-            pass
-        try:
-            cls = type(self.obj)
-            if hasattr(cls, "__module__"):
-                s = "%s.%s" % (cls.__module__, cls.__name__)
-            else:
-                s = str(cls.__name__)
-            result.append("   - type: " + s)
-        except:
-            pass
-        return "\n".join(result)
-
-
-
-def selectChecker(object):
-    """Get a checker for the given object
-
-    The appropriate checker is returned or None is returned. If the
-    return value is None, then object should not be wrapped in a proxy.
-    """
-
-    # We need to be careful here. We might have a proxy, in which case
-    # we can't use the type.  OTOH, we might not be able to use the
-    # __class__ either, since not everything has one.
-
-    # TODO: we really need formal proxy introspection
-
-    #if type(object) is Proxy:
-    #    # Is this already a security proxy?
-    #    return None
-
-    checker = _getChecker(type(object), _defaultChecker)
-
-    #checker = _getChecker(getattr(object, '__class__', type(object)),
-    #                      _defaultChecker)
-
-    if checker is NoProxy:
-        return None
-
-    while not isinstance(checker, Checker):
-        checker = checker(object)
-        if checker is NoProxy or checker is None:
-            return None
-
-    return checker
-
-
-NoProxy = object()
-
-# _checkers is a mapping.
-#
-#  - Keys are types
-#
-#  - Values are
-#
-#    o None => rock
-#    o a Checker
-#    o a function returning None or a Checker
-#
-_checkers = {}
-
-_defaultChecker = Checker({})
-_available_by_default = []
-
-_getChecker = _checkers.get

Modified: zope.security/branches/mgedmin-cleanup/src/zope/security/checker.py
===================================================================
--- zope.security/branches/mgedmin-cleanup/src/zope/security/checker.py	2008-07-28 16:55:40 UTC (rev 88879)
+++ zope.security/branches/mgedmin-cleanup/src/zope/security/checker.py	2008-07-28 16:58:03 UTC (rev 88880)
@@ -44,6 +44,7 @@
 from zope.security.interfaces import IChecker, INameBasedChecker
 from zope.security.interfaces import ISecurityProxyFactory
 from zope.security.interfaces import Unauthorized, ForbiddenAttribute
+from zope.security._definitions import thread_local
 from zope.security._proxy import _Proxy as Proxy, getChecker
 
 if os.environ.get('ZOPE_WATCH_CHECKERS'):
@@ -137,7 +138,122 @@
     # indicates a programming or configuration error
     return True
 
+class Checker(object):
+    implements(INameBasedChecker)
 
+    def __init__(self, get_permissions, set_permissions=None):
+        """Create a checker
+
+        A dictionary must be provided for computing permissions for
+        names. The dictionary get will be called with attribute names
+        and must return a permission id, None, or the special marker,
+        CheckerPublic. If None is returned, then access to the name is
+        forbidden. If CheckerPublic is returned, then access will be
+        granted without checking a permission.
+
+        An optional setattr dictionary may be provided for checking
+        set attribute access.
+
+        """
+        assert isinstance(get_permissions, dict)
+        self.get_permissions = get_permissions
+        if set_permissions is not None:
+            assert isinstance(set_permissions, dict)
+        self.set_permissions = set_permissions
+
+    def permission_id(self, name):
+        'See INameBasedChecker'
+        return self.get_permissions.get(name)
+
+    def setattr_permission_id(self, name):
+        'See INameBasedChecker'
+        if self.set_permissions:
+            return self.set_permissions.get(name)
+
+    def check_getattr(self, object, name):
+        'See IChecker'
+        self.check(object, name)
+
+    def check_setattr(self, object, name):
+        'See IChecker'
+        if self.set_permissions:
+            permission = self.set_permissions.get(name)
+        else:
+            permission = None
+
+        if permission is not None:
+            if permission is CheckerPublic:
+                return # Public
+            if thread_local.interaction.checkPermission(permission, object):
+                return # allowed
+            else:
+                __traceback_supplement__ = (TracebackSupplement, object)
+                raise Unauthorized(object, name, permission)
+
+        __traceback_supplement__ = (TracebackSupplement, object)
+        raise ForbiddenAttribute(name, object)
+
+    def check(self, object, name):
+        'See IChecker'
+        permission = self.get_permissions.get(name)
+        if permission is not None:
+            if permission is CheckerPublic:
+                return # Public
+            if thread_local.interaction.checkPermission(permission, object):
+                return
+            else:
+                __traceback_supplement__ = (TracebackSupplement, object)
+                raise Unauthorized(object, name, permission)
+        elif name in _available_by_default:
+            return
+
+        if name != '__iter__' or hasattr(object, name):
+            __traceback_supplement__ = (TracebackSupplement, object)
+            raise ForbiddenAttribute(name, object)
+
+    def proxy(self, value):
+        'See IChecker'
+        if type(value) is Proxy:
+            return value
+        checker = getattr(value, '__Security_checker__', None)
+        if checker is None:
+            checker = selectChecker(value)
+            if checker is None:
+                return value
+
+        return Proxy(value, checker)
+
+
+
+# Helper class for __traceback_supplement__
+class TracebackSupplement(object):
+
+    def __init__(self, obj):
+        self.obj = obj
+
+    def getInfo(self):
+        result = []
+        try:
+            cls = self.obj.__class__
+            if hasattr(cls, "__module__"):
+                s = "%s.%s" % (cls.__module__, cls.__name__)
+            else:
+                s = str(cls.__name__)
+            result.append("   - class: " + s)
+        except:
+            pass
+        try:
+            cls = type(self.obj)
+            if hasattr(cls, "__module__"):
+                s = "%s.%s" % (cls.__module__, cls.__name__)
+            else:
+                s = str(cls.__name__)
+            result.append("   - type: " + s)
+        except:
+            pass
+        return "\n".join(result)
+
+
 class Global(object):
     """A global object that behaves like a string.
 
@@ -231,6 +347,38 @@
 
     return Checker(data)
 
+def selectChecker(object):
+    """Get a checker for the given object
+
+    The appropriate checker is returned or None is returned. If the
+    return value is None, then object should not be wrapped in a proxy.
+    """
+
+    # We need to be careful here. We might have a proxy, in which case
+    # we can't use the type.  OTOH, we might not be able to use the
+    # __class__ either, since not everything has one.
+
+    # TODO: we really need formal proxy introspection
+
+    #if type(object) is Proxy:
+    #    # Is this already a security proxy?
+    #    return None
+
+    checker = _getChecker(type(object), _defaultChecker)
+
+    #checker = _getChecker(getattr(object, '__class__', type(object)),
+    #                      _defaultChecker)
+
+    if checker is NoProxy:
+        return None
+
+    while not isinstance(checker, Checker):
+        checker = checker(object)
+        if checker is NoProxy or checker is None:
+            return None
+
+    return checker
+
 def getCheckerForInstancesOf(class_):
     return _checkers.get(class_)
 
@@ -250,15 +398,28 @@
 def undefineChecker(type_):
     del _checkers[type_]
 
+NoProxy = object()
 
-# Get optimized versions, if available
+# _checkers is a mapping.
+#
+#  - Keys are types
+#
+#  - Values are
+#
+#    o None => rock
+#    o a Checker
+#    o a function returning None or a Checker
+#
+_checkers = {}
+
+_defaultChecker = Checker({})
+_available_by_default = []
+
+# Get optimized versions
 try:
     import zope.security._zope_security_checker
 except ImportError:
-    from zope.security._checker import _checkers, selectChecker
-    from zope.security._checker import NoProxy, Checker
-    from zope.security._checker import _defaultChecker
-    from zope.security._checker import _available_by_default
+    pass
 else:
     from zope.security._zope_security_checker import _checkers, selectChecker
     from zope.security._zope_security_checker import NoProxy, Checker
@@ -267,6 +428,8 @@
     zope.interface.classImplements(Checker, INameBasedChecker)
 
 
+_getChecker = _checkers.get
+
 class CombinedChecker(Checker):
     """A checker that combines two other checkers in a logical-or fashion.
 



More information about the Checkins mailing list