[Checkins] SVN: z3c.authentication/trunk/src/z3c/authentication/
Added cookie authentication with a own session implementation.
Roger Ineichen
roger at projekt01.ch
Thu Oct 19 21:34:06 EDT 2006
Log message for revision 70825:
Added cookie authentication with a own session implementation.
This allows us to setup the authentication cookie session
to a timeout of 0 (zero) without to affect other session data.
Changed:
A z3c.authentication/trunk/src/z3c/authentication/__init__.py
A z3c.authentication/trunk/src/z3c/authentication/cookie/
A z3c.authentication/trunk/src/z3c/authentication/cookie/BROWSER.txt
A z3c.authentication/trunk/src/z3c/authentication/cookie/README.txt
A z3c.authentication/trunk/src/z3c/authentication/cookie/SETUP.cfg
A z3c.authentication/trunk/src/z3c/authentication/cookie/TODO.txt
A z3c.authentication/trunk/src/z3c/authentication/cookie/__init__.py
A z3c.authentication/trunk/src/z3c/authentication/cookie/browser/
A z3c.authentication/trunk/src/z3c/authentication/cookie/browser/__init__.py
A z3c.authentication/trunk/src/z3c/authentication/cookie/browser/add.pt
A z3c.authentication/trunk/src/z3c/authentication/cookie/browser/browser.py
A z3c.authentication/trunk/src/z3c/authentication/cookie/browser/configure.zcml
A z3c.authentication/trunk/src/z3c/authentication/cookie/configurator.py
A z3c.authentication/trunk/src/z3c/authentication/cookie/configure.zcml
A z3c.authentication/trunk/src/z3c/authentication/cookie/ftesting.zcml
A z3c.authentication/trunk/src/z3c/authentication/cookie/ftests.py
A z3c.authentication/trunk/src/z3c/authentication/cookie/interfaces.py
A z3c.authentication/trunk/src/z3c/authentication/cookie/plugin.py
A z3c.authentication/trunk/src/z3c/authentication/cookie/session.py
A z3c.authentication/trunk/src/z3c/authentication/cookie/testing.py
A z3c.authentication/trunk/src/z3c/authentication/cookie/tests.py
A z3c.authentication/trunk/src/z3c/authentication/cookie/z3c.authentication.cookie-configure.zcml
A z3c.authentication/trunk/src/z3c/authentication/cookie/z3c.authentication.cookie-ftesting.zcml
-=-
Added: z3c.authentication/trunk/src/z3c/authentication/__init__.py
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/__init__.py 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/__init__.py 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,16 @@
+##############################################################################
+#
+# Copyright (c) 2006 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.
+#
+##############################################################################
+"""
+$Id$
+"""
Property changes on: z3c.authentication/trunk/src/z3c/authentication/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/BROWSER.txt
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/BROWSER.txt 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/BROWSER.txt 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,76 @@
+===========================
+Cookie session credential
+===========================
+
+See README.txt for more info.
+
+We show how to setup a custom site using a lifetime cookie session credential.
+Note that we use a custom ftesting setup which configures some test component
+which we can use here without to register them in the package by default.
+
+ >>> from zope.testbrowser.testing import Browser
+ >>> manager = Browser()
+ >>> manager.addHeader('Authorization', 'Basic mgr:mgrpw')
+
+ >>> manager.open('http://localhost/addZ3CAuthenticationCookieSiteStub.html')
+ >>> manager.getControl(name='form.__name__').value = 'site'
+ >>> manager.getControl('Add').click()
+ >>> manager.url
+ 'http://localhost'
+
+Now check the site configuration:
+
+ >>> siteURL = 'http://localhost/site/'
+ >>> manager.open(siteURL + '++etc++site/default/contents.html')
+
+ >>> from zope.traversing.api import traverse
+ >>> root = getRootFolder()
+ >>> default = traverse(root, 'site/++etc++site/default')
+
+Let's test the different utilities:
+
+ >>> tuple(default.keys())
+ (u'CookieClientIdManager', u'CookieCredentialSessionDataContainer',...
+ u'PluggableAuthentication')
+
+Check if the PAU contains a liftime cookie session credential:
+
+ >>> pau = default['PluggableAuthentication']
+ >>> credential = pau['Z3C Cookie Credentials']
+ >>> credential
+ <z3c.authentication.cookie.plugin.CookieCredentialsPlugin object at ...>
+
+And check if the PAU is correct configured for useing this plugin.
+
+ >>> pau.credentialsPlugins
+ (u'Z3C Cookie Credentials',)
+
+We also need to check if we got a own CookieClientIdManager which the
+liftime is set to o (zero) whichmeans it never will expire.
+
+ >>> ccim = default['CookieClientIdManager']
+ >>> ccim.cookieLifetime
+ 0
+
+The last part in the concept is the cookie session data container. This
+session storage has to provide a timeout of 0 (zero) which means it's item
+the persistent CookieCredentials will never expire.
+
+ >>> from zope.app.session.interfaces import ISessionDataContainer
+ >>> from z3c.authentication.cookie import interfaces
+ >>> sdc = default['CookieCredentialSessionDataContainer']
+ >>> sdc
+ <z3c.authentication.cookie.session.CookieCredentialSessionDataContainer ...>
+
+Check if this container available as utility.
+
+ >>> import zope.component
+ >>> ccsdc = zope.component.getUtility(ISessionDataContainer,
+ ... interfaces.SESSION_KEY, root['site'])
+ >>> ccsdc
+ <z3c.authentication.cookie.session.CookieCredentialSessionDataContainer ...>
+
+and supports a timeout of 0 (zero).
+
+ >>> ccsdc.timeout
+ 0
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/BROWSER.txt
___________________________________________________________________
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/README.txt
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/README.txt 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/README.txt 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,85 @@
+======
+README
+======
+
+The target of this package is to offer a cookie based auto login.
+
+This is what Zope3 can do by default with the session credential plugin. But
+there is a restriction if you use the default implementation for doing this.
+The Zope session credential plugin uses the same session data container for
+the session credential and all other session datas which means if you
+configure this for a longtimeframe all other session data get store this long.
+
+This package offers all components for separate the session credential data
+into a own session data container. This implementation offers also a
+configurator plugin which will configure a site wich a liftime session for you.
+
+Let's import our SiteStub first:
+
+ >>> from z3c.authentication.cookie.testing import ISiteStub
+ >>> from z3c.authentication.cookie.testing import SiteStub
+
+Note, the configurator are allready setup which will make a site and add
+the credential plugin. See z3c.authentication.cookie.testing for more info.
+
+Now add the site,
+
+ >>> import zope.event
+ >>> import zope.lifecycleevent
+ >>> siteStub = SiteStub()
+ >>> zope.event.notify(zope.lifecycleevent.ObjectCreatedEvent(siteStub))
+ >>> rootFolder['siteStub'] = siteStub
+ >>> siteStub = rootFolder['siteStub']
+
+invoke the configurator, normaly done in the site add form,
+
+ >>> from z3c.configurator import configurator
+ >>> configurator.configure(siteStub, {})
+
+and see what component we get added via the configurator plugin.
+
+ >>> import zope.component
+ >>> sm = zope.component.getSiteManager(siteStub)
+ >>> default = sm['default']
+ >>> tuple(default.keys())
+ (u'CookieClientIdManager', u'CookieCredentialSessionDataContainer',...
+ u'PluggableAuthentication')
+
+Check if the PAU contains a liftime cookie session credential:
+
+ >>> pau = default['PluggableAuthentication']
+ >>> credential = pau['Z3C Cookie Credentials']
+ >>> credential
+ <z3c.authentication.cookie.plugin.CookieCredentialsPlugin object at ...>
+
+And check if the PAU is correct configured for useing this plugin.
+
+ >>> pau.credentialsPlugins
+ (u'Z3C Cookie Credentials',)
+
+We also need to check if we got a own CookieClientIdManager which the
+liftime is set to o (zero) whichmeans it never will expire.
+
+ >>> ccim = default['CookieClientIdManager']
+ >>> ccim.cookieLifetime
+ 0
+
+The last part in the concept is the cookie session data container. This
+session storage has to provide a timeout of 0 (zero) which means it's item
+the persistent CookieCredentials will never expire.
+
+ >>> from z3c.authentication.cookie import interfaces
+ >>> sdc = default['CookieCredentialSessionDataContainer']
+ >>> sdc
+ <z3c.authentication.cookie.session.CookieCredentialSessionDataContainer ...>
+
+Check if this container s also available as utility.
+
+ >>> from zope.app.session.interfaces import ISessionDataContainer
+ >>> ccsdc = zope.component.getUtility(ISessionDataContainer,
+ ... name=interfaces.SESSION_KEY)
+ >>> ccsdc
+ <z3c.authentication.cookie.session.CookieCredentialSessionDataContainer ...>
+
+ >>> ccsdc.timeout
+ 0
\ No newline at end of file
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/README.txt
___________________________________________________________________
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/SETUP.cfg
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/SETUP.cfg 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/SETUP.cfg 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,3 @@
+<data-files zopeskel/etc/package-includes>
+ z3c.authentication.cookie-*.zcml
+</data-files>
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/SETUP.cfg
___________________________________________________________________
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/TODO.txt
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/TODO.txt 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/TODO.txt 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,15 @@
+====
+TODO
+====
+
+- rename the package to autologin or cookielogin
+
+- implement a IClientIdManager which will use the
+ CookieCredentialSessionDataContainer
+
+- Make sure the normal session will not get mixed with the long life
+ credential session.
+
+- add a configurator which knows how to setup all components.
+
+- Add more tests
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/TODO.txt
___________________________________________________________________
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/__init__.py
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/__init__.py 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/__init__.py 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,17 @@
+##############################################################################
+#
+# Copyright (c) 2006 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.
+#
+##############################################################################
+"""
+$Id$
+"""
+
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/browser/__init__.py
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/browser/__init__.py 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/browser/__init__.py 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,17 @@
+##############################################################################
+#
+# Copyright (c) 2006 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.
+#
+##############################################################################
+"""
+$Id$
+"""
+
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/browser/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/browser/add.pt
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/browser/add.pt 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/browser/add.pt 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,31 @@
+<html metal:use-macro="context/@@standard_macros/page">
+<body>
+<div metal:fill-slot="body">
+ <div class="form-status"
+ tal:define="status view/status"
+ tal:condition="status">
+ <div class="summary"
+ i18n:translate=""
+ tal:content="view/status">
+ Form status summary
+ </div>
+ <ul class="errors" tal:condition="view/errors">
+ <li tal:repeat="error view/error_views"> <span tal:replace="structure error">Error
+ Type</span></li>
+ </ul>
+ </div>
+ <form class="edit-form" action="." enctype="multipart/form-data" metal:define-macro="master"
+ tal:attributes="action request/URL" method="post">
+ <tal:block define="widget nocall:view/widgets/__name__">
+ <div metal:use-macro="context/@@form_macros/widget_row" />
+ </tal:block>
+ <div id="actionsView">
+ <span class="actionButtons">
+ <input tal:repeat="action view/actions"
+ tal:replace="structure action/render" />
+ </span>
+ </div>
+ </form>
+</div>
+</body>
+</html>
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/browser/add.pt
___________________________________________________________________
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/browser/browser.py
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/browser/browser.py 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/browser/browser.py 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,51 @@
+##############################################################################
+#
+# Copyright (c) 2006 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.
+#
+##############################################################################
+"""
+$Id$
+"""
+__docformat__ = "reStructuredText"
+
+import zope.component
+from zope.formlib import form
+from zope.app.pagetemplate import ViewPageTemplateFile
+from zope.app.session.interfaces import ISessionDataContainer
+from z3c.i18n import MessageFactory as _
+from z3c.authentication.cookie import interfaces
+from z3c.authentication.cookie import session
+
+
+class CookieCredentialSessionDataContainerAddForm(form.AddForm):
+ """CookieCredentialSessionDataContainer add form choosing the right
+ session data container name."""
+
+ label = _('Add Cookie Credential Data Container')
+ template = ViewPageTemplateFile('add.pt')
+
+ form_fields = form.Fields(
+ zope.schema.TextLine(__name__='__name__', title=_(u"Object Name"),
+ required=True, default=unicode(interfaces.SESSION_KEY)))
+
+ def create(self, data):
+ return session.CookieCredentialSessionDataContainer()
+
+ def add(self, obj):
+ name = self.request.get('__name__', None) or interfaces.SESSION_KEY
+ self.context.contentName = name
+ self.context.add(obj)
+ sm = zope.component.getSiteManager(self.context)
+ sm.registerUtility(obj, ISessionDataContainer,
+ name=interfaces.SESSION_KEY)
+ self._finished_add = True
+ return obj
+
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/browser/browser.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/browser/configure.zcml
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/browser/configure.zcml 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/browser/configure.zcml 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,37 @@
+<configure
+ xmlns="http://namespaces.zope.org/browser"
+ i18n_domain="z3c">
+
+ <!-- Cookie credential session data container -->
+ <addMenuItem
+ class="..session.CookieCredentialSessionDataContainer"
+ title="Z3C Cookie Credential Data Container"
+ description="A Cookie Credential Data Container
+ (z3c.authentication.cookie)"
+ permission="zope.ManageServices"
+ view="addCookieCredentialSessionDataContainer.html"
+ />
+
+ <page
+ name="addCookieCredentialSessionDataContainer.html"
+ for="zope.app.container.interfaces.IAdding"
+ class=".browser.CookieCredentialSessionDataContainerAddForm"
+ permission="zope.ManageServices"
+ />
+
+ <!-- PAU Plugin -->
+ <addMenuItem
+ title="Cookie Credentials Plugin"
+ class="..plugin.CookieCredentialsPlugin"
+ permission="zope.ManageServices"
+ />
+
+ <editform
+ schema="..interfaces.ICookieCredentialsPlugin"
+ label="Browser Form Challenger"
+ name="edit.html"
+ permission="zope.ManageServices"
+ menu="zmi_views" title="Edit"
+ />
+
+</configure>
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/browser/configure.zcml
___________________________________________________________________
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/configurator.py
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/configurator.py 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/configurator.py 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,89 @@
+##############################################################################
+#
+# Copyright (c) 2006 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.
+#
+##############################################################################
+"""
+$Id$
+"""
+__docformat__ = "reStructuredText"
+
+import zope.component
+import zope.interface
+from zope.app.component.site import LocalSiteManager
+from z3c import configurator
+from zope.app.component import hooks
+from zope.app.component.interfaces import ISite
+import zope.event
+from zope.lifecycleevent import ObjectCreatedEvent
+from zope.app.authentication.interfaces import IPluggableAuthentication
+from zope.app.authentication.authentication import PluggableAuthentication
+from zope.app.authentication.interfaces import IAuthenticatorPlugin
+from zope.app.security.interfaces import IAuthentication
+from zope.app.session.interfaces import ISessionDataContainer
+from zope.app.session.interfaces import IClientIdManager
+from zope.app.session.http import CookieClientIdManager
+
+from z3c.authentication.cookie import interfaces
+from z3c.authentication.cookie.plugin import CookieCredentialsPlugin
+from z3c.authentication.cookie.session import \
+ CookieCredentialSessionDataContainer
+
+
+class SetUpCookieCredentialsPlugin(configurator.ConfigurationPluginBase):
+ """Configurator adding a lifetime cookie session plugin."""
+
+ def __call__(self, data):
+ # first, make a site if no allready done
+ if not ISite.providedBy(self.context):
+ sm = LocalSiteManager(self.context)
+ self.context.setSiteManager(sm)
+ hooks.setSite(self.context)
+ sm = zope.component.getSiteManager(self.context)
+
+ # Add a liftime cookie credential to the PAU
+ site = self.context
+ sm = site.getSiteManager()
+ default = sm['default']
+
+ # add a PAU if not existent
+ pau = None
+ for item in default.values():
+ if IPluggableAuthentication.providedBy(item):
+ pau = item
+ if pau is None:
+ pau = PluggableAuthentication()
+ zope.event.notify(ObjectCreatedEvent(pau))
+ default['PluggableAuthentication'] = pau
+ sm.registerUtility(pau, IAuthentication)
+
+ # setup credentials plugin
+ cred = CookieCredentialsPlugin()
+ zope.event.notify(zope.lifecycleevent.ObjectCreatedEvent(cred))
+ pau[u'Z3C Cookie Credentials'] = cred
+ pau.credentialsPlugins += (u'Z3C Cookie Credentials',)
+
+ # setup cookie session data container
+ ccsdc = CookieCredentialSessionDataContainer()
+ # Expiry time of 0 means never (well - close enough)
+ ccsdc.timeout = 0
+ zope.event.notify(zope.lifecycleevent.ObjectCreatedEvent(ccsdc))
+ default['CookieCredentialSessionDataContainer'] = ccsdc
+ sm.registerUtility(ccsdc, ISessionDataContainer,
+ interfaces.SESSION_KEY)
+
+ # setup cookie client id manager
+ ccim = CookieClientIdManager()
+ # Expiry time of 0 means never (well - close enough)
+ ccim.cookieLifetime = 0
+ zope.event.notify(zope.lifecycleevent.ObjectCreatedEvent(ccim))
+ default['CookieClientIdManager'] = ccim
+ sm.registerUtility(ccim, IClientIdManager)
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/configurator.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/configure.zcml
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/configure.zcml 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/configure.zcml 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,43 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ i18n_domain="z3c">
+
+ <class class=".session.CookieCredentialSessionDataContainer">
+ <require
+ interface="zope.app.session.interfaces.ISessionDataContainer"
+ permission="zope.Public" />
+ <require
+ set_schema="zope.app.session.interfaces.ISessionDataContainer"
+ permission="zope.ManageServices" />
+ <require
+ interface="zope.location.ILocation"
+ permission="zope.Public" />
+ <require
+ set_schema="zope.location.ILocation"
+ permission="zope.ManageServices" />
+ </class>
+
+ <utility
+ name="Cookie Credentials"
+ provides="zope.app.authentication.interfaces.ICredentialsPlugin"
+ factory=".plugin.CookieCredentialsPlugin"
+ />
+
+ <class class=".plugin.CookieCredentialsPlugin">
+
+ <implements
+ interface="zope.annotation.interfaces.IAttributeAnnotatable"
+ />
+ <require
+ permission="zope.ManageServices"
+ interface="zope.app.authentication.session.IBrowserFormChallenger"
+ />
+ <require
+ permission="zope.ManageServices"
+ set_schema="zope.app.authentication.session.IBrowserFormChallenger"
+ />
+ </class>
+
+ <include package=".browser" />
+
+</configure>
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/configure.zcml
___________________________________________________________________
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/ftesting.zcml
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/ftesting.zcml 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/ftesting.zcml 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,37 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ xmlns:browser="http://namespaces.zope.org/browser"
+ i18n_domain="z3c">
+
+ <class class=".testing.SiteStub">
+ <allow
+ attributes="getSiteManager"
+ />
+ <require
+ permission="zope.ManageServices"
+ attributes="setSiteManager"
+ />
+ <require
+ permission="zope.View"
+ interface="zope.app.container.interfaces.IReadContainer"
+ />
+ <require
+ permission="zope.ManageContent"
+ interface="zope.app.container.interfaces.IWriteContainer"
+ />
+ </class>
+
+ <!-- can configure a site for lifetime cookie support -->
+ <adapter
+ factory=".configurator.SetUpCookieCredentialsPlugin"
+ for=".testing.ISiteStub"
+ name="SetUpCookieCredentialsPlugin" />
+
+ <browser:page
+ name="addZ3CAuthenticationCookieSiteStub.html"
+ for="zope.app.folder.interfaces.IFolder"
+ class=".testing.SiteStubAddForm"
+ permission="zope.ManageSite"
+ />
+
+</configure>
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/ftesting.zcml
___________________________________________________________________
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/ftests.py
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/ftests.py 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/ftests.py 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,23 @@
+###############################################################################
+#
+# Copyright 2006 by refline (Schweiz) AG, CH-5630 Muri
+#
+###############################################################################
+"""
+$Id$
+"""
+
+import unittest
+
+from z3c.authentication.cookie import testing
+
+
+def test_suite():
+ suite = unittest.TestSuite((
+ testing.FunctionalDocFileSuite('BROWSER.txt'),
+ ))
+
+ return suite
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='test_suite')
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/ftests.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/interfaces.py
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/interfaces.py 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/interfaces.py 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,62 @@
+##############################################################################
+#
+# Copyright (c) 2006 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.
+#
+##############################################################################
+"""
+$Id$
+"""
+__docformat__ = "reStructuredText"
+
+import zope.interface
+import zope.schema
+from zope.app.session.interfaces import ISessionDataContainer
+from zope.app.authentication import interfaces
+from zope.app.authentication import session
+from z3c.i18n import MessageFactory as _
+
+SESSION_KEY = 'z3c.authentication.cookie.ICookieCredentialSessionDataContainer'
+
+
+class ICookieCredentialSessionDataContainer(ISessionDataContainer):
+ """A persistent cookie credential container."""
+
+ timeout = zope.schema.Int(
+ title=_(u"Timeout"),
+ description=_(
+ "Number of seconds before session data becomes stale and may "
+ "be removed. A value of '0' means no expiration."),
+ default=0,
+ required=True,
+ min=0,
+ )
+
+
+class ICookieCredentialsPlugin(interfaces.ICredentialsPlugin,
+ session.IBrowserFormChallenger):
+ """A cookie credential plugin."""
+
+
+class ICookieCredentials(zope.interface.Interface):
+ """ Interface for storing and accessing credentials in a session.
+
+ We use a real class with interface here to prevent unauthorized
+ access to the credentials.
+ """
+
+ def __init__(login, password):
+ pass
+
+ def getLogin():
+ """Return login name."""
+
+ def getPassword():
+ """Return password."""
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/interfaces.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/plugin.py
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/plugin.py 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/plugin.py 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,175 @@
+##############################################################################
+#
+# Copyright (c) 2006 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.
+#
+##############################################################################
+"""
+$Id$
+"""
+
+import transaction
+import persistent
+import zope.interface
+from urllib import urlencode
+
+from zope.publisher.interfaces.http import IHTTPRequest
+from zope.traversing.browser.absoluteurl import absoluteURL
+
+from zope.app.component import hooks
+from zope.app.container.contained import Contained
+from zope.app.session.interfaces import ISession
+from zope.app.authentication.session import SessionCredentialsPlugin
+from z3c.authentication.cookie import interfaces
+
+
+# TODO; rename to CookieSessionCredential
+class CookieCredentials(persistent.Persistent, Contained):
+ """Credentials class for use with sessions.
+
+ A session credential is created with a login and a password:
+
+ >>> cred = CookieCredentials('scott', 'tiger')
+
+ Logins are read using getLogin:
+ >>> cred.getLogin()
+ 'scott'
+
+ and passwords with getPassword:
+
+ >>> cred.getPassword()
+ 'tiger'
+
+ """
+ zope.interface.implements(interfaces.ICookieCredentials)
+
+ def __init__(self, login, password):
+ self.login = login
+ self.password = password
+
+ def getLogin(self): return self.login
+
+ def getPassword(self): return self.password
+
+ def __str__(self): return self.getLogin() + ':' + self.getPassword()
+
+
+class CookieCredentialsPlugin(SessionCredentialsPlugin):
+ """A credentials plugin that uses Zope sessions to get/store credentials.
+
+ To illustrate how a session plugin works, we'll first setup some session
+ machinery:
+
+ >>> from zope.publisher.tests.httprequest import TestRequest
+ >>> from z3c.authentication.cookie import testing
+ >>> testing.sessionSetUp()
+
+ This lets us retrieve the same session info from any test request, which
+ simulates what happens when a user submits a session ID as a cookie.
+
+ We also need a session plugin:
+
+ >>> plugin = CookieCredentialsPlugin()
+
+ A session plugin uses an ISession component to store the last set of
+ credentials it gets from a request. Credentials can be retrieved from
+ subsequent requests using the session-stored credentials.
+
+ Our test environment is initially configured without credentials:
+
+ >>> request = TestRequest()
+ >>> print plugin.extractCredentials(request)
+ None
+
+ We must explicitly provide credentials once so the plugin can store
+ them in a session:
+
+ >>> request = TestRequest(login='scott', password='tiger')
+ >>> plugin.extractCredentials(request)
+ {'login': 'scott', 'password': 'tiger'}
+
+ Subsequent requests now have access to the credentials even if they're
+ not explicitly in the request:
+
+ >>> plugin.extractCredentials(TestRequest())
+ {'login': 'scott', 'password': 'tiger'}
+
+ We can always provide new credentials explicitly in the request:
+
+ >>> plugin.extractCredentials(TestRequest(
+ ... login='harry', password='hirsch'))
+ {'login': 'harry', 'password': 'hirsch'}
+
+ and these will be used on subsequent requests:
+
+ >>> plugin.extractCredentials(TestRequest())
+ {'login': 'harry', 'password': 'hirsch'}
+
+ We can also change the fields from which the credentials are extracted:
+
+ >>> plugin.loginfield = "my_new_login_field"
+ >>> plugin.passwordfield = "my_new_password_field"
+
+ Now we build a request that uses the new fields:
+
+ >>> request = TestRequest(my_new_login_field='luke', my_new_password_field='the_force')
+
+ The plugin now extracts the credentials information from these new fields:
+
+ >>> plugin.extractCredentials(request)
+ {'login': 'luke', 'password': 'the_force'}
+
+ Finally, we clear the session credentials using the logout method:
+
+ >>> plugin.logout(TestRequest())
+ True
+ >>> print plugin.extractCredentials(TestRequest())
+ None
+
+ """
+ zope.interface.implements(interfaces.ICookieCredentialsPlugin)
+
+ loginpagename = 'loginForm.html'
+ loginfield = 'login'
+ passwordfield = 'password'
+
+ def extractCredentials(self, request):
+ """Extracts credentials from a session if they exist."""
+ if not IHTTPRequest.providedBy(request):
+ return None
+ session = ISession(request, None)
+ sessionData = session.get(interfaces.SESSION_KEY)
+ login = request.get(self.loginfield, None)
+ password = request.get(self.passwordfield, None)
+ credentials = None
+
+ if login and password:
+ credentials = CookieCredentials(login, password)
+ elif not sessionData:
+ return None
+ sessionData = session[interfaces.SESSION_KEY]
+ if credentials:
+ sessionData['credentials'] = credentials
+ else:
+ credentials = sessionData.get('credentials', None)
+ if not credentials:
+ return None
+ return {'login': credentials.getLogin(),
+ 'password': credentials.getPassword()}
+
+ def logout(self, request):
+ """Performs logout by clearing session data credentials."""
+ if not IHTTPRequest.providedBy(request):
+ return False
+
+ sessionData = ISession(request)[interfaces.SESSION_KEY]
+ sessionData['credentials'] = None
+ transaction.commit()
+ return True
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/plugin.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/session.py
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/session.py 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/session.py 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,31 @@
+##############################################################################
+#
+# Copyright (c) 2006 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.
+#
+##############################################################################
+"""
+$Id$
+"""
+
+import zope.interface
+from zope.app.session.session import PersistentSessionDataContainer
+from z3c.authentication.cookie import interfaces
+
+
+class CookieCredentialSessionDataContainer(PersistentSessionDataContainer):
+ """A persistent cookie credential container."""
+
+ zope.interface.implements(
+ interfaces.ICookieCredentialSessionDataContainer)
+
+ def __init__(self):
+ super(CookieCredentialSessionDataContainer, self).__init__()
+ self.timeout = 1 * 60 * 60 * 24 * 365
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/session.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/testing.py
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/testing.py 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/testing.py 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,168 @@
+##############################################################################
+#
+# Copyright (c) 2006 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.
+#
+##############################################################################
+"""
+$Id$
+"""
+__docformat__ = "reStructuredText"
+
+import unittest
+import zope.interface
+import zope.schema
+
+from zope.testing import doctest
+from zope.interface import implements
+from zope.component import provideUtility, provideAdapter
+from zope.publisher.interfaces import IRequest
+from zope.testing import doctestunit
+
+from zope.app.component import hooks
+from zope.app.component.interfaces import ISite
+from zope.app.testing import functional
+from zope.app.testing import setup
+from zope.app.testing import placelesssetup
+from zope.app.testing import ztapi
+from zope.app.session.interfaces import IClientId
+from zope.app.session.interfaces import IClientIdManager
+from zope.app.session.interfaces import ISession
+from zope.app.session.interfaces import ISessionDataContainer
+from zope.app.session.session import ClientId
+from zope.app.session.session import Session
+from zope.app.session.session import PersistentSessionDataContainer
+from zope.app.session.http import CookieClientIdManager
+
+from z3c.configurator import configurator
+from z3c.authentication.cookie import interfaces
+from z3c.authentication.cookie.session import \
+ CookieCredentialSessionDataContainer
+
+
+###############################################################################
+#
+# Test Component
+#
+###############################################################################
+from zope.app.folder.folder import Folder
+from z3c.authentication.cookie.configurator import SetUpCookieCredentialsPlugin
+
+class ISiteStub(zope.interface.Interface):
+ """Configurator marker interface."""
+
+
+class SiteStub(Folder):
+ """A new site providing IMySite."""
+ zope.interface.implements(ISiteStub)
+
+class MakeSiteDuringMySiteAdding(configurator.ConfigurationPluginBase):
+ """Configurator which does make a site from a folder."""
+ zope.component.adapts(ISiteStub)
+
+ def __call__(self, data):
+ if not ISite.providedBy(self.context):
+ sm = LocalSiteManager(self.context)
+ self.context.setSiteManager(sm)
+ hooks.setSite(self.context)
+ sm = zope.component.getSiteManager(self.context)
+
+
+class SiteStubPlugin(SetUpCookieCredentialsPlugin):
+ zope.component.adapts(ISiteStub)
+
+
+# add form for SiteStub (ftesting)
+from zope.formlib import form
+
+class SiteStubAddForm(form.AddForm):
+ """Recruiter Site Add Form, only available for zope.Manager."""
+ form_fields = form.Fields(
+ zope.schema.TextLine(__name__='__name__', title=u'Name'),)
+
+ def createAndAdd(self, data):
+ # get form data
+ name = data.get('__name__', u'')
+
+ # Add the site
+ obj = SiteStub()
+ self.context[name] = obj
+
+ # Configure the new site
+ configurator.configure(obj, data)
+
+ self._finished_add = True
+ return obj
+
+ def nextURL(self):
+ return self.request.URL[-1]
+
+
+###############################################################################
+#
+# testing helper
+#
+###############################################################################
+
+def getRootFolder():
+ return functional.FunctionalTestSetup().getRootFolder()
+
+
+class TestClientId(object):
+ implements(IClientId)
+ def __new__(cls, request):
+ return 'dummyclientidfortesting'
+
+
+###############################################################################
+#
+# placefulSetUp
+#
+###############################################################################
+
+def siteSetUp(test):
+ site = setup.placefulSetUp(site=True)
+ test.globs['rootFolder'] = site
+ zope.component.provideAdapter(MakeSiteDuringMySiteAdding, name='make site')
+ zope.component.provideAdapter(SiteStubPlugin, name='setup ')
+
+
+def siteTearDown(test):
+ setup.placefulTearDown()
+
+
+def sessionSetUp():
+ placelesssetup.setUp()
+ ztapi.provideAdapter(IRequest, IClientId, TestClientId)
+ ztapi.provideAdapter(IRequest, ISession, Session)
+ ztapi.provideUtility(IClientIdManager, CookieClientIdManager())
+ defaultSDC = PersistentSessionDataContainer()
+ ztapi.provideUtility(ISessionDataContainer, defaultSDC, '')
+ cookieSDC = CookieCredentialSessionDataContainer()
+ ztapi.provideUtility(ISessionDataContainer, cookieSDC, interfaces.SESSION_KEY)
+
+
+def FunctionalDocFileSuite(path, **kw):
+ """Including relative path setup."""
+ globs = {'getRootFolder': getRootFolder}
+ if 'globs' in kw:
+ globs.update(kw['globs'])
+ del kw['globs']
+
+ if 'package' not in kw:
+ kw['package'] = doctest._normalize_module(kw.get('package', None))
+ kw['module_relative'] = kw.get('module_relative', True)
+
+ suite = functional.FunctionalDocFileSuite(
+ path,
+ optionflags=doctest.ELLIPSIS | doctest.NORMALIZE_WHITESPACE,
+ globs=globs,
+ **kw)
+ return suite
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/testing.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/tests.py
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/tests.py 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/tests.py 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1,38 @@
+##############################################################################
+#
+# Copyright (c) 2006 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.
+#
+##############################################################################
+"""
+$Id$
+"""
+__docformat__ = "reStructuredText"
+
+import unittest
+
+from zope.testing import doctest
+from zope.testing import doctestunit
+
+from z3c.authentication.cookie import testing
+
+
+def test_suite():
+ return unittest.TestSuite((
+ doctest.DocTestSuite('z3c.authentication.cookie.plugin',
+ setUp=testing.siteSetUp, tearDown=testing.siteTearDown),
+ doctestunit.DocFileSuite('README.txt',
+ setUp=testing.siteSetUp, tearDown=testing.siteTearDown,
+ optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
+ ),
+ ))
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='test_suite')
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/tests.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/z3c.authentication.cookie-configure.zcml
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/z3c.authentication.cookie-configure.zcml 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/z3c.authentication.cookie-configure.zcml 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1 @@
+<include package="z3c.authentication.cookie"/>
\ No newline at end of file
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/z3c.authentication.cookie-configure.zcml
___________________________________________________________________
Name: svn:eol-style
+ native
Added: z3c.authentication/trunk/src/z3c/authentication/cookie/z3c.authentication.cookie-ftesting.zcml
===================================================================
--- z3c.authentication/trunk/src/z3c/authentication/cookie/z3c.authentication.cookie-ftesting.zcml 2006-10-20 01:30:18 UTC (rev 70824)
+++ z3c.authentication/trunk/src/z3c/authentication/cookie/z3c.authentication.cookie-ftesting.zcml 2006-10-20 01:34:05 UTC (rev 70825)
@@ -0,0 +1 @@
+<include package="z3c.authentication.cookie" file="ftesting.zcml" />
\ No newline at end of file
Property changes on: z3c.authentication/trunk/src/z3c/authentication/cookie/z3c.authentication.cookie-ftesting.zcml
___________________________________________________________________
Name: svn:eol-style
+ native
More information about the Checkins
mailing list