From fc6613faa3ae4eb0203d8f0d52c4432135eceaa7 Mon Sep 17 00:00:00 2001 From: Dmitri Bogomolov <4glitch@gmail.com> Date: Tue, 26 May 2020 13:51:09 +0300 Subject: [PATCH] Sorted things out with validation of NewChanDialog --- src/bitmessageqt/addressvalidator.py | 164 +++++++++++++++++---------- src/bitmessageqt/newchandialog.py | 13 +-- 2 files changed, 112 insertions(+), 65 deletions(-) diff --git a/src/bitmessageqt/addressvalidator.py b/src/bitmessageqt/addressvalidator.py index f9de70a2..5e2f9b0a 100644 --- a/src/bitmessageqt/addressvalidator.py +++ b/src/bitmessageqt/addressvalidator.py @@ -1,22 +1,32 @@ -from PyQt4 import QtGui +""" +The validator for address and passphrase QLineEdits +used in `.dialogs.NewChanDialog`. +""" + from Queue import Empty +from qtpy import QtGui + from addresses import decodeAddress, addBMIfNotPresent from account import getSortedAccounts from queues import apiAddressGeneratorReturnQueue, addressGeneratorQueue from tr import _translate from utils import str_chan -class AddressPassPhraseValidatorMixin(): - def setParams(self, passPhraseObject=None, addressObject=None, feedBackObject=None, buttonBox=None, addressMandatory=True): + +class AddressPassPhraseValidatorMixin(object): + def setParams( + self, passPhraseObject=None, addressObject=None, + feedBackObject=None, button=None, addressMandatory=True + ): self.addressObject = addressObject self.passPhraseObject = passPhraseObject self.feedBackObject = feedBackObject - self.buttonBox = buttonBox self.addressMandatory = addressMandatory self.isValid = False # save default text - self.okButtonLabel = self.buttonBox.button(QtGui.QDialogButtonBox.Ok).text() + self.okButton = button + self.okButtonLabel = button.text() def setError(self, string): if string is not None and self.feedBackObject is not None: @@ -26,12 +36,14 @@ class AddressPassPhraseValidatorMixin(): self.feedBackObject.setStyleSheet("QLabel { color : red; }") self.feedBackObject.setText(string) self.isValid = False - if self.buttonBox: - self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(False) + if self.okButton: + self.okButton.setEnabled(False) if string is not None and self.feedBackObject is not None: - self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText(_translate("AddressValidator", "Invalid")) + self.okButton.setText( + _translate("AddressValidator", "Invalid")) else: - self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText(_translate("AddressValidator", "Validating...")) + self.okButton.setText( + _translate("AddressValidator", "Validating...")) def setOK(self, string): if string is not None and self.feedBackObject is not None: @@ -41,9 +53,9 @@ class AddressPassPhraseValidatorMixin(): self.feedBackObject.setStyleSheet("QLabel { }") self.feedBackObject.setText(string) self.isValid = True - if self.buttonBox: - self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(True) - self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText(self.okButtonLabel) + if self.okButton: + self.okButton.setEnabled(True) + self.okButton.setText(self.okButtonLabel) def checkQueue(self): gotOne = False @@ -55,7 +67,8 @@ class AddressPassPhraseValidatorMixin(): while True: try: - addressGeneratorReturnValue = apiAddressGeneratorReturnQueue.get(False) + addressGeneratorReturnValue = \ + apiAddressGeneratorReturnQueue.get(False) except Empty: if gotOne: break @@ -65,80 +78,115 @@ class AddressPassPhraseValidatorMixin(): gotOne = True if len(addressGeneratorReturnValue) == 0: - self.setError(_translate("AddressValidator", "Address already present as one of your identities.")) - return (QtGui.QValidator.Intermediate, 0) - if addressGeneratorReturnValue[0] == 'chan name does not match address': - self.setError(_translate("AddressValidator", "Although the Bitmessage address you entered was valid, it doesn\'t match the chan name.")) - return (QtGui.QValidator.Intermediate, 0) - self.setOK(_translate("MainWindow", "Passphrase and address appear to be valid.")) + self.setError(_translate( + "AddressValidator", + "Address already present as one of your identities." + )) + return + if addressGeneratorReturnValue[0] == \ + 'chan name does not match address': + self.setError(_translate( + "AddressValidator", + "Although the Bitmessage address you entered was valid," + " it doesn\'t match the chan name." + )) + return + self.setOK(_translate( + "MainWindow", "Passphrase and address appear to be valid.")) def returnValid(self): - if self.isValid: - return QtGui.QValidator.Acceptable - else: - return QtGui.QValidator.Intermediate + return QtGui.QValidator.Acceptable if self.isValid \ + else QtGui.QValidator.Intermediate def validate(self, s, pos): - if self.addressObject is None: + try: + address = self.addressObject.text().encode('utf-8') + except AttributeError: address = None - else: - address = str(self.addressObject.text().toUtf8()) - if address == "": - address = None - if self.passPhraseObject is None: + try: + passPhrase = self.passPhraseObject.text().encode('utf-8') + except AttributeError: passPhrase = "" - else: - passPhrase = str(self.passPhraseObject.text().toUtf8()) - if passPhrase == "": - passPhrase = None # no chan name - if passPhrase is None: - self.setError(_translate("AddressValidator", "Chan name/passphrase needed. You didn't enter a chan name.")) - return (QtGui.QValidator.Intermediate, pos) + if not passPhrase: + self.setError(_translate( + "AddressValidator", + "Chan name/passphrase needed. You didn't enter a chan name." + )) + return (QtGui.QValidator.Intermediate, s, pos) - if self.addressMandatory or address is not None: + if self.addressMandatory or address: # check if address already exists: if address in getSortedAccounts(): - self.setError(_translate("AddressValidator", "Address already present as one of your identities.")) - return (QtGui.QValidator.Intermediate, pos) + self.setError(_translate( + "AddressValidator", + "Address already present as one of your identities." + )) + return (QtGui.QValidator.Intermediate, s, pos) + status = decodeAddress(address)[0] # version too high - if decodeAddress(address)[0] == 'versiontoohigh': - self.setError(_translate("AddressValidator", "Address too new. Although that Bitmessage address might be valid, its version number is too new for us to handle. Perhaps you need to upgrade Bitmessage.")) - return (QtGui.QValidator.Intermediate, pos) - + if status == 'versiontoohigh': + self.setError(_translate( + "AddressValidator", + "Address too new. Although that Bitmessage address" + " might be valid, its version number is too new" + " for us to handle. Perhaps you need to upgrade" + " Bitmessage." + )) + return (QtGui.QValidator.Intermediate, s, pos) # invalid - if decodeAddress(address)[0] != 'success': - self.setError(_translate("AddressValidator", "The Bitmessage address is not valid.")) - return (QtGui.QValidator.Intermediate, pos) + if status != 'success': + self.setError(_translate( + "AddressValidator", + "The Bitmessage address is not valid." + )) + return (QtGui.QValidator.Intermediate, s, pos) # this just disables the OK button without changing the feedback text # but only if triggered by textEdited, not by clicking the Ok button - if not self.buttonBox.button(QtGui.QDialogButtonBox.Ok).hasFocus(): + if not self.okButton.hasFocus(): self.setError(None) # check through generator - if address is None: - addressGeneratorQueue.put(('createChan', 4, 1, str_chan + ' ' + str(passPhrase), passPhrase, False)) + if not address: + addressGeneratorQueue.put(( + 'createChan', 4, 1, + str_chan + ' ' + passPhrase, passPhrase, False + )) else: - addressGeneratorQueue.put(('joinChan', addBMIfNotPresent(address), str_chan + ' ' + str(passPhrase), passPhrase, False)) + addressGeneratorQueue.put(( + 'joinChan', addBMIfNotPresent(address), + str_chan + ' ' + passPhrase, passPhrase, False + )) - if self.buttonBox.button(QtGui.QDialogButtonBox.Ok).hasFocus(): - return (self.returnValid(), pos) + if self.okButton.hasFocus(): + return (self.returnValid(), s, pos) else: - return (QtGui.QValidator.Intermediate, pos) + return (QtGui.QValidator.Intermediate, s, pos) def checkData(self): - return self.validate("", 0) + return self.validate(u"", 0) + class AddressValidator(QtGui.QValidator, AddressPassPhraseValidatorMixin): - def __init__(self, parent=None, passPhraseObject=None, feedBackObject=None, buttonBox=None, addressMandatory=True): + def __init__( + self, parent=None, passPhraseObject=None, feedBackObject=None, + button=None, addressMandatory=True + ): super(AddressValidator, self).__init__(parent) - self.setParams(passPhraseObject, parent, feedBackObject, buttonBox, addressMandatory) + self.setParams( + passPhraseObject, parent, feedBackObject, button, + addressMandatory) class PassPhraseValidator(QtGui.QValidator, AddressPassPhraseValidatorMixin): - def __init__(self, parent=None, addressObject=None, feedBackObject=None, buttonBox=None, addressMandatory=False): + def __init__( + self, parent=None, addressObject=None, feedBackObject=None, + button=None, addressMandatory=False + ): super(PassPhraseValidator, self).__init__(parent) - self.setParams(parent, addressObject, feedBackObject, buttonBox, addressMandatory) + self.setParams( + parent, addressObject, feedBackObject, button, + addressMandatory) diff --git a/src/bitmessageqt/newchandialog.py b/src/bitmessageqt/newchandialog.py index 0b85d94c..7ab5fcb6 100644 --- a/src/bitmessageqt/newchandialog.py +++ b/src/bitmessageqt/newchandialog.py @@ -21,10 +21,10 @@ class NewChanDialog(QtWidgets.QDialog): self.parent = parent self.chanAddress.setValidator(AddressValidator( self.chanAddress, self.chanPassPhrase, self.validatorFeedback, - self.buttonBox, False)) + self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok), False)) self.chanPassPhrase.setValidator(PassPhraseValidator( self.chanPassPhrase, self.chanAddress, self.validatorFeedback, - self.buttonBox, False)) + self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok), False)) self.timer = QtCore.QTimer() self.timer.timeout.connect(self.delayedUpdateStatus) @@ -41,17 +41,16 @@ class NewChanDialog(QtWidgets.QDialog): self.timer.stop() self.hide() apiAddressGeneratorReturnQueue.queue.clear() + passPhrase = self.chanPassPhrase.text().encode('utf-8') if self.chanAddress.text() == "": addressGeneratorQueue.put(( 'createChan', 4, 1, - str_chan + ' ' + str(self.chanPassPhrase.text()), - self.chanPassPhrase.text(), True + str_chan + ' ' + passPhrase, passPhrase, True )) else: addressGeneratorQueue.put(( 'joinChan', addBMIfNotPresent(self.chanAddress.text()), - str_chan + ' ' + str(self.chanPassPhrase.text()), - self.chanPassPhrase.text(), True + str_chan + ' ' + passPhrase, passPhrase, True )) addressGeneratorReturnValue = apiAddressGeneratorReturnQueue.get(True) if (len(addressGeneratorReturnValue) > 0 @@ -62,7 +61,7 @@ class NewChanDialog(QtWidgets.QDialog): _translate( "newchandialog", "Successfully created / joined chan {0}" - ).format(self.chanPassPhrase.text()) + ).format(passPhrase) )) self.parent.ui.tabWidget.setCurrentIndex( self.parent.ui.tabWidget.indexOf(self.parent.ui.chans)