URI: 
       tImproved password wrapper. - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit b0ca9afc1e62bfcb9b67e412d232e9722d06d237
   DIR parent 9f665c9994a19210b1aa8946f866f01867a6d5ab
  HTML Author: Neil Booth <kyuupichan@gmail.com>
       Date:   Sat,  4 Jul 2015 18:13:26 +0900
       
       Improved password wrapper.
       
       Doesn't require any particular argument order of the wrapped
       function.
       Caller can tell if the user cancelled the request or not.
       Optionally handles parent window hints.
       
       Diffstat:
         M gui/qt/main_window.py               |      55 ++++++++++++++++---------------
       
       1 file changed, 29 insertions(+), 26 deletions(-)
       ---
   DIR diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py
       t@@ -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():
       t@@ -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:
       t@@ -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()