Changeset 62741 in spip-zone


Ignore:
Timestamp:
Jun 20, 2012, 8:52:38 AM (7 years ago)
Author:
cedric@…
Message:

action pour prendre en charge la modération par lien dans les emails de notification

File:
1 copied

Legend:

Unmodified
Added
Removed
  • _plugins_/notifications/trunk/action/instituer_forum_paremail.php

    r62738 r62741  
    1414
    1515// http://doc.spip.org/@action_instituer_forum_dist
    16 function action_instituer_forum_dist($arg=null) {
     16function action_instituer_forum_paremail_dist() {
    1717
    18         if (is_null($arg)){
    19                 $securiser_action = charger_fonction('securiser_action', 'inc');
    20                 $arg = $securiser_action();
    21         }
     18        // verification manuelle de la signature : cas particulier de cette action signee par email
     19        $arg = _request('arg');
     20        $hash = _request('hash');
    2221
    23         list($id_forum, $statut) = preg_split('/\W/', $arg);
    24         $id_forum = intval($id_forum);
    25         $row = sql_fetsel("*", "spip_forum", "id_forum=$id_forum");
    26         if (!$row) return;
     22        include_spip("inc/securiser_action");
     23        $action = 'instituer_forum_paremail';
     24        $pass = secret_du_site();
    2725
    28         instituer_un_forum($statut,$row);
    29 }
     26        $verif = _action_auteur("$action-$arg", '', $pass, 'alea_ephemere');
    3027
    31 function instituer_un_forum($statut,$row){
     28        $auth = false;
     29        if ($verif==$hash)
     30                $auth = true;
    3231
    33         $id_forum = $row['id_forum'];
    34         $old = $row['statut'];
    35  // rien a faire si pas de changement de statut
    36         if ($old==$statut)
    37                 return;
     32        // si hash est ok, verifier si l'email correspond a un auteur qui a le droit de faire cette action
     33        if ($auth){
     34                $arg = explode("-",$arg);
     35                $id_forum = array_shift($arg);
     36                $statut = array_shift($arg);
     37                // l'email est ce qui reste
     38                $email = implode("-",$arg);
     39                // reconstituer l'arg pour l'action standard
     40                $arg = "$id_forum-$statut";
    3841
    39         // changer le statut de toute l'arborescence dependant de ce message
    40         $id_messages = array($id_forum);
    41         while ($id_messages) {
    42                 sql_updateq("spip_forum", array("statut" => $statut), sql_in("id_forum", $id_messages) ." AND statut = '$old'");
    43 
    44                 $id_messages = array_map('reset',sql_allfetsel("id_forum", "spip_forum", sql_in("id_parent", $id_messages)));
    45         }
    46 
    47         // Notifier de la publication du message, s'il etait 'prop'
    48         if ($old=='prop' AND $statut=='publie') {
    49                 if ($notifications = charger_fonction('notifications', 'inc')) {
    50                         $notifications('forumvalide', $id_forum);
     42                if ($message = sql_fetsel("id_objet","objet","spip_forum","id_forum=".intval($id_forum))){
     43                        // trouver le(s) auteur(s) et verifier leur autorisation
     44                        $res = sql_select("*","spip_auteurs","email=".sql_quote($email,'','text'));
     45                        while ($auteur = sql_fetch($res)){
     46                                if (autoriser("modererforum",$message['objet'],$message['id_objet'],$auteur)){
     47                                        $auth = true;
     48                                        // on ajoute l'exception car on est pas identifie avec cet id_auteur
     49                                        autoriser_exception("modererforum",$message['objet'],$message['id_objet']);
     50                                        break;
     51                                }
     52                        }
    5153                }
    5254        }
    5355
    54         // mettre a jour la date du thread
    55         // si publie, ou que tout le thread est prive,
    56         // mettre la date du thread a 'maintenant' (date de publi du message)
    57         // sinon prendre la date_heure du dernier message public
    58         // c'est imparfait dans le cas ou les crayons ont ete utilises pour modifier ce message entre temps
    59         // car la date_thread aurait cette derniere date alors que pas le message
    60         // mais c'est au mieux de ce que l'on peut faire quand on depublie un SPAM ou supprime un message
    61         if ($statut=='publie' OR $old=='publie') {
    62                 if ($statut=='publie'
    63                         OR !($date_thread = sql_getfetsel("date_heure", "spip_forum", "statut='publie' AND id_thread=".$row['id_thread'], "", "date_heure DESC","0,1"))){
    64                         $date_thread = date('Y-m-d H:i:s');
    65                 }
    66                 sql_updateq("spip_forum", array("date_thread" => $date_thread), "id_thread=".$row['id_thread']);
     56        if ($auth){
     57                spip_log("Moderation message $id_forum $statut par $email","moderationparemail"._LOG_INFO_IMPORTANTE);
     58                $instituer_forum = charger_fonction("instituer_forum","action");
     59                $instituer_forum($arg);
    6760        }
    6861
    69         // invalider les pages comportant ce forum
    70         include_spip('inc/invalideur');
    71         suivre_invalideur("id='forum/$id_forum'");
    72         suivre_invalideur("id='".$row['objet']."/".$row['id_objet']."'");
     62        // Dans tous les cas on finit sur un minipres qui dit si ok ou echec
     63        $titre = ($auth ? "Le message #$id_forum a bien été passé en $statut" : "Vous n'avez pas le droit de moderer ce message");
     64        include_spip('inc/minipres');
     65        echo minipres($titre);
    7366
    74         // Reindexation du thread (par exemple)
    75         pipeline('post_edition',
    76                 array(
    77                         'args' => array(
    78                                 'table' => 'spip_forum',
    79                                 'table_objet' => 'forums',
    80                                 'spip_table_objet' => 'spip_forum',
    81                                 'type' => 'forum',
    82                                 'id_objet' => $id_forum,
    83                                 'action' => 'instituer',
    84                         ),
    85                         'data' => null
    86                 )
    87         );
    8867}
    89 
    90 ?>
Note: See TracChangeset for help on using the changeset viewer.