Overview
SHA1:584b04bc0e3ee46c80e102476193be12f9a45187
Date: 2016-05-31 06:13:03
User: bohwaz
Comment:Fix [50852efa366bd9f1a7848441f88a235eca4cb94a] : empêcher un admin de se tirer une balle dans le pied
Timelines: family | ancestors | descendants | both | trunk
Downloads: Tarball | ZIP archive
Other Links: files | file ages | folders | manifest
References
2016-05-31
06:16 • Fixed ticket [50852efa36]: Empêcher un admin de se tirer une balle dans le pied plus 4 other changes (user: bohwaz) [details]
Tags And Properties
Context
2016-05-31
06:44
[8d327464a4] Nouvelle version stable (user: bohwaz, tags: trunk, stable)
06:13
[584b04bc0e] Fix [50852efa366bd9f1a7848441f88a235eca4cb94a] : empêcher un admin de se tirer une balle dans le pied (user: bohwaz, tags: trunk)
05:44
[1d8fcfb0ad] Ne pas utiliser lettre_infos si le champ n'existe pas. (user: bohwaz, tags: trunk)
Changes

Modified src/templates/admin/membres/cat_modifier.tpl from [5aaec0c773] to [2fe1d52da3].

    50     50           </dl>
    51     51       </fieldset>
    52     52   
    53     53       <fieldset>
    54     54           <legend>Droits</legend>
    55     55           <dl class="droits">
    56     56               <dt><label for="f_droit_connexion_aucun">Les membres de cette catégorie peuvent-ils se connecter ?</label></dt>
           57  +            {if $readonly}
           58  +                <dd class="help">
           59  +                    Il n'est pas possible de désactiver ce droit pour votre propre catégorie.
           60  +                </dd>
           61  +            {/if}
    57     62               <dd>
    58         -                <input type="radio" name="droit_connexion" value="{Garradin\Membres::DROIT_AUCUN}" id="f_droit_connexion_aucun" {if $cat.droit_connexion == Garradin\Membres::DROIT_AUCUN}checked="checked"{/if} />
           63  +                <input type="radio" name="droit_connexion" value="{Garradin\Membres::DROIT_AUCUN}" id="f_droit_connexion_aucun" {if $cat.droit_connexion == Garradin\Membres::DROIT_AUCUN}checked="checked"{/if} {$readonly} />
    59     64                   <label for="f_droit_connexion_aucun"><b class="aucun">C</b> Non</label>
    60     65               </dd>
    61     66               <dd>
    62         -                <input type="radio" name="droit_connexion" value="{Garradin\Membres::DROIT_ACCES}" id="f_droit_connexion_acces" {if $cat.droit_connexion == Garradin\Membres::DROIT_ACCES}checked="checked"{/if} />
           67  +                <input type="radio" name="droit_connexion" value="{Garradin\Membres::DROIT_ACCES}" id="f_droit_connexion_acces" {if $cat.droit_connexion == Garradin\Membres::DROIT_ACCES}checked="checked"{/if} {$readonly} />
    63     68                   <label for="f_droit_connexion_acces"><b class="acces">C</b> Oui</label>
    64     69               </dd>
    65     70           </dl>
    66     71           <dl class="droits">
    67     72               <dt><label for="f_droit_inscription_aucun">Les membres de cette catégorie peuvent-ils s'inscrire d'eux-même ?</label></dt>
    68     73               <dd>
    69     74                   <input type="radio" name="droit_inscription" value="{Garradin\Membres::DROIT_AUCUN}" id="f_droit_inscription_aucun" {if $cat.droit_inscription == Garradin\Membres::DROIT_AUCUN}checked="checked"{/if} />
................................................................................
    72     77               <dd>
    73     78                   <input type="radio" name="droit_inscription" value="{Garradin\Membres::DROIT_ACCES}" id="f_droit_inscription_acces" {if $cat.droit_inscription == Garradin\Membres::DROIT_ACCES}checked="checked"{/if} />
    74     79                   <label for="f_droit_inscription_acces"><b class="acces">I</b> Oui</label>
    75     80               </dd>
    76     81           </dl>
    77     82           <dl class="droits">
    78     83               <dt><label for="f_droit_membres_aucun">Gestion des membres :</label></dt>
           84  +            {if $readonly}
           85  +                <dd class="help">
           86  +                    Il n'est pas possible de désactiver ce droit pour votre propre catégorie.
           87  +                </dd>
           88  +            {/if}
    79     89               <dd>
    80         -                <input type="radio" name="droit_membres" value="{Garradin\Membres::DROIT_AUCUN}" id="f_droit_membres_aucun" {if $cat.droit_membres == Garradin\Membres::DROIT_AUCUN}checked="checked"{/if} />
           90  +                <input type="radio" name="droit_membres" value="{Garradin\Membres::DROIT_AUCUN}" id="f_droit_membres_aucun" {if $cat.droit_membres == Garradin\Membres::DROIT_AUCUN}checked="checked"{/if} {$readonly} />
    81     91                   <label for="f_droit_membres_aucun"><b class="aucun">M</b> Pas d'accès</label>
    82     92               </dd>
    83     93               <dd>
    84         -                <input type="radio" name="droit_membres" value="{Garradin\Membres::DROIT_ACCES}" id="f_droit_membres_acces" {if $cat.droit_membres == Garradin\Membres::DROIT_ACCES}checked="checked"{/if} />
           94  +                <input type="radio" name="droit_membres" value="{Garradin\Membres::DROIT_ACCES}" id="f_droit_membres_acces" {if $cat.droit_membres == Garradin\Membres::DROIT_ACCES}checked="checked"{/if} {$readonly} />
    85     95                   <label for="f_droit_membres_acces"><b class="acces">M</b> Lecture uniquement</label>
    86     96               </dd>
    87     97               <dd>
    88         -                <input type="radio" name="droit_membres" value="{Garradin\Membres::DROIT_ECRITURE}" id="f_droit_membres_ecriture" {if $cat.droit_membres == Garradin\Membres::DROIT_ECRITURE}checked="checked"{/if} />
           98  +                <input type="radio" name="droit_membres" value="{Garradin\Membres::DROIT_ECRITURE}" id="f_droit_membres_ecriture" {if $cat.droit_membres == Garradin\Membres::DROIT_ECRITURE}checked="checked"{/if} {$readonly} />
    89     99                   <label for="f_droit_membres_ecriture"><b class="ecriture">M</b> Lecture &amp; écriture</label>
    90    100               </dd>
    91    101               <dd>
    92         -                <input type="radio" name="droit_membres" value="{Garradin\Membres::DROIT_ADMIN}" id="f_droit_membres_admin" {if $cat.droit_membres == Garradin\Membres::DROIT_ADMIN}checked="checked"{/if} />
          102  +                <input type="radio" name="droit_membres" value="{Garradin\Membres::DROIT_ADMIN}" id="f_droit_membres_admin" {if $cat.droit_membres == Garradin\Membres::DROIT_ADMIN}checked="checked"{/if} {$readonly} />
    93    103                   <label for="f_droit_membres_admin"><b class="admin">M</b> Administration</label>
    94    104               </dd>
    95    105           </dl>
    96    106           <dl class="droits">
    97    107               <dt><label for="f_droit_compta_aucun">Comptabilité :</label></dt>
    98    108               <dd>
    99    109                   <input type="radio" name="droit_compta" value="{Garradin\Membres::DROIT_AUCUN}" id="f_droit_compta_aucun" {if $cat.droit_compta == Garradin\Membres::DROIT_AUCUN}checked="checked"{/if} />
................................................................................
   129    139               <dd>
   130    140                   <input type="radio" name="droit_wiki" value="{Garradin\Membres::DROIT_ADMIN}" id="f_droit_wiki_admin" {if $cat.droit_wiki == Garradin\Membres::DROIT_ADMIN}checked="checked"{/if} />
   131    141                   <label for="f_droit_wiki_admin"><b class="admin">W</b> Administration</label>
   132    142               </dd>
   133    143           </dl>
   134    144           <dl class="droits">
   135    145               <dt><label for="f_droit_config_aucun">Les membres de cette catégorie peuvent-ils modifier la configuration ?</label></dt>
          146  +            {if $readonly}
          147  +                <dd class="help">
          148  +                    Il n'est pas possible de désactiver ce droit pour votre propre catégorie.
          149  +                </dd>
          150  +            {/if}
   136    151               <dd>
   137         -                <input type="radio" name="droit_config" value="{Garradin\Membres::DROIT_AUCUN}" id="f_droit_config_aucun" {if $cat.droit_config == Garradin\Membres::DROIT_AUCUN}checked="checked"{/if} />
          152  +                <input type="radio" name="droit_config" value="{Garradin\Membres::DROIT_AUCUN}" id="f_droit_config_aucun" {if $cat.droit_config == Garradin\Membres::DROIT_AUCUN}checked="checked"{/if} {$readonly} />
   138    153                   <label for="f_droit_config_aucun"><b class="aucun">&#x2611;</b> Non</label>
   139    154               </dd>
   140    155               <dd>
   141         -                <input type="radio" name="droit_config" value="{Garradin\Membres::DROIT_ADMIN}" id="f_droit_config_admin" {if $cat.droit_config == Garradin\Membres::DROIT_ADMIN}checked="checked"{/if} />
          156  +                <input type="radio" name="droit_config" value="{Garradin\Membres::DROIT_ADMIN}" id="f_droit_config_admin" {if $cat.droit_config == Garradin\Membres::DROIT_ADMIN}checked="checked"{/if} {$readonly} />
   142    157                   <label for="f_droit_config_admin"><b class="admin">&#x2611;</b> Oui</label>
   143    158               </dd>
   144    159           </dl>
   145    160       </fieldset>
   146    161   
   147    162       <p class="submit">
   148    163           {csrf_field key="edit_cat_"|cat:$cat.id}
   149    164           <input type="submit" name="save" value="Enregistrer &rarr;" />
   150    165       </p>
   151    166   
   152    167   </form>
   153    168   
   154    169   {include file="admin/_foot.tpl"}

Modified src/templates/admin/membres/categories.tpl from [dd583e5389] to [f9ee8a7a8a].

    13     13                   <th>{$cat.nom|escape}</th>
    14     14                   <td class="num">{$cat.nombre|escape}</td>
    15     15                   <td class="droits">
    16     16                       {format_droits droits=$cat}
    17     17                   </td>
    18     18                   <td class="actions">
    19     19                       <a class="icn" href="cat_modifier.php?id={$cat.id|escape}" title="Modifier">✎</a>
           20  +                    {if $cat.id != $user.id_categorie}
    20     21                       <a class="icn" href="cat_supprimer.php?id={$cat.id|escape}" title="Supprimer">✘</a>
           22  +                    {/if}
    21     23                   </td>
    22     24               </tr>
    23     25           {/foreach}
    24     26       </tbody>
    25     27   </table>
    26     28   
    27     29   {if $error}

Modified src/templates/admin/membres/cotisations.tpl from [ebd63024b1] to [b31f937787].

     1      1   {include file="admin/_head.tpl" title="Cotisations du membre" current="membres/cotisations"}
     2      2   
     3      3   <ul class="actions">
     4      4       <li><a href="{$admin_url}membres/fiche.php?id={$membre.id|escape}"><b>{$membre.identite|escape}</b></a></li>
     5      5       <li><a href="{$admin_url}membres/modifier.php?id={$membre.id|escape}">Modifier</a></li>
     6         -    {if $user.droits.membres >= Garradin\Membres::DROIT_ADMIN}
            6  +    {if $user.droits.membres >= Garradin\Membres::DROIT_ADMIN && $user.id != $membre.id}
     7      7           <li><a href="{$admin_url}membres/supprimer.php?id={$membre.id|escape}">Supprimer</a></li>
     8      8       {/if}
     9      9       <li class="current"><a href="{$admin_url}membres/cotisations.php?id={$membre.id|escape}">Suivi des cotisations</a></li>
    10     10   </ul>
    11     11   
    12     12   <dl class="cotisation">
    13     13   {if $cotisation}

Modified src/templates/admin/membres/cotisations/ajout.tpl from [62f9cf3edb] to [f0b352697d].

     1      1   {if $membre}
     2      2       {include file="admin/_head.tpl" title="Enregistrer une cotisation pour le membre" current="membres/cotisations" js=1}
     3      3   
     4      4       <ul class="actions">
     5      5           <li><a href="{$admin_url}membres/fiche.php?id={$membre.id|escape}"><b>{$membre.identite|escape}</b></a></li>
     6      6           <li><a href="{$admin_url}membres/modifier.php?id={$membre.id|escape}">Modifier</a></li>
     7         -        {if $user.droits.membres >= Garradin\Membres::DROIT_ADMIN}
            7  +        {if $user.droits.membres >= Garradin\Membres::DROIT_ADMIN && $user.id != $membre.id}
     8      8               <li><a href="{$admin_url}membres/supprimer.php?id={$membre.id|escape}">Supprimer</a></li>
     9      9           {/if}
    10     10           <li><a href="{$admin_url}membres/cotisations.php?id={$membre.id|escape}">Suivi des cotisations</a></li>
    11     11       </ul>
    12     12   {else}
    13     13       {include file="admin/_head.tpl" title="Enregistrer une cotisation" current="membres/cotisations" js=1}
    14     14   

Modified src/templates/admin/membres/cotisations/rappels.tpl from [434fa8281b] to [02dc8464dd].

     1      1   {include file="admin/_head.tpl" title="Rappels pour cotisations du membre" current="membres/cotisations" js=1}
     2      2   
     3      3   <ul class="actions">
     4      4       <li><a href="{$admin_url}membres/fiche.php?id={$membre.id|escape}"><b>{$membre.identite|escape}</b></a></li>
     5      5       <li><a href="{$admin_url}membres/modifier.php?id={$membre.id|escape}">Modifier</a></li>
     6         -    {if $user.droits.membres >= Garradin\Membres::DROIT_ADMIN}
            6  +    {if $user.droits.membres >= Garradin\Membres::DROIT_ADMIN && $user.id != $membre.id}
     7      7           <li><a href="{$admin_url}membres/supprimer.php?id={$membre.id|escape}">Supprimer</a></li>
     8      8       {/if}
     9      9       <li class="current"><a href="{$admin_url}membres/cotisations.php?id={$membre.id|escape}">Suivi des cotisations</a></li>
    10     10   </ul>
    11     11   
    12     12   <form method="post" action="{$self_url}">
    13     13       <fieldset>

Modified src/templates/admin/membres/cotisations/supprimer.tpl from [3b17df39a6] to [0e6b2ffe34].

     1      1   {include file="admin/_head.tpl" title="Supprimer une cotisation pour le membre n°`$membre.id`" current="membres/cotisations"}
     2      2   
     3      3   <ul class="actions">
     4      4       <li><a href="{$admin_url}membres/fiche.php?id={$membre.id|escape}">Membre n°{$membre.id|escape}</a></li>
     5      5       <li><a href="{$admin_url}membres/modifier.php?id={$membre.id|escape}">Modifier</a></li>
     6         -    {if $user.droits.membres >= Garradin\Membres::DROIT_ADMIN}
            6  +    {if $user.droits.membres >= Garradin\Membres::DROIT_ADMIN && $user.id != $membre.id}
     7      7           <li><a href="{$admin_url}membres/supprimer.php?id={$membre.id|escape}">Supprimer</a></li>
     8      8       {/if}
     9      9       <li class="current"><a href="{$admin_url}membres/cotisations.php?id={$membre.id|escape}">Suivi des cotisations</a></li>
    10     10   </ul>
    11     11   
    12     12   {if $error}
    13     13       <p class="error">{$error|escape}</p>

Modified src/templates/admin/membres/fiche.tpl from [56d2b7c486] to [5537ffcdef].

     1      1   {include file="admin/_head.tpl" title="`$membre.identite` (`$categorie.nom`)" current="membres"}
     2      2   
     3      3   <ul class="actions">
     4      4       <li class="current"><a href="{$admin_url}membres/fiche.php?id={$membre.id|escape}"><b>{$membre.identite|escape}</b></a></li>
     5      5       <li><a href="{$admin_url}membres/modifier.php?id={$membre.id|escape}">Modifier</a></li>
     6         -    {if $user.droits.membres >= Garradin\Membres::DROIT_ADMIN}
            6  +    {if $user.droits.membres >= Garradin\Membres::DROIT_ADMIN && $user.id != $membre.id}
     7      7           <li><a href="{$admin_url}membres/supprimer.php?id={$membre.id|escape}">Supprimer</a></li>
     8      8       {/if}
     9      9       <li><a href="{$admin_url}membres/cotisations.php?id={$membre.id|escape}">Suivi des cotisations</a></li>
    10     10   </ul>
    11     11   
    12     12   <dl class="cotisation">
    13     13   {if $cotisation}

Modified src/templates/admin/membres/modifier.tpl from [bea41901e2] to [97ce04832b].

     1      1   {include file="admin/_head.tpl" title="Modifier un membre" current="membres" js=1}
     2      2   
     3      3   <ul class="actions">
     4      4       <li><a href="{$admin_url}membres/fiche.php?id={$membre.id|escape}"><b>{$membre.identite|escape}</b></a></li>
     5      5       <li class="current"><a href="{$admin_url}membres/modifier.php?id={$membre.id|escape}">Modifier</a></li>
     6         -    {if $user.droits.membres >= Garradin\Membres::DROIT_ADMIN}
            6  +    {if $user.droits.membres >= Garradin\Membres::DROIT_ADMIN && $user.id != $membre.id}
     7      7           <li><a href="{$admin_url}membres/supprimer.php?id={$membre.id|escape}">Supprimer</a></li>
     8      8       {/if}
     9      9       <li><a href="{$admin_url}membres/cotisations.php?id={$membre.id|escape}">Suivi des cotisations</a></li>
    10     10   </ul>
    11     11   
    12     12   {if $error}
    13     13       <p class="error">

Modified src/www/admin/membres/cat_modifier.php from [65fb457d34] to [33afb1fa19].

    30     30   {
    31     31       if (!Utils::CSRF_check('edit_cat_'.$id))
    32     32       {
    33     33           $error = 'Une erreur est survenue, merci de renvoyer le formulaire.';
    34     34       }
    35     35       else
    36     36       {
    37         -        try {
    38         -            $cats->edit($id, [
           37  +        $data = [
    39     38                   'nom'           =>  Utils::post('nom'),
    40     39                   'description'   =>  Utils::post('description'),
    41     40                   'droit_wiki'    =>  (int) Utils::post('droit_wiki'),
    42     41                   'droit_compta'  =>  (int) Utils::post('droit_compta'),
    43     42                   'droit_config'  =>  (int) Utils::post('droit_config'),
    44     43                   'droit_membres' =>  (int) Utils::post('droit_membres'),
    45     44                   'droit_connexion' => (int) Utils::post('droit_connexion'),
    46     45                   'droit_inscription' => (int) Utils::post('droit_inscription'),
    47     46                   'cacher'        =>  (int) Utils::post('cacher'),
    48     47                   'id_cotisation_obligatoire' => (int) Utils::post('id_cotisation_obligatoire'),
    49         -            ]);
           48  +        ];
           49  +
           50  +        // Ne pas permettre de modifier la connexion, l'accès à la config et à la gestion des membres
           51  +        // pour la catégorie du membre qui édite les catégories, sinon il pourrait s'empêcher
           52  +        // de se connecter ou n'avoir aucune catégorie avec le droit de modifier les catégories !
           53  +        if ($cat['id'] == $user['id_categorie'])
           54  +        {
           55  +            $data['droit_connexion'] = Membres::DROIT_ACCES;
           56  +            $data['droit_config'] = Membres::DROIT_ADMIN;
           57  +            $data['droit_membres'] = Membres::DROIT_ADMIN;
           58  +        }
           59  +
           60  +        try {
           61  +            $cats->edit($id, $data);
    50     62   
    51     63               if ($id == $user['id_categorie'])
    52     64               {
    53     65                   $membres->updateSessionData();
    54     66               }
    55     67   
    56     68               Utils::redirect('/admin/membres/categories.php');
................................................................................
    61     73           }
    62     74       }
    63     75   }
    64     76   
    65     77   $tpl->assign('cat', $cat);
    66     78   $tpl->assign('error', $error);
    67     79   
           80  +$tpl->assign('readonly', $cat['id'] == $user['id_categorie'] ? 'disabled="disabled"' : '');
           81  +
    68     82   $cotisations = new Cotisations;
    69     83   $tpl->assign('cotisations', $cotisations->listCurrent());
    70     84   
    71     85   $tpl->display('admin/membres/cat_modifier.tpl');
    72         -
    73         -?>

Modified src/www/admin/membres/cat_supprimer.php from [d2a7af392a] to [0996b48d07].

    19     19   
    20     20   $cat = $cats->get($id);
    21     21   
    22     22   if (!$cat)
    23     23   {
    24     24       throw new UserException("Cette catégorie n'existe pas.");
    25     25   }
           26  +
           27  +if ($cat['id'] == $user['id_categorie'])
           28  +{
           29  +    throw new UserException("Vous ne pouvez pas supprimer votre catégorie.");
           30  +}
    26     31   
    27     32   $error = false;
    28     33   
    29     34   if (!empty($_POST['delete']))
    30     35   {
    31     36       if (!Utils::CSRF_check('delete_cat_'.$id))
    32     37       {

Modified src/www/admin/membres/supprimer.php from [653b4fe0c8] to [77972b15eb].

    13     13   if (!$membre)
    14     14   {
    15     15       throw new UserException("Ce membre n'existe pas.");
    16     16   }
    17     17   
    18     18   $error = false;
    19     19   
    20         -if (Utils::post('delete'))
           20  +if ($membre['id'] == $user['id'])
           21  +{
           22  +    $error = "Il n'est pas possible de supprimer votre propre compte.";
           23  +}
           24  +
           25  +if (Utils::post('delete') && !$error)
    21     26   {
    22     27       if (!Utils::CSRF_check('delete_membre_'.$membre['id']))
    23     28       {
    24     29           $error = 'Une erreur est survenue, merci de renvoyer le formulaire.';
    25     30       }
    26     31       else
    27     32       {