Compare commits
3 Commits
e5f9b39025
...
2b138446d4
Author | SHA1 | Date |
---|---|---|
Sebastian Lohff | 2b138446d4 | |
Sebastian Lohff | ccd01e8b6e | |
MasterofJOKers | 907013522c |
12
servefile
12
servefile
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/python
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Licensed under GNU General Public License v3 or later
|
||||
|
@ -312,7 +312,7 @@ class DirListingHandler(FileBaseHandler):
|
|||
path = self.getCleanPath()
|
||||
|
||||
# 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
|
||||
if not requestPath.startswith(currBaseDir):
|
||||
self.send_response(301)
|
||||
|
@ -849,9 +849,9 @@ class ServeFile():
|
|||
|
||||
# filter out ips we are not listening on
|
||||
if not self.listenIPv6:
|
||||
ips = filter(lambda ip: ":" not in ip, ips)
|
||||
ips = [ip for ip in ips if '.' in ip]
|
||||
if not self.listenIPv4:
|
||||
ips = filter(lambda ip: "." not in ip, ips)
|
||||
ips = [ip for ip in ips if ':' in ip]
|
||||
|
||||
return ips
|
||||
return None
|
||||
|
@ -1041,7 +1041,7 @@ class ServeFile():
|
|||
raise ServeFileException("Error: Could not create directory '%s' for uploads, %r" % (self.target, str(e)))
|
||||
else:
|
||||
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
|
||||
handler = FilePutter
|
||||
elif self.serveMode == self.MODE_LISTDIR:
|
||||
|
@ -1050,7 +1050,7 @@ class ServeFile():
|
|||
if not os.path.isdir(self.target):
|
||||
raise ServeFileException("Error: '%s' is not a directory." % (self.target,))
|
||||
handler = DirListingHandler
|
||||
handler.targetDir = self.target
|
||||
handler.targetDir = os.path.abspath(self.target)
|
||||
|
||||
if self.auth:
|
||||
# do authentication
|
||||
|
|
|
@ -2,6 +2,7 @@ import io
|
|||
import os
|
||||
import pytest
|
||||
import requests
|
||||
import socket
|
||||
import subprocess
|
||||
import tarfile
|
||||
import time
|
||||
|
@ -9,6 +10,12 @@ import urllib3
|
|||
|
||||
# crudly written to learn more about pytest and to have a base for refactoring
|
||||
|
||||
try:
|
||||
ConnectionRefusedError
|
||||
connrefused_exc = ConnectionRefusedError
|
||||
except NameError:
|
||||
connrefused_exc = socket.error
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def run_servefile():
|
||||
|
@ -118,6 +125,18 @@ def test_specify_port(run_servefile, datadir):
|
|||
check_download(data, fname='testfile', port=8081)
|
||||
|
||||
|
||||
def test_ipv4_only(run_servefile, datadir):
|
||||
data = "NOOT NOOT"
|
||||
p = datadir({'testfile': data}) / 'testfile'
|
||||
run_servefile([str(p), '-4'])
|
||||
|
||||
check_download(data, fname='testfile', host='127.0.0.1')
|
||||
|
||||
sock = socket.socket(socket.AF_INET6)
|
||||
with pytest.raises(connrefused_exc):
|
||||
sock.connect(("::1", 8080))
|
||||
|
||||
|
||||
def test_big_download(run_servefile, datadir):
|
||||
# test with about 10 mb of data
|
||||
data = "x" * (10 * 1024 ** 2)
|
||||
|
@ -167,6 +186,33 @@ def test_serve_directory(run_servefile, datadir):
|
|||
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):
|
||||
data = ('this is my live now\n'
|
||||
'uploading strings to servers\n'
|
||||
|
|
Loading…
Reference in New Issue