From 5c5e4b914c997fe1ba68512ff06d30700ab53527 Mon Sep 17 00:00:00 2001 From: grez911 Date: Tue, 15 Aug 2017 20:17:42 +0300 Subject: [PATCH 1/6] Added P2P portcheck --- src/File/FileRequest.py | 11 +++++++++ src/File/FileServer.py | 51 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/File/FileRequest.py b/src/File/FileRequest.py index df812d8c..12f8ee4d 100644 --- a/src/File/FileRequest.py +++ b/src/File/FileRequest.py @@ -3,6 +3,7 @@ import os import time import json import itertools +import socket # Third party modules import gevent @@ -13,6 +14,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 +458,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("open %s" % self.connection.ip) + else: + self.response("closed %s" % self.connection.ip) + # Unknown command def actionUnknown(self, cmd, params): self.response({"error": "Unknown command: %s" % cmd}) diff --git a/src/File/FileServer.py b/src/File/FileServer.py index 835c3c48..0dcc5658 100644 --- a/src/File/FileServer.py +++ b/src/File/FileServer.py @@ -2,13 +2,12 @@ import logging import urllib2 import re import time -import socket +import random import gevent import util from Config import config -from FileRequest import FileRequest from Site import SiteManager from Debug import Debug from Connection import ConnectionServer @@ -87,11 +86,57 @@ 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 + return back + + def testOpenportP2P(self, port=None): + self.log.info("Checking port %s using P2P..." % port) + site = SiteManager.site_manager.get("1HeLLo4uzjaLetFx6NH3PMwFP3qbRbTf3D") + 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(): # Get all non-onion peers + if peer.ip.endswith(".onion"): + peers.append(peer) + if len(peers) < 3: # Not enough peers + return self.testOpenportPortchecker(port) # Fallback to centralized service + for retry in range(1, 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}) + break # All fine, exit from for loop + if res is None: # Nobody answered + return self.testOpenportPortchecker(port) # Fallback to centralized service + message = res["body"] + if "open" not in message: + if config.tor != "always": + self.log.info("[BAD :(] Port closed %s" % message) + if port == self.port: + self.port_opened = False # Self port, update port_opened status + match = message.split(" ", 1)[1] # Try find my external ip in message + if match: # Found my ip in message + config.ip_external = match + SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist + else: + config.ip_external = False + return {"result": False, "message": message} + else: + self.log.info("[OK :)] Port open: %s" % message) + if port == self.port: # Self port, update port_opened status + self.port_opened = True + match = message.split(" ", 1)[1] # Try find my external ip in message + if match: # Found my ip in message + config.ip_external = match + SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist + else: + config.ip_external = False + return {"result": True, "message": message} def testOpenportPortchecker(self, port=None): self.log.info("Checking port %s using portchecker.co..." % port) From a4132c9cb11db661cff3924e85fc24ff58c81fef Mon Sep 17 00:00:00 2001 From: Sergei Bondarenko Date: Wed, 16 Aug 2017 09:40:54 +0300 Subject: [PATCH 2/6] Update FileServer.py --- src/File/FileServer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/File/FileServer.py b/src/File/FileServer.py index 0dcc5658..0873acfa 100644 --- a/src/File/FileServer.py +++ b/src/File/FileServer.py @@ -8,6 +8,7 @@ import gevent import util from Config import config +from FileRequest import FileRequest from Site import SiteManager from Debug import Debug from Connection import ConnectionServer From c0a96983a7049567354466a9839f3c17efdfefa6 Mon Sep 17 00:00:00 2001 From: Sergei Bondarenko Date: Wed, 16 Aug 2017 14:32:47 +0300 Subject: [PATCH 3/6] Update FileServer.py --- src/File/FileServer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/File/FileServer.py b/src/File/FileServer.py index 0873acfa..f0212606 100644 --- a/src/File/FileServer.py +++ b/src/File/FileServer.py @@ -2,6 +2,7 @@ import logging import urllib2 import re import time +import socket import random import gevent From 1fc2a917d4aeae32b945cf6c8573a71b80dd62c5 Mon Sep 17 00:00:00 2001 From: grez911 Date: Fri, 18 Aug 2017 11:29:41 +0300 Subject: [PATCH 4/6] Fix P2P port check --- src/File/FileRequest.py | 4 ++-- src/File/FileServer.py | 38 +++++++++++++++----------------------- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/File/FileRequest.py b/src/File/FileRequest.py index 12f8ee4d..b458c6a2 100644 --- a/src/File/FileRequest.py +++ b/src/File/FileRequest.py @@ -463,9 +463,9 @@ class FileRequest(object): 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("open %s" % self.connection.ip) + self.response({"status": "open", "ip_external": self.connection.ip}) else: - self.response("closed %s" % self.connection.ip) + self.response({"status": "closed", "ip_external": self.connection.ip}) # Unknown command def actionUnknown(self, cmd, params): diff --git a/src/File/FileServer.py b/src/File/FileServer.py index f0212606..80cdbd36 100644 --- a/src/File/FileServer.py +++ b/src/File/FileServer.py @@ -97,48 +97,40 @@ class FileServer(ConnectionServer): def testOpenportP2P(self, port=None): self.log.info("Checking port %s using P2P..." % port) - site = SiteManager.site_manager.get("1HeLLo4uzjaLetFx6NH3PMwFP3qbRbTf3D") + 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(): # Get all non-onion peers - if peer.ip.endswith(".onion"): + 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(1, 3): # Try 3 peers + 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}) - break # All fine, exit from for loop + 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 - message = res["body"] - if "open" not in message: + if res["status"] == "closed": if config.tor != "always": - self.log.info("[BAD :(] Port closed %s" % message) + 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 - match = message.split(" ", 1)[1] # Try find my external ip in message - if match: # Found my ip in message - config.ip_external = match - SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist - else: - config.ip_external = False - return {"result": False, "message": message} + 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 :)] Port open: %s" % message) + 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 - match = message.split(" ", 1)[1] # Try find my external ip in message - if match: # Found my ip in message - config.ip_external = match - SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist - else: - config.ip_external = False - return {"result": True, "message": message} + 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) From bf69d24566e5bc7f8a6e13de6273c80b1a3df240 Mon Sep 17 00:00:00 2001 From: grez911 Date: Fri, 18 Aug 2017 11:38:26 +0300 Subject: [PATCH 5/6] Deleted unnecessary import statement --- src/File/FileRequest.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/File/FileRequest.py b/src/File/FileRequest.py index b458c6a2..2fc17642 100644 --- a/src/File/FileRequest.py +++ b/src/File/FileRequest.py @@ -3,7 +3,6 @@ import os import time import json import itertools -import socket # Third party modules import gevent From 8487056edbaabe9771e390ff038588e1e1150a2c Mon Sep 17 00:00:00 2001 From: grez911 Date: Fri, 18 Aug 2017 11:43:06 +0300 Subject: [PATCH 6/6] Small fix in P2P portcheck --- src/File/FileServer.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/File/FileServer.py b/src/File/FileServer.py index 80cdbd36..d3aab8b3 100644 --- a/src/File/FileServer.py +++ b/src/File/FileServer.py @@ -93,7 +93,6 @@ class FileServer(ConnectionServer): return self.testOpenportCanyouseeme(port) else: return back - return back def testOpenportP2P(self, port=None): self.log.info("Checking port %s using P2P..." % port)