|
|
@ -244,6 +244,7 @@ class ElectrumWindow(App): |
|
|
|
self.tabs = None |
|
|
|
self.is_exit = False |
|
|
|
self.wallet = None |
|
|
|
self.pause_time = 0 |
|
|
|
|
|
|
|
App.__init__(self)#, **kwargs) |
|
|
|
|
|
|
@ -445,7 +446,6 @@ class ElectrumWindow(App): |
|
|
|
#win.softinput_mode = 'below_target' |
|
|
|
self.on_size(win, win.size) |
|
|
|
self.init_ui() |
|
|
|
self.load_wallet_by_name(self.electrum_config.get_wallet_path()) |
|
|
|
# init plugins |
|
|
|
run_hook('init_kivy', self) |
|
|
|
# fiat currency |
|
|
@ -467,6 +467,8 @@ class ElectrumWindow(App): |
|
|
|
self.network.register_callback(self.on_fee, ['fee']) |
|
|
|
self.network.register_callback(self.on_quotes, ['on_quotes']) |
|
|
|
self.network.register_callback(self.on_history, ['on_history']) |
|
|
|
# load wallet |
|
|
|
self.load_wallet_by_name(self.electrum_config.get_wallet_path()) |
|
|
|
# URI passed in config |
|
|
|
uri = self.electrum_config.get('url') |
|
|
|
if uri: |
|
|
@ -484,17 +486,18 @@ class ElectrumWindow(App): |
|
|
|
wallet.start_threads(self.daemon.network) |
|
|
|
self.daemon.add_wallet(wallet) |
|
|
|
self.load_wallet(wallet) |
|
|
|
self.on_resume() |
|
|
|
|
|
|
|
def load_wallet_by_name(self, path): |
|
|
|
if not path: |
|
|
|
return |
|
|
|
if self.wallet and self.wallet.storage.path == path: |
|
|
|
return |
|
|
|
wallet = self.daemon.load_wallet(path, None) |
|
|
|
if wallet: |
|
|
|
if wallet != self.wallet: |
|
|
|
self.stop_wallet() |
|
|
|
if wallet.has_password(): |
|
|
|
self.password_dialog(wallet, _('Enter PIN code'), lambda x: self.load_wallet(wallet), self.stop) |
|
|
|
else: |
|
|
|
self.load_wallet(wallet) |
|
|
|
self.on_resume() |
|
|
|
else: |
|
|
|
Logger.debug('Electrum: Wallet not found. Launching install wizard') |
|
|
|
storage = WalletStorage(path) |
|
|
@ -504,6 +507,7 @@ class ElectrumWindow(App): |
|
|
|
wizard.run(action) |
|
|
|
|
|
|
|
def on_stop(self): |
|
|
|
Logger.info('on_stop') |
|
|
|
self.stop_wallet() |
|
|
|
|
|
|
|
def stop_wallet(self): |
|
|
@ -617,6 +621,8 @@ class ElectrumWindow(App): |
|
|
|
|
|
|
|
@profiler |
|
|
|
def load_wallet(self, wallet): |
|
|
|
if self.wallet: |
|
|
|
self.stop_wallet() |
|
|
|
self.wallet = wallet |
|
|
|
self.update_wallet() |
|
|
|
# Once GUI has been initialized check if we want to announce something |
|
|
@ -625,6 +631,7 @@ class ElectrumWindow(App): |
|
|
|
self.receive_screen.clear() |
|
|
|
self.update_tabs() |
|
|
|
run_hook('load_wallet', wallet, self) |
|
|
|
print('load wallet done', self.wallet) |
|
|
|
|
|
|
|
def update_status(self, *dt): |
|
|
|
self.num_blocks = self.network.get_local_height() |
|
|
@ -684,12 +691,16 @@ class ElectrumWindow(App): |
|
|
|
Logger.Error('Notification: needs plyer; `sudo pip install plyer`') |
|
|
|
|
|
|
|
def on_pause(self): |
|
|
|
self.pause_time = time.time() |
|
|
|
# pause nfc |
|
|
|
if self.nfcscanner: |
|
|
|
self.nfcscanner.nfc_disable() |
|
|
|
return True |
|
|
|
|
|
|
|
def on_resume(self): |
|
|
|
now = time.time() |
|
|
|
if self.wallet.has_password and now - self.pause_time > 60: |
|
|
|
self.password_dialog(self.wallet, _('Enter PIN'), None, self.stop) |
|
|
|
if self.nfcscanner: |
|
|
|
self.nfcscanner.nfc_enable() |
|
|
|
|
|
|
@ -875,7 +886,8 @@ class ElectrumWindow(App): |
|
|
|
|
|
|
|
def protected(self, msg, f, args): |
|
|
|
if self.wallet.has_password(): |
|
|
|
self.password_dialog(msg, f, args) |
|
|
|
on_success = lambda pw: f(*(args + (pw,))) |
|
|
|
self.password_dialog(self.wallet, msg, on_success, lambda: None) |
|
|
|
else: |
|
|
|
f(*(args + (None,))) |
|
|
|
|
|
|
@ -887,7 +899,7 @@ class ElectrumWindow(App): |
|
|
|
|
|
|
|
def _delete_wallet(self, b): |
|
|
|
if b: |
|
|
|
basename = os.path.basename(self.wallet.storage.path) |
|
|
|
basename = self.wallet.basename() |
|
|
|
self.protected(_("Enter your PIN code to confirm deletion of {}").format(basename), self.__delete_wallet, ()) |
|
|
|
|
|
|
|
def __delete_wallet(self, pw): |
|
|
@ -925,40 +937,23 @@ class ElectrumWindow(App): |
|
|
|
if passphrase: |
|
|
|
label.text += '\n\n' + _('Passphrase') + ': ' + passphrase |
|
|
|
|
|
|
|
def change_password(self, cb): |
|
|
|
if self.wallet.has_password(): |
|
|
|
self.protected(_("Changing PIN code.") + '\n' + _("Enter your current PIN:"), self._change_password, (cb,)) |
|
|
|
else: |
|
|
|
self._change_password(cb, None) |
|
|
|
|
|
|
|
def _change_password(self, cb, old_password): |
|
|
|
if self.wallet.has_password(): |
|
|
|
if old_password is None: |
|
|
|
return |
|
|
|
try: |
|
|
|
self.wallet.check_password(old_password) |
|
|
|
except InvalidPassword: |
|
|
|
self.show_error("Invalid PIN") |
|
|
|
return |
|
|
|
self.password_dialog(_('Enter new PIN'), self._change_password2, (cb, old_password,)) |
|
|
|
|
|
|
|
def _change_password2(self, cb, old_password, new_password): |
|
|
|
self.password_dialog(_('Confirm new PIN'), self._change_password3, (cb, old_password, new_password)) |
|
|
|
|
|
|
|
def _change_password3(self, cb, old_password, new_password, confirmed_password): |
|
|
|
if new_password == confirmed_password: |
|
|
|
self.wallet.update_password(old_password, new_password) |
|
|
|
cb() |
|
|
|
else: |
|
|
|
self.show_error("PIN numbers do not match") |
|
|
|
def password_dialog(self, wallet, msg, on_success, on_failure): |
|
|
|
from .uix.dialogs.password_dialog import PasswordDialog |
|
|
|
if self._password_dialog is None: |
|
|
|
self._password_dialog = PasswordDialog() |
|
|
|
self._password_dialog.init(self, wallet, msg, on_success, on_failure) |
|
|
|
self._password_dialog.open() |
|
|
|
|
|
|
|
def password_dialog(self, msg, f, args): |
|
|
|
def change_password(self, cb): |
|
|
|
from .uix.dialogs.password_dialog import PasswordDialog |
|
|
|
def callback(pw): |
|
|
|
Clock.schedule_once(lambda x: f(*(args + (pw,))), 0.1) |
|
|
|
if self._password_dialog is None: |
|
|
|
self._password_dialog = PasswordDialog() |
|
|
|
self._password_dialog.init(msg, callback) |
|
|
|
message = _("Changing PIN code.") + '\n' + _("Enter your current PIN:") |
|
|
|
def on_success(old_password, new_password): |
|
|
|
self.wallet.update_password(old_password, new_password) |
|
|
|
self.show_info(_("Your PIN code was updated")) |
|
|
|
on_failure = lambda: self.show_error(_("PIN codes do not match")) |
|
|
|
self._password_dialog.init(self, self.wallet, message, on_success, on_failure, is_change=1) |
|
|
|
self._password_dialog.open() |
|
|
|
|
|
|
|
def export_private_keys(self, pk_label, addr): |
|
|
|