Accès restreint par IP. Ajoute un champ pour définir des IP ou des plages d'IP dans la table des zones (et son formulaire). Alors dans ce cas, même sans compte utilisateur, on est autorisé à voir les choses restreintes.

master
rastapopoulos@spip.org 8 years ago
commit 61cb2c8cf8

9
.gitattributes vendored

@ -0,0 +1,9 @@
* text=auto !eol
/accesrestreintip.png -text
/accesrestreintip_administrations.php -text
/accesrestreintip_options.php -text
/accesrestreintip_pipelines.php -text
formulaires/inc-editer_zone-ips.html -text
lang/paquet-accesrestreintip_fr.php -text
lang/zone_fr.php -text
/paquet.xml -text

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

@ -0,0 +1,25 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Fonction d'installation du plugin et de mise à jour.
**/
function accesrestreintip_upgrade($nom_meta_base_version, $version_cible) {
$maj = array();
$maj['create'] = array(
array('sql_alter','TABLE spip_zones ADD ips text DEFAULT "" NOT NULL')
);
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
}
/**
* Fonction de désinstallation du plugin.
**/
function accesrestreintip_vider_tables($nom_meta_base_version) {
sql_alter('TABLE spip_zones DROP ips');
effacer_meta($nom_meta_base_version);
}

@ -0,0 +1,55 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
if (isset($GLOBALS['meta']["accesrestreint_base_version"])){
// Si on n'est pas connecte, on ne passe pas par le pipeline
// alors on ajoute directement les zones par IP
if (!isset($GLOBALS['visiteur_session']['id_auteur'])) {
$GLOBALS['accesrestreint_zones_autorisees'] .= accesrestreintip_lister_zones_par_ip();
// Puisqu'on passe après Accès Restreint, obligé d'ajouter nous-même le marqueur
if (!isset($GLOBALS['marqueur'])) {
$GLOBALS['marqueur'] = '';
}
$GLOBALS['marqueur'] .=
':accesrestreintip_zones_autorisees='
.$GLOBALS['accesrestreint_zones_autorisees'];
}
}
function accesrestreintip_lister_zones_par_ip($ip=null) {
include_spip('base/abstract_sql');
$zones_autorisees = array();
// Récupération IP du client si pas en argument
if (is_null($ip) and isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
}
$long_ip = ip2long($ip);
if ($zones = sql_allfetsel('id_zone, ips', 'spip_zones', 'ips != ""') and is_array($zones)) {
foreach ($zones as $zone) {
$ranges = explode(',', $zone['ips']);
foreach ($ranges as $range) {
// Range d'IP contenant - comme séparateur
if (preg_match ("/-/",$range)) {
$ranges_2 = explode ('-', $range) ;
$low_long_ip = ip2long($ranges_2[0]);
$high_long_ip = ip2long($ranges_2[1]);
if ($long_ip <= $high_long_ip and $low_long_ip <= $long_ip) {
$zones_autorisees[] = $zone['id_zone'];
break; // on a trouvé une IP bonne on ne continue pas plus loin
}
} // IP individuelle
else {
if ($long_ip == ip2long($range)) {
$zones_autorisees[] = $zone['id_zone'];
break; // on a trouvé une IP bonne on ne continue pas plus loin
}
}
}
}
}
return join(',', $zones_autorisees);
}

@ -0,0 +1,74 @@
<?php
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Declaration du champs pour stocker les IP
*
* @pipeline declarer_tables_objets_sql
* @param array $tables Liste des objets et leur description
* @return array
*/
function accesrestreintip_declarer_tables_objets_sql($tables){
// déclaration du champ
$tables['spip_zones']['field']['ips'] = 'text DEFAULT "" NOT NULL';
// éditable etc
$tables['spip_zones']['champs_editables'][] = 'ips';
return $tables;
}
/**
* Ajouter le champ des IP dans l'édition d'une zone
*
* @pipeline editer_contenu_objet
* @param array $flux Données du pipeline
* @return array Données du pipeline
**/
function accesrestreintip_editer_contenu_objet($flux){
if ($flux['args']['type'] == 'zone') {
$champ_ips = recuperer_fond('formulaires/inc-editer_zone-ips', $flux['args']['contexte']);
$flux['data'] = preg_replace('|(<li[^>]*editer_descriptif[^>]*>.*?</li>)|is', "$1\n$champ_ips", $flux['data']);
}
return $flux;
}
/**
* Vérifier le champ des IP d'une zone
*
* @pipeline formulaire_verifier
* @param array $flux Données du pipeline
* @return array Données du pipeline
**/
function accesrestreintip_formulaire_verifier($flux){
if ($flux['args']['form'] == 'editer_zone') {
}
return $flux;
}
/**
* Ajoute les zones quand on détecte les bonnes IP
*
* @pipeline accesrestreint_liste_zones_autorisees
* @param array $flux Données du pipeline
* @return array Données du pipeline
**/
function accesrestreintip_accesrestreint_liste_zones_autorisees($flux){
// On s'assure d'avoir la fonction
if (!function_exists('accesrestreintip_lister_zones_par_ip')) {
include_spip('accesrestreintip_options');
}
// On récupère les zones par IP
$zones_par_ip = array_filter(explode(',', accesrestreintip_lister_zones_par_ip()));
// On ajoute les éventuelles zones par rapport à l'IP du visiteur
$flux = explode(',', $flux);
$flux = array_merge($flux, $zones_par_ip);
$flux = array_unique($flux);
$flux = join(',', $flux);
return $flux;
}

@ -0,0 +1,6 @@
<li class="pleine_largeur editer editer_ips[ (#ENV**{erreurs/ips}|oui)erreur]">
<label for="ips"><:zone:champ_ips_label:></label>
<p class="explication"><:zone:champ_ips_explication:></p>[
<span class='erreur_message'>(#ENV**{erreurs/ips})</span>
]<textarea name="ips" rows="5" id="ips">[(#ENV{ips})]</textarea>
</li>

@ -0,0 +1,10 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
$GLOBALS[$GLOBALS['idx_lang']] = array(
// A
'accesrestreintip_description' => 'Ce plugin permet donner accès à des zones suivant ladresse IP du visiteur.',
'accesrestreintip_nom' => 'Accès (non) restreint par IP',
'accesrestreintip_slogan' => 'Donner accès aux contenus restreints suivant lIP',
);

@ -0,0 +1,8 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
$GLOBALS[$GLOBALS['idx_lang']] = array(
'champ_ips_explication' => 'Liste dadresses IP ou de plages dIP séparées par des virgules. Exemple : 10.5.0.1-10.5.22.13, 10.6.134.132.',
'champ_ips_label' => 'Adresses IP',
);

@ -0,0 +1,22 @@
<paquet
prefix="accesrestreintip"
categorie="auteur"
version="1.0.0"
schema="1.0.0"
etat="dev"
compatibilite="[3.0.0;3.1.*]"
logo="accesrestreintip.png"
documentation=""
>
<nom>Accès restreint par IP</nom>
<auteur lien="http://www.ldd.fr">Les Développements Durables</auteur>
<licence>GNU/GPL v3</licence>
<pipeline nom="declarer_tables_objets_sql" inclure="accesrestreintip_pipelines.php" />
<pipeline nom="editer_contenu_objet" inclure="accesrestreintip_pipelines.php" />
<pipeline nom="formulaire_verifier" inclure="accesrestreintip_pipelines.php" />
<pipeline nom="accesrestreint_liste_zones_autorisees" inclure="accesrestreintip_pipelines.php" />
<necessite nom="accesrestreint" compatibilite="[3.12.4;]" />
</paquet>
Loading…
Cancel
Save