Gustavo Narea
2008-12-17 cfd6bb6c93c77c1e0844209b7027143d35e3bcb3
Added the ability to customize the parameter in the query string for denied authorizations
2 files modified
41 ■■■■■ changed files
repoze/who/plugins/form.py 5 ●●●●● patch | view | raw | blame | history
repoze/who/tests.py 36 ●●●●● patch | view | raw | blame | history
repoze/who/plugins/form.py
@@ -133,7 +133,7 @@
    implements(IChallenger, IIdentifier)
    
    def __init__(self, login_form_url, login_handler_path, logout_handler_path,
                 rememberer_name):
                 rememberer_name, reason_param='reason'):
        self.login_form_url = login_form_url
        self.login_handler_path = login_handler_path
        self.logout_handler_path = logout_handler_path
@@ -141,6 +141,7 @@
        # implements IIdentifier, to handle remember and forget duties
        # (ala a cookie plugin or a session plugin)
        self.rememberer_name = rememberer_name
        self.reason_param = reason_param
    # IIdentifier
    def identify(self, environ):
@@ -185,7 +186,7 @@
        came_from = environ.get('came_from', construct_url(environ))
        query_elements['came_from'] = came_from
        if reason:
            query_elements['reason'] = reason
            query_elements[self.reason_param] = reason
        url_parts[4] = urllib.urlencode(query_elements, doseq=True)
        login_form_url = urlparse.urlunparse(url_parts)
        headers = [ ('Location', login_form_url) ]
repoze/who/tests.py
@@ -1209,10 +1209,11 @@
    def _makeOne(self, login_form_url='http://example.com/login.html',
                 login_handler_path = '/login_handler',
                 logout_handler_path = '/logout_handler',
                 rememberer_name='cookie'):
                 rememberer_name='cookie',
                 reason_param='reason'):
        plugin = self._getTargetClass()(login_form_url, login_handler_path,
                                        logout_handler_path,
                                        rememberer_name)
                                        rememberer_name, reason_param)
        return plugin
    def _makeFormEnviron(self, login=None, password=None, came_from=None,
@@ -1458,6 +1459,37 @@
        self.assertEqual(reason_key, 'reason')
        self.assertEqual(reason_value, 'you are ugly')
    def test_challenge_with_reason_and_custom_reason_param(self):
        plugin = self._makeOne(reason_param='auth_failure')
        environ = self._makeFormEnviron()
        environ['came_from'] = 'http://example.com/came_from'
        app = plugin.challenge(
            environ, '401 Unauthorized',
            [('X-Authorization-Failure-Reason', 'you are ugly')],
            [('forget', '1')])
        sr = DummyStartResponse()
        result = ''.join(app(environ, sr))
        self.failUnless(result.startswith('302 Found'))
        self.assertEqual(len(sr.headers), 3)
        self.assertEqual(sr.headers[0][0], 'Location')
        url = sr.headers[0][1]
        import urlparse
        import cgi
        parts = urlparse.urlparse(url)
        parts_qsl = cgi.parse_qsl(parts[4])
        self.assertEqual(len(parts_qsl), 2)
        parts_qsl.sort()
        reason_key, reason_value = parts_qsl[0]
        came_from_key, came_from_value = parts_qsl[1]
        self.assertEqual(parts[0], 'http')
        self.assertEqual(parts[1], 'example.com')
        self.assertEqual(parts[2], '/login.html')
        self.assertEqual(parts[3], '')
        self.assertEqual(came_from_key, 'came_from')
        self.assertEqual(came_from_value, 'http://example.com/came_from')
        self.assertEqual(reason_key, 'auth_failure')
        self.assertEqual(reason_value, 'you are ugly')
class TestAuthTktCookiePlugin(Base):
    def _getTargetClass(self):
        from repoze.who.plugins.auth_tkt import AuthTktCookiePlugin