Merge pull request #1076 from grez911/master

Added P2P portcheck
This commit is contained in:
ZeroNet 2017-08-18 14:47:38 +02:00 committed by GitHub
commit d44f08382a
2 changed files with 49 additions and 1 deletions

View file

@ -13,6 +13,7 @@ from util import RateLimit
from util import StreamingMsgpack
from util import helper
from Plugin import PluginManager
from contextlib import closing
FILE_BUFF = 1024 * 512
@ -456,6 +457,15 @@ class FileRequest(object):
def actionPing(self, params):
self.response("Pong!")
# Check requested port of the other peer
def actionCheckport(self, params):
with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
sock.settimeout(5)
if sock.connect_ex((self.connection.ip, params["port"])) == 0:
self.response({"status": "open", "ip_external": self.connection.ip})
else:
self.response({"status": "closed", "ip_external": self.connection.ip})
# Unknown command
def actionUnknown(self, cmd, params):
self.response({"error": "Unknown command: %s" % cmd})

View file

@ -3,6 +3,7 @@ import urllib2
import re
import time
import socket
import random
import gevent
@ -87,12 +88,49 @@ class FileServer(ConnectionServer):
def testOpenport(self, port=None, use_alternative=True):
if not port:
port = self.port
back = self.testOpenportPortchecker(port)
back = self.testOpenportP2P(port)
if back["result"] is not True and use_alternative: # If no success try alternative checker
return self.testOpenportCanyouseeme(port)
else:
return back
def testOpenportP2P(self, port=None):
self.log.info("Checking port %s using P2P..." % port)
site = SiteManager.site_manager.get(config.homepage)
peers = []
res = None
if not site: # First run, has no any peers
return self.testOpenportPortchecker(port) # Fallback to centralized service
for peer in site.peers.values():
if not peer.ip.endswith(".onion"): # Get all non-onion peers
peers.append(peer)
if len(peers) < 3: # Not enough peers
return self.testOpenportPortchecker(port) # Fallback to centralized service
for retry in range(0, 3): # Try 3 peers
random_peer = random.choice(peers)
with gevent.Timeout(10.0, False): # 10 sec timeout, don't raise exception
random_peer.connect()
res = random_peer.request("checkport", {"port": port})
if res is not None:
break # All fine, exit from for loop
if res is None: # Nobody answered
return self.testOpenportPortchecker(port) # Fallback to centralized service
if res["status"] == "closed":
if config.tor != "always":
self.log.info("[BAD :(] %s says that your port %s is closed" % (random_peer.ip, port))
if port == self.port:
self.port_opened = False # Self port, update port_opened status
config.ip_external = res["ip_external"]
SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
return {"result": False}
else:
self.log.info("[OK :)] %s says that your port %s is open" % (random_peer.ip, port))
if port == self.port: # Self port, update port_opened status
self.port_opened = True
config.ip_external = res["ip_external"]
SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
return {"result": True}
def testOpenportPortchecker(self, port=None):
self.log.info("Checking port %s using portchecker.co..." % port)
try: