| 20 | |
| 21 | @PluginManager.acceptPlugins |
| 22 | class FileServer(ConnectionServer): |
| 23 | |
| 24 | def __init__(self, ip=config.fileserver_ip, port=config.fileserver_port, ip_type=config.fileserver_ip_type): |
| 25 | self.site_manager = SiteManager.site_manager |
| 26 | self.portchecker = PeerPortchecker.PeerPortchecker(self) |
| 27 | self.log = logging.getLogger("FileServer") |
| 28 | self.ip_type = ip_type |
| 29 | self.ip_external_list = [] |
| 30 | |
| 31 | self.supported_ip_types = ["ipv4"] # Outgoing ip_type support |
| 32 | if helper.getIpType(ip) == "ipv6" or self.isIpv6Supported(): |
| 33 | self.supported_ip_types.append("ipv6") |
| 34 | |
| 35 | if ip_type == "ipv6" or (ip_type == "dual" and "ipv6" in self.supported_ip_types): |
| 36 | ip = ip.replace("*", "::") |
| 37 | else: |
| 38 | ip = ip.replace("*", "0.0.0.0") |
| 39 | |
| 40 | if config.tor == "always": |
| 41 | port = config.tor_hs_port |
| 42 | config.fileserver_port = port |
| 43 | elif port == 0: # Use random port |
| 44 | port_range_from, port_range_to = list(map(int, config.fileserver_port_range.split("-"))) |
| 45 | port = self.getRandomPort(ip, port_range_from, port_range_to) |
| 46 | config.fileserver_port = port |
| 47 | if not port: |
| 48 | raise Exception("Can't find bindable port") |
| 49 | if not config.tor == "always": |
| 50 | config.saveValue("fileserver_port", port) # Save random port value for next restart |
| 51 | |
| 52 | ConnectionServer.__init__(self, ip, port, self.handleRequest) |
| 53 | self.log.debug("Supported IP types: %s" % self.supported_ip_types) |
| 54 | |
| 55 | if ip_type == "dual" and ip == "::": |
| 56 | # Also bind to ipv4 addres in dual mode |
| 57 | try: |
| 58 | self.log.debug("Binding proxy to %s:%s" % ("::", self.port)) |
| 59 | self.stream_server_proxy = StreamServer( |
| 60 | ("0.0.0.0", self.port), self.handleIncomingConnection, spawn=self.pool, backlog=100 |
| 61 | ) |
| 62 | except Exception as err: |
| 63 | self.log.info("StreamServer proxy create error: %s" % Debug.formatException(err)) |
| 64 | |
| 65 | self.port_opened = {} |
| 66 | |
| 67 | self.sites = {} |
| 68 | self.last_request = time.time() |
| 69 | self.files_parsing = {} |
| 70 | self.ui_server = None |
| 71 | |
| 72 | def getRandomPort(self, ip, port_range_from, port_range_to): |
| 73 | self.log.info("Getting random port in range %s-%s..." % (port_range_from, port_range_to)) |
| 74 | tried = [] |
| 75 | for bind_retry in range(100): |
| 76 | port = random.randint(port_range_from, port_range_to) |
| 77 | if port in tried: |
| 78 | continue |
| 79 | tried.append(port) |
no outgoing calls