[Repoze-checkins] r742 - in repoze.pam/trunk/repoze/pam: . plugins
Chris McDonough
chrism at agendaless.com
Tue Feb 26 05:07:54 UTC 2008
Author: Chris McDonough <chrism at agendaless.com>
Date: Tue Feb 26 00:07:54 2008
New Revision: 742
Log:
Finish plugin tests.
Modified:
repoze.pam/trunk/repoze/pam/plugins/basicauth.py
repoze.pam/trunk/repoze/pam/tests.py
Modified: repoze.pam/trunk/repoze/pam/plugins/basicauth.py
==============================================================================
--- repoze.pam/trunk/repoze/pam/plugins/basicauth.py (original)
+++ repoze.pam/trunk/repoze/pam/plugins/basicauth.py Tue Feb 26 00:07:54 2008
@@ -54,7 +54,7 @@
# IChallenger
def challenge(self, environ, status, app_headers, forget_headers):
head = self._get_wwwauth()
- if head != forget_headers:
+ if head[0] not in forget_headers:
head = head + forget_headers
return HTTPUnauthorized(headers=head)
Modified: repoze.pam/trunk/repoze/pam/tests.py
==============================================================================
--- repoze.pam/trunk/repoze/pam/tests.py (original)
+++ repoze.pam/trunk/repoze/pam/tests.py Tue Feb 26 00:07:54 2008
@@ -320,8 +320,23 @@
result = plugin.forget(environ, creds)
self.assertEqual(result, [('WWW-Authenticate', 'Basic realm="realm"')] )
- # XXX need challenge tests
+ def test_challenge_forgetheaders_includes(self):
+ plugin = self._makeOne('realm')
+ creds = {'login':'foo', 'password':'password'}
+ environ = self._makeEnviron()
+ forget = plugin._get_wwwauth()
+ result = plugin.challenge(environ, '401 Unauthorized', [], forget)
+ self.assertEqual(result.headers, forget)
+ def test_challenge_forgetheaders_omits(self):
+ plugin = self._makeOne('realm')
+ creds = {'login':'foo', 'password':'password'}
+ environ = self._makeEnviron()
+ forget = plugin._get_wwwauth()
+ result = plugin.challenge(environ, '401 Unauthorized', [], [])
+ self.assertEqual(result.headers, forget)
+
+
def test_factory(self):
from repoze.pam.plugins.basicauth import make_plugin
plugin = make_plugin({}, 'realm')
@@ -483,6 +498,105 @@
plugin = make_plugin(None, 'foo')
self.assertEqual(plugin.cookie_name, 'foo')
+ def test_forget(self):
+ plugin = self._makeOne('oatmeal')
+ headers = plugin.forget({}, None)
+ self.assertEqual(len(headers), 1)
+ header = headers[0]
+ name, value = header
+ self.assertEqual(name, 'Set-Cookie')
+ self.assertEqual(value,
+ 'oatmeal=""; Path=/; Expires=Sun, 10-May-1971 11:59:00 GMT')
+
+class TestFormPlugin(Base):
+ def _getTargetClass(self):
+ from repoze.pam.plugins.form import FormPlugin
+ return FormPlugin
+
+ def _makeOne(self, login_form_qs='__do_login', rememberer_name='cookie'):
+ plugin = self._getTargetClass()(login_form_qs, rememberer_name)
+ return plugin
+
+ def _makeFormEnviron(self, login=None, password=None, do_login=False):
+ from StringIO import StringIO
+ fields = []
+ if login:
+ fields.append(('login', login))
+ if password:
+ fields.append(('password', password))
+ content_type, body = encode_multipart_formdata(fields)
+ extra = {'wsgi.input':StringIO(body),
+ 'CONTENT_TYPE':content_type,
+ 'CONTENT_LENGTH':len(body),
+ 'REQUEST_METHOD':'POST',
+ 'repoze.pam.plugins': {'cookie':DummyIdentifier()},
+ 'QUERY_STRING':'',
+ }
+ if do_login:
+ extra['QUERY_STRING'] = '__do_login=true'
+ environ = self._makeEnviron(extra)
+ return environ
+
+ def test_implements(self):
+ from zope.interface.verify import verifyClass
+ from repoze.pam.interfaces import IIdentifier
+ from repoze.pam.interfaces import IChallenger
+ klass = self._getTargetClass()
+ verifyClass(IIdentifier, klass)
+ verifyClass(IChallenger, klass)
+
+ def test_identify_noqs(self):
+ plugin = self._makeOne()
+ environ = self._makeFormEnviron()
+ result = plugin.identify(environ)
+ self.assertEqual(result, {})
+
+ def test_identify_qs_no_values(self):
+ plugin = self._makeOne()
+ environ = self._makeFormEnviron(do_login=True)
+ result = plugin.identify(environ)
+ self.assertEqual(result, {})
+
+ def test_identify_nologin(self):
+ plugin = self._makeOne()
+ environ = self._makeFormEnviron(do_login=True, login='chris')
+ result = plugin.identify(environ)
+ self.assertEqual(result, {})
+
+ def test_identify_nopassword(self):
+ plugin = self._makeOne()
+ environ = self._makeFormEnviron(do_login=True, password='password')
+ result = plugin.identify(environ)
+ self.assertEqual(result, {})
+
+ def test_identify_success(self):
+ plugin = self._makeOne()
+ environ = self._makeFormEnviron(do_login=True, login='chris',
+ password='password')
+ result = plugin.identify(environ)
+ self.assertEqual(result, {'login':'chris', 'password':'password'})
+
+ def test_remember(self):
+ plugin = self._makeOne()
+ environ = self._makeFormEnviron()
+ result = plugin.remember(environ, {})
+ self.assertEqual(result, None)
+ self.assertEqual(environ['repoze.pam.plugins']['cookie'].remembered,
+ True)
+
+ def test_forget(self):
+ plugin = self._makeOne()
+ environ = self._makeFormEnviron()
+ result = plugin.forget(environ, {})
+ self.assertEqual(result, None)
+ self.assertEqual(environ['repoze.pam.plugins']['cookie'].forgotten,
+ True)
+
+ def test_factory(self):
+ from repoze.pam.plugins.cookie import make_plugin
+ plugin = make_plugin(None, 'foo')
+ self.assertEqual(plugin.cookie_name, 'foo')
+
class TestDefaultRequestClassifier(Base):
def _getFUT(self):
@@ -524,11 +638,9 @@
def __call__(self, environ):
return 'browser'
-class DummyResponseClassifier:
- def __call__(self, environ, request_classification, headers, exception):
- return request_classification
-
class DummyIdentifier:
+ forgotten = False
+ remembered = False
def __init__(self, credentials=None):
if credentials is None:
credentials = {'login':'chris', 'password':'password'}
@@ -538,10 +650,10 @@
return self.credentials
def forget(self, environ, identity):
- pass
+ self.forgotten = True
def remember(self, environ, identity):
- pass
+ self.remembered = True
class DummyNoResultsIdentifier:
def identify(self, environ):
@@ -575,3 +687,17 @@
if status.startswith('401 '):
return True
+def encode_multipart_formdata(fields):
+ BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$'
+ CRLF = '\r\n'
+ L = []
+ for (key, value) in fields:
+ L.append('--' + BOUNDARY)
+ L.append('Content-Disposition: form-data; name="%s"' % key)
+ L.append('')
+ L.append(value)
+ L.append('--' + BOUNDARY + '--')
+ L.append('')
+ body = CRLF.join(L)
+ content_type = 'multipart/form-data; boundary=%s' % BOUNDARY
+ return content_type, body
More information about the Repoze-checkins
mailing list