[Zope3-checkins] SVN: Zope3/branches/ZopeX3-3.0/src/zope/app/ Merged from trunk:

Jim Fulton jim at zope.com
Fri Jul 9 18:26:09 EDT 2004


Log message for revision 26379:
Merged from trunk:

  r26363 | jim | 2004-07-09 15:28:16 -0400 (Fri, 09 Jul 2004) | 5 lines

Added TrustedAdapterFactory

This is for adapters that are trusted and need unfettered access to
the objects they adapt. If asked to adapt security-proxied objects,
the return security-proxied adapters of unproxied objects.



-=-
Modified: Zope3/branches/ZopeX3-3.0/src/zope/app/component/metaconfigure.py
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/component/metaconfigure.py	2004-07-09 22:23:17 UTC (rev 26378)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/component/metaconfigure.py	2004-07-09 22:26:09 UTC (rev 26379)
@@ -26,6 +26,7 @@
 from zope.app import zapi
 from zope.app.component.interface import queryInterface
 from zope.app.servicenames import Adapters, Presentation
+from zope.app.security.adapter import TrustedAdapterFactory
 
 PublicPermission = 'zope.Public'
 
@@ -120,7 +121,8 @@
                 args = ('', iface)
                 )
 
-def adapter(_context, factory, provides, for_, permission=None, name=''):
+def adapter(_context, factory, provides, for_, permission=None, name='',
+            trusted=False):
     if permission is not None:
         if permission == PublicPermission:
             permission = CheckerPublic
@@ -145,6 +147,9 @@
         # Store the original factory for documentation
         factory.factory = factories[0]
 
+    if trusted:
+        factory = TrustedAdapterFactory(factory)
+
     _context.action(
         discriminator = ('adapter', for_, provides, name),
         callable = handler,

Modified: Zope3/branches/ZopeX3-3.0/src/zope/app/component/metadirectives.py
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/component/metadirectives.py	2004-07-09 22:23:17 UTC (rev 26378)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/component/metadirectives.py	2004-07-09 22:26:09 UTC (rev 26379)
@@ -14,55 +14,58 @@
 """
 $Id$
 """
-from zope.interface import Interface
-from zope.configuration.fields import GlobalObject, Tokens, \
-     PythonIdentifier, MessageID
-from zope.schema import TextLine, Id
-from zope.app.security.fields import Permission
 
-class IBasicComponentInformation(Interface):
+import zope.configuration.fields
+import zope.interface
+import zope.schema
 
-    component = GlobalObject(
+import zope.app.security.fields
+
+class IBasicComponentInformation(zope.interface.Interface):
+
+    component = zope.configuration.fields.GlobalObject(
         title=u"Component to be used",
         required=False
         )
 
-    permission = Permission(
+    permission = zope.app.security.fields.Permission(
         title=u"Permission",
         required=False
         )
 
-    factory = GlobalObject(
+    factory = zope.configuration.fields.GlobalObject(
         title=u"Factory",
         required=False
         )
 
-class IBasicViewInformation(Interface):
+class IBasicViewInformation(zope.interface.Interface):
     """
     This is the basic information for all views.
     """
     
-    for_ = Tokens(
+    for_ = zope.configuration.fields.Tokens(
         title=u"Specifications of the objects to be viewed",
         description=u"""This should be a list of interfaces or classes
         """,
         required=True,
-        value_type=GlobalObject(missing_value=object())
+        value_type=zope.configuration.fields.GlobalObject(
+          missing_value=object(),
+          ),
         )
 
-    permission = Permission(
+    permission = zope.app.security.fields.Permission(
         title=u"Permission",
         description=u"The permission needed to use the view.",
         required=False
         )
 
-    class_ = GlobalObject(
+    class_ = zope.configuration.fields.GlobalObject(
         title=u"Class",
         description=u"A class that provides attributes used by the view.",
         required=False
         )
 
-    layer = TextLine(
+    layer = zope.schema.TextLine(
         title=u"The layer the view is in.",
         description=u"""
         A skin is composed of layers. It is common to put skin
@@ -71,7 +74,7 @@
         required=False
         )
 
-    allowed_interface = Tokens(
+    allowed_interface = zope.configuration.fields.Tokens(
         title=u"Interface that is also allowed if user has permission.",
         description=u"""
         By default, 'permission' only applies to viewing the view and
@@ -82,10 +85,10 @@
         Multiple interfaces can be provided, separated by
         whitespace.""",
         required=False,
-        value_type=GlobalObject()
+        value_type=zope.configuration.fields.GlobalObject()
         )
 
-    allowed_attributes = Tokens(
+    allowed_attributes = zope.configuration.fields.Tokens(
         title=u"View attributes that are also allowed if user has permission.",
         description=u"""
         By default, 'permission' only applies to viewing the view and
@@ -93,118 +96,138 @@
         you can make the permission also apply to the extra attributes
         on the view object.""",
         required=False,
-        value_type=PythonIdentifier()
+        value_type=zope.configuration.fields.PythonIdentifier()
         )
 
-class IBasicResourceInformation(Interface):
+class IBasicResourceInformation(zope.interface.Interface):
     """
     Basic information for resources
     """
 
-    name = TextLine(
+    name = zope.schema.TextLine(
         title=u"The name of the resource.",
         description=u"The name shows up in URLs/paths. For example 'foo'.",
         required=True,
         default=u'',
         )
 
-    provides = GlobalObject(
+    provides = zope.configuration.fields.GlobalObject(
         title=u"The interface this component provides.",
         description=u"""
         A view can provide an interface.  This would be used for
         views that support other views.""",
         required=False,
-        default=Interface,
+        default=zope.interface.Interface,
         )
 
-    type = GlobalObject(
+    type = zope.configuration.fields.GlobalObject(
         title=u"Request type",
         required=True
         )
 
-class IInterfaceDirective(Interface):
+class IInterfaceDirective(zope.interface.Interface):
     """
     Define an interface
     """
     
-    interface = GlobalObject(
+    interface = zope.configuration.fields.GlobalObject(
         title=u"Interface",
         required=True
         )
 
-    type = GlobalObject(
+    type = zope.configuration.fields.GlobalObject(
         title=u"Interface type",
         required=False
         )
 
-class IAdapterDirective(Interface):
+class IAdapterDirective(zope.interface.Interface):
     """
     Register an adapter
     """
 
-    factory = Tokens(
+    factory = zope.configuration.fields.Tokens(
         title=u"Adapter factory/factories",
         description=u"""A list of factories (usually just one) that create the
         adapter instance.""",
         required=True,
-        value_type=GlobalObject()
+        value_type=zope.configuration.fields.GlobalObject()
         )
 
-    provides = GlobalObject(
+    provides = zope.configuration.fields.GlobalObject(
         title=u"Interface the component provides",
         description=u"""This attribute specifes the interface the adapter
         instance must provide.""",
         required=True
         )
 
-    for_ = Tokens(
+    for_ = zope.configuration.fields.Tokens(
         title=u"Specifications to be adapted",
         description=u"""This should be a list of interfaces or classes
         """,
         required=True,
-        value_type=GlobalObject(missing_value=object())
+        value_type=zope.configuration.fields.GlobalObject(
+          missing_value=object(),
+          ),
         )
 
-    permission = Permission(
+    permission = zope.app.security.fields.Permission(
         title=u"Permission",
         description=u"""This adapter is only available, if the principal has
         this permission.""",
         required=False
         )
 
-    name = TextLine(
+    name = zope.schema.TextLine(
         title=u"Name",
-        description=u"""Adapters can have names. This attribute allows you to
+        description=u"""Adapters can have names.
+
+        This attribute allows you to
         specify the name for this adapter.""",
         required=False
         )
 
-class ISubscriberDirective(Interface):
+    trusted = zope.configuration.fields.Bool(
+        title=u"Trusted",
+        description=u"""Make the adapter a trusted adapter
+
+        Trusted adapters have unfettered access to the objects they
+        adapt.  If asked to adapt security-proxied objects, then,
+        rather than getting an unproxied adapter of security-proxied
+        objects, you get a security-proxied adapter of unproxied
+        objects.
+        """,
+        required=False,
+        default=False,
+        )
+
+class ISubscriberDirective(zope.interface.Interface):
     """
     Register a subscriber
     """
 
-    factory = GlobalObject(
+    factory = zope.configuration.fields.GlobalObject(
         title=u"Subscriber factory",
         description=u"A factory used to create the subscriber instance.",
         required=True
         )
 
-    provides = GlobalObject(
+    provides = zope.configuration.fields.GlobalObject(
         title=u"Interface the component provides",
         description=u"""This attribute specifes the interface the adapter
         instance must provide.""",
         required=False,
         )
 
-    for_ = Tokens(
+    for_ = zope.configuration.fields.Tokens(
         title=u"Interfaces or classes that this subscriber depends on",
         description=u"This should be a list of interfaces or classes",
         required=True,
-        value_type=GlobalObject(missing_value = object()),
+        value_type=zope.configuration.fields.GlobalObject(
+          missing_value = object(),
+          ),
         )
 
-    permission = Permission(
+    permission = zope.app.security.fields.Permission(
         title=u"Permission",
         description=u"""This subscriber is only available, if the principal has
         this permission.""",
@@ -216,32 +239,32 @@
     Register a utility
     """
 
-    provides = GlobalObject(
+    provides = zope.configuration.fields.GlobalObject(
         title=u"Interface the component provides",
         required=True
         )
 
-    name = TextLine(
+    name = zope.schema.TextLine(
         title=u"Name",
         required=False
         )
 
-class IFactoryDirective(Interface):
+class IFactoryDirective(zope.interface.Interface):
     """
     Define a factory
     """
 
-    component = GlobalObject(
+    component = zope.configuration.fields.GlobalObject(
         title=u"Component to be used",
         required=True
         )
     
-    id = TextLine(
+    id = zope.schema.TextLine(
         title=u"ID",
         required=False
         )
 
-    title = MessageID(
+    title = zope.configuration.fields.MessageID(
         title=u"Title",
         description=u"""
         text suitable for use in the 'add content' menu of a
@@ -249,7 +272,7 @@
         required=False
         )
 
-    description = MessageID(
+    description = zope.configuration.fields.MessageID(
         title=u"Description",
         description=u"Longer narrative description of what this factory does",
         required=False
@@ -261,10 +284,10 @@
     Register a view for a component
     """
 
-    factory = Tokens(
+    factory = zope.configuration.fields.Tokens(
         title=u"Factory",
         required=False,
-        value_type=GlobalObject()
+        value_type=zope.configuration.fields.GlobalObject()
         )
 
 class IDefaultViewDirective(IBasicResourceInformation):
@@ -275,7 +298,7 @@
     explicitly).
     """
 
-    for_ = GlobalObject(
+    for_ = zope.configuration.fields.GlobalObject(
         title=u"The interface this view is the default for.",
         description=u"""
         Specifies the interface for which the default view is declared. All
@@ -293,32 +316,32 @@
     Register a resource
     """
     
-    layer = TextLine(
+    layer = zope.schema.TextLine(
         title=u"The layer the resource is in.",
         required=False
         )
 
-    allowed_interface = Tokens(
+    allowed_interface = zope.configuration.fields.Tokens(
         title=u"Interface that is also allowed if user has permission.",
         required=False,
-        value_type=GlobalObject()
+        value_type=zope.configuration.fields.GlobalObject()
         )
 
-    allowed_attributes = Tokens(
+    allowed_attributes = zope.configuration.fields.Tokens(
         title=u"View attributes that are also allowed if user has permission.",
         required=False,
-        value_type=PythonIdentifier()
+        value_type=zope.configuration.fields.PythonIdentifier()
         )
 
 
-class IServiceTypeDirective(Interface):
+class IServiceTypeDirective(zope.interface.Interface):
 
-    id = TextLine(
+    id = zope.schema.TextLine(
         title=u"ID of the service type",
         required=True
         )
 
-    interface = GlobalObject(
+    interface = zope.configuration.fields.GlobalObject(
         title=u"Interface of the service type",
         required=True
         )
@@ -328,40 +351,40 @@
     Register a service
     """
 
-    serviceType = TextLine(
+    serviceType = zope.schema.TextLine(
         title=u"ID of service type",
         required=True
         )
 
-class IClassDirective(Interface):
+class IClassDirective(zope.interface.Interface):
     """
     Make statements about a class
     """
 
-    class_ = GlobalObject(
+    class_ = zope.configuration.fields.GlobalObject(
         title=u"Class",
         required=True
         )
 
-class IImplementsSubdirective(Interface):
+class IImplementsSubdirective(zope.interface.Interface):
     """
     Declare that the class given by the content directive's class
     attribute implements a given interface
     """
 
-    interface = Tokens(
+    interface = zope.configuration.fields.Tokens(
         title=u"One or more interfaces",
         required=True,
-        value_type=GlobalObject()
+        value_type=zope.configuration.fields.GlobalObject()
         )
 
-class IRequireSubdirective(Interface):
+class IRequireSubdirective(zope.interface.Interface):
     """
     Indicate that the a specified list of names or the names in a
     given Interface require a given permission for access.
     """
 
-    permission = Permission(
+    permission = zope.app.security.fields.Permission(
         title=u"Permission",
         description=u"""
         Specifies the permission by id that will be required to
@@ -369,39 +392,39 @@
         required=False
         )
 
-    attributes = Tokens(
+    attributes = zope.configuration.fields.Tokens(
         title=u"Attributes and methods",
         description=u"""
         This is a list of attributes and methods that can be accessed.""",
         required=False,
-        value_type=PythonIdentifier()
+        value_type=zope.configuration.fields.PythonIdentifier()
         )
         
-    set_attributes = Tokens(
+    set_attributes = zope.configuration.fields.Tokens(
         title=u"Attributes that can be set",
         description=u"""
         This is a list of attributes that can be modified/mutated.""",
         required=False,
-        value_type=PythonIdentifier()
+        value_type=zope.configuration.fields.PythonIdentifier()
         )
 
-    interface = Tokens(
+    interface = zope.configuration.fields.Tokens(
         title=u"Interfaces",
         description=u"""
         The listed interfaces' methods and attributes can be accessed.""",
         required=False,
-        value_type=GlobalObject()
+        value_type=zope.configuration.fields.GlobalObject()
         )
 
-    set_schema = Tokens(
+    set_schema = zope.configuration.fields.Tokens(
         title=u"The attributes specified by the schema can be set",
         description=u"""
         The listed schemas' properties can be modified/mutated.""",
         required=False,
-        value_type=GlobalObject()
+        value_type=zope.configuration.fields.GlobalObject()
         )
 
-    like_class = GlobalObject(
+    like_class = zope.configuration.fields.GlobalObject(
         title=u"Configure like this class",
         description=u"""
         This argument says that this content class should be configured in the
@@ -410,31 +433,31 @@
         required=False
         )
     
-class IAllowSubdirective(Interface):
+class IAllowSubdirective(zope.interface.Interface):
     """
     Declare a part of the class to be publicly viewable (that is,
     requires the zope.Public permission). Only one of the following
     two attributes may be used.
     """
 
-    attributes = Tokens(
+    attributes = zope.configuration.fields.Tokens(
         title=u"Attributes",
         required=False,
-        value_type=PythonIdentifier()
+        value_type=zope.configuration.fields.PythonIdentifier()
         )
 
-    interface = Tokens(
+    interface = zope.configuration.fields.Tokens(
         title=u"Interface",
         required=False,
-        value_type=GlobalObject()
+        value_type=zope.configuration.fields.GlobalObject()
         )
 
-class IFactorySubdirective(Interface):
+class IFactorySubdirective(zope.interface.Interface):
     """
     Specify the factory used to create this content object
     """
 
-    id = TextLine(
+    id = zope.schema.TextLine(
         title=u"ID",
         description=u"""
         the identifier for this factory in the ZMI factory
@@ -443,7 +466,7 @@
         required=False
         )
 
-    title = MessageID(
+    title = zope.configuration.fields.MessageID(
         title=u"Title",
         description=u"""
         text suitable for use in the 'add content' menu of a
@@ -451,7 +474,7 @@
         required=False
         )
 
-    description = MessageID(
+    description = zope.configuration.fields.MessageID(
         title=u"Description",
         description=u"Longer narrative description of what this factory does",
         required=False

Modified: Zope3/branches/ZopeX3-3.0/src/zope/app/component/tests/test_directives.py
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/component/tests/test_directives.py	2004-07-09 22:23:17 UTC (rev 26378)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/component/tests/test_directives.py	2004-07-09 22:26:09 UTC (rev 26379)
@@ -195,6 +195,42 @@
 
         self.assertEqual(IApp(Content()).__class__, Comp)
 
+    def testTrustedAdapter(self):
+        # Full import is critical!
+        from zope.component.tests.components import Content
+        from zope.app.component.tests.adapter import A1, I1
+
+        xmlconfig(StringIO(template % (
+            """
+            <adapter
+              factory="zope.app.component.tests.adapter.A1"
+              provides="zope.app.component.tests.adapter.I1"
+              for="zope.component.tests.components.IContent"
+              trusted="yes"
+              />
+            """
+            )))
+
+        # With an unproxied object, busoness as usual
+        ob = Content()
+        self.assertEqual(type(I1(ob)), type(A1()))
+
+        # Now with a proxied object:
+        from zope.security.checker import ProxyFactory
+        p = ProxyFactory(ob)
+
+        # we get a proxied adapter:
+        a = I1(p)
+        from zope.security.proxy import Proxy
+        self.assertEqual(type(a), Proxy)
+
+        # around an unproxied object:
+        from zope.security.proxy import getProxiedObject
+        a = getProxiedObject(a)
+        a.context[0] is ob
+        
+        
+
     def testAdapter_w_multiple_factories(self):
         from zope.app.component.tests.adapter import A1, A2, A3
         from zope.component.tests.components import Content, IApp

Copied: Zope3/branches/ZopeX3-3.0/src/zope/app/security/adapter.py (from rev 26363, Zope3/trunk/src/zope/app/security/adapter.py)


Property changes on: Zope3/branches/ZopeX3-3.0/src/zope/app/security/adapter.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Copied: Zope3/branches/ZopeX3-3.0/src/zope/app/security/tests/test_adapter.py (from rev 26363, Zope3/trunk/src/zope/app/security/tests/test_adapter.py)


Property changes on: Zope3/branches/ZopeX3-3.0/src/zope/app/security/tests/test_adapter.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native



More information about the Zope3-Checkins mailing list