[spip-check-cli ↪ sans-plugins] 13 commits

technova69/spip-check-cli | 13 commits

Par Gilles Vincent, le 27 août 2026 à 15h13min :

feat: ajoute --sans-plugins pour exclure les plugins de tout contrôle

–sans-plugins vide ContexteScan::plugins() et retire du parcours du site
les répertoires reconnus comme racine de plugin (paquet.xml présent), pour
toutes les vérifications : plus aucun contrôle d’intégrité, de bootstrap ou
de contenu à l’intérieur des plugins installés, quel que soit leur état réel.

VerificationIntegritePlugin garde toutefois la détection d’un fichier déposé
directement dans plugins/, plugins/auto/ ou plugins/auto// sans
appartenir à aucune installation reconnue — actif même en mode rapide,
puisque ces fichiers ne sont jamais des racines de plugin exclues du parcours.

preparerReferences() ne fait plus aucun appel réseau pour les plugins quand
le flag est actif (aucun intérêt, leur référence ne serait jamais utilisée),
et annonce le nombre de plugins exclus.

Voir docs/superpowers/specs/2026-08-27-sans-plugins-design.md pour la
conception complète.

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

Modifié
README.md
src/Command/ScanLancer.php
src/Scan/ContexteScan.php
src/Verification/VerificationIntegritePlugin.php
tests/Command/ScanLancerTest.php
tests/Scan/ContexteScanTest.php
tests/Verification/VerificationIntegritePluginTest.php

Détails : feat: ajoute --sans-plugins pour exclure les plugins de tout contrôle (dd26b334) · Validations · Gilles Vincent / spip-check-cli · GitLab

==============================
Par Gilles Vincent, le 27 août 2026 à 15h12min :

docs: spec pour --sans-plugins

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

Ajouté
docs/superpowers/specs/2026-08-27-sans-plugins-design.md

Détails : docs: spec pour --sans-plugins (aa7faf21) · Validations · Gilles Vincent / spip-check-cli · GitLab

==============================
Par Gilles Vincent, le 27 août 2026 à 14h47min :

Merge branch ‹ feat/echecs-references › into ‹ main ›

Synthèse des échecs de téléchargement de références

See merge request technova69/spip-check-cli!1

Ajouté
docs/superpowers/specs/2026-08-27-echecs-telechargement-design.md
Modifié
README.md
src/Archive/CacheArchives.php
src/Archive/FournisseurArchives.php
src/Archive/IndexDepotPlugins.php
src/Command/ScanLancer.php
src/Reference/IndexReference.php
src/Verification/VerificationIntegriteCore.php
src/Verification/VerificationIntegritePlugin.php
src/Verification/VerificationSignatureWebshell.php
tests/Archive/CacheArchivesTest.php
tests/Archive/FournisseurArchivesTest.php
tests/Archive/IndexDepotPluginsTest.php
tests/Command/ScanLancerTest.php
tests/Reference/IndexReferenceTest.php
tests/Verification/VerificationIntegriteCoreTest.php
tests/Verification/VerificationIntegritePluginTest.php
tests/Verification/VerificationSignatureWebshellTest.php

Détails : Merge branch 'feat/echecs-references' into 'main' (6465963d) · Validations · Gilles Vincent / spip-check-cli · GitLab

==============================
Par Gilles Vincent, le 27 août 2026 à 13h53min :

fix: reconnaît une archive en cache sous le nom v-préfixé

Cas réel : un plugin (cibloc 2.6.1) était déjà en cache sous le nom de son
téléchargement d’origine (cibloc-v2.6.1.zip, convention de tag v-préfixée),
mais FournisseurArchives::archivePlugin() ne vérifiait le cache que sous le
nom canonique (cibloc-2.6.1.zip) — jamais trouvé, l’outil retentait un
téléchargement au lieu de réutiliser ce qui existait déjà.

CacheArchives::localiser() vérifie maintenant les deux conventions de tag
(v1.2.3, 1.2.3) avant de conclure à une absence — la même dualité déjà
gérée à l’écriture par IndexDepotPlugins::urlsArchive(), manquante à la
lecture. Branché dans contient(), obtenir() et
FournisseurArchives::archivePlugin() (qui utilisait à tort contient() +
chemin() : une archive trouvée sous le nom alternatif aurait fait renvoyer
un chemin canonique inexistant). supprimer() nettoie aussi les deux formes.

Reproduit et vérifié : avec un dépôt qui liste le plugin et l’archive
présente sous le nom v-préfixé, le scan n’émet plus aucune requête réseau
et rend un scan propre.

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

Modifié
src/Archive/CacheArchives.php
src/Archive/FournisseurArchives.php
tests/Archive/CacheArchivesTest.php
tests/Archive/FournisseurArchivesTest.php

Détails : fix: reconnaît une archive en cache sous le nom v-préfixé (2cc51a2f) · Validations · Gilles Vincent / spip-check-cli · GitLab

==============================
Par Gilles Vincent, le 27 août 2026 à 12h57min :

fix: distingue dépôt indisponible vs plugin absent, rétablit le nom de destination

Cas réel : un utilisateur avait renommé ~/.spip-check-cli/cache/depot-
principal.thin.xml, rendant le dépôt invisible pour l’outil. Résultat :
CHAQUE plugin déclaré se voyait dire silencieusement « hors dépôt public »,
sans aucune indication que la cause était le dépôt lui-même plutôt qu’un
fait sur les plugins.

IndexDepotPlugins::disponible() distingue maintenant les deux cas. Quand
des plugins sont déclarés et que le dépôt n’a pas pu être chargé, un échec
dédié « Dépôt public des plugins (N déclaré(s)…) » apparaît une seule fois
dans le bloc de synthèse déjà en place, avant la liste par plugin.

En reproduisant ce cas, découvert que le nom de destination (retiré
précédemment de ce même bloc) était en fait nécessaire dans les 3 cas sur 4
où le nom du fichier tel que téléchargé ne correspond pas au nom attendu
dans le cache (noyau : spip-v4.4.13.zip vs spip-4.4.13.zip ; spip_loader.php
vs spip_loader.php.reference ; principal.thin.xml vs depot-
principal.thin.xml). Rétabli pour les quatre types de référence.

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

Modifié
README.md
docs/superpowers/specs/2026-08-27-echecs-telechargement-design.md
src/Archive/IndexDepotPlugins.php
src/Command/ScanLancer.php
tests/Archive/IndexDepotPluginsTest.php
tests/Command/ScanLancerTest.php

Détails : fix: distingue dépôt indisponible vs plugin absent, rétablit le nom de destination (385d842a) · Validations · Gilles Vincent / spip-check-cli · GitLab

==============================
Par Gilles Vincent, le 27 août 2026 à 12h31min :

fix: ignore une différence de fin de ligne seule (CRLF/LF)

Un fichier retranscrit en CRLF (ou l’inverse) sans autre changement était
signalé comme modifié : les empreintes SHA-1 diffèrent forcément, mais
diff --strip-trailing-cr ne remonte aucun changement dans ce cas — le
scan ne devrait pas en remonter non plus.

IndexReference::correspond($relatif, $empreinteSite, $contenuSite) centralise
la tolérance : l’empreinte SHA-1 brute reste le chemin rapide (le contenu
n’est lu que si elle ne correspond pas), avec un repli sur une comparaison
CRLF→LF des deux côtés avant de conclure à une vraie altération.

Branché dans les trois comparaisons à une référence : VerificationIntegritePlugin,
VerificationIntegriteCore, et VerificationSignatureWebshell::estIdentiqueALaReference
(partagée avec VerificationLegitimiteFormulaireCvt) — un fichier de référence
retranscrit en CRLF ne doit pas non plus se voir rejoué comme un webshell.

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

Modifié
src/Reference/IndexReference.php
src/Verification/VerificationIntegriteCore.php
src/Verification/VerificationIntegritePlugin.php
src/Verification/VerificationSignatureWebshell.php
tests/Reference/IndexReferenceTest.php
tests/Verification/VerificationIntegriteCoreTest.php
tests/Verification/VerificationIntegritePluginTest.php
tests/Verification/VerificationSignatureWebshellTest.php

Détails : fix: ignore une différence de fin de ligne seule (CRLF/LF) (c21d5c5b) · Validations · Gilles Vincent / spip-check-cli · GitLab

==============================
Par Gilles Vincent, le 27 août 2026 à 12h07min :

fix: pointe vers la page des étiquettes du plugin plutôt que deviner l’archive

Remplace le départage par HEAD (retiré : ClientHttp::estJoignable et ses
deux implémentations) par IndexDepotPlugins::urlTags(), qui déduit l’URL
de la page des étiquettes (tags) du dépôt du plugin depuis sa source. Plus
simple, et robuste au blocage anti-robot qui rendait le départage par HEAD
inopérant (archive existante, inexistante et page des tags répondent
identiquement sous ce blocage — cf. commit précédent).

L’utilisateur choisit lui-même le bon zip sur cette page plutôt que de se
voir proposer une ou deux archives devinées. Le téléchargement automatique
n’est pas affecté : IndexDepotPlugins::urlsArchive() (les deux candidats,
essayés dans l’ordre) reste inchangé.

Séparateur des lignes du bloc de synthèse changé de « : » à « => ».

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

Modifié
README.md
docs/superpowers/specs/2026-08-27-echecs-telechargement-design.md
src/Archive/ClientHttp.php
src/Archive/ClientHttpFlux.php
src/Archive/IndexDepotPlugins.php
src/Command/ScanLancer.php
tests/Archive/IndexDepotPluginsTest.php
tests/Command/ScanLancerTest.php
tests/Double/ClientHttpFactice.php

Détails : fix: pointe vers la page des étiquettes du plugin plutôt que deviner l'archive (b174ae88) · Validations · Gilles Vincent / spip-check-cli · GitLab

==============================
Par Gilles Vincent, le 27 août 2026 à 11h03min :

docs: consigne la limite confirmée du départage par HEAD sous X-GoAway

Sur un serveur bloqué, l’archive existante, l’archive inexistante et la
page des tags du même projet répondent identiquement (200, text/html,
X-GoAway: away) — aucun signal HTTP ne distingue alors le bon candidat.
Comportement actuel déjà sûr dans ce cas (les deux candidats restent
affichés, pas de faux tri) ; pas de détection de X-GoAway ajoutée, sur
demande explicite — le résultat serait identique pour une hypothèse
supplémentaire non garantie.

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

Modifié
docs/superpowers/specs/2026-08-27-echecs-telechargement-design.md

Détails : docs: consigne la limite confirmée du départage par HEAD sous X-GoAway (78807aea) · Validations · Gilles Vincent / spip-check-cli · GitLab

==============================
Par Gilles Vincent, le 27 août 2026 à 10h44min :

fix: départage les deux candidats d’URL de plugin par un HEAD

Les deux conventions de tag (v1.2.3, 1.2.3) coexistent sur la zone SPIP.
Un HEAD sur chaque candidat (ClientHttp::estJoignable(), sans télécharger
le corps) filtre à celui qui répond 200 — vérifié sur galleria 2.3.0 :
v2.3.0 rend 404, 2.3.0 rend 200. Si aucun ne répond ou si le diagnostic lui-
même échoue, les candidats non filtrés restent affichés plutôt que d’en
cacher un à tort. N’affecte jamais le téléchargement réel, qui continue
d’essayer les deux URLs comme avant.

Alternative envisagée (API des tags GitLab) écartée : couplée à GitLab,
pagination à gérer, fiabilité derrière un blocage anti-robot pas mieux
garantie que /-/archive/… lui-même.

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

Modifié
docs/superpowers/specs/2026-08-27-echecs-telechargement-design.md
src/Archive/ClientHttp.php
src/Archive/ClientHttpFlux.php
src/Command/ScanLancer.php
tests/Command/ScanLancerTest.php
tests/Double/ClientHttpFactice.php

Détails : fix: départage les deux candidats d'URL de plugin par un HEAD (6c379093) · Validations · Gilles Vincent / spip-check-cli · GitLab

==============================
Par Gilles Vincent, le 27 août 2026 à 10h35min :

fix: montre les deux candidats d’URL de plugin, pas seulement le premier

Les deux conventions de tag (v1.2.3, 1.2.3) coexistent sur la zone SPIP.
N’afficher que le premier candidat pouvait montrer une URL en 404 alors
que le second, réellement valide, n’était jamais montré à l’utilisateur —
confirmé empiriquement sur galleria 2.3.0 : /archive/v2.3.0/… rend 404,
/archive/2.3.0/… rend 200.

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

Modifié
docs/superpowers/specs/2026-08-27-echecs-telechargement-design.md
src/Command/ScanLancer.php
tests/Command/ScanLancerTest.php

Détails : fix: montre les deux candidats d'URL de plugin, pas seulement le premier (712cf52c) · Validations · Gilles Vincent / spip-check-cli · GitLab

==============================
Par Gilles Vincent, le 27 août 2026 à 10h24min :

fix: retire le chemin de destination de la liste des échecs

Il faisait doublon avec la ligne d’instruction, qui donne déjà le
répertoire de cache une seule fois pour tous les éléments listés. Corrige
au passage un libellé de plugin dupliquant sa version (PluginInstalle::libelle()
la contient déjà).

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

Modifié
README.md
docs/superpowers/specs/2026-08-27-echecs-telechargement-design.md
src/Command/ScanLancer.php
tests/Command/ScanLancerTest.php

Détails : fix: retire le chemin de destination de la liste des échecs (8b459744) · Validations · Gilles Vincent / spip-check-cli · GitLab

==============================
Par Gilles Vincent, le 27 août 2026 à 10h04min :

feat: résume les échecs de téléchargement de références après la barre

Quand le noyau, spip_loader.php ou un plugin à source connue ne peut pas
être téléchargé, un unique bloc s’affiche une fois la barre de progression
« Références » terminée — jamais pendant qu’elle tourne : le constat, sans
supposer de cause (réseau, site en panne, protection anti-robot — rien ne
le garantit), puis l’URL détectée et le nom de fichier attendu dans le
cache pour chaque élément manquant, à déposer manuellement avant de relancer
l’analyse.

Remplace l’approche de fix/archives-plugins-diagnostics (messages par
plugin pendant que la barre tourne, attribution de cause non garantie),
laissée de côté.

Voir docs/superpowers/specs/2026-08-27-echecs-telechargement-design.md.

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

Modifié
README.md
src/Command/ScanLancer.php
tests/Command/ScanLancerTest.php

Détails : feat: résume les échecs de téléchargement de références après la barre (962836d6) · Validations · Gilles Vincent / spip-check-cli · GitLab

==============================
Par Gilles Vincent, le 27 août 2026 à 09h59min :

docs: spec pour la synthèse des échecs de téléchargement de références

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

Ajouté
docs/superpowers/specs/2026-08-27-echecs-telechargement-design.md

Détails : docs: spec pour la synthèse des échecs de téléchargement de références (c515b64f) · Validations · Gilles Vincent / spip-check-cli · GitLab