Merge pull request #2169 from bauerj/tor-detect
Detect Tor and suggest using it
This commit is contained in:
commit
0277f79b7e
|
@ -22,6 +22,7 @@
|
||||||
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
# SOFTWARE.
|
# SOFTWARE.
|
||||||
|
import socket
|
||||||
|
|
||||||
from PyQt4.QtGui import *
|
from PyQt4.QtGui import *
|
||||||
from PyQt4.QtCore import *
|
from PyQt4.QtCore import *
|
||||||
|
@ -38,7 +39,7 @@ protocol_letters = 'ts'
|
||||||
class NetworkDialog(WindowModalDialog):
|
class NetworkDialog(WindowModalDialog):
|
||||||
def __init__(self, network, config, parent):
|
def __init__(self, network, config, parent):
|
||||||
WindowModalDialog.__init__(self, parent, _('Network'))
|
WindowModalDialog.__init__(self, parent, _('Network'))
|
||||||
self.setMinimumSize(375, 20)
|
self.setMinimumSize(400, 20)
|
||||||
self.nlayout = NetworkChoiceLayout(network, config)
|
self.nlayout = NetworkChoiceLayout(network, config)
|
||||||
vbox = QVBoxLayout(self)
|
vbox = QVBoxLayout(self)
|
||||||
vbox.addLayout(self.nlayout.layout())
|
vbox.addLayout(self.nlayout.layout())
|
||||||
|
@ -56,6 +57,7 @@ class NetworkChoiceLayout(object):
|
||||||
self.network = network
|
self.network = network
|
||||||
self.config = config
|
self.config = config
|
||||||
self.protocol = None
|
self.protocol = None
|
||||||
|
self.tor_proxy = None
|
||||||
|
|
||||||
self.servers = network.get_servers()
|
self.servers = network.get_servers()
|
||||||
host, port, protocol, proxy_config, auto_connect = network.get_parameters()
|
host, port, protocol, proxy_config, auto_connect = network.get_parameters()
|
||||||
|
@ -108,7 +110,7 @@ class NetworkChoiceLayout(object):
|
||||||
# use SSL
|
# use SSL
|
||||||
self.ssl_cb = QCheckBox(_('Use SSL'))
|
self.ssl_cb = QCheckBox(_('Use SSL'))
|
||||||
self.ssl_cb.setChecked(auto_connect)
|
self.ssl_cb.setChecked(auto_connect)
|
||||||
grid.addWidget(self.ssl_cb, 3, 1, 1, 3)
|
grid.addWidget(self.ssl_cb, 0, 2, 1, 1, Qt.AlignRight)
|
||||||
self.ssl_cb.stateChanged.connect(self.change_protocol)
|
self.ssl_cb.stateChanged.connect(self.change_protocol)
|
||||||
|
|
||||||
# auto connect
|
# auto connect
|
||||||
|
@ -175,7 +177,15 @@ class NetworkChoiceLayout(object):
|
||||||
grid.addWidget(self.proxy_mode, 4, 1)
|
grid.addWidget(self.proxy_mode, 4, 1)
|
||||||
grid.addWidget(self.proxy_host, 4, 2)
|
grid.addWidget(self.proxy_host, 4, 2)
|
||||||
grid.addWidget(self.proxy_port, 4, 3)
|
grid.addWidget(self.proxy_port, 4, 3)
|
||||||
|
self.tor_button = QPushButton("Use Tor Proxy")
|
||||||
|
self.tor_button.setIcon(QIcon(":icons/tor_logo.png"))
|
||||||
|
self.tor_button.hide()
|
||||||
|
self.tor_button.clicked.connect(self.use_tor_proxy)
|
||||||
|
grid.addWidget(self.tor_button, 5, 1, 1, 2)
|
||||||
self.layout_ = vbox
|
self.layout_ = vbox
|
||||||
|
td = TorDetector()
|
||||||
|
td.found_proxy.connect(self.suggest_proxy)
|
||||||
|
td.start()
|
||||||
|
|
||||||
def layout(self):
|
def layout(self):
|
||||||
return self.layout_
|
return self.layout_
|
||||||
|
@ -250,3 +260,44 @@ class NetworkChoiceLayout(object):
|
||||||
auto_connect = self.autoconnect_cb.isChecked()
|
auto_connect = self.autoconnect_cb.isChecked()
|
||||||
|
|
||||||
self.network.set_parameters(host, port, protocol, proxy, auto_connect)
|
self.network.set_parameters(host, port, protocol, proxy, auto_connect)
|
||||||
|
|
||||||
|
def suggest_proxy(self, found_proxy):
|
||||||
|
self.tor_proxy = found_proxy
|
||||||
|
self.tor_button.setText("Use Tor proxy at port " + str(found_proxy[1]))
|
||||||
|
self.tor_button.show()
|
||||||
|
|
||||||
|
def use_tor_proxy(self):
|
||||||
|
# 2 = SOCKS5
|
||||||
|
self.proxy_mode.setCurrentIndex(2)
|
||||||
|
self.proxy_host.setText("127.0.0.1")
|
||||||
|
self.proxy_port.setText(str(self.tor_proxy[1]))
|
||||||
|
self.tor_button.hide()
|
||||||
|
|
||||||
|
|
||||||
|
class TorDetector(QThread):
|
||||||
|
found_proxy = pyqtSignal(object)
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
QThread.__init__(self)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
# Probable ports for Tor to listen at
|
||||||
|
ports = [9050, 9150]
|
||||||
|
for p in ports:
|
||||||
|
if TorDetector.is_tor_port(p):
|
||||||
|
self.found_proxy.emit(("127.0.0.1", p))
|
||||||
|
return
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def is_tor_port(port):
|
||||||
|
try:
|
||||||
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
s.settimeout(0.1)
|
||||||
|
s.connect(("127.0.0.1", port))
|
||||||
|
# Tor responds uniquely to HTTP-like requests
|
||||||
|
s.send("GET\n")
|
||||||
|
if "Tor is not an HTTP Proxy" in s.recv(1024):
|
||||||
|
return True
|
||||||
|
except socket.error:
|
||||||
|
pass
|
||||||
|
return False
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
<file>icons/status_waiting.png</file>
|
<file>icons/status_waiting.png</file>
|
||||||
<file>icons/status_lagging.png</file>
|
<file>icons/status_lagging.png</file>
|
||||||
<file>icons/seal.png</file>
|
<file>icons/seal.png</file>
|
||||||
|
<file>icons/tor_logo.png</file>
|
||||||
<file>icons/speaker.png</file>
|
<file>icons/speaker.png</file>
|
||||||
<file>icons/trezor_unpaired.png</file>
|
<file>icons/trezor_unpaired.png</file>
|
||||||
<file>icons/trezor.png</file>
|
<file>icons/trezor.png</file>
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 2.6 KiB |
Loading…
Reference in New Issue