From 780d09e951b770b2f7815612d9ad016a00071919 Mon Sep 17 00:00:00 2001 From: Korijn van Golen Date: Thu, 20 Jul 2023 14:59:05 +0200 Subject: [PATCH 1/4] fix some typos --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e642bb7..6a0c462 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ The main functionality of `keycmd` is to load secrets from your OS keyring and e This enables you to store sensitive data such as authentication tokens and passwords in your OS keyring, so you no longer need to rely on insecure practises such as `.env` files, or pasting secrets into your terminal. 😱 -The most common use case is to load credentials for package managers such as pip, npm when using private package indexes, such as Azure Artifact Feeds. Another common use case is docker build secrets. +The most common use case is to load credentials for package managers such as pip and npm when using private package indexes, such as Azure Artifact Feeds. Another common use case is docker build secrets. ## Usage @@ -80,7 +80,7 @@ ARTIFACTS_TOKEN = { credential = "korijn@poetry-repository-main", username = "ko ARTIFACTS_TOKEN_B64 = { credential = "korijn@poetry-repository-main", username = "korijn", b64 = true } ``` -This configuration piggybacks off of the credentials created in the OS keyring by [Poetry](https://python-poetry.org/) when [configuring credentials](https://python-poetry.org/docs/repositories/#configuring-credentials) for a private repository. In this case, we expose the same credential is exposed twice: +This configuration piggybacks off of the credentials created in the OS keyring by [Poetry](https://python-poetry.org/) when [configuring credentials](https://python-poetry.org/docs/repositories/#configuring-credentials) for a private repository. In this case, the same credential is exposed twice: * As the environment variable `ARTIFACTS_TOKEN` * Again but with base64 encoding applied as the environment variable `ARTIFACTS_TOKEN_B64` From 7117c9313d993a79fd2385765c220ba5ee141dbc Mon Sep 17 00:00:00 2001 From: Korijn van Golen Date: Thu, 20 Jul 2023 16:06:10 +0200 Subject: [PATCH 2/4] add wsl backend, first steps --- keycmd/__main__.py | 9 ++++++--- keycmd/wsl.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 keycmd/wsl.py diff --git a/keycmd/__main__.py b/keycmd/__main__.py index 4f0e49b..2cf9678 100644 --- a/keycmd/__main__.py +++ b/keycmd/__main__.py @@ -7,6 +7,7 @@ from .creds import get_env from .logs import error, log, set_verbose from .shell import run_cmd, run_shell +from .wsl import maybe_use_wsl_keyring cli = argparse.ArgumentParser( @@ -35,13 +36,15 @@ 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() + + maybe_use_wsl_keyring() + 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..5bbc067 --- /dev/null +++ b/keycmd/wsl.py @@ -0,0 +1,35 @@ +from pathlib import Path + +import keyring +from keyring.backend import KeyringBackend + + +def is_wsl(): + p = Path("/proc/version") + if not p.is_file(): + return False + if "WSL2" in p.read_text(): + return True + return False + + +class TestKeyring(KeyringBackend): + """A test keyring which always outputs the same password + """ + priority = 1 + + def set_password(self, servicename, username, password): + pass + + def get_password(self, servicename, username): + password = "sdfsdf" + print(password) + + def delete_password(self, servicename, username): + pass + + +def maybe_use_wsl_keyring(): + if not is_wsl(): + return + keyring.set_keyring(TestKeyring()) From 562ea2f31620bb20abfb4ce40f75a75c5b4714fc Mon Sep 17 00:00:00 2001 From: Korijn van Golen Date: Thu, 20 Jul 2023 16:26:49 +0200 Subject: [PATCH 3/4] add WslHostKeyring --- keycmd/__main__.py | 3 --- keycmd/wsl.py | 45 +++++++++++++++++++++++---------------------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/keycmd/__main__.py b/keycmd/__main__.py index 2cf9678..1b8ab9c 100644 --- a/keycmd/__main__.py +++ b/keycmd/__main__.py @@ -7,7 +7,6 @@ from .creds import get_env from .logs import error, log, set_verbose from .shell import run_cmd, run_shell -from .wsl import maybe_use_wsl_keyring cli = argparse.ArgumentParser( @@ -43,8 +42,6 @@ def main(): if args.verbose: set_verbose() - maybe_use_wsl_keyring() - try: conf = load_conf() except tomli.TOMLDecodeError as err: diff --git a/keycmd/wsl.py b/keycmd/wsl.py index 5bbc067..343149f 100644 --- a/keycmd/wsl.py +++ b/keycmd/wsl.py @@ -1,35 +1,36 @@ -from pathlib import Path +from subprocess import run -import keyring from keyring.backend import KeyringBackend +from .logs import error -def is_wsl(): - p = Path("/proc/version") - if not p.is_file(): - return False - if "WSL2" in p.read_text(): - return True - return False +def call_host_keyring(python, command): + p = run( + [python, "-c", f"import keyring; {command}"], shell=False, capture_output=True + ) + stdout, stderr = p.stdout.decode("utf-8").strip(), p.stderr.decode("utf-8").strip() + if p.returncode != 0: + error(f"call to WSL host keyring failed (python path: {python}): {stderr}") + return stdout -class TestKeyring(KeyringBackend): - """A test keyring which always outputs the same password - """ + +class WslHostKeyring(KeyringBackend): priority = 1 + python = "py.exe" def set_password(self, servicename, username, password): - pass + call_host_keyring( + self.python, + f"keyring.set_password('{servicename}', '{username}', '{password}')", + ) def get_password(self, servicename, username): - password = "sdfsdf" - print(password) + return call_host_keyring( + self.python, f"print(keyring.get_password('{servicename}', '{username}'))" + ) def delete_password(self, servicename, username): - pass - - -def maybe_use_wsl_keyring(): - if not is_wsl(): - return - keyring.set_keyring(TestKeyring()) + call_host_keyring( + self.python, f"keyring.delete_password('{servicename}', '{username}')" + ) From 0dc5b708b1a6d756e62f4ad075a8215af425205e Mon Sep 17 00:00:00 2001 From: Korijn van Golen Date: Thu, 20 Jul 2023 16:31:19 +0200 Subject: [PATCH 4/4] swap two lines --- keycmd/wsl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keycmd/wsl.py b/keycmd/wsl.py index 343149f..48c33e7 100644 --- a/keycmd/wsl.py +++ b/keycmd/wsl.py @@ -9,9 +9,9 @@ def call_host_keyring(python, command): p = run( [python, "-c", f"import keyring; {command}"], shell=False, capture_output=True ) - stdout, stderr = p.stdout.decode("utf-8").strip(), p.stderr.decode("utf-8").strip() 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