From 39413b9755c57f2b3646c18c466ac53ac7e6e42f Mon Sep 17 00:00:00 2001 From: HelloZeroNet Date: Mon, 28 Sep 2015 00:22:27 +0200 Subject: [PATCH] Rev452, Auto hide no peers found info message, Raise error on invalid file location, Test PEX, Test invalid file downloads, Test peer download and ping --- src/Config.py | 2 +- src/File/FileRequest.py | 16 +++++++---- src/Site/Site.py | 1 + src/Test/TestFileRequest.py | 57 +++++++++++++++++++++++++++++++++++++ src/Test/TestPeer.py | 54 +++++++++++++++++++++++++++++++++++ src/Test/conftest.py | 3 ++ src/Ui/UiWebsocket.py | 2 +- 7 files changed, 128 insertions(+), 7 deletions(-) create mode 100644 src/Test/TestPeer.py diff --git a/src/Config.py b/src/Config.py index 6754894d..5ddfcd92 100644 --- a/src/Config.py +++ b/src/Config.py @@ -8,7 +8,7 @@ class Config(object): def __init__(self, argv): self.version = "0.3.2" - self.rev = 450 + self.rev = 452 self.argv = argv self.action = None self.createParser() diff --git a/src/File/FileRequest.py b/src/File/FileRequest.py index 9a6862c3..71586aa1 100644 --- a/src/File/FileRequest.py +++ b/src/File/FileRequest.py @@ -1,6 +1,4 @@ # Included modules -import socket -import struct import os from cStringIO import StringIO @@ -139,6 +137,8 @@ class FileRequest(object): file.seek(params["location"]) file.read_bytes = FILE_BUFF file_size = os.fstat(file.fileno()).st_size + assert params["location"] < file_size + back = { "body": file, "size": file_size, @@ -179,6 +179,8 @@ class FileRequest(object): file.seek(params["location"]) file_size = os.fstat(file.fileno()).st_size stream_bytes = min(FILE_BUFF, file_size - params["location"]) + assert stream_bytes >= 0 + back = { "size": file_size, "location": min(file.tell() + FILE_BUFF, file_size), @@ -215,16 +217,20 @@ class FileRequest(object): got_peer_keys = [] added = 0 - connected_peer = site.addPeer(self.connection.ip, self.connection.port) # Add requester peer to site - if connected_peer: # Just added + + # Add requester peer to site + connected_peer = site.addPeer(self.connection.ip, self.connection.port) + if connected_peer: # It was not registered before added += 1 connected_peer.connect(self.connection) # Assign current connection to peer - for packed_address in params["peers"]: # Add sent peers to site + # Add sent peers to site + for packed_address in params["peers"]: address = helper.unpackAddress(packed_address) got_peer_keys.append("%s:%s" % address) if site.addPeer(*address): added += 1 + # Send back peers that is not in the sent list and connectable (not port 0) packed_peers = [peer.packMyAddress() for peer in site.getConnectablePeers(params["need"], got_peer_keys)] if added: diff --git a/src/Site/Site.py b/src/Site/Site.py index 61ae9ccc..3a6f84a0 100644 --- a/src/Site/Site.py +++ b/src/Site/Site.py @@ -472,6 +472,7 @@ class Site: return task # Add or update a peer to site + # return_peer: Always return the peer even if it was already present def addPeer(self, ip, port, return_peer=False): if not ip: return False diff --git a/src/Test/TestFileRequest.py b/src/Test/TestFileRequest.py index c7908c87..e53c83dc 100644 --- a/src/Test/TestFileRequest.py +++ b/src/Test/TestFileRequest.py @@ -1,11 +1,15 @@ import cStringIO as StringIO import pytest +import time from Connection import ConnectionServer +from Connection import Connection +from File import FileServer @pytest.mark.usefixtures("resetSettings") +@pytest.mark.usefixtures("resetTempSettings") class TestFileRequest: def testGetFile(self, file_server, site): file_server.ip_incoming = {} # Reset flood protection @@ -17,6 +21,18 @@ class TestFileRequest: response = connection.request("getFile", {"site": site.address, "inner_path": "content.json", "location": 0}) assert "sign" in response["body"] + # Invalid file + response = connection.request("getFile", {"site": site.address, "inner_path": "invalid.file", "location": 0}) + assert "No such file or directory" in response["error"] + + # Location over size + response = connection.request("getFile", {"site": site.address, "inner_path": "content.json", "location": 1024 * 1024}) + assert "File read error" in response["error"] + + # Stream from parent dir + response = connection.request("getFile", {"site": site.address, "inner_path": "../users.json", "location": 0}) + assert "File not allowed" in response["error"] + connection.close() client.stop() @@ -31,5 +47,46 @@ class TestFileRequest: assert "stream_bytes" in response assert "sign" in buff.getvalue() + # Invalid file + buff = StringIO.StringIO() + response = connection.request("streamFile", {"site": site.address, "inner_path": "invalid.file", "location": 0}, buff) + assert "No such file or directory" in response["error"] + + # Location over size + buff = StringIO.StringIO() + response = connection.request( + "streamFile", {"site": site.address, "inner_path": "content.json", "location": 1024 * 1024}, buff + ) + assert "File read error" in response["error"] + + # Stream from parent dir + buff = StringIO.StringIO() + response = connection.request("streamFile", {"site": site.address, "inner_path": "../users.json", "location": 0}, buff) + assert "File not allowed" in response["error"] + + connection.close() + client.stop() + + def testPex(self, file_server, site, site_temp): + file_server.sites[site.address] = site + client = FileServer("127.0.0.1", 1545) + client.sites[site_temp.address] = site_temp + site_temp.connection_server = client + connection = client.getConnection("127.0.0.1", 1544) + + # Add new fake peer to site + fake_peer = site.addPeer("1.2.3.4", 11337, return_peer=True) + # Add fake connection to it + fake_peer.connection = Connection(file_server, "1.2.3.4", 11337) + fake_peer.connection.last_recv_time = time.time() + assert fake_peer in site.getConnectablePeers() + + # Add file_server as peer to client + peer_file_server = site_temp.addPeer("127.0.0.1", 1544) + + assert "1.2.3.4:11337" not in site_temp.peers + assert peer_file_server.pex() + assert "1.2.3.4:11337" in site_temp.peers + connection.close() client.stop() diff --git a/src/Test/TestPeer.py b/src/Test/TestPeer.py new file mode 100644 index 00000000..ae5a6b84 --- /dev/null +++ b/src/Test/TestPeer.py @@ -0,0 +1,54 @@ +import cStringIO as StringIO + +import pytest +import time + +from Connection import ConnectionServer +from Connection import Connection +from File import FileServer + + +@pytest.mark.usefixtures("resetSettings") +@pytest.mark.usefixtures("resetTempSettings") +class TestFileRequest: + def testPing(self, file_server, site, site_temp): + file_server.ip_incoming = {} # Reset flood protection + file_server.sites[site.address] = site + client = FileServer("127.0.0.1", 1545) + client.sites[site_temp.address] = site_temp + site_temp.connection_server = client + connection = client.getConnection("127.0.0.1", 1544) + + # Add file_server as peer to client + peer_file_server = site_temp.addPeer("127.0.0.1", 1544) + + assert peer_file_server.ping() + + assert peer_file_server in site_temp.peers.values() + peer_file_server.remove() + assert peer_file_server not in site_temp.peers.values() + + connection.close() + client.stop() + + def testDownloadFile(self, file_server, site, site_temp): + file_server.ip_incoming = {} # Reset flood protection + file_server.sites[site.address] = site + client = FileServer("127.0.0.1", 1545) + client.sites[site_temp.address] = site_temp + site_temp.connection_server = client + connection = client.getConnection("127.0.0.1", 1544) + + # Add file_server as peer to client + peer_file_server = site_temp.addPeer("127.0.0.1", 1544) + + # Testing streamFile + buff = peer_file_server.streamFile(site_temp.address, "content.json") + assert "sign" in buff.getvalue() + + # Testing getFile + buff = peer_file_server.getFile(site_temp.address, "content.json") + assert "sign" in buff.getvalue() + + connection.close() + client.stop() diff --git a/src/Test/conftest.py b/src/Test/conftest.py index 6bbaf397..441e3bdb 100644 --- a/src/Test/conftest.py +++ b/src/Test/conftest.py @@ -127,5 +127,8 @@ def file_server(request): gevent.spawn(lambda: ConnectionServer.start(file_server)) time.sleep(0) # Port opening assert file_server.running + def stop(): + file_server.stop() + request.addfinalizer(stop) return file_server diff --git a/src/Ui/UiWebsocket.py b/src/Ui/UiWebsocket.py index c419d1b3..eb0a50b9 100644 --- a/src/Ui/UiWebsocket.py +++ b/src/Ui/UiWebsocket.py @@ -301,7 +301,7 @@ class UiWebsocket(object): if len(site.peers) == 0: if sys.modules["main"].file_server.port_opened: if notification: - self.cmd("notification", ["info", "No peers found, but your content is ready to access."]) + self.cmd("notification", ["info", "No peers found, but your content is ready to access.", 5000]) self.response(to, "ok") else: if notification: