Changeset 81494 in spip-zone


Ignore:
Timestamp:
Mar 19, 2014, 4:26:41 PM (5 years ago)
Author:
rastapopoulos@…
Message:

On ajoute trois fonctions à l'API (pour l'instant utilisées nulle part), calquées sur celles des rubriques, qui permettront de filtrer pour un objet quelconque.

Attention, ces fonctions ne s'occupent pas d'héritage, de hiérarchie : je pense pour l'instant, que ce qui concerne les choses ayant une hiérarchie devrait se gérer au dernier moment dans la requête finale (dans public/accesrestreint => pre_boucle), et non pas en manipulant en PHP des tableaux énormes en amont.

On a donc :

accesrestreint_liste_contenu_zone_objets()
qui liste les objets d'un type précis se trouvant dans une ou plusieurs zones

accesrestreint_liste_objets_exclus()
qui liste les objets d'un type précis qui sont exlus pour un utilisateur précis (par défaut le visiteur en cours évidemment)

accesrestreint_objets_accessibles_where()
qui donne le NOT IN permettant de ne garder que les objets d'un type précis qu'à le droit de voir le visiteur en cours

Pour ce truc générique, on continue de gérer la define AR_TYPE_RESTRICTION=faible.

Location:
_plugins_/acces_restreint/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/acces_restreint/trunk/inc/accesrestreint.php

    r81465 r81494  
    304304}
    305305
     306/**
     307 * Liste les identifiants d'un objet précis contenu dans une ou plusieurs zones
     308 *
     309 * @param string $objet
     310 *              Le type de l'objet dont on veut avoir les identifiants liés à des zones
     311 * @param int|string|array $id_zone_ou_where
     312 *              Peut être un identifiant de zone OU un where sql OU un tableau de where
     313 * @return array
     314 */
     315function accesrestreint_liste_contenu_zone_objets($objet, $id_zone_ou_where){
     316        include_spip('base/abstract_sql');
     317       
     318        // Normalisation du nom
     319        $objet = objet_type($objet);
     320        $liste_objets = array();
     321       
     322        // Liste des objets directement liés à la zone
     323        $where = array();
     324        if (is_numeric($id_zone_ou_where)) {
     325                $where[] = "z.id_zone=".intval($id_zone_ou_where);
     326        }
     327        elseif ($id_zone_ou_where) {
     328                $where = $id_zone_ou_where;
     329        }
     330       
     331        // On ajoute de quel objet on parle
     332        if (is_array($where)) {
     333                $where[] = "zo.objet='$objet'";
     334        }
     335        else {
     336                $where = "($where) AND zo.objet='$objet'";
     337        }
     338
     339        $liste_objets = sql_allfetsel('id_objet', 'spip_zones_liens AS zo INNER JOIN spip_zones AS z ON zo.id_zone=z.id_zone', $where);
     340        $liste_objets = array_map('reset', $liste_objets);
     341        $liste_objets = array_unique($liste_objets);
     342       
     343        return $liste_objets;
     344}
     345
     346/**
     347 * Lister les identifiants d'un objet précis qui sont restreints pour le visiteur en cours
     348 *
     349 * @param string $objets
     350 *              Nom des objets dont on veut la liste : 'articles', 'rubriques', etc
     351 * @param bool|string $publique=true
     352 *              Indique si on cherche dans l'espace public (true) ou privé (false) ou partout ('tout')
     353 * @param int $id_auteur=NULL
     354 *              Identifiant de l'auteur, sinon le visiteur s'il est connecté
     355 * @return array
     356 *              Retourne la liste des identifiants de l'objet choisi
     357 */
     358function accesrestreint_liste_objets_exclus($objets, $publique=true, $id_auteur=NULL){
     359        // Cache statique
     360        static $liste_objets_exclus = array();
     361        static $liste_objets_inclus = array();
     362        // Normalisation du nom
     363        $objets = table_objet($objets);
     364       
     365        // Si c'est pour les rubriques, on redirige pour l'instant directement vers l'ancienne fonction
     366        if ($objets == 'rubriques') {
     367                return accesrestreint_liste_rubriques_exclues($publique, $id_auteur, ($publique == 'tout' ? true : false));
     368        }
     369       
     370        // Si pas d'auteur, on prend le visiteur en cours si connecté
     371        if (is_null($id_auteur) AND isset($GLOBALS['visiteur_session']['id_auteur'])) {
     372                $id_auteur = $GLOBALS['visiteur_session']['id_auteur'];
     373        }
     374       
     375        // On ne cherche que si ce n'est pas déjà défini
     376        if (
     377                !isset($liste_objets_exclus[$objets][$id_auteur][$publique])
     378                or !is_array($liste_objets_exclus[$objets][$id_auteur][$publique])
     379        ) {
     380                include_spip('base/abstract_sql');
     381                $where = array();
     382               
     383                // Ne sélectionner que les zones pertinentes
     384                if ($publique != 'tout') {
     385                        if ($publique) {
     386                                $where[] = "publique='oui'";
     387                        }
     388                        else {
     389                                $where[] = "privee='oui'";
     390                        }
     391                }
     392
     393                // Si le visiteur est autorisé sur certaines zones publiques,
     394                // on sélectionne les objets correspondant aux autres zones,
     395                // sinon on selectionne tous les objets de toutes les zones.
     396               
     397                // Si le visiteur en cours a des zones, on y a accès rapidement
     398                if (
     399                        $GLOBALS['accesrestreint_zones_autorisees']
     400                        and $id_auteur == $GLOBALS['visiteur_session']['id_auteur']
     401                ) {
     402                        $where[] = sql_in('zo.id_zone', $GLOBALS['accesrestreint_zones_autorisees'], 'NOT');
     403                }
     404                // Sinon on calcule les zones d'un auteur, lorsqu'il y en a un
     405                elseif ($id_auteur) {
     406                        $where[] = sql_in('zo.id_zone', accesrestreint_liste_zones_autorisees('', $id_auteur), 'NOT');
     407                }
     408
     409                // On liste maintenant tous les objets d'un type qui sont dans les zones *non-autorisées*
     410                $liste_objets_exclus[$objets][$id_auteur][$publique] = accesrestreint_liste_contenu_zone_objets($objets, $where);
     411        }
     412       
     413        // On stocke la liste finale qui pourra être modifiée suivant l'option ci-dessous
     414        $final_liste_objets_exclus = $liste_objets_exclus[$objets][$id_auteur][$publique];
     415       
     416        // Ouvrir la porte à toute personne ayant au moins une clé
     417        if (defined("AR_TYPE_RESTRICTION") AND AR_TYPE_RESTRICTION == "faible") {
     418                // Ne faire la recherche que si la variable statique n'est pas déjà définie
     419                if (
     420                        !isset($liste_objets_inclus[$objets][$id_auteur][$publique])
     421                        or !is_array($liste_objets_inclus[$objets][$id_auteur][$publique])
     422                ) {
     423                        include_spip('base/abstract_sql');
     424                        $where = array();
     425                       
     426                        // Ne selectionner que les zones pertinentes
     427                        if ($publique != 'tout') {
     428                                if ($publique) {
     429                                        $where[] = "publique='oui'";
     430                                }
     431                                else {
     432                                        $where[] = "privee='oui'";
     433                                }
     434                        }
     435
     436                        // Calcul des objets dans des zones autorisees
     437                        if (
     438                                $GLOBALS['accesrestreint_zones_autorisees']
     439                                and $id_auteur == $GLOBALS['visiteur_session']['id_auteur']
     440                        ){
     441                                $where[] = sql_in('zo.id_zone', $GLOBALS['accesrestreint_zones_autorisees']);
     442                        }
     443                        elseif ($id_auteur) {
     444                                $where[] = sql_in('zo.id_zone', accesrestreint_liste_zones_autorisees('', $id_auteur));
     445                        }
     446
     447                        // On liste maintenant tous les objets d'un type qui sont dans les zones *autorisées*
     448                        $liste_objets_inclus[$objets][$id_auteur][$publique] = accesrestreint_liste_contenu_zone_objets($objets, $where);
     449                }
     450
     451                // Enfin on retire des éléments exclus, ceux qui finalement sont autorisés
     452                $final_liste_objets_exclus = array_diff(
     453                        $final_liste_objets_exclus,
     454                        array_intersect($final_liste_objets_exclus, $liste_objets_inclus[$objets][$id_auteur][$publique])
     455                );
     456        }
     457
     458        return $final_liste_objets_exclus;
     459}
  • _plugins_/acces_restreint/trunk/public/accesrestreint.php

    r81450 r81494  
    8181}
    8282
     83/**
     84 * Renvoyer le code de la condition where pour filtrer avec la liste des objets accessibles d'un type précis
     85 *
     86 * Attention, cette fonction ne gère pas les héritages, la hiérarchie, mais seulement les objets contenus directement dans des zones.
     87 *
     88 * @param string $objets
     89 * @param string $primary
     90 * @return string
     91 */
     92function accesrestreint_objets_accessibles_where($objets, $primary, $not='NOT', $_publique=''){
     93        if (!$_publique) {
     94                $_publique = "!test_espace_prive()";
     95        }
     96       
     97        return "sql_in('$primary', accesrestreint_liste_objets_exclus($objets, $_publique), '$not')";
     98}
    8399
    84100/**
Note: See TracChangeset for help on using the changeset viewer.