From 78b47a35b2486ccee7fdf855ecddf7b15e1de500 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Thu, 19 Aug 2021 00:15:44 +0200 Subject: [PATCH] mail: Fix checkmail script password bugging Fixed script to only ask for password once before understanding that the user does not want to provide it. Since gpg seems to not differentiate between a *wrongly* entered password and one entered not at all, we have to assume the user canceled the password prompt and not bug him again until the next time the script is invoked. It will, however, at least notify the user that the process is aborted in a quick notification message, so that if it was done on accident the user will still know what's up. --- mail/.local/bin/mail-check | 120 ++++++++++++++++++++----------------- 1 file changed, 66 insertions(+), 54 deletions(-) diff --git a/mail/.local/bin/mail-check b/mail/.local/bin/mail-check index e5cb3a8..36a2d48 100755 --- a/mail/.local/bin/mail-check +++ b/mail/.local/bin/mail-check @@ -20,71 +20,81 @@ PASSWORD_FILE="$HOME/.local/share/pass/misc/aerc-gmail-app-password.gpg" prehook() { - if [ -n "$MBSYNC_PRE" ]; then - eval "$MBSYNC_PRE" - return 0 - fi - imapfilter -c "${XDG_CONFIG_HOME:-/home/marty/.config}/imapfilter/config.lua" + if [ -n "$MBSYNC_PRE" ]; then + eval "$MBSYNC_PRE" + return 0 + fi + imapfilter -c "${XDG_CONFIG_HOME:-/home/marty/.config}/imapfilter/config.lua" } posthook() { - if [ -n "$MBSYNC_POST" ]; then - eval "$MBSYNC_POST" - return 0 - fi + if [ -n "$MBSYNC_POST" ]; then + eval "$MBSYNC_POST" + return 0 + fi - notmuch new 2>/dev/null - afew --tag --new - afew --move-mail --new - afew --tag --new - notmuch_foldertags - countnew + notmuch new 2>/dev/null + afew --tag --new + afew --move-mail --new + afew --tag --new + notmuch_foldertags + countnew } # use notmuch to index incoming mail and set the # correct number of mails if new ones arrived for notifications countnew() { - num=$(notmuch count tag:unread and tag:inbox) - HASMAIL="${num:-0}" + num=$(notmuch count tag:unread and tag:inbox) + HASMAIL="${num:-0}" } # fail the routine and optionally send a message why fail() { - [ -n "$1" ] && echo "$1" - exit 1 + [ -n "$1" ] && echo "$1" + exit 1 } checkmail() { - mbsync -c "${XDG_CONFIG_HOME:-$HOME/.config}/isync/mbsyncrc" -a + mbsync -c "${XDG_CONFIG_HOME:-$HOME/.config}/isync/mbsyncrc" -a } checkonline() { - # Ping 1.1.1.1 to confirm that we are on the internet - ping -c 1 "1.1.1.1" >/dev/null 2>/dev/null || fail "checkmail can not access the internet." + # Ping 1.1.1.1 to confirm that we are on the internet + ping -c 1 "1.1.1.1" >/dev/null 2>/dev/null || fail "checkmail can not access the internet." } # warn user that he has to enter his password in a moment # to stop catching him offguard or entering something by accident checkwarnuser() { - agt=$(gpg2 --decrypt --no-tty --quiet --no-verbose --for-your-eyes-only --pinentry-mode cancel "$PASSWORD_FILE" 2>&1) - if echo "$agt" | grep -qE 'No secret key'; then - notify "Mail: Password phrase needed!" - sleep 2.5 - fi + agt=$(gpg2 --decrypt --no-tty --quiet --no-verbose --for-your-eyes-only --pinentry-mode cancel "$PASSWORD_FILE" 2>&1) + if echo "$agt" | grep -qE 'No secret key'; then + notify "Mail" "Password phrase needed!" + sleep 2.5 + fi +} + +enablegpgagent() { + ## get password from user + agt=$(gpg2 --decrypt --no-tty --quiet --no-verbose --for-your-eyes-only --pinentry-mode ask "$PASSWORD_FILE" 2>&1) + ## exit program after first failed attempt + if echo "$agt" | grep -qE 'decryption failed'; then + notify "Mail" "Process aborted." + exit 1 + fi } # send out a notification on new mail, to libnotify and stdout notifymail() { - [ "${MBSYNC_NOTIFY:-1}" -eq 0 ] && return + [ "${MBSYNC_NOTIFY:-1}" -eq 0 ] && return - if [ "${HASMAIL:-0}" -gt 0 ]; then - notify "($HASMAIL) new mail" - fi + if [ "${HASMAIL:-0}" -gt 0 ]; then + notify "Mail" "New Mail ($HASMAIL)" + fi } notify() { - command -v notify-send >/dev/null && notify-send "$@" - echo "$@" + command -v notify-send >/dev/null && notify-send "$@" + echo "$@" } # Routine start @@ -93,38 +103,40 @@ notify() { # skip any retries and pre/post hooks, just run mbsync if [ "$1" = "raw" ]; then - checkmail - exit + checkmail + exit fi main() { - checkwarnuser + checkwarnuser - prehook + enablegpgagent - tries=0 - while true; do - if checkmail; then - break - fi + prehook - tries=$((tries + 1)) - if [ $tries -gt "${MBSYNC_MAX_TRIES:-3}" ]; then - fail "maximum retries reached without success." - fi - done - unset tries + tries=0 + while true; do + if checkmail; then + break + fi - posthook + tries=$((tries + 1)) + if [ $tries -gt "${MBSYNC_MAX_TRIES:-3}" ]; then + fail "maximum retries reached without success." + fi + done + unset tries - notifymail + posthook + + notifymail } notmuch_foldertags() { - notmuch tag +dump -inbox -deleted -- folder:Dump and not folder:Inbox - notmuch tag +archived -inbox -deleted -- folder:Archive and not folder:Inbox - notmuch tag +deleted -inbox -archived -- folder:Trash and not folder:Inbox - notmuch tag -inbox -- not folder:Inbox + notmuch tag +dump -inbox -deleted -- folder:Dump and not folder:Inbox + notmuch tag +archived -inbox -deleted -- folder:Archive and not folder:Inbox + notmuch tag +deleted -inbox -archived -- folder:Trash and not folder:Inbox + notmuch tag -inbox -- not folder:Inbox } main