diff --git a/extras/test/test-mutt-crypto.sh b/extras/test/test-mutt-crypto.sh new file mode 100755 index 0000000..f4e9aff --- /dev/null +++ b/extras/test/test-mutt-crypto.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env zsh + +set -euo pipefail + +script_dir="${0:A:h}" +source "${script_dir}/lib/test_helpers.zsh" +test_setup "${0}" + +cleanup() { + test_cleanup +} +trap cleanup EXIT INT TERM + +command -v mutt >/dev/null 2>&1 || { + print -- "SKIP test-mutt-crypto.sh: missing mutt" + exit 0 +} + +muttrc="${tmp_root}/muttrc" +cat > "${muttrc}" < /dev/null; then + mblaze_ensure local email_regex="([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})" e_from=`print - "${_mail_input}" | maddr -h 'from' - | grep -oP "$email_regex"` e_from=${e_from:l} diff --git a/src/zlibs/bootstrap b/src/zlibs/bootstrap index a8f9aff..9c36435 100644 --- a/src/zlibs/bootstrap +++ b/src/zlibs/bootstrap @@ -142,8 +142,6 @@ bootstrap_root="${bootstrap_file:A:h:h}" # global variable for mutt options vars+=(muttflags) - autoload colors; colors - # which command to use when creating dirs mkdir="`command -v mkdir` -m 700 -p" @@ -170,8 +168,6 @@ bootstrap_root="${bootstrap_file:A:h:h}" # own mblaze workdir and init empty sequence export MBLAZE="$MAILDIRS/cache/mblaze" - mkdir -p "${MBLAZE}" - touch ${MBLAZE}/seq PATH="$WORKDIR/bin:$PATH" @@ -239,51 +235,25 @@ bootstrap_root="${bootstrap_file:A:h:h}" } # binary programs recognition -check_bin() { - # required programs - for req in pinentry fetchmail gpg msmtp; do +check_required_bins() { + for req in "$@"; do isfound $req { test $? != 0 } && { error "Cannot find $req. Please install it." exit 1 } done +} - # make sure a gnupg dir exists +ensure_gnupg_dir() { { test -r $HOME/.gnupg/pubring.gpg } || { ${=mkdir} $HOME/.gnupg touch $HOME/.gnupg/pubring.gpg touch $HOME/.gnupg/secring.gpg } +} - # which find command to use - case $OS in - GNU) find="find -O3" ;; - MAC) find="gfind -O3" ;; - *) find="find" - esac - - # which wipe command to use - if isfound wipe; then - rm="wipe -f -s -q -R /dev/urandom" - elif isfound srm; then - rm="srm -m" - else - rm="rm -f" - fi - func "Rm binary: $rm" - - # which mutt binary to use - if isfound mutt; then - mutt_exec=mutt - elif isfound neomutt; then - mutt_exec=neomutt - fi - pgpewrap="${WORKDIR}/bin/gpgewrap" - dotlock="${WORKDIR}/bin/dotlock" - - func "Mutt binary: $mutt_exec" - func "Notmuch binary: `command -v notmuch`" +check_keyring() { func "Keyring set: $JARO_KEYRING" if [[ "$JARO_KEYRING" == "" ]]; then # check for pass, else fallback @@ -324,6 +294,79 @@ check_bin() { GNOMEKEY=1 ;; esac fi +} + +ensure_mutt() { + if isfound mutt; then + mutt_exec=mutt + elif isfound neomutt; then + mutt_exec=neomutt + else + error "Cannot find mutt or neomutt. Please install one." + exit 1 + fi + func "Mutt binary: $mutt_exec" +} + +mblaze_ensure() { + export MBLAZE=${MBLAZE:-"$MAILDIRS/cache/mblaze"} + mkdir -p "${MBLAZE}" + touch "${MBLAZE}/seq" +} + +check_bin() { + local cmd="${1:-$subcommand}" + + # which find command to use + case $OS in + GNU) find="find -O3" ;; + MAC) find="gfind -O3" ;; + *) find="find" + esac + + # which wipe command to use + if isfound wipe; then + rm="wipe -f -s -q -R /dev/urandom" + elif isfound srm; then + rm="srm -m" + else + rm="rm -f" + fi + func "Rm binary: $rm" + + pgpewrap="${WORKDIR}/bin/gpgewrap" + dotlock="${WORKDIR}/bin/dotlock" + + case "$cmd" in + fetch) + check_required_bins pinentry fetchmail gpg + ensure_gnupg_dir + check_keyring + ;; + send|smtp) + check_required_bins pinentry gpg msmtp + ensure_gnupg_dir + check_keyring + ;; + peek|open|compose|__empty|__unknown:*) + ensure_mutt + [[ "$cmd" = "peek" ]] && { + check_required_bins pinentry gpg + ensure_gnupg_dir + check_keyring + } + ;; + passwd|askpass) + check_required_bins pinentry gpg + ensure_gnupg_dir + check_keyring + ;; + init|wizard) + check_required_bins pinentry gpg + ensure_gnupg_dir + check_keyring + ;; + esac return 0 } diff --git a/src/zlibs/filters b/src/zlibs/filters index 30cfc32..37b5e8b 100755 --- a/src/zlibs/filters +++ b/src/zlibs/filters @@ -33,8 +33,17 @@ # 8. All the rest -> unsorted # -# load zsh filter cache arrays -test -r "$MAILDIRS/cache/filters" && { +# Load zsh filter cache arrays only for commands that need them. +load_filter_cache() { + fn load_filter_cache + + typeset -gAl filter_from + typeset -galU filter_own + typeset -gAl filter_to + typeset -galU filter_whitelist + typeset -galU filter_blacklist + + [[ -r "$MAILDIRS/cache/filters" ]] || return 1 source "$MAILDIRS/cache/filters" } @@ -230,8 +239,7 @@ filter_maildir() { maildirmake "$MAILDIRS/unsorted" # loads up the filter cache (zsh compiled arrays) - [[ -r "$MAILDIRS/cache/filters" ]] && - source $MAILDIRS/cache/filters + load_filter_cache mails="$(maildir_list_messages "$srcpath")" numm=`print $mails | wc -l` @@ -243,6 +251,7 @@ filter_maildir() { notice "Filtering maildir: $mdinput ($numm mails)" c=0 + mblaze_ensure for m in ${(f)mails}; do @@ -551,6 +560,8 @@ update_sieve() { ####### # SIEVE + load_filter_cache + act "generate sieve filter rules" id=`datestamp`.$RANDOM newlock "$MAILDIRS/Filters.sieve" diff --git a/src/zlibs/keyring b/src/zlibs/keyring index 484ae11..052b190 100755 --- a/src/zlibs/keyring +++ b/src/zlibs/keyring @@ -24,6 +24,11 @@ # pass wrapper to set all env _pass() { fn pass $* + [[ -t 0 ]] && { + export GPG_TTY=$(tty) + command -v gpg-connect-agent >/dev/null 2>&1 && + gpg-connect-agent updatestartuptty /bye >/dev/null 2>&1 + } PASSWORD_STORE_DIR=$PASSWORD_STORE_DIR pass $* } diff --git a/src/zlibs/maildirs b/src/zlibs/maildirs index c5b0832..fd9ebfe 100755 --- a/src/zlibs/maildirs +++ b/src/zlibs/maildirs @@ -54,6 +54,7 @@ maildirmake() { # use mblaze if found command -v mmkdir > /dev/null && { + mblaze_ensure mmkdir "$1" return $? } @@ -90,6 +91,7 @@ maildir_list_messages() { maildircheck "$md" || return 1 if command -v mlist >/dev/null; then + mblaze_ensure mlist "$md" return $? fi @@ -108,6 +110,7 @@ maildir_list_folders() { [[ -d "$root" ]] || return 1 if command -v mdirs >/dev/null; then + mblaze_ensure local folders folders="$(mdirs -a "$root")" for folder in ${(f)folders}; do @@ -134,6 +137,7 @@ maildir_refile() { maildircheck "$dest" || maildirmake "$dest" || return 1 if command -v mrefile >/dev/null; then + mblaze_ensure if [[ "$mode" == "copy" ]]; then mrefile -k "$msg" "$dest" else @@ -240,6 +244,7 @@ deliver() { # use mblaze if found command -v mdeliver > /dev/null && { + mblaze_ensure last_deliver=`mdeliver -v "$MAILDIRS/$dest"` local ret=$? [[ $ret == 0 ]] || { diff --git a/src/zlibs/parse b/src/zlibs/parse index 9b86ef7..fcc3644 100755 --- a/src/zlibs/parse +++ b/src/zlibs/parse @@ -25,6 +25,7 @@ # extract all addresses found in a list of email files from stdin mblaze_extract_addresses() { + mblaze_ensure _action="${1:-all}" case "${_action}" in sender)