(self)
| 118 | |
| 119 | # Open connection to peer and wait for handshake |
| 120 | def connect(self): |
| 121 | self.type = "out" |
| 122 | if self.ip_type == "onion": |
| 123 | if not self.server.tor_manager or not self.server.tor_manager.enabled: |
| 124 | raise Exception("Can't connect to onion addresses, no Tor controller present") |
| 125 | self.sock = self.server.tor_manager.createSocket(self.ip, self.port) |
| 126 | elif config.tor == "always" and helper.isPrivateIp(self.ip) and self.ip not in config.ip_local: |
| 127 | raise Exception("Can't connect to local IPs in Tor: always mode") |
| 128 | elif config.trackers_proxy != "disable" and config.tor != "always" and self.is_tracker_connection: |
| 129 | if config.trackers_proxy == "tor": |
| 130 | self.sock = self.server.tor_manager.createSocket(self.ip, self.port) |
| 131 | else: |
| 132 | import socks |
| 133 | self.sock = socks.socksocket() |
| 134 | proxy_ip, proxy_port = config.trackers_proxy.split(":") |
| 135 | self.sock.set_proxy(socks.PROXY_TYPE_SOCKS5, proxy_ip, int(proxy_port)) |
| 136 | else: |
| 137 | self.sock = self.createSocket() |
| 138 | |
| 139 | if "TCP_NODELAY" in dir(socket): |
| 140 | self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) |
| 141 | |
| 142 | timeout_before = self.sock.gettimeout() |
| 143 | self.sock.settimeout(30) |
| 144 | if self.ip_type == "ipv6" and not hasattr(self.sock, "proxy"): |
| 145 | sock_address = (self.ip, self.port, 1, 1) |
| 146 | else: |
| 147 | sock_address = (self.ip, self.port) |
| 148 | |
| 149 | self.sock.connect(sock_address) |
| 150 | |
| 151 | # Implicit SSL |
| 152 | should_encrypt = not self.ip_type == "onion" and self.ip not in self.server.broken_ssl_ips and self.ip not in config.ip_local |
| 153 | if self.cert_pin: |
| 154 | self.sock = CryptConnection.manager.wrapSocket(self.sock, "tls-rsa", cert_pin=self.cert_pin) |
| 155 | self.sock.do_handshake() |
| 156 | self.crypt = "tls-rsa" |
| 157 | self.sock_wrapped = True |
| 158 | elif should_encrypt and "tls-rsa" in CryptConnection.manager.crypt_supported: |
| 159 | try: |
| 160 | self.sock = CryptConnection.manager.wrapSocket(self.sock, "tls-rsa") |
| 161 | self.sock.do_handshake() |
| 162 | self.crypt = "tls-rsa" |
| 163 | self.sock_wrapped = True |
| 164 | except Exception as err: |
| 165 | if not config.force_encryption: |
| 166 | self.log("Crypt connection error, adding %s:%s as broken ssl. %s" % (self.ip, self.port, Debug.formatException(err))) |
| 167 | self.server.broken_ssl_ips[self.ip] = True |
| 168 | self.sock.close() |
| 169 | self.crypt = None |
| 170 | self.sock = self.createSocket() |
| 171 | self.sock.settimeout(30) |
| 172 | self.sock.connect(sock_address) |
| 173 | |
| 174 | # Detect protocol |
| 175 | self.send({"cmd": "handshake", "req_id": 0, "params": self.getHandshakeInfo()}) |
| 176 | event_connected = self.event_connected |
| 177 | gevent.spawn(self.messageLoop) |
no test coverage detected