Added P2P portcheck

This commit is contained in:
grez911 2017-08-15 20:17:42 +03:00
parent 1db2327b3d
commit 5c5e4b914c
2 changed files with 59 additions and 3 deletions

View file

@ -3,6 +3,7 @@ import os
import time import time
import json import json
import itertools import itertools
import socket
# Third party modules # Third party modules
import gevent import gevent
@ -13,6 +14,7 @@ from util import RateLimit
from util import StreamingMsgpack from util import StreamingMsgpack
from util import helper from util import helper
from Plugin import PluginManager from Plugin import PluginManager
from contextlib import closing
FILE_BUFF = 1024 * 512 FILE_BUFF = 1024 * 512
@ -456,6 +458,15 @@ class FileRequest(object):
def actionPing(self, params): def actionPing(self, params):
self.response("Pong!") 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 # Unknown command
def actionUnknown(self, cmd, params): def actionUnknown(self, cmd, params):
self.response({"error": "Unknown command: %s" % cmd}) self.response({"error": "Unknown command: %s" % cmd})

View file

@ -2,13 +2,12 @@ import logging
import urllib2 import urllib2
import re import re
import time import time
import socket import random
import gevent import gevent
import util import util
from Config import config from Config import config
from FileRequest import FileRequest
from Site import SiteManager from Site import SiteManager
from Debug import Debug from Debug import Debug
from Connection import ConnectionServer from Connection import ConnectionServer
@ -87,11 +86,57 @@ class FileServer(ConnectionServer):
def testOpenport(self, port=None, use_alternative=True): def testOpenport(self, port=None, use_alternative=True):
if not port: if not port:
port = self.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 if back["result"] is not True and use_alternative: # If no success try alternative checker
return self.testOpenportCanyouseeme(port) return self.testOpenportCanyouseeme(port)
else: else:
return back 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): def testOpenportPortchecker(self, port=None):
self.log.info("Checking port %s using portchecker.co..." % port) self.log.info("Checking port %s using portchecker.co..." % port)