Forum ZitePLUS

La communauté des utilisateurs du CMS ZitePLUS

Vous n'êtes pas identifié(e).

#1 19/05/2016 15:24:24

pydou
Membre
Lieu : Caluire
Inscription : 01/04/2010
Messages : 110
Site Web

Gestion dynamique des droits

Bonjour,

Pour les besoins particulier d'un site, dans lequel on peut suivant le cas voir ou ne pas voir une page, j'avais besoin d'une gestion dynamique des droits sur les pages... valable uniquement pour la session, et donc non persistante...
L'idée est de permettre à ces utilisateurs appartenant tous au même groupe d'avoir une page personnelle qu'ils sont seuls à pouvoir modifier, et que les utilisateurs abonnés à cette page puisse la voir. Mais je ne voulais pas multiplier les groupes.
Après avoir galéré, j'ai trouvé la solution, et pour minimiser l'impact sur le code, j'ai utilisé un module pour le faire.

La solution trouvée se présente comme suit :
- Les pages sont crées avec comme nom de fichier un moyen d'identifier le propriétaire (exemple le pseudo)
- Elles sont créées en lecture ET écriture réservées à l'administrateur
- Après lecture des pages (structure.dta) on modifie dynamiquement les droits
- si une page a été modifiée par celui qui a le droit en écriture, on efface les droits ajoutés avant d'enregistrer la structure.

Pour la mise en oeuvre, j'ai ajouté 4 lignes au code de ZITEPLUS  (V0.9.4)

Dans le fichier tmodule.php, j'ajoute 2 constantes de type d'évènement

/////////////////////////
define('eBuild',12);   //  AJOUT PYDou
define('eEdit',13);    //  AJOUT PYDou
/////////////////////////


Dans le fichier ziteplus.php j'appelle un évènement au tout début de la fonction builder

    function builder() {
//////////////////////////////////////////// 
        $this->doevent(eBuild,eBefore,$out);  //  Ajout PYDou
////////////////////////////////////////////

Dans le fichier pageadmin.php, j'appelle un évènement juste avant d'écrire la structure  (du côté de la ligne 100)

        if ($nbphp && ($pagedesc[cPageType]%2!=0)) {
        $pagedesc[cPageType] = ($pagedesc[cPageType]&~pgbitType)|(int)2;
                }
///////////////////////////////////////////////////////////
                    self::$cms->doevent(eEdit,eAfter,$out);  //  Ajout PYDou
///////////////////////////////////////////////////////////
                 $rslt = $cms->pages->WriteStruct() && $cms->writefile($file, $source);
        $out .= $rslt ? $cms->get_message('done_ok') : $cms->get_message('done_failed');

Le module qui permet le traitement dépend du besoin qu'on peut en avoir (logiqie de modification dynamique, mais il contient aussi des actions constantes :

Enregistrement des évènements :

protected function Register() {
  self::$cms->register_event(eBuild,eBefore,$this->modulename);
  self::$cms->register_event(eEdit,eAfter,$this->modulename);
}


La partie commune du code  pour eBuild , eBefore dans laqelle permax représente le nom de la page (pour moi celle dont le fichier porte le nom de l'utilisateur connecté)

      $i=1;
      while (isset(self::$cms->struct[$i])) {
        if (self::$cms->struct[$i][0]==$permax) {
          $nb=count(self::$cms->struct[$i][cPageRead]);
          if (($nb>0) and (self::$cms->struct[$i][cPageRead][$nb-1]!="logon")) self::$cms->struct[$i][cPageRead][$nb]="logon";
        } 
        if (self::$cms->struct[$i][0]==$permay) {
          $nb=count(self::$cms->struct[$i][cPageRead]);
          if (($nb>0) and (self::$cms->struct[$i][cPageRead][$nb-1]!="logon")) self::$cms->struct[$i][cPageRead][$nb]="logon";
          $nb=count(self::$cms->struct[$i][cPageWrite]);
          if (($nb>0) and (self::$cms->struct[$i][cPageWrite][$nb-1]!="logon")) self::$cms->struct[$i][cPageWrite][$nb]="logon";
        }
        $i++;   
      }

La partie commune du code qui efface les droits ajoutés avant enregistrement

      $i=1;
      while (isset(self::$cms->struct[$i])) {
        if (self::$cms->struct[$i][0]==$permax) {
          $nb=count(self::$cms->struct[$i][cPageRead]);
          unset(self::$cms->struct[$i][cPageRead][$nb-1]);
        } 
        if (self::$cms->struct[$i][0]==$permay) {
          $nb=count(self::$cms->struct[$i][cPageRead]);
          unset(self::$cms->struct[$i][cPageRead][$nb-1]);
          $nb=count(self::$cms->struct[$i][cPageWrite]);
          unset(self::$cms->struct[$i][cPageWrite][$nb-1]);
        }
        $i++;   
      }


Toute idée qui me permettrait de ne pas toucher au code de ZITEPLUS sera la bienvenue.
A défaut, l'intégration de ces modifications (mineures) dans les versions future me conviendrait tout aussi bien

ZitePlusment vôtre
PYDou


Consultant en sécurité informatique (ISO 27001 Lead Auditor, ISO 27005 Risk Manager)
Amateur de JAZZ, Voile, Bridge

Hors ligne

Pied de page des forums