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.
This commit is contained in:
Neil Booth 2015-07-04 18:13:26 +09:00
parent 9f665c9994
commit b0ca9afc1e
1 changed files with 29 additions and 26 deletions

View File

@ -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()