summaryrefslogtreecommitdiffstats
path: root/pkgs/simple/fzmenu
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/simple/fzmenu')
-rwxr-xr-xpkgs/simple/fzmenu/bin/otpmenu44
-rwxr-xr-xpkgs/simple/fzmenu/bin/passmenu45
-rw-r--r--pkgs/simple/fzmenu/default.nix50
3 files changed, 139 insertions, 0 deletions
diff --git a/pkgs/simple/fzmenu/bin/otpmenu b/pkgs/simple/fzmenu/bin/otpmenu
new file mode 100755
index 0000000..273a408
--- /dev/null
+++ b/pkgs/simple/fzmenu/bin/otpmenu
@@ -0,0 +1,44 @@
+#! /bin/sh
+set -efu
+
+#PATH=
+
+case ${FZMENU_PHASE-0} in
+ 0)
+ export FZMENU_PHASE=1
+ exec setsid -f terminal dash "$0"
+ ;;
+ 1)
+ if result=$(
+ PASSWORD_STORE_DIR=${PASSWORD_STORE_DIR-$HOME/.password-store}
+ FZF_DEFAULT_OPTS=${FZMENU_FZF_DEFAULT_OPTS-}
+ if test -n "$FZF_DEFAULT_OPTS"; then
+ export FZF_DEFAULT_OPTS
+ fi
+ find -L "$PASSWORD_STORE_DIR" -type f -name 'otp.gpg' |
+ awk -F / -v PASSWORD_STORE_DIR="$PASSWORD_STORE_DIR" '
+ { n = length(PASSWORD_STORE_DIR "/") }
+ $NF == "otp.gpg" {
+ print substr($0, 1 + n, length($0)-length("/otp.gpg")-n)
+ }
+ ' |
+ exec fzf \
+ --history=/dev/null \
+ --no-sort \
+ --prompt='OTP: ' \
+ )
+ then
+ export FZMENU_PHASE=2
+ export FZMENU_RESULT="$result"
+ setsid -f "$0"
+ fi
+ ;;
+ 2)
+ pass=$(pass otp code "$FZMENU_RESULT/otp")
+ printf %s "$pass" |
+ xdotool type -f -
+ ;;
+ *)
+ echo "$0: error: bad phase: $FZMENU_PHASE" >&2
+ exit -1
+esac
diff --git a/pkgs/simple/fzmenu/bin/passmenu b/pkgs/simple/fzmenu/bin/passmenu
new file mode 100755
index 0000000..76153f5
--- /dev/null
+++ b/pkgs/simple/fzmenu/bin/passmenu
@@ -0,0 +1,45 @@
+#! /bin/sh
+set -efu
+
+#PATH=
+
+case ${FZMENU_PHASE-0} in
+ 0)
+ export FZMENU_PHASE=1
+ exec setsid -f terminal dash "$0"
+ ;;
+ 1)
+ if result=$(
+ PASSWORD_STORE_DIR=${PASSWORD_STORE_DIR-$HOME/.password-store}
+ FZF_DEFAULT_OPTS=${FZMENU_FZF_DEFAULT_OPTS-}
+ if test -n "$FZF_DEFAULT_OPTS"; then
+ export FZF_DEFAULT_OPTS
+ fi
+ find -L "$PASSWORD_STORE_DIR" -type f -name '*.gpg' |
+ awk -F / -v PASSWORD_STORE_DIR="$PASSWORD_STORE_DIR" '
+ { n = length(PASSWORD_STORE_DIR "/") }
+ $NF == "otp.gpg" { next }
+ /.*\.gpg$/ {
+ print substr($0, 1 + n, length($0)-length(".gpg")-n)
+ }
+ ' |
+ exec fzf \
+ --history=/dev/null \
+ --no-sort \
+ --prompt='pass: ' \
+ )
+ then
+ export FZMENU_PHASE=2
+ export FZMENU_RESULT="$result"
+ setsid -f "$0"
+ fi
+ ;;
+ 2)
+ pass=$(pass show "$FZMENU_RESULT")
+ printf %s "$pass" |
+ xdotool type -f -
+ ;;
+ *)
+ echo "$0: error: bad phase: $FZMENU_PHASE" >&2
+ exit -1
+esac
diff --git a/pkgs/simple/fzmenu/default.nix b/pkgs/simple/fzmenu/default.nix
new file mode 100644
index 0000000..1a285ee
--- /dev/null
+++ b/pkgs/simple/fzmenu/default.nix
@@ -0,0 +1,50 @@
+{ lib, pkgs, stdenv }:
+
+let
+ terminal = pkgs.writeDashBin "terminal" ''
+ # usage: terminal COMMAND [ARGS...]
+ exec ${pkgs.alacritty-tv}/bin/alacritty \
+ --profile=fzmenu \
+ --class AlacrittyFzmenuFloat \
+ -e "$@"
+ '';
+in
+
+pkgs.runCommand "fzmenu" {
+} /* sh */ ''
+ mkdir $out
+
+ cp -r ${./bin} $out/bin
+
+ substituteInPlace $out/bin/otpmenu \
+ --replace '#! /bin/sh' '#! ${pkgs.dash}/bin/dash' \
+ --replace '#PATH=' PATH=${lib.makeBinPath [
+ pkgs.coreutils
+ pkgs.dash
+ pkgs.findutils
+ pkgs.fzf
+ pkgs.gawk
+ (pkgs.pass.withExtensions (ext: [
+ ext.pass-otp
+ ]))
+ pkgs.utillinux
+ pkgs.xdotool
+ terminal
+ ]}
+
+ substituteInPlace $out/bin/passmenu \
+ --replace '#! /bin/sh' '#! ${pkgs.dash}/bin/dash' \
+ --replace '#PATH=' PATH=${lib.makeBinPath [
+ pkgs.coreutils
+ pkgs.dash
+ pkgs.findutils
+ pkgs.fzf
+ pkgs.gawk
+ (pkgs.pass.withExtensions (ext: [
+ ext.pass-otp
+ ]))
+ pkgs.utillinux
+ pkgs.xdotool
+ terminal
+ ]}
+''