예제 #1
0
/**
 * 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]);
}
예제 #2
0
/**
 * 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;
}