|
@@ -0,0 +1,57 @@
|
|
|
|
+#!/usr/bin/env python3
|
|
|
|
+
|
|
|
|
+# pylint: disable=invalid-name; script name
|
|
|
|
+
|
|
|
|
+import argparse
|
|
|
|
+import os
|
|
|
|
+import pathlib
|
|
|
|
+import subprocess
|
|
|
|
+import time
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def _get_password_store_prefix_path() -> pathlib.Path:
|
|
|
|
+ # $ grep ^PREFIX $(which pass)
|
|
|
|
+ return pathlib.Path(
|
|
|
|
+ subprocess.run(
|
|
|
|
+ ["pass", "git", "rev-parse", "--show-toplevel"],
|
|
|
|
+ stdout=subprocess.PIPE,
|
|
|
|
+ check=True,
|
|
|
|
+ )
|
|
|
|
+ .stdout.rstrip()
|
|
|
|
+ .decode()
|
|
|
|
+ )
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def _main():
|
|
|
|
+ argparser = argparse.ArgumentParser(allow_abbrev=False)
|
|
|
|
+ argparser.add_argument("password_path", nargs="?")
|
|
|
|
+ args = argparser.parse_args()
|
|
|
|
+ if not args.password_path:
|
|
|
|
+ prefix = _get_password_store_prefix_path()
|
|
|
|
+ for password_path in prefix.rglob("*.gpg"):
|
|
|
|
+ print(
|
|
|
|
+ password_path.relative_to(prefix).as_posix()[
|
|
|
|
+ : -len(password_path.suffix)
|
|
|
|
+ ]
|
|
|
|
+ )
|
|
|
|
+ else:
|
|
|
|
+ password = (
|
|
|
|
+ subprocess.run(
|
|
|
|
+ ["pass", "show", args.password_path],
|
|
|
|
+ stdout=subprocess.PIPE,
|
|
|
|
+ check=True,
|
|
|
|
+ )
|
|
|
|
+ .stdout.splitlines()[0]
|
|
|
|
+ .decode()
|
|
|
|
+ )
|
|
|
|
+ assert password.isprintable()
|
|
|
|
+ assert "'" not in password
|
|
|
|
+ os.close(1) # close rofi's window
|
|
|
|
+ time.sleep(0.1) # wait for rofi's window to close
|
|
|
|
+ subprocess.run(
|
|
|
|
+ ["xdotool", "-"], input=f"type '{password}'".encode(), check=True
|
|
|
|
+ )
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+if __name__ == "__main__":
|
|
|
|
+ _main()
|