Skip to content

Commit

Permalink
Extracted a reusable function redirectWithComeFrom()
Browse files Browse the repository at this point in the history
This should make the life easier for people writing alternative
credentials plugins (i.e. me).
  • Loading branch information
mgedmin committed Apr 9, 2013
1 parent 931aeb6 commit 59b7a80
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 14 deletions.
3 changes: 2 additions & 1 deletion CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ Changes
2.0.0a2 (unreleased)
--------------------

- Nothing changed yet.
- Refactored ``zope.pluggableauth.plugins.session.redirectWithComeFrom``
into a reusable function.


2.0.0a1 (2013-02-21)
Expand Down
65 changes: 52 additions & 13 deletions src/zope/pluggableauth/plugins/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -322,19 +322,8 @@ def challenge(self, request):
return False

site = hooks.getSite()
# We need the traversal stack to complete the 'camefrom' parameter
stack = request.getTraversalStack()
stack.reverse()
# Better to add the query string, if present
query = request.get('QUERY_STRING')

camefrom = '/'.join([request.getURL()] + stack)
if query:
camefrom = camefrom + '?' + query
url = '%s/@@%s?%s' % (absoluteURL(site, request),
self.loginpagename,
urlencode({'camefrom': camefrom}))
request.response.redirect(url)
redirectWithComeFrom(request, '%s/@@%s' % (absoluteURL(site, request),
self.loginpagename))
return True

def logout(self, request):
Expand All @@ -347,3 +336,53 @@ def logout(self, request):
sessionData['credentials'] = None
transaction.commit()
return True


def redirectWithComeFrom(request, location):
"""Redirect to a new location adding the current URL as ?comefrom=...
>>> from zope.publisher.browser import TestRequest
>>> request = TestRequest()
>>> redirectWithComeFrom(request, 'http://127.0.0.1/login')
>>> request.response.getStatus()
302
>>> request.response.getHeader('location')
'http://127.0.0.1/login?camefrom=http%3A%2F%2F127.0.0.1'
We'll fake up a more interesting request
>>> env = {
... 'REQUEST_URI': '/foo/bar/folder/page%201.html?q=value',
... 'QUERY_STRING': 'q=value'
... }
>>> request = TestRequest(environ=env)
>>> request._traversed_names = [u'foo', u'bar']
>>> request._traversal_stack = [u'page 1.html', u'folder']
>>> request['REQUEST_URI']
'/foo/bar/folder/page%201.html?q=value'
>>> redirectWithComeFrom(request, 'http://127.0.0.1/login')
>>> request.response.getHeader('location')
'http://127.0.0.1/login?camefrom=http%3A%2F%2F127.0.0.1%2Ffoo%2Fbar%2Ffolder%2Fpage+1.html%3Fq%3Dvalue'
"""

# We need the traversal stack to complete the 'camefrom' parameter
# (sice this function must work during traversal as well as after it)
stack = request.getTraversalStack()
stack.reverse()

# Better to add the query string, if present
query = request.get('QUERY_STRING')

camefrom = '/'.join([request.getURL()] + stack)
if query:
camefrom = camefrom + '?' + query

# We assume location doesn't have query parameters
url = '%s?%s' % (location, urlencode({'camefrom': camefrom}))
request.response.redirect(url)

0 comments on commit 59b7a80

Please sign in to comment.