10000 Bugfix/mqtt over ssl (#199) · useful-esp8266-lib/tdm@6a55728 · GitHub
[go: up one dir, main page]

Skip to content

Commit 6a55728

Browse files
authored
Bugfix/mqtt over ssl (jziolkowski#199)
* Fixing MQTT over SSL * removing changes from another PR * reformatting tdmgr file * reformating file * reusing previous variables
1 parent 5b5106e commit 6a55728

File tree

3 files changed

+71
-13
lines changed

3 files changed

+71
-13
lines changed

GUI/Broker.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import random
2+
import ssl
23
import string
34

45
from PyQt5.QtCore import QSettings
5-
from PyQt5.QtWidgets import QCheckBox, QDialog, QFormLayout, QGroupBox, QLineEdit, QPushButton
6+
from PyQt5.QtWidgets import QCheckBox, QComboBox, QDialog, QFormLayout, QGroupBox, QLineEdit, QPushButton
67

78
from GUI import HLayout, SpinBox, VLayout
89

@@ -15,6 +16,27 @@ def __init__(self, *args, **kwargs):
1516

1617
self.settings = QSettings(QSettings.IniFormat, QSettings.UserScope, 'tdm', 'tdm')
1718

19+
gbtls = QGroupBox(" TLS [optional]")
20+
tlsLayout = QFormLayout()
21+
self.use_tls = QCheckBox("tls")
22+
self.use_tls.setChecked(self.settings.value("tls", False, bool))
23+
24+
self.tls_file = QLineEdit()
25+
self.tls_file.setText(self.settings.value("tlsfile", "/etc/opentls/certs/ca.crt"))
26+
self.tls_insecure = QCheckBox("TLS insecure")
27+
self.tls_insecure.setChecked(self.settings.value("tls_insecure", False, bool))
28+
29+
self.tls_version = QComboBox(self)
30+
self.tls_version.addItem("TLSv1.2", ssl.PROTOCOL_TLSv1_2)
31+
self.tls_version.addItem("TLSv1.1", ssl.PROTOCOL_TLSv1_1)
32+
self.tls_version.addItem("TLSv1", ssl.PROTOCOL_TLSv1)
33+
34+
tlsLayout.addRow("Use tls", self.use_tls)
35+
tlsLayout.addRow("Cert file", self.tls_file)
36+
tlsLayout.addRow("TLS insecure", self.tls_insecure)
37+
tlsLayout.addRow("TLS Version", self.tls_version)
38+
gbtls.setLayout(tlsLayout)
39+
1840
gbHost = QGroupBox("Hostname and port")
1941
hfl = QFormLayout()
2042
self.hostname = QLineEdit()
@@ -52,7 +74,7 @@ def __init__(self, *args, **kwargs):
5274
hlBtn.addWidgets([btnSave, btnCancel])
5375

5476
vl = VLayout()
55-
vl.addWidgets([gbHost, gbLogin, gbClientId, self.cbConnectStartup])
77+
vl.addWidgets([gbHost, gbtls, gbLogin, gbClientId, self.cbConnectStartup])
5678
vl.addLayout(hlBtn)
5779

5880
self.setLayout(vl)
@@ -67,6 +89,17 @@ def accept(self):
6789
self.settings.setValue("password", self.password.text())
6890
self.settings.setValue("connect_on_startup", self.cbConnectStartup.isChecked())
6991
self.settings.setValue("client_id", self.clientId.text())
92+
self.settings.setValue("tls", self.use_tls.isChecked())
93+
self.settings.setValue("tls_file", self.tls_file.text())
94+
self.settings.setValue("tls_insecure", self.tls_insecure.isChecked())
95+
if self.tls_version.currentText() == "TLSv1.2":
96+
self.settings.setValue("tls_version", ssl.PROTOCOL_TLSv1_2)
97+
elif self.tls_version.currentText() == "TLSv1.1 ":
98+
self.settings.setValue("tls_version", ssl.PROTOCOL_TLSv1_1)
99+
elif self.tls_version.currentText() == "TLSv1":
100+
self.settings.setValue("tls_version", ssl.PROTOCOL_TLSv1)
101+
102+
# self.settings.setValue("client_id", self.clientId.text())
70103
self.settings.sync()
71104
self.done(QDialog.Accepted)
72105

Util/mqtt.py

Lines changed: 26 additions & 0 deletions
< D7AE div data-testid="addition diffstat" class="DiffSquares-module__diffSquare--h5kjy DiffSquares-module__addition--jeNtt">
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import logging
22
import socket
3+
import ssl
34

45
import paho.mqtt.client as mqtt
56
from PyQt5 import QtCore
@@ -33,7 +34,11 @@ def __init__(self, parent=None):
3334

3435
self.m_hostname = ""
3536
self.m_port = 1883
37+
self.m_tls_is_set = False
3638
self.ssl = False
39+
self.m_tls_insecure = True
40+
self.m_tls_version = ssl.PROTOCOL_TLSv1_2
41+
self.m_cert_file = "/cert/cert/ca.crt"
3742
self.m_keepAlive = 60
3843
self.m_cleanSession = True
3944
self.m_protocolVersion = MqttClient.MQTT_3_1
@@ -124,13 +129,34 @@ def connectToHost(self):
124129
if self.m_hostname:
125130
self.connecting.emit()
126131
try:
132+
# TLS setup
133+
if self.ssl and not self.m_tls_is_set:
134+
if self.m_tls_insecure:
135+
self.m_client.tls_set(tls_version=self.m_tls_version)
136+
else:
137+
self.m_client.tls_set(self.m_cert_file, tls_version=self.m_tls_version)
138+
139+
self.m_client.tls_insecure_set(self.m_tls_insecure)
140+
self.m_tls_is_set = True
141+
127142
self.m_client.connect(self.m_hostname, port=self.port, keepalive=self.keepAlive)
128143

129144
self.state = MqttClient.Connecting
130145
self.m_client.loop_start()
131146
except socket.timeout:
132147
self.connectError.emit(3)
133148

149+
@QtCore.pyqtSlot()
150+
def setSSL(self, broker_tls_file, broker_tls_insecure, broker_tls_version):
151+
self.ssl = True
152+
self.m_tls_insecure = broker_tls_insecure
153+
self.m_tls_version = broker_tls_version
154+
self.m_cert_file = broker_tls_file
155+
156+
@QtCore.pyqtSlot()
157+
def unsetSSL(self):
158+
self.ssl = False
159+
134160
@QtCore.pyqtSlot()
135161
def disconnectFromHost(self):
136162
self.m_client.loop_stop()

tdmgr.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -231,17 +231,7 @@ def toggle_autoupdate(self, state):
231231

232232
def toggle_connect(self, state):
233233
if state and self.mqtt.state == self.mqtt.Disconnected:
234-
self.broker_hostname = self.settings.value('hostname', 'localhost')
235-
self.broker_port = self.settings.value('port', 1883, int)
236-
self.broker_username = self.settings.value('username')
237-
self.broker_password = self.settings.value('password')
238-
239-
self.mqtt.hostname = self.broker_hostname
240-
self.mqtt.port = self.broker_port
241-
242-
if self.broker_username:
243-
self.mqtt.setAuth(self.broker_username, self.broker_password)
244-
self.mqtt.connectToHost()
234+
self.mqtt_connect()
245235
elif not state and self.mqtt.state == self.mqtt.Connected:
246236
self.mqtt_disconnect()
247237

@@ -251,11 +241,20 @@ def auto_telemetry(self):
251241
self.mqtt.publish(d.cmnd_topic('STATUS'), payload=8)
252242

253243
def mqtt_connect(self):
244+
self.broker_tls = self.settings.value("tls")
245+
self.broker_tls_file = self.settings.value("tls_file")
246+
self.broker_tls_insecure = self.settings.value("tls_insecure")
247+
self.broker_tls_version = self.settings.value("tls_version")
254248
self.broker_hostname = self.settings.value('hostname', 'localhost')
255249
self.broker_port = self.settings.value('port', 1883, int)
256250
self.broker_username = self.settings.value('username')
257251
self.broker_password = self.settings.value('password')
258252

253+
if self.broker_tls:
254+
self.mqtt.setSSL(self.broker_tls_file, self.broker_tls_insecure, self.broker_tls_version)
255+
else:
256+
self.mqtt.unsetSSL()
257+
259258
self.mqtt.hostname = self.broker_hostname
260259
self.mqtt.port = self.broker_port
261260

0 commit comments

Comments
 (0)
0