bricebou/ipset | 3 commits
Par bricebou, le 27 août 2026 à 14h46min :
test: couvrir les intervalles, l’unicité et l’invalidation
Trois classes, sur les trois sujets où des défauts ont été trouvés en
production. Convention reprise du plugin verifier, qui résout le même problème
— tester des fonctions SPIP hors SPIP : un phpunit.xml.dist, un
tests/bootstrap.php qui décore le minimum nécessaire, une classe par sujet.
Le bootstrap pilote deux états par des globales, $GLOBALS[‹ test_auteurs ›] pour
la table simulée et $GLOBALS[‹ visiteur_session ›] pour la session. Il reproduit
fidèlement le point qui a coûté le plus cher : session_set($nom, null) supprime
la clé au lieu de la poser.
IntervalleTest vérifie les deux propriétés dont dépend tout le reste — strcmp()
sur inet_pton() ordonne numériquement, bit de signe compris, et les opérateurs
bit-à-bit sur chaînes travaillent octet par octet — puis les bornes des CIDR
jusqu’aux cas limites /0 et /31, les syntaxes rejetées et l’IPv4 mappée en IPv6.
VerifierAccessIpsTest couvre la contrainte d’unicité par chevauchement
d’intervalles : inclusions dans les deux sens, frontières de /24, familles
d’adresses distinctes, notations équivalentes d’une même adresse, exclusion de
l’auteur en cours d’édition, et signalement de tous les conflits d’un coup.
CacheEtSessionTest couvre les deux régressions qu’aucun test ne voyait, parce
qu’elles n’apparaissent qu’en enchaînant les mécanismes dans un même
processus : la reconstruction du cache après que le vérificateur a figé le memo
statique, et la purge du memo de session quand l’IP n’est plus reconnue. Il
vérifie aussi que l’estampille réagit à une permutation d’IPs entre deux
auteurs, cas où l’IPSet compilé reste identique.
Les trois classes ont été validées par mutation : retirer le forçage du memo,
la purge de session ou la détection de chevauchement fait tomber
respectivement 1, 1 et 9 tests.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com
Ajouté
.gitignore
phpunit.xml.dist
tests/CacheEtSessionTest.php
tests/IntervalleTest.php
tests/VerifierAccessIpsTest.php
tests/bootstrap.php
Modifié
composer.json
==============================
Par bricebou, le 27 août 2026 à 14h36min :
fix: purger le memo de session quand l’IP n’est plus reconnue
ipset_access_author() se terminait par un return null sec : le chemin « l’IP ne
correspond à aucun auteur » ne touchait pas à la session. Les clés d’un accès
révoqué — ip_id_auteur, ip_version, ip_name — y survivaient donc jusqu’à
l’expiration.
L’accès lui-même était bien retiré, la fonction rendant null. Seul l’affichage
mentait, et il mentait là où c’est le plus gênant : la page de diagnostic lit
ip_name directement en session, sans passer par la fonction, et continuait
d’annoncer le nom d’un auteur auquel l’IP n’était plus rattachée.
C’est le pendant du défaut corrigé en sens inverse plus tôt, où l’on ne posait
pas une clé qu’il fallait poser : ici on ne retirait pas une clé qu’il fallait
retirer.
Le isset() en garde fait de la purge un no-op pour un visiteur anonyme sans
mémorisation, donc aucun coût sur le cas courant. Un log signale la révocation,
sans quoi elle serait invisible dans les traces.
Vérifié en partant d’une session portant un accès révoqué : les trois clés
disparaissent et la fonction rend null.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com
Modifié
ipset_options.php
==============================
Par bricebou, le 27 août 2026 à 10h12min :
fix: reconstruire le cache sur les données d’après l’enregistrement
Le vérificateur de saisie et la reconstruction du cache partagent
ipset_get_all_ips_by_authors() et son memo statique. Or les deux tournent dans
la même requête, dans cet ordre : la validation d’abord, qui fige le memo sur
l’état d’avant l’écriture, puis post_edition, qui reconstruit à partir de ce
memo périmé.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com
Modifié
inc/ipset.php