• v1.6.0 8ccc0afd10

    v1.6.0
    All checks were successful
    Auto Release on version bump / release (push) Successful in 7s
    Stable

    Ghost released this 2026-10-06 12:45:11 +02:00 | 0 commits to main since this release

    Un solo nome per tutto: eg-contact-form. Repo, nome del plugin e cartella non coincidevano dall'inizio (repo eg-contact-form-privacy, cartella, file e text domain eg-contact-form), e il modulo "Installa plugin da Forgejo" dell'updater rifiutava il repo perché cerca <repo>.php. Scelta l'opzione B: rinominare il repo invece di file, cartella e text domain, così il plugin non si disattiva e il .po resta com'è. Il nome visualizzato resta "EG Contact Form Privacy": su WordPress.org nome e slug sono separati (Plugin Developer FAQ). L'anti-spam previsto per la 1.6.0 passa alla 1.7.0.

    Changed

    • Prefisso a slug completo eg_contact_form_ ovunque, come chiede WordPress.org: classi EG_Contact_Form ed EG_Contact_Form_Admin (file includes/class-eg-contact-form-admin.php), costanti EG_CONTACT_FORM_*, gruppo di cache eg_contact_form, transient eg_contact_form_*, filtro eg_contact_form_labels (senza alias del vecchio nome, uscito il giorno prima), pagina ?page=eg-contact-form, option group, azione admin_post e id dei campi.
    • Migrazione al primo caricamento: eg_contact_form_privacy_settings (o eg_contact_recipient della 1.4.x) diventa eg_contact_form_settings, eg_contact_stats diventa eg_contact_form_stats; le vecchie opzioni vengono cancellate. La disinstallazione cancella anche i nomi vecchi.
    • I contatori temporanei (rate limit di 1 ora, limite giornaliero della risposta automatica, token usati) ripartono con i nomi nuovi: al massimo per un giorno un indirizzo può ricevere una risposta automatica in più. La pulizia dei transient con eg_contact_% copre sia i vecchi sia i nuovi.
    • URL di repo, Documentazione e header Gitea Plugin URI puntano a .../emanuelegori/eg-contact-form. Ordine obbligato: prima si aggiornano i siti (l'updater usa ancora l'URL vecchio e non segue i redirect, redirection => 0), poi si rinomina il repo.
    Downloads
  • v1.5.1 5b56f6f6b7

    v1.5.1
    All checks were successful
    Auto Release on version bump / release (push) Successful in 6s
    Stable

    Ghost released this 2026-10-06 07:51:28 +02:00 | 1 commits to main since this release

    Correzioni emerse dal collaudo della 1.5.0 sullo stage (tema Blocksy, sfondo personalizzato giallo/arancio).

    Fixed

    • Campi che in focus prendevano lo sfondo del form. Blocksy ha input:is([type=text],[type=email],...):focus con background-color: var(--theme-form-field-background-focus-color) (trasparente sullo stage) e color: var(--theme-text-color): specificità (0,2,1), più alta della nostra .eg-form-group input (0,1,1). Con un tema scuro il testo sarebbe diventato chiaro sullo sfondo del form. Ora tutte le regole dei campi hanno il prefisso .eg-contact-form e la regola :focus fissa sfondo bianco e testo #333333. Il textarea non era colpito (lì la regola del tema è textarea:focus, meno specifica).

    Changed

    • Link Privacy Policy: colore del testo e sempre sottolineato, invece del colore principale. Il verde predefinito sul riquadro privacy giallo aveva contrasto 1.58:1, e anche sul bianco solo 2.78:1 (WCAG chiede 4.5:1). Così il link resta leggibile con qualsiasi sfondo e non si riconosce solo dal colore.
    Downloads
  • v1.5.0 9a42d05df1

    v1.5.0
    All checks were successful
    Auto Release on version bump / release (push) Successful in 7s
    Stable

    Ghost released this 2026-10-05 21:51:09 +02:00 | 2 commits to main since this release

    Pagina di impostazioni, pensata anche per una futura proposta su WordPress.org. Scelte discusse prima di scrivere codice: niente grafico giornaliero, niente proof-of-work (richiede JavaScript e toglierebbe al plugin il "senza JavaScript"; aiuta contro il volume, che tempo minimo e rate limit già fermano, non contro il singolo phishing), niente lista di domini usa-e-getta (invecchia, scaricarla è un servizio esterno, colpisce gli alias usati da chi protegge il proprio indirizzo).

    Added

    • Impostazioni > EG Contact Form, con tre schede. Il codice sta in includes/class-eg-contact-form-privacy-admin.php, caricato solo nell'area di amministrazione.
      • Generale: destinatario, campo Oggetto mostrato o nascosto, destinazione dei messaggi sospetti, risposta automatica attiva o no con testo personalizzabile, pulsante "Invia email di prova", esempi di shortcode.
      • Aspetto: sfondo (bianco, neutro, gradiente, trasparente, personalizzato), cornice, ombra e colore principale, secondo il pattern degli altri plugin eg-*. Il predefinito resta il bianco con ombra e verde #4CAF50, quindi chi aggiorna non vede differenze (il pattern comune parte dal gradiente: qui no, per scelta).
      • Statistiche: consegnati, consegnati come sospetti e bloccati negli ultimi 30 giorni, poi la tabella dei motivi con una riga di spiegazione ciascuno. Ricorda che il plugin non salva i messaggi ma il plugin SMTP può tenerne una copia.
    • Messaggi sospetti verso un altro indirizzo, sempre con l'etichetta nell'oggetto. L'opzione "scartali" è stata esclusa: un messaggio vero segnato per errore andrebbe perso.
    • Testo della risposta automatica scelto dall'amministratore: solo testo, con i segnaposto {site_name}, {site_url} e {date}. Niente segnaposto per i dati del form, che riaprirebbero il relay. Vuoto = testo predefinito tradotto nella lingua della pagina (con Polylang esce in inglese su /en/contact/).
    • Nota fissa in fondo alla risposta automatica: "Hai ricevuto questa email perché il tuo indirizzo è stato inserito nel modulo contatti di {sito}. Se non sei stato tu, puoi ignorarla." Sostituisce l'idea di "non riceverai altri messaggi", che sarebbe una promessa falsa (il limite è 1 al giorno per indirizzo).
    • Filtro eg_contact_form_privacy_labels per le etichette dei campi. Etichette libere nelle impostazioni sono state escluse: un testo solo romperebbe le traduzioni sui siti multilingua.
    • Footer della pagina di impostazioni come negli altri plugin, senza emoji. Il link Documentazione punta al repository finché non esiste la pagina del plugin sul blog.

    Changed

    • Post/Redirect/Get: il POST ora si elabora in template_redirect (gli attributi dello shortcode si leggono dal contenuto della pagina) e un invio riuscito fa un redirect 303 a ?eg_contact_sent=1#eg-contact, così F5 non rimanda il messaggio. In caso di errore niente redirect, il form resta compilato. Lo shortcode fuori dal contenuto della pagina (widget, template) continua a funzionare come prima, senza redirect.
    • Accessibilità: messaggio con role="alert" (errore) o role="status" (invio riuscito), campo sbagliato con aria-invalid e aria-describedby, autocomplete="name" ed "email", form che punta all'àncora #eg-contact così dopo un errore la pagina scorre al messaggio, senza JavaScript.
    • Colori del form da variabili CSS (--eg-contact-accent, --eg-contact-accent-text) nello stile inline del box. Il testo del pulsante diventa nero sui colori chiari (luminosità YIQ sotto 160 = scuro); con sfondo trasparente il testo prende il colore del tema, e la casella privacy ha uno sfondo semitrasparente che funziona sia su chiaro sia su scuro.
    • Con il campo Oggetto nascosto, l'email arriva con l'oggetto "Nuovo messaggio dal modulo contatti"; le regole sull'oggetto non scattano.
    • Le impostazioni stanno nell'opzione eg_contact_form_privacy_settings (prefisso a slug completo, così la 2.0.0 non deve rimigrarla). Al primo caricamento eg_contact_recipient viene copiata lì e cancellata. eg_contact_stats e i transient eg_contact_* restano com'erano fino alla 2.0.0. Il link "Impostazioni" si aggiunge a "Documentazione" nella riga del plugin.

    Fixed

    • CHANGELOG.md: la sezione 1.4.1 non aveva il titolo ## [1.4.1].

    Downloads
  • v1.4.2 697d3dd4cd

    v1.4.2
    All checks were successful
    Auto Release on version bump / release (push) Successful in 7s
    Stable

    Ghost released this 2026-10-05 19:32:42 +02:00 | 3 commits to main since this release

    Changed

    • Tolta la promessa "GDPR-compliant" da Description, descrizione breve, elenco funzionalità e FAQ di readme.txt: la linea guida 9 di WordPress.org esclude i plugin che lasciano intendere di garantire la conformità legale, e la conformità dipende da come il sito tratta i dati (es. il log di FluentSMTP che conserva i messaggi). Nuova Description: "Privacy-first contact form: no trackers, no cookies, no external services, built-in anti-spam and auto-reply.", ora tradotta anche in italiano. La FAQ "Is it GDPR-compliant?" diventa "What personal data does it handle?" ed elenca i fatti. Il tag gdpr resta: è un termine di ricerca, non una promessa.
    • Tolte le emoji dal messaggio di invio riuscito (✅, msgid cambiato) e dal link Documentation nella lista plugin (📖).

    • 2026-10-05

    Spam del 05/10 consegnato senza etichetta: phishing in cirillico nel campo Nome ("Вам перевод 109736 руб. забрать тут https://…goo.gl…", cioè "ti è arrivato un bonifico, ritiralo qui"), messaggio di parole casuali (9flSKAg c5rl QNUXmxa IRWYHOO jaZM wwp7KYU), indirizzo della probabile vittima nel campo Email. Il bot contava su una risposta automatica che ripete il Nome: con la 1.4.0 la vittima ha ricevuto solo la conferma a testo fisso, quindi il relay è rimasto chiuso, ma il messaggio faceva 1 punto e non è finito in quarantena.

    Added

    • Indirizzo web nel Nome: 2 punti (motivo link_name), da solo basta per la quarantena. Prima valeva 1 punto insieme a @ e 4 cifre, che restano a 1 punto (name) quando non c'è un link.
    • Messaggio di parole casuali: 1 punto (motivo gibberish) se il messaggio ha almeno 4 parole e almeno metà sono "strane", cioè mescolano lettere e cifre (9flSKAg, c5rl) o hanno maiuscole dentro la parola (QNUXmxa, jaZM). Lo spam del 05/10 ora fa 3 punti.
    • Verifica sui falsi positivi: messaggi tecnici con WordPress, iPhone, PHP8, WiFi6, 5GHz, v1.9.0, un messaggio in russo, uno di 4 parole e la firma con il nome ripetuto restano non sospetti.

    Changed

    • README.md in inglese e nuovo README.it-IT.md in italiano, con la struttura degli altri plugin eg-* (funzionalità, uso, anti-spam, dati trattati, installazione, struttura, changelog).
    • readme.txt: changelog solo della linea 1.4.x; le versioni precedenti in changelog.txt (nel pacchetto).
    • .gitattributes con l'elenco standard: README.it-IT.md fuori dal pacchetto, README.md e LICENSE.md dentro.

    Removed

    • INSTALLAZIONE.md e languages/README.md: duplicavano il README ed erano superati (citavano Git Updater e un en_US.po che non esiste più).
    • .distignore: il pacchetto lo crea la CI con git archive, che usa .gitattributes.

    Downloads
  • v1.4.1 f1fc154cc8

    v1.4.1
    All checks were successful
    Auto Release on version bump / release (push) Successful in 8s
    Stable

    Ghost released this 2026-10-05 19:19:37 +02:00 | 4 commits to main since this release

    Spam del 05/10 consegnato senza etichetta: phishing in cirillico nel campo Nome ("Вам перевод 109736 руб. забрать тут https://…goo.gl…", cioè "ti è arrivato un bonifico, ritiralo qui"), messaggio di parole casuali (9flSKAg c5rl QNUXmxa IRWYHOO jaZM wwp7KYU), indirizzo della probabile vittima nel campo Email. Il bot contava su una risposta automatica che ripete il Nome: con la 1.4.0 la vittima ha ricevuto solo la conferma a testo fisso, quindi il relay è rimasto chiuso, ma il messaggio faceva 1 punto e non è finito in quarantena.

    Added

    • Indirizzo web nel Nome: 2 punti (motivo link_name), da solo basta per la quarantena. Prima valeva 1 punto insieme a @ e 4 cifre, che restano a 1 punto (name) quando non c'è un link.
    • Messaggio di parole casuali: 1 punto (motivo gibberish) se il messaggio ha almeno 4 parole e almeno metà sono "strane", cioè mescolano lettere e cifre (9flSKAg, c5rl) o hanno maiuscole dentro la parola (QNUXmxa, jaZM). Lo spam del 05/10 ora fa 3 punti.
    • Verifica sui falsi positivi: messaggi tecnici con WordPress, iPhone, PHP8, WiFi6, 5GHz, v1.9.0, un messaggio in russo, uno di 4 parole e la firma con il nome ripetuto restano non sospetti.

    Changed

    • README.md in inglese e nuovo README.it-IT.md in italiano, con la struttura degli altri plugin eg-* (funzionalità, uso, anti-spam, dati trattati, installazione, struttura, changelog).
    • readme.txt: changelog solo della linea 1.4.x; le versioni precedenti in changelog.txt (nel pacchetto).
    • .gitattributes con l'elenco standard: README.it-IT.md fuori dal pacchetto, README.md e LICENSE.md dentro.

    Removed

    • INSTALLAZIONE.md e languages/README.md: duplicavano il README ed erano superati (citavano Git Updater e un en_US.po che non esiste più).
    • .distignore: il pacchetto lo crea la CI con git archive, che usa .gitattributes.

    Downloads
  • v1.4.0 e6318956de

    v1.4.0
    All checks were successful
    Auto Release on version bump / release (push) Successful in 8s
    Stable

    Ghost released this 2026-10-03 18:01:03 +02:00 | 5 commits to main since this release

    Revisione anti-spam dopo un messaggio di prova (03/10/2026) passato da tutte le difese: lo stesso marcatore 169954 in Nome, Oggetto e Messaggio, email su dominio usa-e-getta. Lo scopo era verificare quali campi la risposta automatica rimanda a un indirizzo scelto da chi scrive: Nome e Oggetto tornavano indietro, quindi il form poteva fare da relay di spam con mittente noreply@ del sito (già successo il 21/09 con un messaggio pubblicitario e la conferma recapitata a un indirizzo di terzi). Nei log NPM di un mese: 873 POST al form, il 95% fermato dal solo tempo minimo; lo spam passato aspettava 5-19 secondi.

    Changed

    • Risposta automatica a testo fisso: niente più Nome né Oggetto del mittente. Parte al massimo 1 volta al giorno per indirizzo e 10 volte all'ora su tutto il sito, e mai per i messaggi sospetti.
    • Rate limit solo su REMOTE_ADDR: Client-IP e X-Forwarded-For li imposta il client e permettevano di azzerare il contatore. Dietro un reverse proxy l'IP reale va ripristinato dal web server (in produzione lo fa già mod_remoteip nel container WordPress).
    • Il rate limit conta anche i tentativi falliti (10/h per IP) oltre agli invii riusciti (3/h). Con un object cache persistente (Redis) l'incremento è atomico; le chiavi contengono la finestra temporale, quindi un contatore non sopravvive alla sua ora anche se la cache perde la scadenza.
    • Nonce, token scaduto o già usato: niente più wp_die() di check_admin_referer(), il form ricompare con il testo scritto e un token nuovo. Per i visitatori anonimi il nonce è condiviso e dura 12-24 h, quindi non è una difesa anti-bot.
    • Honeypot: nome eg_contact_ref, etichetta neutra, contenitore con aria-hidden (prima uno screen reader lo leggeva e poteva farlo compilare).
    • Il template riceve i valori già sanitizzati da render_form() invece di rileggere $_POST; niente più $_POST = array().
    • L'invio viene elaborato una sola volta per richiesta anche se lo shortcode viene renderizzato più volte.

    Added

    • Token firmato (HMAC con wp_salt( 'nonce' )) con ora di emissione e id casuale: tempo minimo 5 s, età massima 6 h, uso singolo (consumato solo quando la mail parte). Sostituisce il campo eg_timestamp, che non era firmato e, se assente, valeva 0 e superava il controllo.
    • Quarantena: un messaggio con punteggio >= 2 arriva comunque al destinatario con [SUSPECT: motivi] nell'oggetto e un avviso nel corpo, senza risposta automatica. Segnali: stessa sequenza di 5 caratteri con almeno una cifra in Nome, Oggetto e Messaggio (2 punti); messaggio sotto le 3 parole; Nome con URL, @ o 4 cifre; URL nell'Oggetto; Nome o Oggetto di una sola parola di 15+ caratteri con lettere e cifre; campi identici (1 punto ciascuno). Il probe del 03/10 fa 5 punti. La regola della sequenza ripetuta richiede una cifra perché senza scattava su messaggi veri (nome ripetuto nella firma e nell'oggetto).
    • Contatori giornalieri (giorni UTC) per esito nell'opzione eg_contact_stats (autoload off), 30 giorni, senza IP né contenuti: sent, quarantined, honeypot, too_fast, token_invalid, token_expired, token_used, nonce, rate_attempts, rate_sends, invalid, mail_error, autoreply_limited.
    • Pagine con lo shortcode escluse dalla cache di pagina (DONOTCACHEPAGE + nocache_headers() su template_redirect): con una cache il token sarebbe uguale per tutti e il secondo visitatore lo troverebbe già usato.

    Fixed

    • Reply-To: virgole, punti e virgola, virgolette e parentesi angolari tolti dal Nome. wp_mail() divide il Reply-To sulle virgole e un Nome come x@altro.tld, Mario aggiungeva un indirizzo.
    • Lunghezze dei campi con mb_strlen(): prima un nome non latino di 51 caratteri superava il limite di 100 byte.
    • EG_CONTACT_VERSION allineata all'header (era ferma a 1.3.1).
    • Disattivazione e disinstallazione: DELETE con $wpdb->prepare() ed esc_like(), su tutti i transient eg_contact_*; la disinstallazione cancella anche eg_contact_stats.
    • readme.txt: Tested up to 7.1; tolta la voce sul "confirmation link token", che non corrispondeva a nessuna funzione.

    Notes

    • Le nuove chiavi tengono il prefisso eg_contact_ per coerenza con l'opzione esistente; il passaggio al prefisso con lo slug completo richiede una migrazione ed è rimandato.
    • Collaudo: test nel container con object cache in memoria, mail intercettate da pre_wp_mail e scritture DB bloccate (token, limiti, spoofing Client-IP, quarantena del probe, limiti auto-reply, Reply-To, nomi cirillici, 4 messaggi legittimi non segnalati).

    Downloads
  • v1.3.3 e52643c6d3

    v1.3.3 Stable

    Ghost released this 2026-06-05 23:38:56 +02:00 | 8 commits to main since this release

    Fixed

    • Le 5 variabili di re-popolazione del form in templates/contact-form.php ($eg_form_resubmit, $eg_repop_name/email/subject/message) sono state collassate in un singolo array prefissato $eg_contact_form_repop con chiavi is_resubmit, name, email, subject, message. Risolve 5 warning PrefixAllGlobals.NonPrefixedVariableFound introdotti dalla v1.3.2: WPCS richiede che le variabili top-level di un template incluso abbiano come prefisso il plugin slug completo (eg_contact_form_), non solo il prefisso autore (eg_).

    Notes

    • Nessuna modifica funzionale o di sicurezza: il flusso CSRF + sanitisation introdotto in v1.3.2 resta identico.

    Downloads