Selaa lähdekoodia

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

HelloZeroNet 8 vuotta sitten
vanhempi
commit
39413b9755
7 muutettua tiedostoa jossa 128 lisäystä ja 7 poistoa
  1. 1 1
      src/Config.py
  2. 11 5
      src/File/FileRequest.py
  3. 1 0
      src/Site/Site.py
  4. 57 0
      src/Test/TestFileRequest.py
  5. 54 0
      src/Test/TestPeer.py
  6. 3 0
      src/Test/conftest.py
  7. 1 1
      src/Ui/UiWebsocket.py

+ 1 - 1
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()

+ 11 - 5
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:

+ 1 - 0
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

+ 57 - 0
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()

+ 54 - 0
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()

+ 3 - 0
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
 

+ 1 - 1
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: