diff --git a/bin/mw b/bin/mw index f6fd6c0..cf42822 100755 --- a/bin/mw +++ b/bin/mw @@ -1,19 +1,15 @@ #!/bin/sh prefix="/usr/local" -pass_prefix="mw-" -muttdir="${XDG_CONFIG_HOME:-$HOME/.config}/mutt" # Main mutt config location -accdir="$muttdir/accounts" # Directory for account settings -maildir="${XDG_DATA_HOME:-$HOME/.local/share}/mail" # Location of mail storage -emailre=".+@.+\..+" # Regex to confirm valid email address +maildir="${XDG_DATA_HOME:-$HOME/.local/share}/mail" muttshare="$prefix/share/mutt-wizard" -mbsyncrc="${MBSYNCRC:-$HOME/.mbsyncrc}" mwconfig="$muttshare/mutt-wizard.muttrc" cachedir="${XDG_CACHE_HOME:-$HOME/.cache}/mutt-wizard" -muttrc="$muttdir/muttrc" +muttrc="${XDG_CONFIG_HOME:-$HOME/.config}/mutt/muttrc" +accdir="${XDG_CONFIG_HOME:-$HOME/.config}/mutt/accounts" msmtprc="${XDG_CONFIG_HOME:-$HOME/.config}/msmtp/config" msmtplog="${XDG_CONFIG_HOME:-$HOME/.config}/msmtp/msmtp.log" -marker="# mw-autogenerated" +mbsyncrc="${MBSYNCRC:-$HOME/.mbsyncrc}" alias mbsync='mbsync -c "$mbsyncrc"' for x in "/etc/ssl/certs/ca-certificates.crt" "/etc/pki/tls/certs/ca-bundle.crt" "/etc/ssl/ca-bundle.pem" "/etc/pki/tls/cacert.pem" "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem" "/etc/ssl/cert.pem" "/usr/local/share/ca-certificates/"; do @@ -25,10 +21,10 @@ checkbasics() { command -V gpg >/dev/null 2>&1 && GPG="gpg" || GPG="gpg2" [ -r "$PASSWORD_STORE_DIR/.gpg-id" ] && "$GPG" --list-secret-keys "$(cat "$PASSWORD_STORE_DIR/.gpg-id")" >/dev/null 2>&1 || { echo "First run \`pass init \` to set up a password archive." - echo "(If you don't already have a GPG key pair, first run \`$GPG --full-gen-key\`.)" + echo "(If you don't already have a GPG key pair, first run \`$GPG --full-generate-key\`.)" exit 1 ;} ;} -getaccounts() { accounts="$(find -L "$accdir" -type f | grep -o "[0-9]-.*.muttrc" | sed "s/-/: /;s/\.muttrc$//" | sort -n)" ;} +getaccounts() { accounts="$(find -L "$accdir" -type f 2>/dev/null | grep -o "[0-9]-.*.muttrc" | sed "s/-/: /;s/\.muttrc$//" | sort -n)" ;} list() { getaccounts && [ -n "$accounts" ] && echo "$accounts" ;} @@ -49,14 +45,14 @@ host $smtp port ${sport:-587} from $fulladdr user $login -passwordeval \"pass $pass_prefix$fulladdr\" +passwordeval \"pass $fulladdr\" $tlsline " mbsync_profile="IMAPStore $fulladdr-remote Host $imap Port ${iport:-993} User $login -PassCmd \"pass $pass_prefix$fulladdr\" +PassCmd \"pass $fulladdr\" AuthMechs LOGIN SSLType ${imapssl:-IMAPS} CertificateFile $sslcert @@ -64,8 +60,8 @@ CertificateFile $sslcert MaildirStore $fulladdr-local Subfolders Verbatim Path ${XDG_DATA_HOME:-$HOME/.local/share}/mail/$fulladdr/ -Inbox ${XDG_DATA_HOME:-$HOME/.local/share}/mail/$fulladdr/INBOX -Flatten . +Inbox ${XDG_DATA_HOME:-$HOME/.local/share}/mail/$fulladdr/${inbox:-INBOX} +Flatten _ Channel $fulladdr Expunge Both @@ -111,7 +107,7 @@ set folder = \"imaps://$login@$imap:${iport:-993}\" set imap_user = \"$login\" set header_cache = $cachedir/$fulladdr/headers set message_cachedir = $cachedir/$fulladdr/bodies -set imap_pass = \"\`pass $pass_prefix$fulladdr\`\" +set imap_pass = \"\`pass $fulladdr\`\" set mbox_type = Maildir set ssl_starttls = yes @@ -159,7 +155,7 @@ delete() { if [ -z "${fulladdr+x}" ]; then rm -rf "${cachedir:?}/${fulladdr:?}" "$accdir/"[1-9]"-$fulladdr.muttrc" sed -ibu "/[0-9]-$fulladdr.muttrc/d" "$muttrc" ; rm -f "$muttrc"bu sed -ibu "/account $fulladdr/,/^\(\s*$\|account\)/d" "$msmtprc"; rm -f "$msmtprc"bu - pass rm -f "$pass_prefix$fulladdr" >/dev/null 2>&1 + pass rm -f "$fulladdr" >/dev/null 2>&1 # Get rid of those multiple newlines because I don't know awk well enough to do it by default lol. for file in "$msmtprc" "$mbsyncrc"; do @@ -171,11 +167,11 @@ delete() { if [ -z "${fulladdr+x}" ]; then askinfo() { \ [ -z "$fulladdr" ] && echo "Give the full email address to add:" && read -r fulladdr - while ! echo "$fulladdr" | grep -qE "$emailre"; do + while ! echo "$fulladdr" | grep -qE ".+@.+\..+"; do echo "\`$fulladdr\` is not a valid email address. Please retype the address:" read -r fulladdr done - grep -q "Channel\s*$fulladdr$" "$mbsyncrc" && + grep -q "Channel\s*$fulladdr$" "$mbsyncrc" 2>/dev/null && { echo "$fulladdr has already been added" && exit 1 ;} { [ -z "$imap" ] || [ -z "$smtp" ] ;} && parsedomains [ -z "$imap" ] && echo "Give your email server's IMAP address (excluding the port number):" && @@ -192,14 +188,11 @@ askinfo() { \ fi } -createpass() { echo "$password" > "$PASSWORD_STORE_DIR/$pass_prefix$fulladdr" - "$GPG" -qer "$(cat "$PASSWORD_STORE_DIR/.gpg-id")" "$PASSWORD_STORE_DIR/$pass_prefix$fulladdr" - rm -f "$PASSWORD_STORE_DIR/$pass_prefix$fulladdr" ;} - -writeinfo() { mkdir -p "$muttdir" "$accdir" "$cachedir/$fulladdr/bodies" "${XDG_CONFIG_HOME:-$HOME/.config}/msmtp" "$maildir/$fulladdr" +createpass() { echo "$password" > "$PASSWORD_STORE_DIR/$fulladdr" + "$GPG" -qer "$(cat "$PASSWORD_STORE_DIR/.gpg-id")" "$PASSWORD_STORE_DIR/$fulladdr" + rm -f "$PASSWORD_STORE_DIR/$fulladdr" ;} - # Get accounts and find the first missing account number (max. 9). - getaccounts; for x in $(seq 1 9); do echo "$accounts" | grep -q "$x" || { export idnum="$x"; break ;}; done +writeinfo() { mkdir -p "${muttrc%/*}" "$accdir" "$cachedir/$fulladdr/bodies" "${XDG_CONFIG_HOME:-$HOME/.config}/msmtp" "$maildir/$fulladdr" # Configure msmtprc for sending mail. [ ! -f "$msmtprc" ] && echo "$msmtp_header" > "$msmtprc" @@ -213,37 +206,32 @@ writeinfo() { mkdir -p "$muttdir" "$accdir" "$cachedir/$fulladdr/bodies" "${XDG_ # Create a muttrc for viewing mail. echo "$mutt_profile" > "$accdir/$idnum-$fulladdr.muttrc" [ ! -f "$muttrc" ] && echo "# vim: filetype=neomuttrc" > "$muttrc" - ! grep -q "^source.*mutt-wizard.muttrc" "$muttrc" && echo "source $mwconfig $marker" >> "$muttrc" - ! grep "^source.*.muttrc" "$muttrc" | grep -qv "$mwconfig" && echo "source $accdir/$idnum-$fulladdr.muttrc $marker" >> "$muttrc" - echo "macro index,pager i$idnum 'source $accdir/$idnum-$fulladdr.muttrc!;' \"switch to $fulladdr\" $marker" >> "$muttrc" + ! grep -q "^source.*mutt-wizard.muttrc" "$muttrc" && echo "source $mwconfig" >> "$muttrc" + ! grep "^source.*.muttrc" "$muttrc" | grep -qv "$mwconfig" && echo "source $accdir/$idnum-$fulladdr.muttrc" >> "$muttrc" + echo "macro index,pager i$idnum 'source $accdir/$idnum-$fulladdr.muttrc!;' \"switch to $fulladdr\"" >> "$muttrc" notmuchauto # Create a notmuch config file if not present already. } -getpass() { while : ; do pass rm -f "$pass_prefix$fulladdr" >/dev/null 2>&1 - pass insert "$pass_prefix$fulladdr" && break; done ;} +getpass() { while : ; do pass rm -f "$fulladdr" >/dev/null 2>&1 + pass insert "$fulladdr" && break; done ;} formatShortcut() { toappend="$toappend -macro index,pager g$1 \"=$3\" \"go to $2\" $marker -macro index,pager M$1 \";=$3\" \"move mail to $2\" $marker -macro index,pager C$1 \";=$3\" \"copy mail to $2\" $marker" >> "$accdir/$idnum-$fulladdr.muttrc" ;} +macro index,pager g$1 \"=$3\" \"go to $2\" +macro index,pager M$1 \";=$3\" \"move mail to $2\" +macro index,pager C$1 \";=$3\" \"copy mail to $2\"" ;} setBox() { toappend="$toappend -set $1 = \"+$2\" $marker" ;} - -getboxes() { [ -n "${force+x}" ] && mailboxes="INBOX -Drafts -Junk -Trash -Sent -Archive" && return 0 - info="$(curl --location-trusted -s -m 5 --user "$login:$(pass $pass_prefix$fulladdr)" --url "${protocol:-imaps}://$imap:${iport:-993}")" - [ -z "$info" ] && echo "Log-on not successful." && return 1 - mailboxes="$(echo "$info" | sed "s/.*\" //;s/\"//g" | tr -d ' ')" -} +set $1 = \"+$2\"" ;} -finalize() { echo "$mailboxes" | xargs -I {} mkdir -p "$maildir/$fulladdr/{}/cur" "$maildir/$fulladdr/{}/tmp" "$maildir/$fulladdr/{}/new" - sed -ibu "/$marker/d" "$accdir/$idnum-$fulladdr.muttrc" ; rm -f "$accdir/$idnum-$fulladdr.muttrcbu" +getboxes() { if [ -n "${force+x}" ]; then + mailboxes="$(printf "INBOX\\nDrafts\\nJunk\\nTrash\\nSent\\nArchive")" + else + info="$(curl --location-trusted -s -m 5 --user "$login:$(pass $fulladdr)" --url "${protocol:-imaps}://$imap:${iport:-993}")" + [ -z "$info" ] && echo "Log-on not successful." && return 1 + mailboxes="$(echo "$info" | sed "s/.*\" //;s/\"//g" | tr -d ' ')" + fi + getaccounts; for x in $(seq 1 9); do echo "$accounts" | grep -q "^$x:" || { export idnum="$x"; break ;}; done toappend="mailboxes $(echo "$mailboxes" | sed "s/^/\"=/;s/$/\"/" | paste -sd ' ' - )" for x in $mailboxes; do case "$x" in @@ -253,9 +241,12 @@ finalize() { echo "$mailboxes" | xargs -I {} mkdir -p "$maildir/$fulladdr/{}/cur *[Jj][Uu][Nn][Kk]*) formatShortcut j junk "$x" ;; *[Aa][Rr][Cc][Hh][Ii][Vv][Ee]*) formatShortcut a archive "$x" ;; *[Ss][Pp][Aa][Mm]*) formatShortcut S spam "$x" ;; - *[Ii][Nn][Bb][Oo][Xx]*) formatShortcut i inbox "$x"; setBox spoolfile "$x" ;; + *[Ii][Nn][Bb][Oo][Xx]*) formatShortcut i inbox "$x"; setBox spoolfile "$x" inbox="$x" ;; esac done +} + +finalize() { echo "$mailboxes" | xargs -I {} mkdir -p "$maildir/$fulladdr/{}/cur" "$maildir/$fulladdr/{}/tmp" "$maildir/$fulladdr/{}/new" echo "$toappend" >> "$accdir/$idnum-$fulladdr.muttrc" [ -z "${online+x}" ] && echo "$fulladdr (account #$idnum) added successfully." command -V urlview >/dev/null 2>&1 && [ ! -f "$HOME/.urlview" ] && echo "COMMAND \$BROWSER" > "$HOME/.urlview" @@ -328,7 +319,7 @@ Options allowed with -a: NOTE: Once at least one account is added, you can run \`mbsync -a\` to begin downloading mail. -To change an account's password, run \`pass edit ${pass_prefix}your@email.com\`. +To change an account's password, run \`pass edit your@email.com\`. EOF } @@ -365,7 +356,7 @@ esac done case "$action" in list) list ;; - add) checkbasics && askinfo && getprofiles && writeinfo && getboxes && finalize || { delete ; exit 1 ;} ;; + add) checkbasics && askinfo && getboxes && getprofiles && writeinfo && finalize || { delete ; exit 1 ;} ;; delete) delete ;; sync) mailsync $fulladdr ;; toggle) togglecron ;;