[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