async def unlock_keyring(self, request: Dict[str, Any]) -> Dict[str, Any]: success: bool = False error: Optional[str] = None key: Optional[str] = request.get("key", None) if type(key) is not str: return {"success": False, "error": "missing key"} try: if Keychain.master_passphrase_is_valid(key, force_reload=True): Keychain.set_cached_master_passphrase(key) success = True # Inform the GUI of keyring status changes self.keyring_status_changed(await self.keyring_status(), "wallet_ui") else: error = "bad passphrase" except Exception as e: tb = traceback.format_exc() self.log.error(f"Keyring passphrase validation failed: {e} {tb}") error = "validation exception" if success and self.run_check_keys_on_unlock: try: self.log.info("Running check_keys now that the keyring is unlocked") check_keys(self.root_path) self.run_check_keys_on_unlock = False except Exception as e: tb = traceback.format_exc() self.log.error(f"check_keys failed after unlocking keyring: {e} {tb}") response: Dict[str, Any] = {"success": success, "error": error} return response
async def add_key(self, request): if "mnemonic" not in request: raise ValueError("Mnemonic not in request") # Adding a key from 24 word mnemonic mnemonic = request["mnemonic"] passphrase = "" try: sk = self.service.keychain.add_private_key(" ".join(mnemonic), passphrase) except KeyError as e: return { "success": False, "error": f"The word '{e.args[0]}' is incorrect.'", "word": e.args[0], } fingerprint = sk.get_g1().get_fingerprint() await self._stop_wallet() # Makes sure the new key is added to config properly started = False check_keys(self.service.root_path) request_type = request["type"] if request_type == "new_wallet": started = await self.service._start(fingerprint=fingerprint, new_wallet=True) elif request_type == "skip": started = await self.service._start(fingerprint=fingerprint, skip_backup_import=True) elif request_type == "restore_backup": file_path = Path(request["file_path"]) started = await self.service._start(fingerprint=fingerprint, backup_file=file_path) if started is True: return {"fingerprint": fingerprint} raise ValueError("Failed to start")
async def check_keys(self, root_path): """ Forwards to init_funcs.check_keys() """ if self.use_local_keychain(): check_keys(root_path, self.keychain) else: response, success = await self.get_response_for_request("check_keys", {"root_path": str(root_path)}) if not success: self.handle_error(response)
async def check_keys(self, request: Dict[str, Any]) -> Dict[str, Any]: if self.get_keychain_for_request(request).is_keyring_locked(): return {"success": False, "error": KEYCHAIN_ERR_LOCKED} root_path = request.get("root_path", None) if root_path is None: return { "success": False, "error": KEYCHAIN_ERR_MALFORMED_REQUEST, "error_details": {"message": "missing root_path"}, } check_keys(Path(root_path)) return {"success": True}