==================
Credentials Plugin
==================

When using principal dependend cache entries a user specific cache key must be
created. This is done by using the session id created by the client id
manager. The default client id manager creates an id based on the browser
session. If a user is logging in as different users within the same browser
session the wrong cache entries are used.

The CredentialsPlugIn provided here creates a new session id every time a user
logges in.

  >>> from lovely.responsecache.credentials import CredentialsPlugIn

  >>> plugin = CredentialsPlugIn()

  >>> from zope.publisher.browser import TestRequest
  >>> request = TestRequest()

  >>> from zope import interface
  >>> from zope import component
  >>> from zope.app.session.interfaces import ISession
  >>> from zope.publisher.interfaces.browser import IDefaultBrowserLayer

  >>> class FakeSession(dict):
  ...     interface.implements(ISession)
  ...     component.adapts(IDefaultBrowserLayer)
  ...     def __getitem__(self, name):
  ...          if not name in self:
  ...              self[name] = {}
  ...          return dict.__getitem__(self, name)

  >>> session = FakeSession()
  >>> def getSession(context):
  ...     return session
  >>> component.provideAdapter(getSession, (IDefaultBrowserLayer,), ISession)
  >>> session
  {}

  >>> class FakeClientIdManager(object):
  ...     clientIdCount = 0
  ...     clientId = 0
  ...     def generateUniqueId(self):
  ...          self.clientIdCount += 1 
  ...          return self.clientIdCount
  ...     def setRequestId(self, request, id):
  ...          self.clientId = id
  >>> from zope.app.session.interfaces import IClientIdManager
  >>> idManager = FakeClientIdManager()
  >>> component.provideUtility(idManager, IClientIdManager)

We provide no credentials.

  >>> plugin.extractCredentials(request)
  >>> session
  {}

Now we provide a login.

  >>> request.form[CredentialsPlugIn.loginfield] = 'jukart'
  >>> request.form[CredentialsPlugIn.passwordfield] = 'holla'

  >>> plugin.extractCredentials(request)
  {'login': 'jukart', 'password': 'holla'}
  >>> idManager.clientId
  1
  >>> plugin.extractCredentials(request)
  {'login': 'jukart', 'password': 'holla'}
  >>> idManager.clientId
  1
  >>> session['zope.app.authentication.browserplugins']['credentials'].getLogin()
  'jukart'

We login as a different user.

  >>> request.form[CredentialsPlugIn.loginfield] = 'dobee'
  >>> request.form[CredentialsPlugIn.passwordfield] = 'hoschi'
  >>> plugin.extractCredentials(request)
  {'login': 'dobee', 'password': 'hoschi'}

A new client id was requested.

  >>> idManager.clientId
  2
  >>> session['zope.app.authentication.browserplugins']['credentials'].getLogin()
  'dobee'

