[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