async def create_start_daemon_connection( root_path: Path) -> Optional[DaemonProxy]: connection = await connect_to_daemon_and_validate(root_path) if connection is None: print("Starting daemon") # launch a daemon process = launch_start_daemon(root_path) # give the daemon a chance to start up if process.stdout: process.stdout.readline() await asyncio.sleep(1) # it prints "daemon: listening" connection = await connect_to_daemon_and_validate(root_path) if connection: passphrase = None if await connection.is_keyring_locked(): passphrase = Keychain.get_cached_master_passphrase() if not Keychain.master_passphrase_is_valid(passphrase): passphrase = get_current_passphrase() if passphrase: print("Unlocking daemon keyring") await connection.unlock_keyring(passphrase) return connection return None
async def notify_keyring_migration_completed(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"} Keychain.handle_migration_completed() 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" response: Dict[str, Any] = {"success": success, "error": error} return response
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
def cli( ctx: click.Context, root_path: str, keys_root_path: Optional[str] = None, passphrase_file: Optional[TextIOWrapper] = None, ) -> None: from pathlib import Path ctx.ensure_object(dict) ctx.obj["root_path"] = Path(root_path) # keys_root_path and passphrase_file will be None if the passphrase options have been # scrubbed from the CLI options if keys_root_path is not None: set_keys_root_path(Path(keys_root_path)) if passphrase_file is not None: from chia.cmds.passphrase_funcs import cache_passphrase, read_passphrase_from_file from sys import exit try: passphrase = read_passphrase_from_file(passphrase_file) if Keychain.master_passphrase_is_valid(passphrase): cache_passphrase(passphrase) else: raise KeyringCurrentPassphraseIsInvalid("Invalid passphrase") except KeyringCurrentPassphraseIsInvalid: if Path(passphrase_file.name).is_file(): print(f'Invalid passphrase found in "{passphrase_file.name}"') else: print("Invalid passphrase") exit(1) except Exception as e: print(f"Failed to read passphrase: {e}") check_ssl(Path(root_path))
def using_default_passphrase() -> bool: if not Keychain.has_master_passphrase(): return False return Keychain.master_passphrase_is_valid(default_passphrase())