diff --git a/keycmd/__main__.py b/keycmd/__main__.py index 4f0e49b..1b8ab9c 100644 --- a/keycmd/__main__.py +++ b/keycmd/__main__.py @@ -35,13 +35,13 @@ def main(): """CLI entrypoint""" args = cli.parse_args() - if args.verbose: - set_verbose() - if args.version: log(f"v{__version__}") return + if args.verbose: + set_verbose() + try: conf = load_conf() except tomli.TOMLDecodeError as err: diff --git a/keycmd/wsl.py b/keycmd/wsl.py new file mode 100644 index 0000000..48c33e7 --- /dev/null +++ b/keycmd/wsl.py @@ -0,0 +1,36 @@ +from subprocess import run + +from keyring.backend import KeyringBackend + +from .logs import error + + +def call_host_keyring(python, command): + p = run( + [python, "-c", f"import keyring; {command}"], shell=False, capture_output=True + ) + if p.returncode != 0: + error(f"call to WSL host keyring failed (python path: {python}): {stderr}") + stdout, stderr = p.stdout.decode("utf-8").strip(), p.stderr.decode("utf-8").strip() + return stdout + + +class WslHostKeyring(KeyringBackend): + priority = 1 + python = "py.exe" + + def set_password(self, servicename, username, password): + call_host_keyring( + self.python, + f"keyring.set_password('{servicename}', '{username}', '{password}')", + ) + + def get_password(self, servicename, username): + return call_host_keyring( + self.python, f"print(keyring.get_password('{servicename}', '{username}'))" + ) + + def delete_password(self, servicename, username): + call_host_keyring( + self.python, f"keyring.delete_password('{servicename}', '{username}')" + )