From 1a7674c83a1df91cf29af18dee0526814588fb95 Mon Sep 17 00:00:00 2001 From: tavo-wasd Date: Tue, 6 Feb 2024 23:00:36 -0600 Subject: [PATCH] pinentry w bemenu --- scripts/anypinentry | 299 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100755 scripts/anypinentry diff --git a/scripts/anypinentry b/scripts/anypinentry new file mode 100755 index 0000000..8442b0c --- /dev/null +++ b/scripts/anypinentry @@ -0,0 +1,299 @@ +#!/bin/sh +# Ref: http://info2html.sourceforge.net/cgi-bin/info2html-demo/info2html?%28pinentry%29Protocol + +set -e + +VERSION="0.1"; + +if [ -z "$DISPLAY" ]; then + DISPLAY=":1"; + export DISPLAY; +fi +prompt_string_default="PIN: " + +title=""; +prompt_string="$prompt_string_default"; +description=""; +keyinfo=""; +repeat=""; + +error__password_mismatch="Passwords don't match"; +AP_YES="Yes"; +AP_NO="No"; + +prompt_action='/home/tavo/.config/scripts/menu/menu "$AP_PROMPT" pass'; +confirm_action='echo -e "$AP_YES\n$AP_NO" | /home/tavo/.config/scripts/menu/menu "$AP_PROMPT"'; +display_error_action='notify-send -a "Pinentry" "$AP_ERROR"'; + +# :: Prompt string (default if empty) +ask_password() { + export AP_PROMPT="${1:-"$prompt_string"}"; + printf '' | sh -c "$prompt_action" 2> /dev/null; +} +# :: Prompt string (default if empty) +confirm() { + export AP_PROMPT="${1:-"$prompt_string"}"; + export AP_YES; export AP_NO; + printf '' | sh -c "$confirm_action" 2> /dev/null; +} +# :: Error text +show_error() { + export AP_ERROR="$1"; + sh -c "$display_error_action" 2> /dev/null; +} + +cancelled_error() { echo "ERR 83886179 Operation cancelled "; } +com_error() { echo "ERR 83886360 IP parameter error >"; } +not_implemented_error() { echo "ERR 536870981 Not implemented "; } +unknown_error() { echo "ERR 536871187 Unknown IPC command "; } + + +reset() { + description= + prompt_string="$prompt_string_default" + keyinfo= + repeat= + error__password_mismatch= + setok= + setnotok= + setcancel= + title= +} + +save_option() { + echo "OK"; +} + +get_info() { + arg=$(echo "$1" | tr a-z A-Z) + case "$arg" in + VERSION) echo "D $VERSION" && echo "OK" ;; + PID) echo "D $$" && echo "OK" ;; + *) com_error ;; + esac; +} + +# :: Repeat string -> Password -> OK | ERR +password_prompt() { + pass=""; + if pass=$(ask_password "$([ -z "$1" ] && echo "$repeat")"); then + if [ -n "$1" ]; then + password_prompt "" "$pass"; + else + # If password repeat attempt failed, try again, + # Else continue + if [ -n "$2" ] && [ "$pass" != "$2" ]; then + show_error "$error__password_mismatch"; + password_prompt "$repeat"; + else + if [ ! -z "$pass" ]; then + echo "D $pass" | + sed 's/%/%25/; s/\r/%0D/' | # % = 25 and CR = %0D + awk 'BEGIN {ORS="%0A"} /^..*$/ {print}' | # LF = %0A + sed 's/%0A$//' # Strip trailing %0A + echo + fi + echo "OK"; + fi; + fi; + else + cancelled_error; + fi; + repeat= +} + +# :: OK | ERR +confirm_prompt() { + if [ "$(confirm)" = "$AP_YES" ]; then + echo "OK" + else + cancelled_error; + fi +} + +pinentry_help() { + cat < + +END + +printf "Usage: %s [options] (-h for help)\n" "$0" >&2 + +cat <. +END +} + +parse_cliargs() { + getopt -T || exit_status=$? + if [ $exit_status -ne 4 ]; then + printf "Your version of getopt(1) is out of date\n" >&2 + exit 1 + fi + + TEMP=$(getopt -n "$0" -o dD:T:N:C:M:o:gWc:a:h \ + --long debug,display:,ttyname:,ttytype:,lc-ctype:,lc-messages:,timeout:,no-global-grab,parent-wid,colors:,ttyalert:,prompt:,confirm:,error:,help,version \ + -- "$@") + + if [ $? -ne 0 ]; then + help + exit 1 + fi + + eval set -- "$TEMP" + unset TEMP + + while true; do + case "$1" in + -d | --debug) shift ;; + -D | --display) shift 2 ;; + -T | --ttyname) shift 2 ;; + -N | --ttytype) shift 2 ;; + -C | --lc-ctype) shift 2 ;; + -M | --lc-messages) shift 2 ;; + -o | --timeout) shift 2 ;; + -g | --no-global-grab) shift ;; + -W | --parent-wid) shift ;; + -c | --colors) echo "colors=$2"; shift 2 ;; + -a | --ttyalert) shift 2 ;; + --error-command) display_error_action="$2"; shift 2 ;; + --prompt) prompt_action="$2"; shift 2 ;; + --confirm) confirm_action="$2"; shift 2 ;; + -h | --help) help && exit 0 ;; + --version) echo "anypinentry-$VERSION" && exit 0 ;; + --) shift; break ;; + *) ;; + esac + done +} + + + +# Main +parse_cliargs "$@"; + +# Initialize protocol +echo "OK Pleased to meet you" + +while read -r line; do + interpret_command "$line"; +done; + +# "SETERROR" +# "SETOK" +# "SETNOTOK" +# "SETCANCEL" +# "MESSAGE" +# "SETQUALITYBAR" +# "SETQUALITYBAR_TT" +# "SETTIMEOUT" +# "CLEARPASSPHRASE" +