Skip to content

Client wawp-updater et chaîne de publication - #1

Merged
thierrypigot merged 23 commits into
mainfrom
feat/client-pipeline
Oct 12, 2026
Merged

thierrypigot merged 23 commits into
mainfrom
feat/client-pipeline

Conversation

@thierrypigot

Copy link
Copy Markdown
Contributor

Objet

Client de mise à jour wawp-updater embarqué dans les plugins WeAre[WP] et chaîne de publication automatique vers updates.wearewp.pro.

Contenu

  • wawp-updater/ (PHP 7.4+, WordPress 5.8+) : intégration native (Update URI, plugins_api, upgrader_pre_download), validation stricte des réponses du serveur, jeton frais au téléchargement, signature Ed25519 obligatoire, contrôle du paquet (slug, version offerte, version supérieure), entrée no_update, chargement partagé où la copie la plus récente gère tous les plugins, aucune erreur fatale si un fichier manque. La clé WAWP_LICENSE_KEY n'est jamais stockée, journalisée ni affichée.
  • .github/workflows/plugin-release.yml : workflow réutilisable en trois jobs séparés (construction sans secret, signature et envoi FTPS sans code du plugin, archive dans la Release sans secret), actions officielles épinglées par empreinte.
  • Scripts : contrôles avant publication et du paquet construit, signature, envoi FTPS, génération des clés, préparation d'un dépôt de plugin.
  • docs/mise-en-place.md : procédure unique (clés, secrets, o2switch, premier plugin, rotation).

Ce dépôt ne contient aucun secret. Les clés publiques seront ajoutées lors de la mise en service.

Vérifications

  • PHPUnit : 68 tests, 414 assertions
  • PHPStan niveau max (cible PHP 7.4) et PHPCS WordPress-Extra + PHPCompatibilityWP : aucune erreur
  • Bout en bout sur un vrai WordPress (SQLite) contre le vrai serveur : tous les scénarios passent (mise à jour signée, jeton périmé remplacé, paquet altéré refusé, licence révoquée, clé absente)
  • Relu tâche par tâche, revue finale et relecture des corrections sans point ouvert

… les plugins

Ajoute load.php et bootstrap.php, le test du chargeur, et corrige les constats PHPCS et PHPStan de la bibliothèque sans changer son comportement.
…e contrôle du paquet

- boot() charge la copie la plus récente dont bootstrap.php est lisible, sinon ne fait rien ;
- bootstrap.php vérifie les six fichiers src/ avant tout require et renvoie sinon une fonction sans effet ;
- load.php ne laisse plus que le registre en portée globale ;
- Package::matches() lit le zip (ZipArchive, sinon PclZip du cœur) : entrées sous <slug>/ et en-tête Version.
…date, paquet détourné refusé

- après la signature, le paquet doit contenir <slug>/ en version de l'offre, supérieure à l'installée (wawp_package_mismatch) ;
- plugin à jour avec une clé valide : entrée sans paquet, rangée par WordPress dans no_update ;
- upgrader_pre_download en priorité 1 : une URL WeAre[WP] déjà traitée par un autre filtre est refusée (wawp_package_hijacked).
…e lue aussi sur main, durcissements

- scripts/check-package.php vérifie build/<slug>/ avant le zip (wawp-updater complet, chargement et
  inscription, en-têtes Version et Update URI, deux clés publiques distinctes, aucun dossier .git) ;
- le job build lit config/min-updater-version.txt sur main (checkout épinglé, sparse) et retient la plus haute ;
- check-headers.php refuse une version minimale malformée ou un dossier vide ;
- lftp installé dans une étape sans secrets, overwrite sur les artefacts, Release jamais écrasée.
@thierrypigot
thierrypigot merged commit 29f21ae into main Oct 12, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants