[ipset ↪ version2] 7 commits

bricebou/ipset | 7 commits

Par bricebou, le 26 août 2026 à 11h40min :

style: indentation du paquet.xml

Modifié
paquet.xml

Détails : style: indentation du paquet.xml (b08f129c) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 26 août 2026 à 11h40min :

chore: s’assurer de n’avoir dans vendor/ que les dépendances en require

Modifié
vendor/composer/autoload_psr4.php
vendor/composer/autoload_static.php
vendor/composer/installed.php

Détails : chore: s'assurer de n'avoir dans vendor/ que les dépendances en require (839b71c4) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 26 août 2026 à 11h40min :

feat: remplacer le stockage en meta de l’IPSet par un cache estampillé

L’IPSet compilé était sérialisé en base64 dans la configuration ipset, et
rien ne propageait un changement d’IPs aux mémoires déjà constituées. Il est
désormais confié à une classe Cache, qui délègue à Memoization quand il est
actif — APCu puis filecache, cf. MCache::autodetect() — et retombe sur un
fichier tmp/ipset/ipset.json sinon, pour que le plugin reste utilisable seul.

La valeur est stockée en JSON via IPSet::jsonSerialize() / newFromJson(),
format de persistance supporté par wikimedia/ip-utils : moitié moins
volumineux que serialize(), et une valeur scalaire que le backend APCu de
Memoization stocke sans passer par son sérialiseur.

Le cœur du changement est l’estampille. Elle est dérivée de la relation
auteur → IPs — et non du seul jeu d’IPs, invariant quand une IP passe d’un
auteur à l’autre —, publiée en configuration, et sert de clé de lecture à
trois mémoires : l’entrée de cache, le memo en session, et le fichier de
résolution par IP. Publier une nouvelle estampille rend inatteignable tout ce
qui est périmé, sans avoir à joindre chaque pool APCu ni chaque session.

Corrige de ce fait deux invalidations qui n’avaient jamais lieu :

  • tmp/accessip/ servait une résolution IP → auteur obsolète jusqu’au
    passage du génie, sept jours plus tard : le fichier porte maintenant
    l’estampille et se périme avec elle ;
  • le memo en session ne se resynchronisait jamais, laissant indéfiniment un
    visiteur déjà identifié sur un id_auteur qui n’était plus le bon.

Notes d’intégration :

  • schéma 1.1.0 : la configuration ipset est effacée et le cache purgé ;
  • Cache::set() exige une estampille explicite, l’appelant étant seul à savoir
    ce qui a réellement changé ;
  • : dépendance souple, le repli fichier couvrant
    son absence.

Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com

Ajouté
src/Cache.php
Modifié
inc/ipset.php
inclure/ipset_diagnostic_fonctions.php
ipset_administrations.php
ipset_options.php
paquet.xml
src/AccessIP.php

Détails : feat: remplacer le stockage en meta de l'IPSet par un cache estampillé (a4f13882) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 26 août 2026 à 11h40min :

refactor: déplacer ipset_ips_count() dans inc/ipset.php

Modifié
inc/ipset.php
saisies-vues/access_ips_fonctions.php

Détails : refactor: déplacer ipset_ips_count() dans inc/ipset.php (e8b0a5ad) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 26 août 2026 à 11h40min :

fix: reconstruire le cache quand le statut d’un auteur change

ipset_get_all_ips_by_authors() écarte les auteurs 5poubelle du jeu d’IPs,
mais le pipeline ne se déclenchait que sur action === 'modifier' avec
access_ips dans les données. Or SPIP institue un changement de statut avec
action === 'instituer' et statut dans les données : mettre un auteur à la
corbeille ne reconstruisait donc pas le cache, et son accès par IP survivait
jusqu’à l’expiration du TTL.

Un changement de statut étant fréquent (validation d’inscriptions), on ne
reconstruit que si l’auteur porte effectivement des IPs — une lecture de
champ coûte moins qu’une reconstruction complète.

Le test sur access_ips perd au passage sa condition sur l’action, pour
couvrir aussi une création qui poserait le champ d’emblée. Et le motif du
recalcul est tracé : sans lui, une reconstruction déclenchée par un
changement de statut est indistinguable d’une édition du champ.

Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com

Modifié
ipset_pipelines.php

Détails : fix: reconstruire le cache quand le statut d'un auteur change (698cdd8e) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 26 août 2026 à 11h40min :

fix: ne pas perdre ip_name quand l’auteur n’a pas de nom

session_set($nom, null) supprime la clé au lieu de la poser (voir
ecrire/inc/session.php). Or sql_getfetsel() rend null quand il ne trouve
rien : pour un compte institution dont spip_auteurs.nom est vide, ou pour
un id_auteur devenu obsolète, ip_name restait donc absente de la session.

Et elle ne pouvait plus être reposée ensuite : le retour anticipé sur
ip_id_auteur court-circuite le code qui l’écrit. Le nom manquait donc
définitivement pour toute la durée de la session.

Le cast en chaîne pose la clé à ‹  › — falsy pour l’affichage, mais présente,
donc réécrite à la prochaine résolution.

Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com

Modifié
ipset_options.php

Détails : fix: ne pas perdre ip_name quand l'auteur n'a pas de nom (3f5c729c) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 26 août 2026 à 11h40min :

fix: respecter le type de retour ?int d’ipset_access_author()

La fonction déclare ?int mais retournait la valeur brute
d’ipset_get_author(), qui vaut false lorsqu’aucun auteur ne correspond.
PHP la coerçait alors silencieusement en 0.

Trois valeurs distinctes signifiaient donc « pas d’accès » selon le chemin
emprunté : null, 0 et false. Le memo en session pouvant lui aussi
contenir 0, la lecture est normalisée de la même façon — sans relancer la
recherche, une IP déjà cherchée sans succès devant rester mémorisée.

Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com

Modifié
ipset_options.php

Détails : fix: respecter le type de retour ?int d'ipset_access_author() (38f7fcd8) · Validations · bricebou / ipset · GitLab