Skip to content

Releases: oliweb-ch/wp-html-mail

v4.0.4 — Hardening

Choose a tag to compare

@oli217 oli217 released this 15 Aug 08:07

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 shutdown via add_action() pour supprimer le fichier temporaire après que wp_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 version string)
  • sanitize_text_field() sur name, description, author
  • esc_url_raw() sur thumbnail, preview, url, download_url

v4.0.3 — Correctifs de sécurité

Choose a tag to compare

@oli217 oli217 released this 15 Aug 07:54

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 possible
  • footer / footer_* : wp_kses_post() — plus robuste que strip_tags() sur les attributs
  • headerimg_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é

Choose a tag to compare

@oli217 oli217 released this 15 Aug 07:42

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'attribut src de l'image header
  • esc_attr() sur l'attribut alt
  • esc_url(get_home_url()) sur les wrappers <a href> du header
  • esc_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

Choose a tag to compare

@oli217 oli217 released this 13 Jul 17:48

v4.0.1 — Correctifs de régression

Corrections

  • Instanciation prématurée : Haet_MB_ContentType_Text et Haet_MB_ContentType_TwoCol appelaient __() avant le chargement des traductions. Les deux singletons sont maintenant instanciés dans la closure plugins_loaded (cohérent avec le reste du plugin).
  • Contrainte PHP : symfony/css-selector passe 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

Choose a tag to compare

@oli217 oli217 released this 13 Jul 16:18

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é) par tijsverkoyen/css-to-inline-styles (mis à jour décembre 2025)

Corrections

  • class-mailbuilder.php n'était jamais chargé dans le plugin original
  • Textdomain incorrect haet_mail corrigé en wp-html-mail
  • Dépréciation PHP 8.2 &$this dans 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