diff options
| author | gabrix73 <gabriel1@frozenstar.info> | 2026-05-31 01:32:59 +0200 |
|---|---|---|
| committer | gabrix73 <gabriel1@frozenstar.info> | 2026-05-31 01:32:59 +0200 |
| commit | 904fb9fbae8c26cf13fdc6719b497248e24f0bf3 (patch) | |
| tree | 9c36c53e36a75e1ecb9fdf080e3b2a6aadba8c9c | |
| parent | f90151373ee07501a199fb564319fc3f38730c44 (diff) | |
| download | neomutt-config-904fb9fbae8c26cf13fdc6719b497248e24f0bf3.tar.gz neomutt-config-904fb9fbae8c26cf13fdc6719b497248e24f0bf3.tar.xz neomutt-config-904fb9fbae8c26cf13fdc6719b497248e24f0bf3.zip | |
Add YubiKey PIV Ed25519 signature support for mail2news
- Configure vim-yubisigner as editor for automatic signing
- Update m2n-prompt.sh to use vim-yubisigner wrapper
- Add X-PGP-Key header with WKD URL
- Update SMTP onion address
- Signatures created with yubisigner-cli in PGP-like clearsign format
| -rw-r--r-- | accounts/mail2news | 24 | ||||
| -rw-r--r-- | scripts/m2n-prompt.sh | 176 |
2 files changed, 141 insertions, 59 deletions
diff --git a/accounts/mail2news b/accounts/mail2news index 9fa485e..3181f92 100644 --- a/accounts/mail2news +++ b/accounts/mail2news @@ -1,20 +1,24 @@ -# ~/.config/neomutt/accounts/mail2news -# Send-only account — mail2news gateway via Tor onion SMTP +# Account: mail2news (solo SMTP via Tor) -# Ephemeral From — .invalid domain cannot be traced or replied to -set from = "nobody@virebent.invalid" -set realname = "anonymous" +# Il "from" viene impostato dinamicamente dalla macro +set from = "victor@virebent.invalid" +set realname = "Gabx" -# No inbox — send only -set folder = "" +# Nessun IMAP - solo invio +set folder = "" set spoolfile = "" -# SMTP via Tor hidden service — virebent.art mail2news onion relay -set smtp_url = "smtp://xilb7y4kj6u6qfo45o3yk2kilfv54ffukzei3puonuqlncy7cn2afwyd.onion:25" +# SMTP via Tor (.onion) +set smtp_url = "smtp://qee4i7sags6phsvb2yodwecfj7noimfhhalsjktsvikrwotxzis3raad.onion:25" set smtp_pass = "" set ssl_starttls = no set ssl_force_tls = no -my_hdr X-Mailer: NeoMutt +# Header personalizzati +my_hdr X-Mailer: NeoMutt mail2news +my_hdr X-PGP-Key: https://contact.virebent.art/.well-known/openpgpkey/gabvirebent.asc + +# YubiSigner: Firma automatica con YubiKey PIV Ed25519 tramite editor wrapper +set editor = "/home/gabriel1/bin/vim-yubisigner" color status black white diff --git a/scripts/m2n-prompt.sh b/scripts/m2n-prompt.sh index d57db96..312cb76 100644 --- a/scripts/m2n-prompt.sh +++ b/scripts/m2n-prompt.sh @@ -1,82 +1,160 @@ #!/bin/bash -# Mail2News posting script — NeoMutt + torsocks + swaks -# Bind to F9 in neomuttrc.tor: -# macro index,pager <F9> "<shell-escape>~/.config/neomutt/m2n-prompt.sh<enter>" "Post to Usenet" -set -euo pipefail - -M2N_TO="mail2news@xilb7y4kj6u6qfo45o3yk2kilfv54ffukzei3puonuqlncy7cn2afwyd.onion" -SMTP_HOST="xilb7y4kj6u6qfo45o3yk2kilfv54ffukzei3puonuqlncy7cn2afwyd.onion" -SMTP_PORT="25" -FROM="nobody@virebent.invalid" +# Mail2News - Script interattivo per comporre post Usenet +# Flusso: Newsgroup → Subject → [References se Re:] → Messaggio → Revisione → Invio clear -echo "=== MAIL2NEWS — Usenet Post ===" +echo "========================================" +echo " MAIL2NEWS - Nuovo Post" +echo "========================================" echo -printf "Newsgroup(s) [comma-separated]: " -read -r NEWSGROUP -[ -z "$NEWSGROUP" ] && echo "Aborted." && exit 1 +# 1. Newsgroup (supporta multipli separati da virgola) +echo -n "Newsgroup(s) (separa con virgola per crosspost): " +read NEWSGROUP + +if [ -z "$NEWSGROUP" ]; then + echo "Errore: newsgroup obbligatorio" + exit 1 +fi + +# Rimuovi spazi attorno alle virgole (misc.test, alt.test → misc.test,alt.test) NEWSGROUP=$(echo "$NEWSGROUP" | sed 's/ *, */,/g') -printf "Subject: " -read -r SUBJECT -[ -z "$SUBJECT" ] && echo "Aborted." && exit 1 +# 2. Subject +echo -n "Subject: " +read SUBJECT + +if [ -z "$SUBJECT" ]; then + echo "Errore: subject obbligatorio" + exit 1 +fi +# 3. Se inizia con Re: chiedi References REFERENCES="" -if echo "$SUBJECT" | grep -qi "^re:"; then - printf "References (Message-ID of original): " - read -r REFERENCES +if [[ "$SUBJECT" =~ ^[Rr][Ee]:* ]]; then + echo -n "References (Message-ID del post originale): " + read REFERENCES fi -MSGFILE=$(mktemp /tmp/m2n-body.XXXXXX) +# 4. Componi messaggio +MSGFILE=$(mktemp /tmp/m2n-msg.XXXXXX) echo "" > "$MSGFILE" echo "-- " >> "$MSGFILE" -echo "posted via virebent.art mail2news" >> "$MSGFILE" +echo "Gabx" >> "$MSGFILE" + +echo +echo "Scrivi il messaggio (si aprirà vim + firma YubiKey)..." +echo "Premi INVIO per continuare..." +read -${EDITOR:-vim} "$MSGFILE" +/home/gabriel1/bin/vim-yubisigner "$MSGFILE" +# 5. Indirizzo mail2news semplice (senza data) +TO="mail2news@xilb7y4kj6u6qfo45o3yk2kilfv54ffukzei3puonuqlncy7cn2afwyd.onion" + +# 6. Crea draft completo per revisione DRAFTFILE=$(mktemp /tmp/m2n-draft.XXXXXX) -{ - printf "To: %s\n" "$M2N_TO" - printf "From: %s\n" "$FROM" - printf "Subject: %s\n" "$SUBJECT" - [ -n "$REFERENCES" ] && printf "References: %s\n" "$REFERENCES" - printf "Newsgroups: %s\n" "$NEWSGROUP" - printf "\n" - cat "$MSGFILE" -} > "$DRAFTFILE" +cat > "$DRAFTFILE" << EOF +To: $TO +From: Gabx <mail2news@virebent.invalid> +Subject: $SUBJECT +EOF + +if [ -n "$REFERENCES" ]; then + echo "References: $REFERENCES" >> "$DRAFTFILE" +fi + +echo "Newsgroups: $NEWSGROUP" >> "$DRAFTFILE" +echo "" >> "$DRAFTFILE" +cat "$MSGFILE" >> "$DRAFTFILE" + +# 7. Mostra e permetti modifica clear -echo "=== REVIEW ===" +echo "========================================" +echo " REVISIONE EMAIL" +echo "========================================" +echo cat "$DRAFTFILE" echo -printf "[s]end [e]dit [q]uit: " -read -r CHOICE +echo "========================================" +echo "[e] Modifica [s] Spedisci [q] Annulla" +echo -n "Scelta: " +read CHOICE case "$CHOICE" in - e|E) ${EDITOR:-vim} "$DRAFTFILE" ;; - q|Q) rm -f "$MSGFILE" "$DRAFTFILE"; echo "Cancelled."; exit 0 ;; + e|E) + vim "$DRAFTFILE" + echo + echo "[s] Spedisci [q] Annulla" + echo -n "Scelta: " + read CHOICE2 + if [[ "$CHOICE2" != "s" && "$CHOICE2" != "S" ]]; then + echo "Annullato." + rm -f "$MSGFILE" "$DRAFTFILE" + exit 0 + fi + ;; + q|Q) + echo "Annullato." + rm -f "$MSGFILE" "$DRAFTFILE" + exit 0 + ;; + s|S) + # continua sotto + ;; + *) + # default: spedisci + ;; esac +# 8. Invia via sendmail/msmtp o salva per neomutt +# Generiamo il file per neomutt +echo "set my_m2n_draft = \"${DRAFTFILE}\"" > /tmp/m2n.rc +echo "set my_m2n_to = \"${TO}\"" >> /tmp/m2n.rc +echo "set my_m2n_subj = \"${SUBJECT}\"" >> /tmp/m2n.rc +if [ -n "$REFERENCES" ]; then + echo "my_hdr References: ${REFERENCES}" >> /tmp/m2n.rc +fi +echo "my_hdr Newsgroups: ${NEWSGROUP}" >> /tmp/m2n.rc + +# Salva draft per invio +cp "$DRAFTFILE" /tmp/m2n-final.eml + echo -echo "Sending via Tor..." +echo "Email pronta. Invio in corso..." + +# Invia via swaks attraverso Tor (gestisce correttamente la sincronizzazione SMTP) +SMTP_HOST="qee4i7sags6phsvb2yodwecfj7noimfhhalsjktsvikrwotxzis3raad.onion" +SMTP_PORT="25" + +# SECURITY: Strip Message-ID to force server-side generation (anonymity) +CLEANFILE=$(mktemp /tmp/m2n-clean.XXXXXX) +grep -v "^Message-ID:" "$DRAFTFILE" > "$CLEANFILE" torsocks swaks \ --server "${SMTP_HOST}:${SMTP_PORT}" \ - --from "$FROM" \ - --to "$M2N_TO" \ - --data "@${DRAFTFILE}" \ + --from "mail2news@virebent.invalid" \ + --to "${TO}" \ + --data "@${CLEANFILE}" \ --timeout 60 \ - 2>&1 | tee /tmp/m2n-smtp.log + > /tmp/m2n-smtp.log 2>&1 -if grep -q "250 " /tmp/m2n-smtp.log; then - echo - echo "Sent to: $NEWSGROUP" +rm -f "$CLEANFILE" + +if grep -q "250 .*[Qq]ueued\|250 2.0.0 Ok" /tmp/m2n-smtp.log; then + echo "✓ Messaggio inviato a $NEWSGROUP" + cat /tmp/m2n-smtp.log else - echo - echo "ERROR — check /tmp/m2n-smtp.log" + echo "✗ Errore invio. Log:" + cat /tmp/m2n-smtp.log + echo "" + echo "Draft salvato in: $DRAFTFILE" + exit 1 fi -rm -f "$MSGFILE" "$DRAFTFILE" -printf "\nPress Enter to return to NeoMutt..." -read -r +# Cleanup +rm -f "$MSGFILE" +echo +echo "Premi INVIO per tornare a neomutt..." +read |
