[Zope-Checkins] CVS: Zope3/lib/python/Zope/App/ContentDirective - ContentDirective.py:1.1.4.1 __init__.py:1.1.4.1 content-meta.zcml:1.1.4.1
Jim Fulton
jim@zope.com
Fri, 7 Jun 2002 10:40:58 -0400
Update of /cvs-repository/Zope3/lib/python/Zope/App/ContentDirective
In directory cvs.zope.org:/tmp/cvs-serv12187/lib/python/Zope/App/ContentDirective
Added Files:
Tag: Zope-3x-branch
ContentDirective.py __init__.py content-meta.zcml
Log Message:
Merging in Zope3InWonderland-branch, which implemented the following
proposals (see
http://dev.zope.org/Wikis/DevSite/Projects/ComponentArchitecture/OldProposals):
- RenameAllowToRequire
- GroupClassRelatedDirectivesInClassDirective
- ViewInterfaceAndSimplification
- ConsistentUseOfSpacesAsDelimitersInZCMLAttributes
- TwoArgumentViewConstructors
- ImplementsInZCML
- SimpleViewCreationInZCML
- RemoveGetView
- ReplaceProtectWithAllow
- ViewMethodsAsViews
- MergeProtectionAndComponentDefinitions
There were also various security fixes resulting of better integration
of security with components.
=== Added File Zope3/lib/python/Zope/App/ContentDirective/ContentDirective.py ===
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (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.
#
##############################################################################
""" Register class directive.
$Id: ContentDirective.py,v 1.1.4.1 2002/06/07 14:40:57 jim Exp $
"""
from Zope.Configuration.ConfigurationDirectiveInterfaces \
import INonEmptyDirective
from Zope.Configuration.Action import Action
import Interface
from Zope.App.Security.protectClass \
import protectLikeUnto, protectName, checkPermission
from Zope.App.ZMI.IGenericCreatorMarker import IGenericCreatorMarker
from Zope.App.ZMI.metaConfigure import provideClass
PublicPermission = 'Zope.Public'
class ProtectionDeclarationException(Exception):
"""Security-protection-specific exceptions."""
pass
class ContentDirective:
__implements__ = INonEmptyDirective
def __init__(self, _context, class_):
self.__id = class_
self.__class = _context.resolve(class_)
# not used yet
#self.__name = class_
#self.__normalized_name = _context.getNormalizedName(class_)
self.__context = _context
def implements(self, _context, interface):
resolved_interface = _context.resolve(interface)
return [
Action(
discriminator = ('ContentDirective', self.__class, object()),
callable = Interface.Implements.implements,
# the last argument is check=1, which causes implements
# to verify that the class does implement the interface
args = (self.__class, resolved_interface, 1),
)
]
def require(self, _context,
permission, attributes=None, interface=None):
"""Require a the permission to access a specific aspect"""
r = []
if not (interface or attributes):
# XXX: perhaps raise an error here, as no interface or attributes
# were given
return r
if interface:
self.__protectByInterface(interface, permission, r)
if attributes:
self.__protectNames(attributes, permission, r)
return r
def mimic(self, _context, class_):
"""Base security requirements on those of the given class"""
class_to_mimic = _context.resolve(class_)
return [
Action(discriminator=('security:mimic', self.__class, object()),
callable=protectLikeUnto,
args=(self.__class, class_to_mimic),
)
]
def allow(self, _context, attributes=None, interface=None):
"""Like require, but with permission_id Zope.Public"""
return self.require(_context, PublicPermission, attributes, interface)
def factory(self, _context, permission, title, id=None, description='',
for_container='', creation_markers=''):
"""Register a zmi factory for this class"""
if for_container:
for_container = tuple([_context.resolve(cls)
for cls in for_container.split()])
else:
for_container = None
if creation_markers:
creation_markers = tuple([_context.resolve(name)
for name in creation_markers.split()])
else:
creation_markers = (IGenericCreatorMarker,)
id = id or self.__id
# note factories are all in one pile, services and content,
# so addable names must also act as if they were all in the
# same namespace, despite the service/content division
return [
Action(
discriminator = ('AddableFactory', id),
callable = provideClass,
args = ('AddableContent', id, self.__class,
permission, title, description, for_container,
creation_markers)
)
]
def __protectByInterface(self, interface, permission_id, r):
"Set a permission on names in an interface."
interface = self.__context.resolve(interface)
for n, d in interface.namesAndDescriptions(1):
self.__protectName(n, permission_id, r)
def __protectName(self, name, permission_id, r):
"Set a permission on a particular name."
r.append((
('security:protectName', self.__class, name),
protectName, (self.__class, name, permission_id)))
def __protectNames(self, names, permission_id, r):
"Set a permission on a bunch of names."
for name in names.split():
self.__protectName(name.strip(), permission_id, r)
def __call__(self):
"Handle empty/simple declaration."
return ()
=== Added File Zope3/lib/python/Zope/App/ContentDirective/__init__.py ===
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (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.
#
##############################################################################
"""
'class' configuration directive.
"""
=== Added File Zope3/lib/python/Zope/App/ContentDirective/content-meta.zcml ===
<zopeConfigure xmlns='http://namespaces.zope.org/zope'>
<!-- Zope.App.ContentDirective -->
<directives namespace="http://namespaces.zope.org/zope">
<directive name="content"
attributes="class"
handler="Zope.App.ContentDirective." >
<subdirective name="implements"
attributes="interface" />
<subdirective namespace="http://namespaces.zope.org/security"
name="require"
attributes="permission attributes interface" />
<subdirective namespace="http://namespaces.zope.org/security"
name="allow"
attributes="attributes interface" />
<subdirective namespace="http://namespaces.zope.org/security"
name="mimic"
attributes="class" />
<subdirective namespace="http://namespaces.zope.org/zmi"
name="factory"
attributes="id permission title description
creation_markers" />
</directive>
</directives>
</zopeConfigure>