[ipset ↪ version2] 15 commits

bricebou/ipset | 15 commits

Par bricebou, le 26 août 2026 à 09h45min :

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 (70776791) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 26 août 2026 à 09h41min :

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é (dea20089) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 26 août 2026 à 09h41min :

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 (80ab9890) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 26 août 2026 à 09h41min :

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 (3519f664) · Validations · bricebou / ipset · GitLab

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

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 (4a36fd11) · Validations · bricebou / ipset · GitLab

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

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() (5ef6fdb5) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 26 août 2026 à 09h39min :

fix: corriger le nom de la tâche cron de nettoyage des accès IP

<genie nom="accessip"> ne correspondait ni au fichier
genie/ipset_accessip.php, ni à la fonction genie_ipset_accessip_dist().

Modifié
paquet.xml

Détails : fix: corriger le nom de la tâche cron de nettoyage des accès IP (2a3acb7a) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 25 août 2026 à 09h31min :

feat: versionner le champ access_ips

Modifié
base/ipset.php

Détails : feat: versionner le champ access_ips (2fca330b) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 24 août 2026 à 15h57min :

refactor: faire appel aux nouvelles dépendances

Ajouté
src/AccessIP.php
Modifié
base/ipset.php
composer.json
genie/ipset_accessip.php
inc/ipset.php
inclure/ipset_diagnostic_fonctions.php
ipset_options.php
saisies-vues/access_ips_fonctions.php
verifier/access_ips.php

Détails : refactor: faire appel aux nouvelles dépendances (7bd03db9) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 24 août 2026 à 15h57min :

refactor: mise en conformité des fichiers de langues

Modifié
lang/ipset_fr.php
lang/paquet-ipset_fr.php

Détails : refactor: mise en conformité des fichiers de langues (82febd65) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 24 août 2026 à 15h57min :

chore: mise à jour du paquet.xml et nettoyage dans les dépendances

Ajouté
ipset-xx.svg
Supprimé
lib/IPSet/COPYING
lib/IPSet/README.md
lib/IPSet/src/IPSet/IPSet.php
lib/IPSet/src/Wikimedia/IPSet.php
lib/IPTools/.codeclimate.yml
lib/IPTools/.gitignore
lib/IPTools/.travis.yml
lib/IPTools/LICENSE
lib/IPTools/README.md
lib/IPTools/composer.json
lib/IPTools/src/IP.php
lib/IPTools/src/Network.php
lib/IPTools/src/PropertyTrait.php
lib/IPTools/src/Range.php
lib/IPTools/tests/IPTest.php
lib/IPTools/tests/NetworkTest.php
lib/IPTools/tests/RangeTest.php
lib/IPTools/tests/bootstrap.php
prive/themes/spip/images/ipset-128.png
prive/themes/spip/images/ipset-32.png
prive/themes/spip/images/ipset-64.png
Modifié
paquet.xml

Détails : chore: mise à jour du paquet.xml et nettoyage dans les dépendances (fbdb678f) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 24 août 2026 à 13h54min :

chore: utiliser des librairies plus récentes et mieux maintenues via Composer…

Ajouté
composer.lock
vendor/autoload.php
vendor/cdn77/iptools/.github/workflows/ci.yml
vendor/cdn77/iptools/.gitignore
vendor/cdn77/iptools/LICENSE
vendor/cdn77/iptools/README.md
vendor/cdn77/iptools/composer.json
vendor/cdn77/iptools/renovate.json
vendor/cdn77/iptools/src/Exception/IpException.php
vendor/cdn77/iptools/src/Exception/IpToolsException.php
vendor/cdn77/iptools/src/Exception/NetworkException.php
vendor/cdn77/iptools/src/Exception/RangeException.php
vendor/cdn77/iptools/src/IP.php
vendor/cdn77/iptools/src/Network.php
vendor/cdn77/iptools/src/PropertyTrait.php
vendor/cdn77/iptools/src/Range.php
vendor/cdn77/iptools/tests/IPTest.php
vendor/cdn77/iptools/tests/NetworkTest.php
vendor/cdn77/iptools/tests/RangeTest.php
vendor/composer/ClassLoader.php
vendor/composer/InstalledVersions.php
vendor/composer/LICENSE
vendor/composer/autoload_classmap.php
vendor/composer/autoload_files.php
vendor/composer/autoload_namespaces.php
vendor/composer/autoload_psr4.php
vendor/composer/autoload_real.php
vendor/composer/autoload_static.php
vendor/composer/installed.json
vendor/composer/installed.php
vendor/composer/platform_check.php
vendor/wikimedia/base-convert/CODE_OF_CONDUCT.md
vendor/wikimedia/base-convert/COPYING
vendor/wikimedia/base-convert/README.md
vendor/wikimedia/base-convert/src/Functions.php
vendor/wikimedia/ip-utils/CODE_OF_CONDUCT.md
vendor/wikimedia/ip-utils/COPYING
vendor/wikimedia/ip-utils/HISTORY.md
vendor/wikimedia/ip-utils/README.md
vendor/wikimedia/ip-utils/src/IPSet.php
vendor/wikimedia/ip-utils/src/IPUtils.php
Modifié
composer.json

Détails : chore: utiliser des librairies plus récentes et mieux maintenues via Composer... (1f95e0d6) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 24 août 2026 à 13h40min :

style: une passe d’ECS

Modifié
base/ipset.php
genie/ipset_accessip.php
inc/AccessIP.php
inc/ipset.php
inclure/ipset_diagnostic_fonctions.php
ipset_administrations.php
ipset_options.php
ipset_pipelines.php
lang/ipset_fr.php
lang/paquet-ipset_fr.php
prive/objets/liste/auteurs_access_ips_fonctions.php
saisies-vues/access_ips_fonctions.php
verifier/access_ips.php

Détails : style: une passe d'ECS (aa5f8800) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 24 août 2026 à 13h39min :

refactor: une passe de Rector

Modifié
base/ipset.php
genie/ipset_accessip.php
inc/AccessIP.php
inc/ipset.php
inclure/ipset_diagnostic_fonctions.php
ipset_administrations.php
ipset_options.php
ipset_pipelines.php
lang/ipset_fr.php
lang/paquet-ipset_fr.php
saisies-vues/access_ips_fonctions.php
verifier/access_ips.php

Détails : refactor: une passe de Rector (53e0131c) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 24 août 2026 à 13h38min :

chore: mise en place des outils de qualité de code (Rector, ECS)

Ajouté
composer.json
ecs.php
rector.php

Détails : chore: mise en place des outils de qualité de code (Rector, ECS) (87ac01d5) · Validations · bricebou / ipset · GitLab