[ipset ↪ version2] 3 commits

bricebou/ipset | 3 commits

Par bricebou, le 26 août 2026 à 14h50min :

docs: mise à jour du README.md…

…Claude Code reprenant ici les points saillants de sa session et les développements de la branche de développement

Modifié
README.md

Détails : docs: mise à jour du README.md... (0222fa46) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 26 août 2026 à 14h38min :

fix: nomenclature dans la définition du genie dans paquet.xml

Modifié
paquet.xml

Détails : fix: nomenclature dans la définition du genie dans paquet.xml (029edc64) · Validations · bricebou / ipset · GitLab

==============================
Par bricebou, le 26 août 2026 à 14h24min :

fix: détecter les chevauchements de plages entre auteurs

La contrainte d’unicité ne portait que sur l’égalité de chaîne : un LIKE
‹ %ip% › sur spip_auteurs, puis un in_array() sur la liste éclatée. Une plage
englobant une entrée déjà prise passait donc sans être vue — 10.0.0.0/8 était
accepté alors que 10.217.39.0/24 appartenait à un autre auteur, et les deux se
partageaient ensuite les mêmes adresses.

La vérification compare désormais des intervalles. Deux propriétés le
permettent sans énumérer les adresses, ce qui serait exclu — un /8 en couvre 16
millions, un /32 IPv6 en couvre 2^96 :

  • strcmp() sur la forme compactée d’inet_pton() respecte l’ordre numérique, y
    compris au franchissement du bit de signe, donc pas besoin de bcmath en IPv6 ;
  • les opérateurs &, | et ~ sur des chaînes PHP travaillent octet par octet, ce
    qui donne les bornes d’un CIDR en trois lignes, /0 et /31 compris.

ipset_intervalle() remplace ainsi Network::parse() : neuf fois plus rapide sur
un millier d’entrées, et strict, ce qui supprime le double contrôle que
l’ancien code avait dû ajouter parce que « Network est trop tolérant ».

L’index des IPs déjà affectées est trié par borne de début et porte le maximum
courant des bornes de fin. Ce maximum préfixe répond en O(1) à « y a-t-il un
conflit ? », la dichotomie en O(log n) à « lequel ? » :

1 016 entrées,    50 saisies :   5,1 ms -> 3,2 ms
1 016 entrées,   500 saisies :  50,1 ms -> 3,9 ms
10 000 entrées,  500 saisies : 522    ms ->  38 ms

Mais le gain décisif est structurel : le vérificateur n’a plus aucune requête
propre. Il réutilise ipset_get_all_ips_by_authors(), déjà chargée et mémoïsée.
L’ancienne version faisait un LIKE par IP saisie sur une colonne mediumtext non
indexable, soit autant de scans complets d’une table qui compte des centaines
de milliers de lignes.

Effets de bord bénéfiques du passage par cette fonction : son filtre
statut != ‹ 5poubelle › s’applique, donc les IPs d’un auteur en corbeille ne
bloquent plus une réaffectation ; et une donnée invalide déjà en base n’empêche
plus une saisie valide.

Deux trous comblés au passage :

  • les chevauchements internes à une même saisie, 10.0.0.0/8 et 10.1.2.3 dans le
    même champ, qui faussaient le comptage d’IPs affiché ;
  • les IPv4 notées en IPv6 mappée, ::ffff:1.2.3.4 pouvant être affectée à un
    auteur alors que 1.2.3.4 l’était déjà à un autre.

Enfin tous les problèmes sont signalés d’un coup — syntaxe, chevauchement
interne, conflit inter-auteurs — plafonnés à 20 messages. Corriger une plage
trop large une erreur à la fois obligerait à réenregistrer autant de fois qu’il
y a de conflits. Le parcours de collecte n’est engagé que si le court-circuit a
répondu qu’il y avait un conflit : le chemin valide reste en O(log n).

Vérifié sur 21 cas : inclusions dans les deux sens, frontières de /24, familles
d’adresses disjointes, notations équivalentes d’une même adresse, exclusion de
l’auteur en cours d’édition, et rejets de syntaxe.

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

Modifié
inc/ipset.php
lang/ipset_fr.php
verifier/access_ips.php

Détails : fix: détecter les chevauchements de plages entre auteurs (1eac46f1) · Validations · bricebou / ipset · GitLab