forked from seba/servefile
Make `targetDir` absolute by default
When serving a `../` as directory (with `-l`), servefile creates an endless 301-redirect loop. Having an absolute path fixes this. Since this error might come up any time again, we're setting `targetDir` to its absolute path right from the beginning and never have to worry about it later on.
This commit is contained in:
parent
e5f9b39025
commit
907013522c
|
@ -312,7 +312,7 @@ class DirListingHandler(FileBaseHandler):
|
||||||
path = self.getCleanPath()
|
path = self.getCleanPath()
|
||||||
|
|
||||||
# check if path is in current serving directory
|
# check if path is in current serving directory
|
||||||
currBaseDir = os.path.abspath(self.targetDir) + os.path.sep
|
currBaseDir = self.targetDir + os.path.sep
|
||||||
requestPath = os.path.normpath(os.path.join(currBaseDir, path)) + os.path.sep
|
requestPath = os.path.normpath(os.path.join(currBaseDir, path)) + os.path.sep
|
||||||
if not requestPath.startswith(currBaseDir):
|
if not requestPath.startswith(currBaseDir):
|
||||||
self.send_response(301)
|
self.send_response(301)
|
||||||
|
@ -1041,7 +1041,7 @@ class ServeFile():
|
||||||
raise ServeFileException("Error: Could not create directory '%s' for uploads, %r" % (self.target, str(e)))
|
raise ServeFileException("Error: Could not create directory '%s' for uploads, %r" % (self.target, str(e)))
|
||||||
else:
|
else:
|
||||||
raise ServeFileException("Error: Upload directory already exists and is a file.")
|
raise ServeFileException("Error: Upload directory already exists and is a file.")
|
||||||
FilePutter.targetDir = self.target
|
FilePutter.targetDir = os.path.abspath(self.target)
|
||||||
FilePutter.maxUploadSize = self.maxUploadSize
|
FilePutter.maxUploadSize = self.maxUploadSize
|
||||||
handler = FilePutter
|
handler = FilePutter
|
||||||
elif self.serveMode == self.MODE_LISTDIR:
|
elif self.serveMode == self.MODE_LISTDIR:
|
||||||
|
@ -1050,7 +1050,7 @@ class ServeFile():
|
||||||
if not os.path.isdir(self.target):
|
if not os.path.isdir(self.target):
|
||||||
raise ServeFileException("Error: '%s' is not a directory." % (self.target,))
|
raise ServeFileException("Error: '%s' is not a directory." % (self.target,))
|
||||||
handler = DirListingHandler
|
handler = DirListingHandler
|
||||||
handler.targetDir = self.target
|
handler.targetDir = os.path.abspath(self.target)
|
||||||
|
|
||||||
if self.auth:
|
if self.auth:
|
||||||
# do authentication
|
# do authentication
|
||||||
|
|
|
@ -167,6 +167,33 @@ def test_serve_directory(run_servefile, datadir):
|
||||||
check_download('jup!', '/bar/thisisaverylongfilenamefortestingthatthisstillworksproperly')
|
check_download('jup!', '/bar/thisisaverylongfilenamefortestingthatthisstillworksproperly')
|
||||||
|
|
||||||
|
|
||||||
|
def test_serve_relative_directory(run_servefile, datadir):
|
||||||
|
d = {
|
||||||
|
'foo': {'kratzbaum': 'cat', 'I like Cats!': 'kitteh', '&&&&&&&': 'wheee'},
|
||||||
|
'bar': {'thisisaverylongfilenamefortestingthatthisstillworksproperly': 'jup!'},
|
||||||
|
'noot': 'still data in here',
|
||||||
|
'bigfile': 'x' * (10 * 1024 ** 2),
|
||||||
|
}
|
||||||
|
p = datadir(d)
|
||||||
|
run_servefile(['../', '-l'], cwd=os.path.join(str(p), 'foo'))
|
||||||
|
|
||||||
|
# check if all files are in directory listing
|
||||||
|
# (could be made more sophisticated with beautifulsoup)
|
||||||
|
for path in '/', '/../':
|
||||||
|
r = make_request(path)
|
||||||
|
for k in d:
|
||||||
|
assert k in r.text
|
||||||
|
|
||||||
|
for fname, content in d['foo'].items():
|
||||||
|
check_download(content, '/foo/' + fname)
|
||||||
|
|
||||||
|
r = make_request('/unknown')
|
||||||
|
assert r.status_code == 404
|
||||||
|
|
||||||
|
# download
|
||||||
|
check_download('jup!', '/bar/thisisaverylongfilenamefortestingthatthisstillworksproperly')
|
||||||
|
|
||||||
|
|
||||||
def test_upload(run_servefile, tmp_path):
|
def test_upload(run_servefile, tmp_path):
|
||||||
data = ('this is my live now\n'
|
data = ('this is my live now\n'
|
||||||
'uploading strings to servers\n'
|
'uploading strings to servers\n'
|
||||||
|
|
Loading…
Reference in New Issue