1
0

qt payment requests: fix some races

closes #5283, #5407, #5121
This commit is contained in:
SomberNight
2019-06-05 16:29:33 +02:00
parent 0ec574bcf8
commit d2de8de356
2 changed files with 15 additions and 6 deletions

View File

@@ -1602,11 +1602,15 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
"""Returns whether there are errors with outputs. """Returns whether there are errors with outputs.
Also shows error dialog to user if so. Also shows error dialog to user if so.
""" """
if self.payment_request and self.payment_request.has_expired(): pr = self.payment_request
self.show_error(_('Payment request has expired')) if pr:
return True 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() errors = self.payto_e.get_errors()
if errors: if errors:
self.show_warning(_("Invalid Lines found:") + "\n\n" + '\n'.join([ _("Line #") + str(x[0]+1) + ": " + x[1] for x in errors])) self.show_warning(_("Invalid Lines found:") + "\n\n" + '\n'.join([ _("Line #") + str(x[0]+1) + ": " + x[1] for x in errors]))
@@ -1820,6 +1824,8 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
def payment_request_ok(self): def payment_request_ok(self):
pr = self.payment_request pr = self.payment_request
if not pr:
return
key = self.invoices.add(pr) key = self.invoices.add(pr)
status = self.invoices.get_status(key) status = self.invoices.get_status(key)
self.invoice_list.update() self.invoice_list.update()
@@ -1840,7 +1846,10 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
self.amount_e.textEdited.emit("") self.amount_e.textEdited.emit("")
def payment_request_error(self): 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.payment_request = None
self.do_clear() self.do_clear()

View File

@@ -123,6 +123,7 @@ class PaymentRequest:
return str(self.raw) return str(self.raw)
def parse(self, r): def parse(self, r):
self.outputs = []
if self.error: if self.error:
return return
self.id = bh2u(sha256(r)[0:16]) self.id = bh2u(sha256(r)[0:16])
@@ -134,7 +135,6 @@ class PaymentRequest:
return return
self.details = pb2.PaymentDetails() self.details = pb2.PaymentDetails()
self.details.ParseFromString(self.data.serialized_payment_details) self.details.ParseFromString(self.data.serialized_payment_details)
self.outputs = []
for o in self.details.outputs: for o in self.details.outputs:
type_, addr = transaction.get_address_from_output_script(o.script) type_, addr = transaction.get_address_from_output_script(o.script)
if type_ != TYPE_ADDRESS: if type_ != TYPE_ADDRESS: