summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgabrix73 <gabriel1@frozenstar.info>2026-05-31 01:32:59 +0200
committergabrix73 <gabriel1@frozenstar.info>2026-05-31 01:32:59 +0200
commit904fb9fbae8c26cf13fdc6719b497248e24f0bf3 (patch)
tree9c36c53e36a75e1ecb9fdf080e3b2a6aadba8c9c
parentf90151373ee07501a199fb564319fc3f38730c44 (diff)
downloadneomutt-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/mail2news24
-rw-r--r--scripts/m2n-prompt.sh176
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