def _wallet_path(self, name=""): if name is None: if not self.wallet: raise ValueError("No wallet selected") return self.wallet.storage.path else: wallets_dir = join(util.user_dir(), "wallets") util.make_dir(wallets_dir) return util.standardize_path(join(wallets_dir, name))
def start_new_window(self, path, uri): '''Raises the window for the wallet if it is open. Otherwise opens the wallet and creates a new window for it.''' path = standardize_path( path) # just make sure some plugin didn't give us a symlink for w in self.windows: if w.wallet.storage.path == path: w.bring_to_top() break else: try: wallet = self.daemon.load_wallet(path, None) if not wallet: storage = WalletStorage(path, manual_upgrades=True) wizard = InstallWizard(self.config, self.app, self.plugins, storage) try: wallet = wizard.run_and_get_wallet() except UserCancelled: pass except GoBack as e: self.print_error( '[start_new_window] Exception caught (GoBack)', e) finally: wizard.terminate() del wizard gc.collect( ) # wizard sticks around in memory sometimes, otherwise :/ if not wallet: return wallet.start_threads(self.daemon.network) self.daemon.add_wallet(wallet) except BaseException as e: traceback.print_exc(file=sys.stdout) if '2fa' in str(e): self.warning( title=_('Error'), message= '2FA wallets for Bitcoin Cash are currently unsupported by <a href="https://api.trustedcoin.com/#/">TrustedCoin</a>. Follow <a href="https://github.com/Electron-Cash/Electron-Cash/issues/41#issuecomment-357468208">this guide</a> in order to recover your funds.' ) else: self.warning(title=_('Error'), message='Cannot load wallet:\n' + str(e)) return w = self.create_window_for_wallet(wallet) if uri: w.pay_to_URI(uri) w.bring_to_top() w.setWindowState(w.windowState() & ~Qt.WindowMinimized | Qt.WindowActive) # this will activate the window w.activateWindow() return w
def start_new_window(self, path, uri): '''Raises the window for the wallet if it is open. Otherwise opens the wallet and creates a new window for it. `path=None` is a special usage which will raise the last activated window or open the 'last wallet' if no windows are open.''' if not path: if not self.windows: # This branch is taken if nothing is currently open but # path == None, in which case set path=last wallet self.config.open_last_wallet() path = self.config.get_wallet_path() elif self._last_active_window: # This branch is taken if we have windows open and we have # _last_active_window defined, in which case we specify # that this window should be activated by setting path # so that the for loop below will trigger on this window. w = self._last_active_window() # weak ref -> strong ref if w and w in self.windows: # check ref still alive # this will cause the last active window to be used in the # for loop below path = w.wallet.storage.path # NB: path may still be None here if it came in as None from args and # if the above logic couldn't select a window to use -- in which case # we'll end up picking self.windows[0] path = path and standardize_path( path) # just make sure some plugin didn't give us a symlink for w in self.windows: if not path or w.wallet.storage.path == path: path = w.wallet.storage.path # remember path in case it was None w.bring_to_top() break else: try: try: wallet = self.daemon.load_wallet(path, None) except BaseException as e: self.print_error(repr(e)) if self.windows: # *Not* starting up. Propagate exception out to present # error message box to user. raise e # We're just starting up, so we are tolerant of bad wallets # and just want to proceed to the InstallWizard so the user # can either specify a different wallet or create a new one. # (See issue #1189 where before they would get stuck) path = self.get_new_wallet_path( ) # give up on this unknown wallet and try a new name.. note if things get really bad this will raise FileNotFoundError and the app aborts here. wallet = None # fall thru to wizard if not wallet: storage = WalletStorage(path, manual_upgrades=True) wizard = InstallWizard(self.config, self.app, self.plugins, storage, 'New/Restore Wallet') try: wallet = wizard.run_and_get_wallet() except UserCancelled: pass except GoBack as e: self.print_error( '[start_new_window] Exception caught (GoBack)', e) finally: wizard.terminate() del wizard gc.collect( ) # wizard sticks around in memory sometimes, otherwise :/ if not wallet: return wallet.start_threads(self.daemon.network) self.daemon.add_wallet(wallet) except BaseException as e: traceback.print_exc(file=sys.stdout) if '2fa' in str(e): self.warning( title=_('Error'), message= '2FA wallets for Bitcoin Cash are currently unsupported by <a href="https://api.trustedcoin.com/#/">TrustedCoin</a>. Follow <a href="https://github.com/Electron-Cash/Electron-Cash/issues/41#issuecomment-357468208">this guide</a> in order to recover your funds.' ) else: self.warning(title=_('Error'), message='Cannot load wallet:\n' + str(e), icon=QMessageBox.Critical) return w = self.create_window_for_wallet(wallet) if uri: w.pay_to_URI(uri) w.bring_to_top() w.setWindowState(w.windowState() & ~Qt.WindowMinimized | Qt.WindowActive) # this will activate the window w.activateWindow() return w
def start_new_window(self, path, uri, *, app_is_starting=False): '''Raises the window for the wallet if it is open. Otherwise opens the wallet and creates a new window for it. `path=None` is a special usage which will raise the last activated window or open the 'last wallet' if no windows are open.''' wallet = None if not path: if not self.windows: # This branch is taken if nothing is currently open but # path == None, in which case set path=last wallet self.config.open_last_wallet() path = self.config.get_wallet_path() elif self._last_active_window: # This branch is taken if we have windows open and we have # _last_active_window defined, in which case we specify # that this window should be activated by setting path # so that the for loop below will trigger on this window. w = self._last_active_window() # weak ref -> strong ref if w and w in self.windows: # check ref still alive # this will cause the last active window to be used in the # for loop below path = w.wallet.storage.path # NB: path may still be None here if it came in as None from args and # if the above logic couldn't select a window to use -- in which case # we'll end up picking self.windows[0] path = path and standardize_path( path) # just make sure some plugin didn't give us a symlink try: wallet = self.daemon.load_wallet(path, None) except BaseException as e: traceback.print_exc(file=sys.stdout) d = QtWidgets.QMessageBox( QtWidgets.QMessageBox.Warning, _('Error'), _('Cannot load wallet') + ' (1):\n' + str(e)) d.exec_() # if app is starting, still let wizard to appear if not app_is_starting: return if not wallet: try: wallet = self._start_wizard_to_select_or_create_wallet(path) except (WalletFileException, BitcoinException) as e: traceback.print_exc(file=sys.stderr) QtWidgets.QMessageBox.warning( None, _('Error'), _('Cannot load wallet') + ' (2):\n' + str(e)) if not wallet: return # create or raise window try: if not self.windows: self.warn_if_no_secp() for w in self.windows: if w.wallet.storage.path == wallet.storage.path: w.bring_to_top() return w = self._create_window_for_wallet(wallet) except BaseException as e: traceback.print_exc(file=sys.stdout) d = QtWidgets.QMessageBox( QtWidgets.QMessageBox.Warning, _('Error'), _('Cannot create window for wallet:') + '\n' + str(e)) d.exec_() return if uri: w.pay_to_URI(uri) w.bring_to_top() w.setWindowState(w.windowState() & ~QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive) # this will activate the window w.activateWindow() return w
def _wallet_path(self, name=""): wallets_dir = join(util.user_dir(), "wallets") util.make_dir(wallets_dir) return util.standardize_path(join(wallets_dir, name))
def start_new_window(self, path, uri): '''Raises the window for the wallet if it is open. Otherwise opens the wallet and creates a new window for it.''' path = standardize_path(path) # just make sure some plugin didn't give us a symlink for w in self.windows: if w.wallet.storage.path == path: w.bring_to_top() break else: try: if not self.windows: self.warn_if_no_secp() try: wallet = self.daemon.load_wallet(path, None) except BaseException as e: self.print_error(repr(e)) if self.windows: # *Not* starting up. Propagate exception out to present # error message box to user. raise e # We're just starting up, so we are tolerant of bad wallets # and just want to proceed to the InstallWizard so the user # can either specify a different wallet or create a new one. # (See issue #1189 where before they would get stuck) path = self.get_new_wallet_path() # give up on this unknown wallet and try a new name.. note if things get really bad this will raise FileNotFoundError and the app aborts here. wallet = None # fall thru to wizard if not wallet: storage = WalletStorage(path, manual_upgrades=True) wizard = InstallWizard(self.config, self.app, self.plugins, storage) try: wallet, password = wizard.run_and_get_wallet() or (None, None) except UserCancelled: pass except GoBack as e: self.print_error('[start_new_window] Exception caught (GoBack)', e) finally: wizard.terminate() del wizard gc.collect() # wizard sticks around in memory sometimes, otherwise :/ if not wallet: return wallet.start_threads(self.daemon.network) self.daemon.add_wallet(wallet) self._cache_password(wallet, password) except BaseException as e: traceback.print_exc(file=sys.stdout) if '2fa' in str(e): self.warning(title=_('Error'), message = '2FA wallets for Bitcoin Cash are currently unsupported by <a href="https://api.trustedcoin.com/#/">TrustedCoin</a>. Follow <a href="https://github.com/Electron-Cash/Electron-Cash/issues/41#issuecomment-357468208">this guide</a> in order to recover your funds.') else: self.warning(title=_('Error'), message = 'Cannot load wallet:\n' + str(e), icon=QMessageBox.Critical) return w = self.create_window_for_wallet(wallet) if uri: w.pay_to_URI(uri) w.bring_to_top() w.setWindowState(w.windowState() & ~Qt.WindowMinimized | Qt.WindowActive) # this will activate the window w.activateWindow() return w