Permettre un accès par IP ou plages d’IPs à des auteurs SPIP
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
chankalan 5dbd9f98c9 préfixer le genie 2 years ago
base Plugin IPSet pour SPIP qui ajoute un champ 'access_ips' sur les auteurs SPIP, 3 years ago
genie préfixer le genie 2 years ago
inc Pas de bol, en sqlite, et sur certains mysql (?) la sérialization PHP d’objets ayant des méthodes privées 3 years ago
inclure On met des liens vers la page de diagnostic IP, on améliore légèrement son affichage, et on passe 3 years ago
lang On met des liens vers la page de diagnostic IP, on améliore légèrement son affichage, et on passe 3 years ago
lib Plugin IPSet pour SPIP qui ajoute un champ 'access_ips' sur les auteurs SPIP, 3 years ago
prive On met des liens vers la page de diagnostic IP, on améliore légèrement son affichage, et on passe 3 years ago
saisies Plugin IPSet pour SPIP qui ajoute un champ 'access_ips' sur les auteurs SPIP, 3 years ago
saisies-vues Plugin IPSet pour SPIP qui ajoute un champ 'access_ips' sur les auteurs SPIP, 3 years ago
verifier Plugin IPSet pour SPIP qui ajoute un champ 'access_ips' sur les auteurs SPIP, 3 years ago
README.md Formattage du code de la doc 3 years ago
ipset_administrations.php Plugin IPSet pour SPIP qui ajoute un champ 'access_ips' sur les auteurs SPIP, 3 years ago
ipset_fonctions.php Plugin IPSet pour SPIP qui ajoute un champ 'access_ips' sur les auteurs SPIP, 3 years ago
ipset_options.php Pas de bol, en sqlite, et sur certains mysql (?) la sérialization PHP d’objets ayant des méthodes privées 3 years ago
ipset_pipelines.php Les pages 'auteurs' et 'visiteurs' ajoutent un lien en navigation vers une page 3 years ago
paquet.xml valide SPIP4 2 years ago

README.md

IPSet

IPSet est un plugin pour SPIP qui permet de définir des IPs ou Plages d’IPs à des auteurs SPIP. Il utilise la librairie éponyme IPSet de Wikimedia.

Principe général

Le plugin permet de tester rapidement qu’une IP entrante fait partie d’une liste d’IPs ou de Plages d’IPs connues du site, et éventuellement de retrouver à quel auteur SPIP cette IP est définie. On s’appuie essentiellement sur 2 fonctions PHP de base :

  • ipset_get() retourne un IPSet avec l’ensemble des plages / IPs connues, que l’on peut tester avec l’IP du visiteur :
$ip = $GLOBALS['ip'];
$ipset = ipset_get();
if ($ipset->match($ip)) {
    // On connait cette IP
}
  • ipset_access_author() va plus loin et retourne d’id_auteur éventuel associé à l’IP du visiteur, si on connait cette IP. Dans ce cas, une session anonyme est créé contenant les entrées ip_id_auteur et ip_name renseignées, qui correspondent à l’id_auteur et nom de l’auteur associé.

Fonctionnement technique

Champ access_ips

Pour stocker les IPs / Plages d’IPs associées aux auteurs, le plugin ajoute un champ access_ips à la table spip_auteurs de SPIP. Une saisie dans le formulaire d’auteurs permet de renseigner ce champ. On peut définir une ou plusieurs adresses IPs ou plages d’IPs (séparées par des virgules), tel que :

  • 123.123.123.1, 123.123.123.2
  • 123.123.123.0/28

Les plages d’IPs sont à fournir en notation CIDR.

Une vérification empêche d’utiliser deux fois la même IP ou plage d’IP sur différents auteurs.

Méta ipset

À chaque actualisation d’une IP dans le formulaire d’édition d’auteur, un cache méta (dans spip_meta) est mis à jour avec une définition IPSet de l’ensemble des IPs/Plages définies pour les auteurs du site.

Au besoin, on peut vérifier rapidement qu’une IP visiteur du site fait partie de ce set d’IPs défini, en appelant la fonction ipset_get() qui retourne l’IPSet depuis ce cache méta (ou le calcule s’il n’existe pas).

Cache disque tmp/accessip

Lorsqu’on a besoin d’associer une IP à un auteur (par exemple pour afficher son nom dans le header du site ou pour des autorisations spécifiques), le calcul pour retrouver à quel auteur est associé une IP est plus gourmand (on doit recalculer un IPSet avec les IPs/Plages d’IPs de chaque auteur possible et le tester avec l’IP visiteur).

Pour éviter ces calculs, on stocke l’association dans un cache disque lorsque l’on trouve qu’une IP est associée à un auteur Cela se fait par exemple lorsqu’on utilise la fonction ipset_access_author() :

  • s’il n’y a pas de session anonyme déjà pour cette IP, on teste
  • si l’IP est connue (l’IPSet global est validé)
  • si oui, on appelle ipset_get_author($ip) qui retourne l’id_auteur, en le cherchant soit en cache disque (dans tmp/accessip/$ip) soit en le calculant et en créant ce cache.
  • puis on crée une session anonyme pour ce visiteur.

Cache disque tmp/noflood

En même temps que le cache tmp/accessip, l’IP est ajouté dans tmp/noflood/$ip ce qui peut servir à se faire whitelister par des antispams.

Génie accessip

Un génie nettoie périodiquement les caches disques tmp/accessip et tmp/noflood des fichiers plus vieux que 7 jours.

Exemples d’utilisation

Autorisation

Vérifier qu’on connait l’auteur : il est identifié ou a une IP connue :

function autoriser_exemple_acceder_dist($faire, $type, $id, $qui, $opt) {
    if ((!$qui or !$qui['id_auteur']) and !ipset_access_author()) {
        return false;
    }
    // ...
    return true;
}

Nom du visiteur en squelettes

<div class="small">
    <?php if (!isset($GLOBALS['visiteur_session']['statut'])) { ?>
        <?php if (ipset_access_author()) { ?>
            <span class="localisation">
                <i class="picto picto-user"></i><span> <?php echo $GLOBALS['visiteur_session']['ip_name']; ?></span>
            </span>
        <?php }  ?>
        <a href="#URL_PAGE{login}" class="link-popin link-popin-login"><i class="picto picto-login"></i><span> <:exemple:lien_connexion:></span></a>
    <?php }  else { ?>
        <a href="#URL_PAGE{compte}"><i class="picto picto-user"></i><span> <:exemple:lien_compte:></span></a>
    <?php } ?>
</div>