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 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})

View file

@ -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)