"""`logout`: end the session on the hub, retire this machine's key, erase the store.""" import json from ..client.account import Account, no_passphrase from ..client.hub import Hub from ..errors import CliError from ..output import err, sentence from .context import Context HELP = "end the session, retire this machine's device key and erase what is stored" def add_parser(sub, parent) -> None: sub.add_parser("logout", parents=[parent], help=HELP, description=sentence(HELP) + ".") async def sign_out_stored(ctx: Context) -> None: """Whatever account the store holds, on whatever hub. Never asks anything.""" stored = ctx.store.peek() hub = ctx.hub if stored.get("hub") == ctx.hub.url else Hub(stored.get("hub", "")) try: account = Account.open(hub, None, no_passphrase, ctx.store) warnings = await account.sign_out() except CliError as e: warnings = [f"The saved session could not be opened ({e.message}); it is erased " "here, and ends on the hub when it expires."] with ctx.store.locked(): ctx.store.erase() finally: if hub is not ctx.hub: await hub.aclose() for w in warnings: err(f"meshbay-cli: warning: {w}") async def run(ctx: Context) -> int: if not ctx.store.peek(): print(json.dumps({"signed_out": False}) if ctx.args.json else "Not signed in.") return 0 await sign_out_stored(ctx) print(json.dumps({"signed_out": True}) if ctx.args.json else "Signed out.") return 0