#!/bin/sh # # Purpose {{{ # This script will : # 1. If no gpg-key is in cache. # a. Run a terminal with a tmux splits (at least a split to enter gpg passphrase). # b. Wait until timeout. # c. Check every second if a key is now cached. # d. Kill dedicated terminal emulator window. # 2. (When) a gpg-key is finally cached, simply call the "real" rofi-pass. # # 2023-01-12 # }}} # GPG command to check cache {{{ # 0 : No key in cache # 1 : At leaste one key in cache # }}} gpg_agent_info=$(gpg-connect-agent 'keyinfo --list' /bye 2>/dev/null | awk 'BEGIN{CACHED=0} /^S/ {if($7==1){CACHED=1}} END{if($0!=""){print CACHED} else {print "none"}}') # Terminal emulator and window title TERM_TITLE="Authentication with tmux" TIMEOUT=60 TIME=1 # Get "real" rofi-pass binary path {{{ if [ -f /bin/rofi-pass ]; then ROFI_PASS_BIN="/bin/rofi-pass" elif [ -f /usr/bin/rofi-pass ]; then ROFI_PASS_BIN="/usr/bin/rofi-pass" elif [ -f "${HOME}"/repos/rofi-pass/rofi-pass ]; then ROFI_PASS_BIN="${HOME}/repos/rofi-pass/rofi-pass" else printf '%s' "No rofi-pass binary available" exit 1 fi # }}} # If gpg-agent doesn't have any key in cache if [ "${gpg_agent_info}" -eq 0 ]; then ## Start a terminal emulator ## Create new tmux splits to ask for gpg passphrase "${TERM_EMULATOR}" --title "${TERM_TITLE}" -e bash -c 'tmux source-file "${HOME}"/.tmux/splitAUTHENTICATION' & # Minimum time to enter my passphrases sleep 5 # Wait until TIMEOUT while [ "${TIME}" -lt "${TIMEOUT}" ]; do gpg_agent_info=$(gpg-connect-agent 'keyinfo --list' /bye 2>/dev/null | awk 'BEGIN{CACHED=0} /^S/ {if($7==1){CACHED=1}} END{if($0!=""){print CACHED} else {print "none"}}') ## If a gpg key is in cache {{{ if [ "${gpg_agent_info}" -eq 1 ]; then echo "While loop − GPG in cache" ### Leave the loop break ## }}} ## Still no key {{{ else ## Wait a second TIME=$((TIME + 1)) sleep 1 fi ## }}} done ### Kill any remaining window kill $(pgrep --newest --full "${TERM_TITLE}") 2>/dev/null ## If a gpg key is finally in cache if [ "${gpg_agent_info}" -eq 1 ]; then # Then, call real rofi-pass "${ROFI_PASS_BIN}" else exit 2 fi # If gpg-agent already have a key in cache {{{ elif [ "${gpg_agent_info}" -gt 0 ]; then # Then, call real rofi-pass "${ROFI_PASS_BIN}" else # Not supposed to happen exit 3 fi # }}}