Remove my old and ugly hack to check permissions and set up a new flexible way to...
authorx2003bruneau <x2003bruneau@839d8a87-29fc-0310-9880-83ba4fa771e5>
Mon, 5 Mar 2007 14:33:53 +0000 (14:33 +0000)
committerx2003bruneau <x2003bruneau@839d8a87-29fc-0310-9880-83ba4fa771e5>
Mon, 5 Mar 2007 14:33:53 +0000 (14:33 +0000)
git-svn-id: svn+ssh://murphy/home/svn/platal/trunk@1548 839d8a87-29fc-0310-9880-83ba4fa771e5

26 files changed:
classes/flagset.php
classes/platal.php
classes/plmodule.php
classes/session.php
include/xnet/session.inc.php
include/xorg/session.inc.php
modules/core.php
templates/events/index.tpl
templates/include/minifiche.tpl
templates/include/trombi.tpl
templates/lists/header_listes.tpl
templates/newsletter/show.tpl
templates/profile/profile.tpl
templates/skin/common.menu.tpl
templates/skin/default.tpl
templates/skin/espace.tpl
templates/skin/humlinux.tpl
templates/skin/keynote.tpl
templates/skin/linux.tpl
templates/skin/liteskin.tpl
templates/skin/nbviolet.tpl
templates/skin/newxorg.tpl
templates/skin/register.tpl
templates/skin/spectral.tpl
templates/skin/trapped.tpl
templates/xnet/skin.tpl

index 7fe89b6..d06115f 100644 (file)
@@ -44,7 +44,7 @@ class Flagset
      * @param $flag XXX
      * @return VOID
      */
-    public function addflag($flag) 
+    public function addFlag($flag) 
     {
         if (!$flag) return;
         if (!$this->hasflag($flag)) {
@@ -59,7 +59,7 @@ class Flagset
      * @param $flag XXX
      * @return 1 || 0
      */
-    public function hasflag($flag) 
+    public function hasFlag($flag) 
     {
         $tok = strtok($this->value,$this->sep);
         while ($tok) {
@@ -74,7 +74,7 @@ class Flagset
      * @param $flag XXX
      * @return VOID
      */
-    public function rmflag($flag) 
+    public function rmFlag($flag) 
     {
         if (!$flag) return;
         $newvalue = "";
@@ -90,6 +90,12 @@ class Flagset
         $this->value=$newvalue;
     }
 
+    /** return the flagset
+     */
+    public function flags()
+    {
+        return $this->value;
+    }
 } 
 
 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
index 5716199..cdfb3cb 100644 (file)
@@ -175,6 +175,31 @@ class Platal
         return null;
     }
 
+    protected function check_perms($perms)
+    {
+        if (!$perms) { // No perms, no check
+            return true;
+        }
+        $s_perms = S::v('perms');
+
+        // hook perms syntax is
+        $perms = explode(',', $perms);
+        foreach ($perms as $perm)
+        {
+            $ok = true;
+            $rights = explode(':', $perm);
+            foreach ($rights as $right) {
+                if (($right{0} == '!' && $s_perms->hasFlag(substr($right, 1))) || !$s_perms->hasFlag($right)) {
+                    $ok = false;
+                }
+            }
+            if ($ok) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private function call_hook(PlatalPage &$page)
     {
         $hook = $this->find_hook();
@@ -196,8 +221,7 @@ class Platal
                 return PL_FORBIDDEN;
             }
         }
-
-        if (!empty($hook['perms']) && $hook['perms'] != S::v('perms')) {
+        if ($hook['auth'] != AUTH_PUBLIC && !$this->check_perms($hook['perms'])) {
             return PL_FORBIDDEN;
         }
 
index 8a5e6ca..4cd113c 100644 (file)
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************/
 
-class PLModule
+abstract class PLModule
 {
-    function handlers()     { die("implement me"); }
+    abstract function handlers();
 
-    public function make_hook($fun, $auth, $perms = '', $type = DO_AUTH)
+    /** Register a hook
+     * @param fun name of the handler (the exact name will be handler_$fun)
+     * @param auth authentification level of needed to run this handler
+     * @param perms permission required to run this handler
+     * @param type additionnal flags
+     *
+     * Perms syntax is the following:
+     * perms = rights(,rights)*
+     * rights = right(:right)*
+     * right is an atomic right permission (like 'admin', 'user', 'groupadmin', 'groupmember'...)
+     *
+     * If type is set to NO_AUTH, the system will return 403 instead of asking auth data
+     * this is useful for Ajax handlers
+     */
+    public function make_hook($fun, $auth, $perms = 'user', $type = DO_AUTH)
     {
         return array('hook'  => array($this, 'handler_'.$fun),
                      'auth'  => $auth,
index 004066e..a06662b 100644 (file)
@@ -58,7 +58,7 @@ class Session
 
     public static function has_perms()
     {
-        return Session::logged() && Session::v('perms') == PERMS_ADMIN;
+        return Session::logged() && Session::v('perms')->hasFlag(PERMS_ADMIN);
     }
 
     public static function logged()
index de75d23..d798261 100644 (file)
@@ -41,6 +41,20 @@ class XnetSession
             $url .= "&url=".urlencode($returl);
             $_SESSION['loginX'] = $url;
         }
+
+        if (S::logged() && $globals->asso()) {
+            $perms = S::v('perms');
+            $perms->rmFlag('groupadmin');
+            $perms->rmFlag('groupmember');
+            if (may_update()) {
+                $perms->addFlag('groupadmin');
+                $perms->addFlag('groupmember');
+            }
+            if (is_member()) {
+                $perms->addFlag('groupmember');
+            }
+            $_SESSION['perms'] = $perms;
+        }
     }
 
     // }}}
@@ -81,7 +95,8 @@ class XnetSession
     // }}}
     // {{{ doAuthX
 
-    public static function doAuthX() {
+    public static function doAuthX() 
+    {
         global $globals, $page;
 
         if (md5('1'.S::v('challenge').$globals->xnet->secret.Get::i('uid').'1') != Get::v('auth')) {
@@ -99,6 +114,8 @@ class XnetSession
              LIMIT  1", Get::i('uid'));
         $_SESSION = array_merge($_SESSION, $res->fetchOneAssoc());
         $_SESSION['auth'] = AUTH_MDP;
+        require_once 'xorg/session.inc.php';
+        $_SESSION['perms'] =& XorgSession::make_perms(S::v('perms'));
         S::kill('challenge');
         S::kill('loginX');
         S::kill('may_update');
@@ -125,7 +142,8 @@ class XnetSession
         if (!S::has('suid')) {
             $_SESSION['suid'] = $_SESSION;
         }
-        $_SESSION['perms'] = 'user';
+        require_once 'xorg/session.inc.php';
+        $_SESSION['perms'] =& XorgSession::make_perms('user');
     }
 
     // }}}
index 2681c2c..c6ea8e4 100644 (file)
@@ -158,6 +158,7 @@ class XorgSession
      * @param page the calling page (by reference)
      */
     public static function doAuthCookie()
+        
     {
         if (S::logged()) {
             return true;
@@ -175,6 +176,22 @@ class XorgSession
     }
 
     // }}}
+    // {{{ public static function make_perms()
+
+    public static function &make_perms($perm)
+    {
+        $flags = new FlagSet();
+        if ($perm == 'disabled' || $perm == 'ext') {
+            return $flags;
+        }
+        $flags->addFlag(PERMS_USER);
+        if ($perm == 'admin') {
+            $flags->addFlag(PERMS_ADMIN);
+        }
+        return $flags;
+    }
+
+    // }}}
 }
 
 // {{{ function try_cookie()
@@ -250,6 +267,7 @@ function start_connexion ($uid, $identified)
     $_SESSION         = array_merge($_SESSION, $sess);
     $_SESSION['log']  = $logger;
     $_SESSION['auth'] = ($identified ? AUTH_MDP : AUTH_COOKIE);
+    $_SESSION['perms'] =& XorgSession::make_perms($_SESSION['perms']);
     $mail_subject = null;
     if (check_account()) {
         $mail_subject = "Connexion d'un utilisateur surveillé";
index 3354449..2165d27 100644 (file)
@@ -101,7 +101,7 @@ class CoreModule extends PLModule
             $_SESSION['log']->log("suid_start", "login by ".S::v('forlife'));
         }    
         $_SESSION['suid'] = $_SESSION;
-        $_SESSION['perms'] = $level;
+        $_SESSION['perms'] =& XorgSession::make_perms($level);
 
         pl_redirect('/');
     }
index 7e64ba8..06de324 100644 (file)
@@ -175,7 +175,7 @@ Bienvenue {$smarty.session.prenom}
           {/if}
         </div>
         <div style="float:right">
-          {if $smarty.session.perms eq 'admin'}
+          {if $smarty.session.perms->hasFlag('admin')}
           <a href="admin/events/edit/{$ev.id}">{icon name=page_edit title="Editer cet article"}</a>
           {/if}
           <a href="events/read/{$ev.id}{if $previd}/newsid{$previd}{/if}" onclick="return readEvent('{$ev.id}')">{icon name=cross title="Cacher cet article"}</a>
index f1b8ddd..371026a 100644 (file)
@@ -73,7 +73,7 @@
     {/if}
     {/if}
 
-    {if $smarty.session.perms eq admin}
+    {if $smarty.session.perms->hasFlag('admin')}
       [{if !$c.wasinscrit && !$c.dcd}
         <a href="marketing/private/{$c.user_id}">{*
           *}{icon name=email title="marketter user"}</a>
index 83192b9..fcea502 100644 (file)
@@ -31,7 +31,7 @@
       <a href="{if $urlmainsite}{$urlmainsite}{/if}profile/{$p.forlife}" class="popup2">
         <img src="{$globals->baseurl}/photo/{$p.forlife}" width="110" alt=" [ PHOTO ] " />
       </a>
-      {if $trombi_admin && $smarty.session.perms eq 'admin' && !$urlmainsite}
+      {if $trombi_admin && $smarty.session.perms->hasFlag('admin') && !$urlmainsite}
       <a href="admin/trombino/{$p.user_id}">
         {icon name=wrench title="[admin]"}</a>
       {/if}
index 708534b..695879b 100644 (file)
@@ -46,7 +46,7 @@
       {/if}
     </td>
   </tr>
-  {if $details.own || $smarty.session.perms eq admin || ($it_is_xnet && $is_admin)}
+  {if $details.own || $smarty.session.perms->hasFlag('admin') || $smarty.session.perms->hasFlag('groupadmin')}
   <tr>
     <td><strong>Administrer la liste :</strong></td>
     <td>
@@ -73,7 +73,7 @@
     </td>
   </tr>
   {/if}
-  {if $smarty.session.perms eq admin || ($it_is_xnet && $is_admin)}
+  {if $smarty.session.perms->hasFlag('admin') || $smarty.session.perms->hasFlag('groupadmin')}
 
   <tr>
     <td><strong>Administrer (avancé) :</strong></td>
index e3df5df..3cf0ce9 100644 (file)
@@ -31,7 +31,7 @@
 {else}
 [<a href='nl/show/{$nl->id()}?text=1'>version Texte</a>]
 {/if}
-{if $smarty.session.perms eq admin}
+{if $smarty.session.perms->hasFlag('admin')}
 [<a href='admin/newsletter/edit/{$nl->id()}'>Editer</a>]
 {/if}
 </p>
index 1b49918..2d62265 100644 (file)
@@ -60,7 +60,7 @@ function chgMainWinLoc(strPage) {
         <a href="javascript:chgMainWinLoc('carnet/contacts?action=retirer&amp;user={$x.forlife}')">
           {icon name=cross title="Retirer de mes contacts"}</a>
         {/if}
-        {if $smarty.session.perms eq admin}
+        {if $smarty.session.perms->hasFlag('admin')}
         <a href="javascript:chgMainWinLoc('admin/user/{$x.forlife}')">
           {icon name=wrench title="administrer user"}</a>
         {/if}
index 4965e51..0209b25 100644 (file)
@@ -74,7 +74,7 @@
 <div class="menu_item"><a href="Xorg/NousContacter">Nous contacter</a></div>
 <div class="menu_item"><a href="send_bug" class="popup2">Signaler un bug</a></div>
 
-{if $smarty.session.perms eq admin}
+{if $smarty.session.perms->hasFlag('admin')}
 <div class="menu_title">***</div>
 <div class="menu_item"><a href="marketing">Marketing</a></div>
 <div class="menu_item"><a href="admin/">Administration</a></div>
index f98f53f..f0496bf 100644 (file)
@@ -33,7 +33,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms})
+        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index 8754b82..a81f38e 100644 (file)
@@ -34,7 +34,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms})
+        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index eb0bcda..5ae3ce3 100644 (file)
@@ -34,7 +34,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms})
+        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index 24f8613..35bffa9 100644 (file)
@@ -33,7 +33,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms})
+        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index ea20999..319307c 100644 (file)
@@ -34,7 +34,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms})
+        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index 028740b..c4d671a 100644 (file)
@@ -34,7 +34,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms})
+        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index b1f4114..13290bf 100644 (file)
@@ -34,7 +34,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms})
+        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index b5d432e..e81232c 100644 (file)
@@ -34,7 +34,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms})
+        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index 3c99e2b..7ec1859 100644 (file)
@@ -33,7 +33,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms})
+        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index 1277076..cad2865 100644 (file)
@@ -34,7 +34,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms})
+        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index 7a2ba5e..2c1d2d9 100644 (file)
@@ -34,7 +34,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms})
+        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index f68bf83..fba4654 100644 (file)
               <div style="display: inline">
                 <small>voir le site en tant que...
                 <select name="right" onchange="this.form.submit()">
-                  {if $smarty.session.perms eq 'admin' || $smarty.session.suid.perms eq 'admin'}
-                  <option value="admin" {if $smarty.session.perms eq 'admin'}selected="selected"{/if}>Administrateur</option>
+                  {if $smarty.session.perms->hasFlag('admin') || $smarty.session.suid.perms->hasFlag('admin')}
+                  <option value="admin" {if $smarty.session.perms->hasFlag('admin')}selected="selected"{/if}>Administrateur</option>
                   {/if}
-                  <option value="anim" {if $is_admin && $smarty.session.perms neq 'admin'}selected="selected"{/if}>Animateur</option>
+                  <option value="anim" {if $is_admin && !$smarty.session.perms->hasFlag('admin')}selected="selected"{/if}>Animateur</option>
                   <option value="member" {if !$is_admin && $is_member}selected="selected"{/if}>Membre</option>
                   <option value="logged" {if !$is_admin && !$is_member}selected="selected"{/if}>Non-membre</option>
                 </select>
               {/if}
             </td>
             <td class="right" style="vertical-align: middle">
-              {if $smarty.session.perms eq admin}
+              {if $smarty.session.perms->hasFlag('admin')}
               <a href="admin" title="Administration des groupes">
                 Gérer les groupes
                 {icon name=wrench title="Administration"}