tqt payment requests: fix some races - electrum - Electrum Bitcoin wallet (HTM) git clone https://git.parazyd.org/electrum (DIR) Log (DIR) Files (DIR) Refs (DIR) Submodules --- (DIR) commit d2de8de356213585eccb5d4b963429f9a674ed65 (DIR) parent 0ec574bcf8b9d58462efee700df96a744a753435 (HTM) Author: SomberNight <somber.night@protonmail.com> Date: Wed, 5 Jun 2019 16:29:33 +0200 qt payment requests: fix some races closes #5283, #5407, #5121 Diffstat: M electrum/gui/qt/main_window.py | 19 ++++++++++++++----- M electrum/paymentrequest.py | 2 +- 2 files changed, 15 insertions(+), 6 deletions(-) --- (DIR) diff --git a/electrum/gui/qt/main_window.py b/electrum/gui/qt/main_window.py t@@ -1602,11 +1602,15 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger): """Returns whether there are errors with outputs. Also shows error dialog to user if so. """ - if self.payment_request and self.payment_request.has_expired(): - self.show_error(_('Payment request has expired')) - return True + pr = self.payment_request + if pr: + if pr.error: + return True + if pr.has_expired(): + self.show_error(_('Payment request has expired')) + return True - if not self.payment_request: + if not pr: errors = self.payto_e.get_errors() if errors: self.show_warning(_("Invalid Lines found:") + "\n\n" + '\n'.join([ _("Line #") + str(x[0]+1) + ": " + x[1] for x in errors])) t@@ -1820,6 +1824,8 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger): def payment_request_ok(self): pr = self.payment_request + if not pr: + return key = self.invoices.add(pr) status = self.invoices.get_status(key) self.invoice_list.update() t@@ -1840,7 +1846,10 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger): self.amount_e.textEdited.emit("") def payment_request_error(self): - self.show_message(self.payment_request.error) + pr = self.payment_request + if not pr: + return + self.show_message(pr.error) self.payment_request = None self.do_clear() (DIR) diff --git a/electrum/paymentrequest.py b/electrum/paymentrequest.py t@@ -123,6 +123,7 @@ class PaymentRequest: return str(self.raw) def parse(self, r): + self.outputs = [] if self.error: return self.id = bh2u(sha256(r)[0:16]) t@@ -134,7 +135,6 @@ class PaymentRequest: return self.details = pb2.PaymentDetails() self.details.ParseFromString(self.data.serialized_payment_details) - self.outputs = [] for o in self.details.outputs: type_, addr = transaction.get_address_from_output_script(o.script) if type_ != TYPE_ADDRESS: