--- a/MqttMonitor/MqttConnectionProfilesDialog.py Mon Jun 28 17:44:07 2021 +0200 +++ b/MqttMonitor/MqttConnectionProfilesDialog.py Sun Jul 18 18:30:15 2021 +0200 @@ -20,6 +20,8 @@ from .Ui_MqttConnectionProfilesDialog import Ui_MqttConnectionProfilesDialog +from .MqttClient import MqttClient, MqttProtocols + import UI.PixmapCache from Utilities.crypto import pwConvert @@ -28,18 +30,16 @@ """ Class implementing a dialog to edit the MQTT connection profiles. """ - def __init__(self, client, profiles, parent=None): + def __init__(self, profiles, parent=None): """ Constructor - @param client reference to the MQTT client object - @type MqttClient @param profiles dictionary containing dictionaries containing the connection parameters. Each entry must have the keys - "BrokerAddress", "BrokerPort", "ClientId", - "Keepalive", "CleanSession", "Username", "Password", "WillTopic", - "WillMessage", "WillQos", "WillRetain", "TlsEnable", "TlsCaCert", - "TlsClientCert", "TlsClientKey", "ConnectionTimeout". + "BrokerAddress", "BrokerPort", "ClientId", "Protocol", + "ConnectionTimeout", "Keepalive", "CleanSession", "Username", + "Password", "WillTopic", "WillMessage", "WillQos", "WillRetain", + "TlsEnable", "TlsCaCert", "TlsClientCert", "TlsClientKey". @type dict @param parent reference to the parent widget @type QWidget @@ -47,8 +47,6 @@ super().__init__(parent) self.setupUi(self) - self.__client = client - self.__profiles = collections.defaultdict(self.__defaultProfile) self.__profiles.update(profiles) self.__profilesChanged = False @@ -239,10 +237,10 @@ @return dictionary containing dictionaries containing the defined connection profiles. Each entry have the keys "BrokerAddress", - "BrokerPort", "ClientId", "Keepalive", "CleanSession", "Username", - "Password", "WillTopic", "WillMessage", "WillQos", "WillRetain", - "TlsEnable", "TlsCaCert", "TlsClientCert", "TlsClientKey", - "ConnectionTimeout". + "BrokerPort", "ClientId", "Protocol", "ConnectionTimeout", + "Keepalive", "CleanSession", "Username", "Password", "WillTopic", + "WillMessage", "WillQos", "WillRetain", "TlsEnable", "TlsCaCert", + "TlsClientCert", "TlsClientKey". @rtype dict """ profilesDict = {} @@ -256,11 +254,21 @@ @return name of the applied profile @rtype str """ + if self.mqttv31Button.isChecked(): + protocol = MqttProtocols.MQTTv31 + elif self.mqttv311Button.isChecked(): + protocol = MqttProtocols.MQTTv311 + elif self.mqttv5Button.isChecked(): + protocol = MqttProtocols.MQTTv5 + else: + protocol = MqttProtocols.MQTTv311 + profileName = self.profileEdit.text() - profile = { + connectionProfile = { "BrokerAddress": self.brokerAddressEdit.text(), "BrokerPort": self.brokerPortSpinBox.value(), "ClientId": self.clientIdEdit.text(), + "Protocol": protocol, "ConnectionTimeout": self.connectionTimeoutSpinBox.value(), "Keepalive": self.keepaliveSpinBox.value(), "CleanSession": self.cleanSessionCheckBox.isChecked(), @@ -275,18 +283,18 @@ "TlsClientCert": "", "TlsClientKey": "", } - if profile["TlsEnable"]: + if connectionProfile["TlsEnable"]: if self.tlsCertsFileButton.isChecked(): - profile["TlsCaCert"] = self.tlsCertsFilePicker.text() + connectionProfile["TlsCaCert"] = self.tlsCertsFilePicker.text() elif self.tlsSelfSignedCertsButton.isChecked(): - profile["TlsCaCert"] = ( + connectionProfile["TlsCaCert"] = ( self.tlsSelfSignedCertsFilePicker.text()) - profile["TlsClientCert"] = ( + connectionProfile["TlsClientCert"] = ( self.tlsSelfSignedClientCertFilePicker.text()) - profile["TlsClientKey"] = ( + connectionProfile["TlsClientKey"] = ( self.tlsSelfSignedClientKeyFilePicker.text()) - self.__profiles[profileName] = profile + self.__profiles[profileName] = connectionProfile self.__profilesChanged = True return profileName @@ -298,7 +306,7 @@ @return default dictionary entry @rtype dict """ - defaultProfile = self.__client.defaultConnectionOptions() + defaultProfile = MqttClient.defaultConnectionOptions() defaultProfile["BrokerAddress"] = "" if defaultProfile["TlsEnable"]: defaultProfile["BrokerPort"] = 8883 @@ -338,36 +346,48 @@ @param profileName name of the profile to get data from @type str """ - profile = self.__defaultProfile() + connectionProfile = self.__defaultProfile() if profileName: - profile.update(self.__profiles[profileName]) + connectionProfile.update(self.__profiles[profileName]) self.__populatingProfile = True if profileName is not None: self.profileEdit.setText(profileName) - self.brokerAddressEdit.setText(profile["BrokerAddress"]) - self.brokerPortSpinBox.setValue(profile["BrokerPort"]) - self.clientIdEdit.setText(profile["ClientId"]) - self.connectionTimeoutSpinBox.setValue(profile["ConnectionTimeout"]) - self.keepaliveSpinBox.setValue(profile["Keepalive"]) - self.cleanSessionCheckBox.setChecked(profile["CleanSession"]) - self.usernameEdit.setText(profile["Username"]) - self.passwordEdit.setText(pwConvert(profile["Password"], encode=False)) - self.willTopicEdit.setText(profile["WillTopic"]) - self.willMessageEdit.setPlainText(profile["WillMessage"]) - self.willQosSpinBox.setValue(profile["WillQos"]) - self.willRetainCheckBox.setChecked(profile["WillRetain"]) - self.tlsGroupBox.setChecked(profile["TlsEnable"]) - if profile["TlsCaCert"] and profile["TlsClientCert"]: + self.brokerAddressEdit.setText(connectionProfile["BrokerAddress"]) + self.brokerPortSpinBox.setValue(connectionProfile["BrokerPort"]) + self.clientIdEdit.setText(connectionProfile["ClientId"]) + self.mqttv31Button.setChecked( + connectionProfile["Protocol"] == MqttProtocols.MQTTv31) + self.mqttv311Button.setChecked( + connectionProfile["Protocol"] == MqttProtocols.MQTTv311) + self.mqttv5Button.setChecked( + connectionProfile["Protocol"] == MqttProtocols.MQTTv5) + self.connectionTimeoutSpinBox.setValue( + connectionProfile["ConnectionTimeout"]) + self.keepaliveSpinBox.setValue(connectionProfile["Keepalive"]) + self.cleanSessionCheckBox.setChecked(connectionProfile["CleanSession"]) + self.usernameEdit.setText(connectionProfile["Username"]) + self.passwordEdit.setText( + pwConvert(connectionProfile["Password"], encode=False)) + self.willTopicEdit.setText(connectionProfile["WillTopic"]) + self.willMessageEdit.setPlainText(connectionProfile["WillMessage"]) + self.willQosSpinBox.setValue(connectionProfile["WillQos"]) + self.willRetainCheckBox.setChecked(connectionProfile["WillRetain"]) + self.tlsGroupBox.setChecked(connectionProfile["TlsEnable"]) + if ( + connectionProfile["TlsCaCert"] and + connectionProfile["TlsClientCert"] + ): self.tlsSelfSignedCertsButton.setChecked(True) - self.tlsSelfSignedCertsFilePicker.setText(profile["TlsCaCert"]) + self.tlsSelfSignedCertsFilePicker.setText( + connectionProfile["TlsCaCert"]) self.tlsSelfSignedClientCertFilePicker.setText( - profile["TlsClientCert"]) + connectionProfile["TlsClientCert"]) self.tlsSelfSignedClientKeyFilePicker.setText( - profile["TlsClientKey"]) - elif profile["TlsCaCert"]: + connectionProfile["TlsClientKey"]) + elif connectionProfile["TlsCaCert"]: self.tlsCertsFileButton.setChecked(True) - self.tlsCertsFilePicker.setText(profile["TlsCaCert"]) + self.tlsCertsFilePicker.setText(connectionProfile["TlsCaCert"]) else: self.tlsDefaultCertsButton.setChecked(True) self.__populatingProfile = False @@ -385,6 +405,7 @@ self.brokerAddressEdit.setText("") self.brokerPortSpinBox.setValue(1883) self.clientIdEdit.setText("") + self.mqttv311Button.setChecked(True) self.keepaliveSpinBox.setValue(60) self.cleanSessionCheckBox.setChecked(True) self.usernameEdit.setText("") @@ -436,40 +457,56 @@ return False elif profileName in self.__profiles: - profile = self.__defaultProfile() - profile.update(self.__profiles[profileName]) + if self.mqttv31Button.isChecked(): + protocol = MqttProtocols.MQTTv31 + elif self.mqttv311Button.isChecked(): + protocol = MqttProtocols.MQTTv311 + elif self.mqttv5Button.isChecked(): + protocol = MqttProtocols.MQTTv5 + else: + protocol = MqttProtocols.MQTTv311 + + connectionProfile = self.__defaultProfile() + connectionProfile.update(self.__profiles[profileName]) changed = ( - self.brokerAddressEdit.text() != profile["BrokerAddress"] or - self.brokerPortSpinBox.value() != profile["BrokerPort"] or - self.clientIdEdit.text() != profile["ClientId"] or + self.brokerAddressEdit.text() != + connectionProfile["BrokerAddress"] or + self.brokerPortSpinBox.value() != + connectionProfile["BrokerPort"] or + self.clientIdEdit.text() != connectionProfile["ClientId"] or + protocol != connectionProfile["Protocol"] or self.connectionTimeoutSpinBox.value() != - profile["ConnectionTimeout"] or - self.keepaliveSpinBox.value() != profile["Keepalive"] or + connectionProfile["ConnectionTimeout"] or + self.keepaliveSpinBox.value() != + connectionProfile["Keepalive"] or self.cleanSessionCheckBox.isChecked() != - profile["CleanSession"] or - self.usernameEdit.text() != profile["Username"] or + connectionProfile["CleanSession"] or + self.usernameEdit.text() != connectionProfile["Username"] or self.passwordEdit.text() != - pwConvert(profile["Password"], encode=False) or - self.willTopicEdit.text() != profile["WillTopic"] or - self.willMessageEdit.toPlainText() != profile["WillMessage"] or - self.willQosSpinBox.value() != profile["WillQos"] or - self.willRetainCheckBox.isChecked() != profile["WillRetain"] or - self.tlsGroupBox.isChecked() != profile["TlsEnable"] + pwConvert(connectionProfile["Password"], encode=False) or + self.willTopicEdit.text() != connectionProfile["WillTopic"] or + self.willMessageEdit.toPlainText() != + connectionProfile["WillMessage"] or + self.willQosSpinBox.value() != connectionProfile["WillQos"] or + self.willRetainCheckBox.isChecked() != + connectionProfile["WillRetain"] or + self.tlsGroupBox.isChecked() != connectionProfile["TlsEnable"] ) # check TLS stuff only, if not yet changed if not changed: if self.tlsCertsFileButton.isChecked(): changed |= ( - self.tlsCertsFilePicker.text() != profile["TlsCaCert"] + self.tlsCertsFilePicker.text() != + connectionProfile["TlsCaCert"] ) elif self.tlsSelfSignedCertsButton.isChecked(): changed |= ( self.tlsSelfSignedCertsFilePicker.text() != - profile["TlsCaCert"] or + connectionProfile["TlsCaCert"] or self.tlsSelfSignedClientCertFilePicker.text() != - profile["TlsClientCert"] or + connectionProfile["TlsClientCert"] or self.tlsSelfSignedClientKeyFilePicker.text() != - profile["TlsClientKey"] + connectionProfile["TlsClientKey"] ) return changed