zope.security.testing — zope.security 4.0dev documentation

### Navigation

- index
- modules |
- zope.security 4.0dev documentation »
- Module code »

# Source code for zope.security.testing

    ##############################################################################
    #
    # Copyright (c) 2004-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.
    #
    ##############################################################################
    """Testing support code

    This module provides some helper/stub objects for setting up interactions.
    """

    from zope import interface, component
    from zope.security import interfaces
    from zope.security.permission import Permission
    import contextlib
    import zope.security.management

    @interface.implementer(interfaces.IPrincipal)
    class Principal:

        def __init__(self, id, title=None, description='', groups=None):
            self.id = id
            self.title = title or id
            self.description = description
            if groups is not None:
                self.groups = groups
                interface.directlyProvides(self, interfaces.IGroupAwarePrincipal)

    @interface.implementer(interfaces.IParticipation)
    class Participation:

        def __init__(self, principal):
            self.principal = principal
            self.interaction = None

    def addCheckerPublic():
        """Add the CheckerPublic permission as 'zope.Public'"""

        perm = Permission('zope.Public', 'Public',
                """Special permission used for resources that are always public

                The public permission is effectively an optimization, sine
                it allows security computation to be bypassed.
                """
                )
        gsm = component.getGlobalSiteManager()
        gsm.registerUtility(perm, interfaces.IPermission, perm.id)

    def create_interaction(principal_id, **kw):
        principal = Principal(principal_id, **kw)
        participation = Participation(principal)
        zope.security.management.newInteraction(participation)
        return principal

    @contextlib.contextmanager
    def interaction(principal_id, **kw):
        if zope.security.management.queryInteraction():
            # There already is an interaction. Great. Leave it alone.
            yield
        else:
            principal = create_interaction(principal_id, **kw)
            try:
                yield principal
            finally:
                zope.security.management.endInteraction()

### Navigation

- index
- modules |
- zope.security 4.0dev documentation »
- Module code »