-
v1.6.0
StableAll checks were successfulAuto Release on version bump / release (push) Successful in 7sreleased this
2026-10-06 12:45:11 +02:00 | 0 commits to main since this releaseUn solo nome per tutto:
eg-contact-form. Repo, nome del plugin e cartella non coincidevano dall'inizio (repoeg-contact-form-privacy, cartella, file e text domaineg-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: classiEG_Contact_FormedEG_Contact_Form_Admin(fileincludes/class-eg-contact-form-admin.php), costantiEG_CONTACT_FORM_*, gruppo di cacheeg_contact_form, transienteg_contact_form_*, filtroeg_contact_form_labels(senza alias del vecchio nome, uscito il giorno prima), pagina?page=eg-contact-form, option group, azioneadmin_poste id dei campi. - Migrazione al primo caricamento:
eg_contact_form_privacy_settings(oeg_contact_recipientdella 1.4.x) diventaeg_contact_form_settings,eg_contact_statsdiventaeg_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 URIpuntano 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
1 download
- Prefisso a slug completo
-
v1.5.1
StableAll checks were successfulAuto Release on version bump / release (push) Successful in 6sreleased this
2026-10-06 07:51:28 +02:00 | 1 commits to main since this releaseCorrezioni 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],...):focusconbackground-color: var(--theme-form-field-background-focus-color)(trasparente sullo stage) ecolor: 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-forme la regola:focusfissa 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
2 downloads
- Campi che in focus prendevano lo sfondo del form. Blocksy ha
-
v1.5.0
StableAll checks were successfulAuto Release on version bump / release (push) Successful in 7sreleased this
2026-10-05 21:51:09 +02:00 | 2 commits to main since this releasePagina 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_labelsper 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) orole="status"(invio riuscito), campo sbagliato conaria-invalidearia-describedby,autocomplete="name"ed"email", form che punta all'àncora#eg-contactcosì 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 caricamentoeg_contact_recipientviene copiata lì e cancellata.eg_contact_statse i transienteg_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
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
3 downloads
- Impostazioni > EG Contact Form, con tre schede. Il codice sta in
-
v1.4.2
StableAll checks were successfulAuto Release on version bump / release (push) Successful in 7sreleased this
2026-10-05 19:32:42 +02:00 | 3 commits to main since this releaseChanged
- 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 taggdprresta: è 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.mdin inglese e nuovoREADME.it-IT.mdin 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 inchangelog.txt(nel pacchetto)..gitattributescon l'elenco standard:README.it-IT.mdfuori dal pacchetto,README.mdeLICENSE.mddentro.
Removed
INSTALLAZIONE.mdelanguages/README.md: duplicavano il README ed erano superati (citavano Git Updater e unen_US.poche non esiste più)..distignore: il pacchetto lo crea la CI congit archive, che usa.gitattributes.
Downloads
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
2 downloads
- Tolta la promessa "GDPR-compliant" da Description, descrizione breve, elenco funzionalità e FAQ di
-
v1.4.1
StableAll checks were successfulAuto Release on version bump / release (push) Successful in 8sreleased this
2026-10-05 19:19:37 +02:00 | 4 commits to main since this releaseSpam 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.mdin inglese e nuovoREADME.it-IT.mdin 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 inchangelog.txt(nel pacchetto)..gitattributescon l'elenco standard:README.it-IT.mdfuori dal pacchetto,README.mdeLICENSE.mddentro.
Removed
INSTALLAZIONE.mdelanguages/README.md: duplicavano il README ed erano superati (citavano Git Updater e unen_US.poche non esiste più)..distignore: il pacchetto lo crea la CI congit archive, che usa.gitattributes.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
2 downloads
- Indirizzo web nel Nome: 2 punti (motivo
-
v1.4.0
StableAll checks were successfulAuto Release on version bump / release (push) Successful in 8sreleased this
2026-10-03 18:01:03 +02:00 | 5 commits to main since this releaseRevisione anti-spam dopo un messaggio di prova (03/10/2026) passato da tutte le difese: lo stesso marcatore
169954in 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 mittentenoreply@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-IPeX-Forwarded-Forli 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_remoteipnel 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()dicheck_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 conaria-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 campoeg_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()sutemplate_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 comex@altro.tld, Marioaggiungeva un indirizzo. - Lunghezze dei campi con
mb_strlen(): prima un nome non latino di 51 caratteri superava il limite di 100 byte. EG_CONTACT_VERSIONallineata all'header (era ferma a 1.3.1).- Disattivazione e disinstallazione:
DELETEcon$wpdb->prepare()edesc_like(), su tutti i transienteg_contact_*; la disinstallazione cancella ancheeg_contact_stats. readme.txt:Tested up to7.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_maile scritture DB bloccate (token, limiti, spoofingClient-IP, quarantena del probe, limiti auto-reply, Reply-To, nomi cirillici, 4 messaggi legittimi non segnalati).
Downloads
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
3 downloads
-
v1.3.3 Stable
released this
2026-06-05 23:38:56 +02:00 | 8 commits to main since this releaseFixed
- 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_repopcon chiaviis_resubmit,name,email,subject,message. Risolve 5 warningPrefixAllGlobals.NonPrefixedVariableFoundintrodotti 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
-
Source code (ZIP)
6 downloads
-
Source code (TAR.GZ)
10 downloads
- Le 5 variabili di re-popolazione del form in