dotfiles/mail/.local/bin/mail-check
Marty Oehme 78b47a35b2
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.
2021-08-19 00:21:16 +02:00

142 lines
3.4 KiB
Bash
Executable file

#!/usr/bin/env sh
# runs mbsync, with pre-hooks and post-hooks
# by default, first runs imapfilter
# and after indexes with notmuch
#
# To run without invoking any hooks or retry attempts,
# run `checkmail raw`
# this will simply invoke a single isync run on all
# boxes with the correct config file set.
#
# for more advanced, per-account/channel hooks, see
# https://sourceforge.net/p/isync/feature-requests/8/
# available env vars:
# MBSYNC_MAX_TRIES=3
# MBSYNC_PRE="/bin/usr/cmd-to-run"
# MBSYNC_POST="/bin/usr/cmd-to-run"
# MBSYNC_NOTIFY=1
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"
}
posthook() {
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
}
# 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}"
}
# fail the routine and optionally send a message why
fail() {
[ -n "$1" ] && echo "$1"
exit 1
}
checkmail() {
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."
}
# 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
}
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
if [ "${HASMAIL:-0}" -gt 0 ]; then
notify "Mail" "New Mail ($HASMAIL)"
fi
}
notify() {
command -v notify-send >/dev/null && notify-send "$@"
echo "$@"
}
# Routine start
# check
# skip any retries and pre/post hooks, just run mbsync
if [ "$1" = "raw" ]; then
checkmail
exit
fi
main() {
checkwarnuser
enablegpgagent
prehook
tries=0
while true; do
if checkmail; then
break
fi
tries=$((tries + 1))
if [ $tries -gt "${MBSYNC_MAX_TRIES:-3}" ]; then
fail "maximum retries reached without success."
fi
done
unset tries
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
}
main