/** * Filtre pour tester l'appartenance d'un auteur a une zone * * @param int $id_zone * @param int $id_auteur */ function accesrestreint_acces_zone($id_zone,$id_auteur=null){ static $liste_zones = array(); if (is_null($id_auteur)) $id_auteur=$GLOBALS['visiteur_session']['id_auteur']; if (!isset($liste_zones[$id_auteur])){ if ($GLOBALS['accesrestreint_zones_autorisees'] AND ($id_auteur==$GLOBALS['visiteur_session']['id_auteur'])) $liste_zones[$id_auteur] = explode(',',$GLOBALS['accesrestreint_zones_autorisees']); elseif (!is_null($id_auteur)){ include_spip('inc/acces_restreint'); $liste_zones[$id_auteur] = explode(',',accesrestreint_liste_zones_autorisees('',$id_auteur)); } } return in_array($id_zone,$liste_zones[$id_auteur]); }
/** * fonctions de filtrage rubrique * -> condition NOT IN * Cette fonction renvoie la liste des rubriques interdites * au visiteur courant * d'ou le recours a $GLOBALS['accesrestreint_zones_autorisees'] * * @param bool $publique * @param int $id_auteur * @return array */ function accesrestreint_liste_rubriques_exclues($publique=true, $id_auteur=NULL) { // cache static static $liste_rub_exclues = array(); static $liste_rub_inclues = array(); $id_auteur = is_null($id_auteur)?$GLOBALS['visiteur_session']['id_auteur']:$id_auteur; if (!isset($liste_rub_exclues[$id_auteur][$publique]) || !is_array($liste_rub_exclues[$id_auteur][$publique])) { $where = array(); // Ne selectionner que les zones pertinentes if ($publique) $where[] = "publique='oui'"; else $where[] = "privee='oui'"; // Si le visiteur est autorise sur certaines zones publiques, // on selectionne les rubriques correspondant aux autres zones, // sinon on selectionne toutes celles correspondant a une zone. include_spip('base/abstract_sql'); if ($GLOBALS['accesrestreint_zones_autorisees'] AND $id_auteur==$GLOBALS['visiteur_session']['id_auteur']) $where[] = sql_in('zr.id_zone',$GLOBALS['accesrestreint_zones_autorisees'],'NOT'); elseif ($id_auteur) $where[] = sql_in('zr.id_zone',accesrestreint_liste_zones_autorisees('',$id_auteur),'NOT'); // liste les rubriques (+branches) des zones dont ne fait pas parti l'auteur $liste_rub_exclues[$id_auteur][$publique] = accesrestreint_liste_contenu_zone_rub($where); #$liste_rub_exclues[$publique] = array_unique($liste_rub_exclues[$publique]); } $final_liste_rub_exclues = $liste_rub_exclues[$id_auteur][$publique]; if (defined("AR_TYPE_RESTRICTION") AND AR_TYPE_RESTRICTION == "faible") { // AR_TYPE_RESTRICTION définit le type de restriction pour traiter les elements communs à plusieurs zone // Une restriction exclusive (ou forte) donne l'acces aux rubriques restreintes par // plusieurs zone aux seuls membres de toutes les zones concernees. // Une restriction faible donne acces à une rubrique, même restreinte par // plusieurs zones, aux membres de chaque zone concernee. // valeurs : 'faible', 'forte, ou 'exclusive' // Autrement dit, si une rubrique 2 est enfant d'une rubrique 1, // et qu'il existe une zone 1 (rubrique 1) et une zone 2 (rubrique 2) : // - un auteur present dans la zone 1 (uniquement) ne pourra pas voir la rubrique 2 // lorsque la restriction est "forte". Il le pourra avec une restriction "faible" // // - A l'inverse, un auteur present uniquement dans la zone 2 ne pourra pas voir // la rubrique 1 meme si la restriction est "faible" car la parentee n'est pas concernee. // il faut (si souhaite) dans ce cas definir en plus AR_TYPE_RESTRICTION_PARENTEE a "faible" // pour l'autoriser. if (!isset($liste_rub_inclues[$id_auteur][$publique]) OR !is_array($liste_rub_inclues[$id_auteur][$publique])) { $where = array(); // Ne selectionner que les zones pertinentes if ($publique) $where[] = "publique='oui'"; else $where[] = "privee='oui'"; // Calcul des rubriques dans des zones autorisees include_spip('base/abstract_sql'); if ($GLOBALS['accesrestreint_zones_autorisees'] AND $id_auteur==$GLOBALS['visiteur_session']['id_auteur']) $where[] = sql_in('zr.id_zone',$GLOBALS['accesrestreint_zones_autorisees']); elseif ($id_auteur) $where[] = sql_in('zr.id_zone',accesrestreint_liste_zones_autorisees('',$id_auteur)); // liste les rubriques (+branches) des zones de l'auteur $liste_rub_inclues[$id_auteur][$publique] = accesrestreint_liste_contenu_zone_rub($where); // pour autoriser la vue des rubriques parentes // memes si elles sont restreintes par une autre zone if (defined("AR_TYPE_RESTRICTION_PARENTEE") AND AR_TYPE_RESTRICTION_PARENTEE == "faible") { $liste_rub_inclues[$id_auteur][$publique] = array_merge($liste_rub_inclues[$id_auteur][$publique], accesrestreint_liste_parentee_zone_rub($where)); } } // Ne pas exclure les elements qui sont autorises $final_liste_rub_exclues = array_diff($final_liste_rub_exclues, array_intersect($final_liste_rub_exclues,$liste_rub_inclues[$id_auteur][$publique])); } return $final_liste_rub_exclues; }