Repository navigation
Releases: oliweb-ch/wp-html-mail
Release list
v4.0.4 — Hardening
Hardening
send_test() — accès défensif au paramètre email
Remplacement de $request->get_params()['email'] (accès tableau non défensif) par $request->get_param('email') avec vérification is_string() avant sanitize_email(). Évite une TypeError PHP si le champ est absent ou de type inattendu ([], null…).
Fichiers debug — wp_tempnam() + suppression après envoi
get_temp_dir() . 'debug-' . uniqid() . '.txt'→wp_tempnam('haet-mail-debug')(nom non prévisible, fichier créé directement par WordPress)- Ajout d'un hook
shutdownviaadd_action()pour supprimer le fichier temporaire après quewp_mail()l'a utilisé comme pièce jointe
CSS textarea — esc_textarea()
Les deux textareas du Mail Builder (mailbuilder_css_desktop, mailbuilder_css_mobile) utilisaient echo brut. Ajout de esc_textarea().
Bibliothèque de templates distante — validation schéma JSON
Ajout d'une méthode privée sanitize_template() appliquée à chaque objet reçu de templates.wp-html-mail.com avant stockage en transient :
- Rejette les objets malformés (pas d'objet, pas de
versionstring) sanitize_text_field()surname,description,authoresc_url_raw()surthumbnail,preview,url,download_url
v4.0.3 — Correctifs de sécurité
Correctifs de sécurité
🟠 XSS potentiel dans headertext (via attributs HTML)
strip_tags() ne supprime pas les attributs à l'intérieur des balises autorisées (<span onmouseover="..."> survivait). Remplacé par wp_kses() avec une allowlist stricte sur les tags et leurs attributs :
headertext/headertext_*:b,strong,i,em,span[style]— aucun attribut événementiel possiblefooter/footer_*:wp_kses_post()— plus robuste questrip_tags()sur les attributsheaderimg_notice:<a>limité àhref,title,rel,target
Ajout de wp_kses_post() au point de rendu pour le cas just_text de get_header().
🟡 Whitelist des clés dans validate_theme_options()
Les données POST pouvaient contenir des clés arbitraires stockées après sanitisation. Ajout d'un array_filter() en tête de validate_theme_options() : seules les clés de get_default_theme_options() et les suffixes de traduction connus (footer_*, headertext_*) sont conservées.
🟠 Mail Builder CPT : capacités restreintes à manage_options
Le custom post type wphtmlmail_mail utilisait capability_type => 'post' (accessible aux editor et author). Ajout d'un tableau capabilities mappant toutes les opérations CPT sur manage_options. La vérification dans save_post est passée de edit_posts à manage_options.
v4.0.2 — Correctifs de sécurité
Correctifs de sécurité
🔴 REST save_theme_settings() — validation manquante
Les données POST étaient sauvegardées brutes sans appel à validate_theme_options(). Le chemin REST byppassait entièrement la validation existante.
🟠 Actions avancées — CSRF
Les actions destructives (delete-design, delete-all, create-template-file) étaient déclenchées via $_GET sans vérification de nonce. Ajout de check_admin_referer() côté serveur et wp_nonce_url() sur les URLs générées.
🟠 Échappement contextuel des sorties HTML
esc_url()sur l'attributsrcde l'image headeresc_attr()sur l'attributaltesc_url(get_home_url())sur les wrappers<a href>du headeresc_html()sur le sujet injecté via{#mailsubject#}wp_kses_post()sur le footer au moment du rendu
🟠 Permissions fichier
chmod 0777 → chmod 0644 sur le fichier template créé dans le répertoire du thème.
CI
Ajout d'un workflow GitHub Actions (composer audit) déclenché sur chaque push, PR et hebdomadairement.
v4.0.1
v4.0.1 — Correctifs de régression
Corrections
- Instanciation prématurée :
Haet_MB_ContentType_TextetHaet_MB_ContentType_TwoColappelaient__()avant le chargement des traductions. Les deux singletons sont maintenant instanciés dans la closureplugins_loaded(cohérent avec le reste du plugin). - Contrainte PHP :
symfony/css-selectorpasse de v8.1.0 (php >=8.4.1) à v7.4.9 (php >=8.2), aligné avec le prérequis déclaréRequires PHP: 8.3.
Ces deux bugs ont été introduits en v4.0.0 lors du refactoring des hooks.
v4.0.0
v4.0.0 — Rupture majeure
Prérequis
- PHP 8.3+ (anciennement PHP 7.2)
- WordPress 6.4+ (anciennement WP 5.4)
Nouveautés
- Webfonts (Google Fonts) fusionné dans le plugin principal — l'addon séparé n'est plus nécessaire
- Gestion des mises à jour automatiques via GitHub Releases (Plugin Update Checker v5)
- Remplacement de
voku/css-to-inline-styles(abandonné) partijsverkoyen/css-to-inline-styles(mis à jour décembre 2025)
Corrections
class-mailbuilder.phpn'était jamais chargé dans le plugin original- Textdomain incorrect
haet_mailcorrigé enwp-html-mail - Dépréciation PHP 8.2
&$thisdans les callbacks de hooks supprimée
Installation
Télécharger wp-html-mail.zip ci-dessous et l'uploader via Extensions → Ajouter → Téléverser.
Fork de codemiq/wp-html-mail — GPLv2