diff options
Diffstat (limited to 'pkgs/simple/fzmenu')
-rwxr-xr-x | pkgs/simple/fzmenu/bin/otpmenu | 44 | ||||
-rwxr-xr-x | pkgs/simple/fzmenu/bin/passmenu | 45 | ||||
-rw-r--r-- | pkgs/simple/fzmenu/default.nix | 50 |
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 + ]} +'' |