diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py index d397e958..3d978542 100644 --- a/gui/qt/main_window.py +++ b/gui/qt/main_window.py @@ -1081,7 +1081,31 @@ class ElectrumWindow(QMainWindow): self.completions.setStringList(l) def protected(func): - return lambda s, *args: s.do_protect(func, args) + '''Password request wrapper. The password is passed to the function + as the 'password' named argument. Return value is a 2-element + tuple: (Cancelled, Result) where Cancelled is True if the user + cancels the password request, otherwise False. Result is the + return value of the wrapped function, or None if cancelled. + ''' + def request_password(self, *args, **kwargs): + parent = kwargs.get('parent', self) + if self.wallet.use_encryption: + while True: + password = self.password_dialog(parent=parent) + if not password: + return True, None + try: + self.wallet.check_password(password) + break + except Exception as e: + QMessageBox.warning(parent, _('Error'), str(e), _('OK')) + continue + else: + password = None + + kwargs['password'] = password + return False, func(self, *args, **kwargs) + return request_password def read_send_tab(self): if self.payment_request and self.payment_request.has_expired(): @@ -1896,29 +1920,6 @@ class ElectrumWindow(QMainWindow): d = QRDialog(data, self, title) d.exec_() - - def do_protect(self, func, args): - if self.wallet.use_encryption: - while True: - password = self.password_dialog() - if not password: - return - try: - self.wallet.check_password(password) - break - except Exception as e: - QMessageBox.warning(self, _('Error'), str(e), _('OK')) - continue - else: - password = None - - if args != (False,): - args = (self,) + args + (password,) - else: - args = (self, password) - apply(func, args) - - def show_public_keys(self, address): if not address: return try: @@ -2098,8 +2099,10 @@ class ElectrumWindow(QMainWindow): def show_warning(self, msg): QMessageBox.warning(self, _('Warning'), msg, _('OK')) - def password_dialog(self, msg=None): - d = QDialog(self) + def password_dialog(self, msg=None, parent=None): + if parent == None: + parent = self + d = QDialog(parent) d.setModal(1) d.setWindowTitle(_("Enter Password")) pw = QLineEdit()