mirror of
https://github.com/webrecorder/pywb.git
synced 2025-03-24 06:59:52 +01:00
referer redirect fixes:
- allow redirect if current Host: matches - redirect request uri to host root, not current host path
This commit is contained in:
parent
2a828fab32
commit
8b2bfa570c
@ -135,8 +135,8 @@ class ReferRedirect:
|
|||||||
>>> ReferRedirect(['http://example:9090/']).match_prefixs
|
>>> ReferRedirect(['http://example:9090/']).match_prefixs
|
||||||
['http://example:9090/']
|
['http://example:9090/']
|
||||||
|
|
||||||
>>> test_redir('http://localhost:8080/', '/other.html', 'http://localhost:8080/coll/20131010/http://example.com/path/page.html')
|
>>> test_redir('http://localhost:8080/', '/diff_path/other.html', 'http://localhost:8080/coll/20131010/http://example.com/path/page.html')
|
||||||
'http://localhost:8080/coll/20131010/http://example.com/path/other.html'
|
'http://localhost:8080/coll/20131010/http://example.com/diff_path/other.html'
|
||||||
|
|
||||||
>>> test_redir('http://localhost:8080/', '/../other.html', 'http://localhost:8080/coll/20131010/http://example.com/path/page.html')
|
>>> test_redir('http://localhost:8080/', '/../other.html', 'http://localhost:8080/coll/20131010/http://example.com/path/page.html')
|
||||||
'http://localhost:8080/coll/20131010/http://example.com/other.html'
|
'http://localhost:8080/coll/20131010/http://example.com/other.html'
|
||||||
@ -146,7 +146,7 @@ class ReferRedirect:
|
|||||||
|
|
||||||
# Custom collection
|
# Custom collection
|
||||||
>>> test_redir('http://localhost:8080/', '/other.html', 'http://localhost:8080/complex/123/20131010/http://example.com/path/page.html', coll='complex/123')
|
>>> test_redir('http://localhost:8080/', '/other.html', 'http://localhost:8080/complex/123/20131010/http://example.com/path/page.html', coll='complex/123')
|
||||||
'http://localhost:8080/complex/123/20131010/http://example.com/path/other.html'
|
'http://localhost:8080/complex/123/20131010/http://example.com/other.html'
|
||||||
|
|
||||||
# With timestamp included
|
# With timestamp included
|
||||||
>>> test_redir('http://localhost:8080/', '/20131010/other.html', 'http://localhost:8080/coll/20131010/http://example.com/index.html')
|
>>> test_redir('http://localhost:8080/', '/20131010/other.html', 'http://localhost:8080/coll/20131010/http://example.com/index.html')
|
||||||
@ -160,6 +160,10 @@ class ReferRedirect:
|
|||||||
>>> test_redir('http://example:8080/', '/other.html', 'http://localhost:8080/coll/20131010/http://example.com/path/page.html')
|
>>> test_redir('http://example:8080/', '/other.html', 'http://localhost:8080/coll/20131010/http://example.com/path/page.html')
|
||||||
False
|
False
|
||||||
|
|
||||||
|
# Right Host
|
||||||
|
>>> test_redir('http://localhost:8080/', '/other.html', 'http://example.com:8080/coll/20131010/http://example.com/path/page.html', http_host = 'example.com:8080')
|
||||||
|
'http://example.com:8080/coll/20131010/http://example.com/other.html'
|
||||||
|
|
||||||
# With custom SCRIPT_NAME
|
# With custom SCRIPT_NAME
|
||||||
>>> test_redir('http://localhost:8080/', '/../other.html', 'http://localhost:8080/extra/coll/20131010/http://example.com/path/page.html', '/extra')
|
>>> test_redir('http://localhost:8080/', '/../other.html', 'http://localhost:8080/extra/coll/20131010/http://example.com/path/page.html', '/extra')
|
||||||
'http://localhost:8080/extra/coll/20131010/http://example.com/other.html'
|
'http://localhost:8080/extra/coll/20131010/http://example.com/other.html'
|
||||||
@ -188,13 +192,14 @@ class ReferRedirect:
|
|||||||
if referrer is None:
|
if referrer is None:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# ensure referrer starts with one of allowed hosts
|
|
||||||
if not any (referrer.startswith(i) for i in self.match_prefixs):
|
|
||||||
return None
|
|
||||||
|
|
||||||
# get referrer path name
|
# get referrer path name
|
||||||
ref_split = urlparse.urlsplit(referrer)
|
ref_split = urlparse.urlsplit(referrer)
|
||||||
|
|
||||||
|
# ensure referrer starts with one of allowed hosts
|
||||||
|
if not any (referrer.startswith(i) for i in self.match_prefixs):
|
||||||
|
if ref_split.netloc != env.get('HTTP_HOST'):
|
||||||
|
return None
|
||||||
|
|
||||||
path = ref_split.path
|
path = ref_split.path
|
||||||
|
|
||||||
app_path = env['SCRIPT_NAME']
|
app_path = env['SCRIPT_NAME']
|
||||||
@ -222,9 +227,9 @@ class ReferRedirect:
|
|||||||
|
|
||||||
rewriter = ref_request.urlrewriter
|
rewriter = ref_request.urlrewriter
|
||||||
|
|
||||||
rel_request_uri = env['REL_REQUEST_URI'][1:]
|
rel_request_uri = env['REL_REQUEST_URI']
|
||||||
|
|
||||||
timestamp_path = rewriter.wburl.timestamp + '/'
|
timestamp_path = '/' + rewriter.wburl.timestamp + '/'
|
||||||
|
|
||||||
# check if timestamp is already part of the path
|
# check if timestamp is already part of the path
|
||||||
if rel_request_uri.startswith(timestamp_path):
|
if rel_request_uri.startswith(timestamp_path):
|
||||||
@ -242,8 +247,12 @@ if __name__ == "__main__" or utils.enable_doctests():
|
|||||||
|
|
||||||
import handlers
|
import handlers
|
||||||
|
|
||||||
def test_redir(match_host, request_uri, referrer, script_name = '', coll = 'coll'):
|
def test_redir(match_host, request_uri, referrer, script_name = '', coll = 'coll', http_host = None):
|
||||||
env = {'REL_REQUEST_URI': request_uri, 'HTTP_REFERER': referrer, 'SCRIPT_NAME': script_name}
|
env = {'REL_REQUEST_URI': request_uri, 'HTTP_REFERER': referrer, 'SCRIPT_NAME': script_name}
|
||||||
|
|
||||||
|
if http_host:
|
||||||
|
env['HTTP_HOST'] = http_host
|
||||||
|
|
||||||
routes = [Route(coll, handlers.BaseHandler())]
|
routes = [Route(coll, handlers.BaseHandler())]
|
||||||
|
|
||||||
redir = ReferRedirect(match_host)
|
redir = ReferRedirect(match_host)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user