[Checkins] SVN: gocept.xmlrpcskin/trunk/s Copy in the code we'll probably need

Wolfgang Schnerring wosc at wosc.de
Tue Jul 26 04:46:56 EDT 2011


Log message for revision 122351:
  Copy in the code we'll probably need
  

Changed:
  U   gocept.xmlrpcskin/trunk/setup.py
  U   gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/configure.zcml
  A   gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/interfaces.py
  A   gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/meta.zcml
  A   gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/traverser.py
  A   gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/zcml.py

-=-
Modified: gocept.xmlrpcskin/trunk/setup.py
===================================================================
--- gocept.xmlrpcskin/trunk/setup.py	2011-07-26 08:07:07 UTC (rev 122350)
+++ gocept.xmlrpcskin/trunk/setup.py	2011-07-26 08:46:56 UTC (rev 122351)
@@ -36,9 +36,15 @@
     namespace_packages=['gocept'],
     install_requires=[
         'setuptools',
-        'zope.component',
+        'zope.app.publisher',
+        'zope.component[zcml]',
+        'zope.configuration',
         'zope.interface',
+        'zope.publisher>=3.6.0',
+        'zope.security',
+        'zope.traversing',
     ],
     extras_require=dict(test=[
+        'zope.testbrowser',
     ]),
 )

Modified: gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/configure.zcml
===================================================================
--- gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/configure.zcml	2011-07-26 08:07:07 UTC (rev 122350)
+++ gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/configure.zcml	2011-07-26 08:46:56 UTC (rev 122351)
@@ -1,3 +1,11 @@
-<configure xmlns="http://namespaces.zope.org/zope">
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:browser="http://namespaces.zope.org/browser"
+    >
 
+  <browser:view
+      name="skin" type="zope.publisher.interfaces.xmlrpc.IXMLRPCRequest"
+      provides="zope.traversing.interfaces.ITraversable" for="*"
+      factory=".traverser.xmlrpc_skin"
+      />
 </configure>

Added: gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/interfaces.py
===================================================================
--- gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/interfaces.py	                        (rev 0)
+++ gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/interfaces.py	2011-07-26 08:46:56 UTC (rev 122351)
@@ -0,0 +1,20 @@
+#############################################################################
+#
+# Copyright (c) 2011 Zope Foundation 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.
+#
+##############################################################################
+
+import zope.interface
+import zope.publisher.interfaces
+
+
+class IXMLRPCSkinType(zope.publisher.interfaces.ISkinType):
+    """Skin for XML-RPC."""

Added: gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/meta.zcml
===================================================================
--- gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/meta.zcml	                        (rev 0)
+++ gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/meta.zcml	2011-07-26 08:46:56 UTC (rev 122351)
@@ -0,0 +1,11 @@
+<configure
+    xmlns:meta="http://namespaces.zope.org/meta"
+    xmlns="http://namespaces.zope.org/zope">
+
+  <meta:directive
+      namespace="http://namespaces.gocept.com/zcml"
+      name="xmlrpcview"
+      schema=".zcml.IXMLRPCViewDirective"
+      handler=".zcml.xmlrpc_view" />
+
+</configure>

Added: gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/traverser.py
===================================================================
--- gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/traverser.py	                        (rev 0)
+++ gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/traverser.py	2011-07-26 08:46:56 UTC (rev 122351)
@@ -0,0 +1,33 @@
+#############################################################################
+#
+# Copyright (c) 2011 Zope Foundation 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.
+#
+##############################################################################
+
+from gocept.xmlrpcskin.interfaces import IXMLRPCSkinType
+import zope.component.interfaces
+import zope.location.interfaces
+import zope.publisher.skinnable
+import zope.traversing.namespace
+
+
+class xmlrpc_skin(zope.traversing.namespace.view):
+    # copy&paste of zope.traversing.namespace.skin to use a different skin-type
+    # interface
+
+    def traverse(self, name, ignored):
+        self.request.shiftNameToApplication()
+        try:
+            skin = zope.component.getUtility(IXMLRPCSkinType, name)
+        except zope.component.interfaces.ComponentLookupError:
+            raise zope.location.interfaces.LocationError("++skin++%s" % name)
+        zope.publisher.skinnable.applySkin(self.request, skin)
+        return self.context

Added: gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/zcml.py
===================================================================
--- gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/zcml.py	                        (rev 0)
+++ gocept.xmlrpcskin/trunk/src/gocept/xmlrpcskin/zcml.py	2011-07-26 08:46:56 UTC (rev 122351)
@@ -0,0 +1,133 @@
+#############################################################################
+#
+# Copyright (c) 2011 Zope Foundation 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.
+#
+##############################################################################
+
+from zope.app.publisher.xmlrpc import MethodPublisher
+from zope.component.interface import provideInterface
+from zope.component.zcml import handler
+from zope.configuration.exceptions import ConfigurationError
+from zope.interface import Interface
+from zope.publisher.interfaces.xmlrpc import IXMLRPCRequest
+from zope.security.checker import CheckerPublic, Checker
+from zope.security.checker import getCheckerForInstancesOf
+import zope.app.publisher.xmlrpc.metadirectives
+import zope.configuration.fields
+
+
+class IXMLRPCViewDirective(
+    zope.app.publisher.xmlrpc.metadirectives.IViewDirective):
+
+    layer = zope.configuration.fields.GlobalInterface(
+        title=u"The layer the view is declared for",
+        description=u"The default layer for which the default view is "
+                    u"applicable. By default it is applied to all layers.",
+        required=False
+        )
+
+
+def xmlrpc_view(_context, for_=None, interface=None, methods=None,
+                class_=None, permission=None, name=None, layer=IXMLRPCRequest):
+    # copy&paste from zope.app.publisher.xmlrpc.metaconfigure.view
+    # to make layer a parameter instead of hardcoding it to IXMLRPCRequest
+
+    interface = interface or []
+    methods = methods or []
+
+    # If there were special permission settings provided, then use them
+    if permission == 'zope.Public':
+        permission = CheckerPublic
+
+    require = {}
+    for attr_name in methods:
+        require[attr_name] = permission
+
+    if interface:
+        for iface in interface:
+            for field_name in iface:
+                require[field_name] = permission
+            _context.action(
+                discriminator=None,
+                callable=provideInterface,
+                args=('', for_)
+                )
+
+    # Make sure that the class inherits MethodPublisher, so that the views
+    # have a location
+    if class_ is None:
+        class_ = original_class = MethodPublisher
+    else:
+        original_class = class_
+        class_ = type(class_.__name__, (class_, MethodPublisher), {})
+
+    if name:
+        # Register a single view
+
+        if permission:
+            checker = Checker(require)
+
+            def proxyView(context, request, class_=class_, checker=checker):
+                view = class_(context, request)
+                # We need this in case the resource gets unwrapped and
+                # needs to be rewrapped
+                view.__Security_checker__ = checker
+                return view
+
+            class_ = proxyView
+            class_.factory = original_class
+        else:
+            # No permission was defined, so we defer to the checker
+            # of the original class
+            def proxyView(context, request, class_=class_):
+                view = class_(context, request)
+                view.__Security_checker__ = getCheckerForInstancesOf(
+                    original_class)
+                return view
+            class_ = proxyView
+            class_.factory = original_class
+
+        # Register the new view.
+        _context.action(
+            discriminator=('view', for_, name, layer),
+            callable=handler,
+            args=('registerAdapter',
+                  class_, (for_, layer), Interface, name,
+                  _context.info)
+            )
+    else:
+        if permission:
+            checker = Checker({'__call__': permission})
+        else:
+            raise ConfigurationError(
+              "XML/RPC view has neither a name nor a permission. "
+              "You have to specify at least one of the two.")
+
+        for name in require:
+            # create a new callable class with a security checker;
+            cdict = {'__Security_checker__': checker,
+                     '__call__': getattr(class_, name)}
+            new_class = type(class_.__name__, (class_,), cdict)
+            _context.action(
+                discriminator=('view', for_, name, layer),
+                callable=handler,
+                args=('registerAdapter',
+                      new_class, (for_, layer), Interface, name,
+                      _context.info)
+                )
+
+    # Register the used interfaces with the site manager
+    if for_ is not None:
+        _context.action(
+            discriminator=None,
+            callable=provideInterface,
+            args=('', for_)
+            )



More information about the checkins mailing list