Esempio n. 1
0
    def testPackAddress(self):
        for port in [1, 1000, 65535]:
            for ip in [
                    "1.1.1.1", "127.0.0.1", "0.0.0.0", "255.255.255.255",
                    "192.168.1.1"
            ]:
                assert len(helper.packAddress(ip, port)) == 6
                assert helper.unpackAddress(helper.packAddress(ip,
                                                               port)) == (ip,
                                                                          port)

            for ip in [
                    "1:2:3:4:5:6:7:8", "::1",
                    "2001:19f0:6c01:e76:5400:1ff:fed6:3eca",
                    "2001:4860:4860::8888"
            ]:
                assert len(helper.packAddress(ip, port)) == 18
                assert helper.unpackAddress(helper.packAddress(ip,
                                                               port)) == (ip,
                                                                          port)

        with pytest.raises(struct.error) as err:
            helper.packAddress("1.1.1.1", 100000)

        with pytest.raises(socket.error):
            helper.packAddress("999.1.1.1", 1)

        with pytest.raises(AssertionError):
            helper.unpackAddress("X")
Esempio n. 2
0
    def testPackAddress(self):
        assert len(helper.packAddress("1.1.1.1", 1)) == 6
        assert helper.unpackAddress(helper.packAddress("1.1.1.1", 1)) == ("1.1.1.1", 1)

        with pytest.raises(socket.error):
            helper.packAddress("999.1.1.1", 1)

        with pytest.raises(AssertionError):
            helper.unpackAddress("X")
Esempio n. 3
0
    def testPackAddress(self):
        assert len(helper.packAddress("1.1.1.1", 1)) == 6
        assert helper.unpackAddress(helper.packAddress("1.1.1.1", 1)) == ("1.1.1.1", 1)

        with pytest.raises(socket.error):
            helper.packAddress("999.1.1.1", 1)

        with pytest.raises(AssertionError):
            helper.unpackAddress("X")
Esempio n. 4
0
def processPeerRes(tracker_address, site, peers):
    added = 0

    # Onion
    found_onion = 0
    for packed_address in peers["onion"]:
        found_onion += 1
        peer_onion, peer_port = helper.unpackOnionAddress(packed_address)
        if site.addPeer(peer_onion, peer_port, source="tracker"):
            added += 1

    # Ip4
    found_ipv4 = 0
    peers_normal = itertools.chain(peers.get("ip4", []), peers.get("ipv4", []),
                                   peers.get("ipv6", []))
    for packed_address in peers_normal:
        found_ipv4 += 1
        peer_ip, peer_port = helper.unpackAddress(packed_address)
        if site.addPeer(peer_ip, peer_port, source="tracker"):
            added += 1

    if added:
        site.worker_manager.onPeers()
        site.updateWebsocket(peers_added=added)
    return added
Esempio n. 5
0
    def actionPex(self, params):
        site = self.sites.get(params["site"])
        if not site or not site.settings["serving"]:  # Site unknown or not serving
            self.response({"error": "Unknown site"})
            return False

        got_peer_keys = []
        added = 0

        # 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

        # 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:
            site.worker_manager.onPeers()
            self.log.debug("Added %s peers to %s using pex, sending back %s" % (added, site, len(packed_peers)))
        self.response({"peers": packed_peers})
Esempio n. 6
0
    def pex(self, site=None, need_num=5):
        if not site:
            site = self.site  # If no site defined request peers for this site

        # give back 5 connectible peers
        packed_peers = helper.packPeers(self.site.getConnectablePeers(5))
        request = {"site": site.address, "peers": packed_peers["ip4"], "need": need_num}
        if packed_peers["onion"]:
            request["peers_onion"] = packed_peers["onion"]
        res = self.request("pex", request)
        if not res or "error" in res:
            return False
        added = 0
        # Ip4
        for peer in res.get("peers", []):
            address = helper.unpackAddress(peer)
            if site.addPeer(*address):
                added += 1
        # Onion
        for peer in res.get("peers_onion", []):
            address = helper.unpackOnionAddress(peer)
            if site.addPeer(*address):
                added += 1

        if added:
            self.log("Added peers using pex: %s" % added)

        return added
Esempio n. 7
0
    def pex(self, site=None, need_num=5):
        if not site:
            site = self.site  # If no site defined request peers for this site

        # give back 5 connectible peers
        packed_peers = helper.packPeers(self.site.getConnectablePeers(5))
        request = {
            "site": site.address,
            "peers": packed_peers["ip4"],
            "need": need_num
        }
        if packed_peers["onion"]:
            request["peers_onion"] = packed_peers["onion"]
        res = self.request("pex", request)
        if not res or "error" in res:
            return False
        added = 0
        # Ip4
        for peer in res.get("peers", []):
            address = helper.unpackAddress(peer)
            if site.addPeer(*address):
                added += 1
        # Onion
        for peer in res.get("peers_onion", []):
            address = helper.unpackOnionAddress(peer)
            if site.addPeer(*address):
                added += 1

        if added:
            self.log("Added peers using pex: %s" % added)

        return added
Esempio n. 8
0
    def actionPex(self, params):
        site = self.sites.get(params["site"])
        if not site or not site.settings[
                "serving"]:  # Site unknown or not serving
            self.response({"error": "Unknown site"})
            return False

        got_peer_keys = []
        added = 0

        # 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

        # 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:
            site.worker_manager.onPeers()
            self.log.debug("Added %s peers to %s using pex, sending back %s" %
                           (added, site, len(packed_peers)))
        self.response({"peers": packed_peers})
Esempio n. 9
0
 def findHash(self, hash_id):
     response = self.request("findHash", {
         "site": self.site.address,
         "hash_id": hash_id
     })
     if not response or "error" in response:
         return False
     return [helper.unpackAddress(peer) for peer in response["peers"]]
Esempio n. 10
0
    def actionPex(self, params):
        site = self.sites.get(params["site"])
        if not site or not site.settings[
                "serving"]:  # Site unknown or not serving
            self.response({"error": "Unknown site"})
            self.connection.badAction(5)
            return False

        got_peer_keys = []
        added = 0

        # Add requester peer to site
        connected_peer = site.addPeer(self.connection.ip,
                                      self.connection.port,
                                      source="request")

        if connected_peer:  # It was not registered before
            added += 1
            connected_peer.connect(
                self.connection)  # Assign current connection to peer

        # Add sent peers to site
        for packed_address in itertools.chain(params.get("peers", []),
                                              params.get("peers_ipv6", [])):
            address = helper.unpackAddress(packed_address)
            got_peer_keys.append("%s:%s" % address)
            if site.addPeer(*address, source="pex"):
                added += 1

        # Add sent onion peers to site
        for packed_address in params.get("peers_onion", []):
            address = helper.unpackOnionAddress(packed_address)
            got_peer_keys.append("%s:%s" % address)
            if site.addPeer(*address, source="pex"):
                added += 1

        # Send back peers that is not in the sent list and connectable (not port 0)
        packed_peers = helper.packPeers(
            site.getConnectablePeers(params["need"],
                                     ignore=got_peer_keys,
                                     allow_private=False))

        if added:
            site.worker_manager.onPeers()
            if config.verbose:
                self.log.debug(
                    "Added %s peers to %s using pex, sending back %s" %
                    (added, site,
                     {key: len(val)
                      for key, val in packed_peers.iteritems()}))

        back = {
            "peers": packed_peers["ipv4"],
            "peers_ipv6": packed_peers["ipv6"],
            "peers_onion": packed_peers["onion"]
        }

        self.response(back)
Esempio n. 11
0
    def actionPex(self, params):
        site = self.sites.get(params["site"])
        if not site or not site.settings[
                "serving"]:  # Site unknown or not serving
            self.response({"error": "Unknown site"})
            return False

        got_peer_keys = []
        added = 0

        # 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

        # Add sent peers to site
        for packed_address in params.get("peers", []):
            address = helper.unpackAddress(packed_address)
            got_peer_keys.append("%s:%s" % address)
            if site.addPeer(*address):
                added += 1

        # Add sent peers to site
        for packed_address in params.get("peers_onion", []):
            address = helper.unpackOnionAddress(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 = helper.packPeers(
            site.getConnectablePeers(params["need"],
                                     got_peer_keys,
                                     allow_private=False))

        if added:
            site.worker_manager.onPeers()
            if config.verbose:
                self.log.debug(
                    "Added %s peers to %s using pex, sending back %s" %
                    (added, site,
                     len(packed_peers["ip4"]) + len(packed_peers["onion"])))

        back = {}
        if packed_peers["ip4"]:
            back["peers"] = packed_peers["ip4"]
        if packed_peers["onion"]:
            back["peers_onion"] = packed_peers["onion"]

        self.response(back)
Esempio n. 12
0
    def actionPex(self, params):
        site = self.sites.get(params["site"])
        if not site or not site.settings["serving"]:  # Site unknown or not serving
            self.response({"error": "Unknown site"})
            return False

        got_peer_keys = []
        added = 0

        # Add requester peer to site
        connected_peer = site.addPeer(self.connection.ip, self.connection.port, source="request")

        if connected_peer:  # It was not registered before
            added += 1
            connected_peer.connect(self.connection)  # Assign current connection to peer

        # Add sent peers to site
        for packed_address in params.get("peers", []):
            address = helper.unpackAddress(packed_address)
            got_peer_keys.append("%s:%s" % address)
            if site.addPeer(*address, source="pex"):
                added += 1

        # Add sent peers to site
        for packed_address in params.get("peers_onion", []):
            address = helper.unpackOnionAddress(packed_address)
            got_peer_keys.append("%s:%s" % address)
            if site.addPeer(*address, source="pex"):
                added += 1

        # Send back peers that is not in the sent list and connectable (not port 0)
        packed_peers = helper.packPeers(site.getConnectablePeers(params["need"], got_peer_keys, allow_private=False))

        if added:
            site.worker_manager.onPeers()
            if config.verbose:
                self.log.debug(
                    "Added %s peers to %s using pex, sending back %s" %
                    (added, site, len(packed_peers["ip4"]) + len(packed_peers["onion"]))
                )

        back = {}
        if packed_peers["ip4"]:
            back["peers"] = packed_peers["ip4"]
        if packed_peers["onion"]:
            back["peers_onion"] = packed_peers["onion"]

        self.response(back)
Esempio n. 13
0
    def pex(self, site=None, need_num=5):
        if not site:
            site = self.site  # If no site defined request peers for this site

        # give back 5 connectible peers
        packed_peers = helper.packPeers(
            self.site.getConnectablePeers(5, allow_private=False))
        request = {
            "site": site.address,
            "peers": packed_peers["ipv4"],
            "need": need_num
        }
        if packed_peers["onion"]:
            request["peers_onion"] = packed_peers["onion"]
        if packed_peers["ipv6"]:
            request["peers_ipv6"] = packed_peers["ipv6"]

        res = self.request("pex", request)

        if not res or "error" in res:
            return False

        added = 0

        # Remove unsupported peer types
        if "peers_ipv6" in res and "ipv6" not in self.connection.server.supported_ip_types:
            del res["peers_ipv6"]

        if "peers_onion" in res and "onion" not in self.connection.server.supported_ip_types:
            del res["peers_onion"]

        # Add IPv4 + IPv6
        for peer in itertools.chain(res.get("peers", []),
                                    res.get("peers_ipv6", [])):
            address = helper.unpackAddress(peer)
            if site.addPeer(*address, source="pex"):
                added += 1

        # Add Onion
        for peer in res.get("peers_onion", []):
            address = helper.unpackOnionAddress(peer)
            if site.addPeer(*address, source="pex"):
                added += 1

        if added:
            self.log("Added peers using pex: %s" % added)

        return added
Esempio n. 14
0
 def pex(self, site=None, need_num=5):
     if not site:
         site = self.site  # If no site defined request peers for this site
     # give him/her 5 connectible peers
     packed_peers = [peer.packMyAddress() for peer in self.site.getConnectablePeers(5)]
     res = self.request("pex", {"site": site.address, "peers": packed_peers, "need": need_num})
     if not res or "error" in res:
         return False
     added = 0
     for peer in res.get("peers", []):
         address = helper.unpackAddress(peer)
         if site.addPeer(*address):
             added += 1
     if added:
         self.log("Added peers using pex: %s" % added)
     return added
Esempio n. 15
0
 def pex(self, site=None, need_num=5):
     if not site:
         site = self.site  # If no site defined request peers for this site
     # give him/her 5 connectible peers
     packed_peers = [peer.packMyAddress() for peer in self.site.getConnectablePeers(5)]
     response = self.request("pex", {"site": site.address, "peers": packed_peers, "need": need_num})
     if not response or "error" in response:
         return False
     added = 0
     for peer in response.get("peers", []):
         address = helper.unpackAddress(peer)
         if site.addPeer(*address):
             added += 1
     if added:
         self.log("Added peers using pex: %s" % added)
     return added
Esempio n. 16
0
def processPeerRes(site, peers):
    added = 0
    # Ip4
    found_ip4 = 0
    for packed_address in peers["ip4"]:
        found_ip4 += 1
        peer_ip, peer_port = helper.unpackAddress(packed_address)
        if site.addPeer(peer_ip, peer_port):
            added += 1
    # Onion
    found_onion = 0
    for packed_address in peers["onion"]:
        found_onion += 1
        peer_onion, peer_port = helper.unpackOnionAddress(packed_address)
        if site.addPeer(peer_onion, peer_port):
            added += 1

    if added:
        site.worker_manager.onPeers()
        site.updateWebsocket(peers_added=added)
        site.log.debug("Found %s ip4, %s onion peers, new: %s" % (found_ip4, found_onion, added))
Esempio n. 17
0
def processPeerRes(tracker_address, site, peers):
    added = 0
    # Ip4
    found_ip4 = 0
    for packed_address in peers["ip4"]:
        found_ip4 += 1
        peer_ip, peer_port = helper.unpackAddress(packed_address)
        if site.addPeer(peer_ip, peer_port):
            added += 1
    # Onion
    found_onion = 0
    for packed_address in peers["onion"]:
        found_onion += 1
        peer_onion, peer_port = helper.unpackOnionAddress(packed_address)
        if site.addPeer(peer_onion, peer_port):
            added += 1

    if added:
        site.worker_manager.onPeers()
        site.updateWebsocket(peers_added=added)
    return added
Esempio n. 18
0
def processPeerRes(tracker_address, site, peers):
    added = 0
    # Ip4
    found_ip4 = 0
    for packed_address in peers["ip4"]:
        found_ip4 += 1
        peer_ip, peer_port = helper.unpackAddress(packed_address)
        if site.addPeer(peer_ip, peer_port):
            added += 1
    # Onion
    found_onion = 0
    for packed_address in peers["onion"]:
        found_onion += 1
        peer_onion, peer_port = helper.unpackOnionAddress(packed_address)
        if site.addPeer(peer_onion, peer_port):
            added += 1

    if added:
        site.worker_manager.onPeers()
        site.updateWebsocket(peers_added=added)
    return added
Esempio n. 19
0
def processPeerRes(site, peers):
    added = 0
    have_ip4 = "ip4" in peers
    have_onion = "onion" in peers
    have_i2p = "i2p" in peers

    #Ip4
    found_ip4 = 0
    if have_ip4:
        for packed_address in peers["ip4"]:
            found_ip4 += 1
            peer_ip, peer_port = helper.unpackAddress(packed_address)
            if site.addPeer(peer_ip, peer_port):
                added += 1

    # Onion
    found_onion = 0
    if have_onion:
        for packed_address in peers["onion"]:
            found_onion += 1
            peer_onion, peer_port = helper.unpackOnionAddress(packed_address)
            if site.addPeer(peer_onion, peer_port):
                added += 1

    # I2P
    found_i2p = 0
    if have_i2p:
        for packed_address in peers["i2p"]:
            found_i2p += 1
            peer_i2p, peer_port = helper.unpackI2PAddress(packed_address)
            if site.addPeer(peer_i2p, peer_port):
                added += 1

    if added:
        site.worker_manager.onPeers()
        site.updateWebsocket(peers_added=added)
        site.log.debug("Found %s ip4, %s onion peers, %s i2p peers, new: %s" %
                       (found_ip4, found_onion, found_i2p, added))
Esempio n. 20
0
 def findHash(self, hash_id):
     response = self.request("findHash", {"site": self.site.address, "hash_id": hash_id})
     if not response or "error" in response:
         return False
     return [helper.unpackAddress(peer) for peer in response["peers"]]