Changeset 112771 in spip-zone


Ignore:
Timestamp:
Dec 13, 2018, 2:24:12 PM (5 weeks ago)
Author:
cedric@…
Message:

Revision des actions subscribe/unsubscribe/confirm et du decodage du arg hash pour permettre de gerer l'action sur plusieurs listes d'un coup - les URLs dans la nature dans l'ancien format continuent de fonctionner

Location:
_plugins_/mailsubscribers/trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/mailsubscribers/trunk/action/confirm_mailsubscriber.php

    r98864 r112771  
    1313 *
    1414 * @param string $email
    15  * @param string $identifiant
     15 * @param array $id_mailsubscribinglists
    1616 */
    17 function action_confirm_mailsubscriber_dist($email = null, $identifiant = null) {
     17function action_confirm_mailsubscriber_dist($email = null, $id_mailsubscribinglists = null) {
    1818       
    1919        include_spip('mailsubscribers_fonctions');
     
    2323                $arg = mailsubscribers_verifier_args_action('confirm');
    2424                if ($arg){
    25                         list($email, $identifiant) = $arg;
     25                        list($email, $id_mailsubscribinglists) = $arg;
    2626                }
    2727        }
     
    3434
    3535        $subscribe_mailsubscriber = charger_fonction('subscribe_mailsubscriber', 'action');
    36         $subscribe_mailsubscriber($email, $identifiant, false);
     36        $subscribe_mailsubscriber($email, $id_mailsubscribinglists, false);
    3737
    3838}
  • _plugins_/mailsubscribers/trunk/action/confirm_unsubscribe_mailsubscriber.php

    r110644 r112771  
    1818 *
    1919 * @param string $email
    20  * @param string $identifiant
     20 * @param array $id_mailsubscribinglists
    2121 */
    22 function action_confirm_unsubscribe_mailsubscriber_dist($email = null, $identifiant = null) {
     22function action_confirm_unsubscribe_mailsubscriber_dist($email = null, $id_mailsubscribinglists = null) {
    2323        include_spip('mailsubscribers_fonctions');
    2424        $timestamp = null;
     
    2929                $arg = explode(':', $arg);
    3030                $timestamp = array_pop($arg);
    31                 $identifiant = array_pop($arg);
     31                $id_mailsubscribinglists = array_pop($arg);
     32                $id_mailsubscribinglists = explode('-', $id_mailsubscribinglists);
    3233                $email = implode(":", $arg);
    3334        }
     
    4748        // il suffit de rejouer unsubscribe en forcant le simple-optin
    4849        $unsubscribe_mailsubscriber = charger_fonction("unsubscribe_mailsubscriber", "action");
    49         $unsubscribe_mailsubscriber ($email, $identifiant, false);
     50        $unsubscribe_mailsubscriber ($email, $id_mailsubscribinglists, false);
    5051}
    5152
  • _plugins_/mailsubscribers/trunk/action/subscribe_mailsubscriber.php

    r110637 r112771  
    1313 *
    1414 * @param string $email
    15  * @param string $identifiant
     15 * @param array $id_mailsubscribinglists
    1616 * @param null|bool $double_optin
    1717 */
    18 function action_subscribe_mailsubscriber_dist($email = null, $identifiant = null, $double_optin = null) {
     18function action_subscribe_mailsubscriber_dist($email = null, $id_mailsubscribinglists = null, $double_optin = null) {
    1919        include_spip('mailsubscribers_fonctions');
    2020        include_spip('inc/mailsubscribers');
     
    2424                $arg = mailsubscribers_verifier_args_action('subscribe');
    2525                if ($arg){
    26                         list($email, $identifiant) = $arg;
     26                        list($email, $id_mailsubscribinglists) = $arg;
    2727                }
    2828        }
     
    3434                exit;
    3535        }
    36        
     36
     37        $nb_listes = 0;
    3738        $titre_liste = '';
    38         $status = $infos['status'];
    39         if ($identifiant){
    40                 $status = (isset($infos['subscriptions'][$identifiant]['status'])?$infos['subscriptions'][$identifiant]['status']:'');
    41                 $liste = sql_fetsel('id_mailsubscribinglist, titre_public', 'spip_mailsubscribinglists', 'identifiant=' . sql_quote($identifiant));
    42                 if ($liste['titre_public']) {
    43                         include_spip('inc/texte');
    44                         $titre_liste = supprimer_numero(typo($liste['titre_public']));
     39        $deja = false;
     40        $identifiants = null;
     41        if ($infos['status'] == 'on') {
     42                $deja = true;
     43        }
     44        if ($id_mailsubscribinglists){
     45                $titre_liste = array();
     46                $listes = sql_allfetsel('id_mailsubscribinglist, identifiant, titre_public', 'spip_mailsubscribinglists', sql_in('id_mailsubscribinglist', $id_mailsubscribinglists));
     47                foreach ($listes as $liste) {
     48                        $identifiant = $liste['identifiant'];
     49                        $status = (isset($infos['subscriptions'][$identifiant]['status'])?$infos['subscriptions'][$identifiant]['status']:'');
     50                        if ($status !== 'on') {
     51                                $deja = false;
     52                                $identifiants[] = $identifiant;
     53                                if ($liste['titre_public']) {
     54                                        include_spip('inc/texte');
     55                                        $titre_liste[] = supprimer_numero(typo($liste['titre_public']));
     56                                }
     57                                else {
     58                                        $titre_liste[] = '#' . $liste['id_mailsubscribinglist'];
     59                                }
     60                        }
    4561                }
    46                 else {
    47                         $titre_liste = '#' . $liste['id_mailsubscribinglist'];
    48                 }
     62                $nb_listes = count($titre_liste);
     63                $titre_liste = implode(', ', $titre_liste);
    4964        }
    5065
    51         if ($status == 'on') {
     66        if ($deja) {
    5267                $titre = _T('mailsubscriber:subscribe_deja_texte', array('email' => $email));
    5368        }
     
    6176                $env = array(
    6277                        'email' => "<b>$email</b>",
     78                        'nb_listes' => $nb_listes,
    6379                        'titre_liste' => $titre_liste,
    6480                        'nom_site_spip' => $GLOBALS['meta']['nom_site'],
     
    6682                );
    6783                if ($double_optin) {
    68                         if ($titre_liste) {
     84                        if ($nb_listes>1) {
     85                                $titre = _T('mailsubscriber:confirmsubscribe_texte_email_listes_1', $env);
     86                        } elseif ($nb_listes == 1) {
    6987                                $titre = _T('mailsubscriber:confirmsubscribe_texte_email_liste_1', $env);
    7088                        } else {
     
    7593                else {
    7694                        $options['force'] = true;
    77                         if ($titre_liste) {
     95                        if ($nb_listes>1) {
     96                                $titre = _T('mailsubscriber:subscribe_texte_email_listes_1', $env);
     97                        } elseif ($nb_listes == 1) {
    7898                                $titre = _T('mailsubscriber:subscribe_texte_email_liste_1', $env);
    7999                        } else {
     
    82102                }
    83103
    84                 if ($identifiant){
    85                         $options['listes'] = array($identifiant);
     104                if ($identifiants){
     105                        $options['listes'] = $identifiants;
    86106                }
    87107                $subscribe($email, $options);
  • _plugins_/mailsubscribers/trunk/action/unsubscribe_mailsubscriber.php

    r110644 r112771  
    1313 *
    1414 * @param string $email
    15  * @param string $identifiant
     15 * @param array $id_mailsubscribinglists
    1616 * @param bool $double_optin
    1717 */
    18 function action_unsubscribe_mailsubscriber_dist($email = null, $identifiant = null, $double_optin = true) {
     18function action_unsubscribe_mailsubscriber_dist($email = null, $id_mailsubscribinglists = null, $double_optin = true) {
    1919        include_spip('mailsubscribers_fonctions');
    2020        include_spip('inc/mailsubscribers');
     
    2323                $arg = mailsubscribers_verifier_args_action('unsubscribe');
    2424                if ($arg){
    25                         list($email, $identifiant) = $arg;
     25                        list($email, $id_mailsubscribinglists) = $arg;
    2626                }
    2727        } else {
     
    3636        }
    3737
     38        $nb_listes = 0;
    3839        $titre_liste = '';
    39         $status = $infos['status'];
    40         if ($identifiant){
    41                 $liste = sql_fetsel('id_mailsubscribinglist, titre_public', 'spip_mailsubscribinglists', 'identifiant=' . sql_quote($identifiant));
    42                 if ($liste['titre_public']) {
    43                         include_spip('inc/texte');
    44                         $titre_liste = supprimer_numero(typo($liste['titre_public']));
     40        $deja = false;
     41        $identifiants = null;
     42        $titre_liste = '';
     43        if ($infos['status'] !== 'on') {
     44                $deja = true;
     45        }
     46        if ($id_mailsubscribinglists){
     47                $titre_liste = array();
     48                $listes = sql_allfetsel('id_mailsubscribinglist, identifiant, titre_public', 'spip_mailsubscribinglists', sql_in('id_mailsubscribinglist', $id_mailsubscribinglists));
     49                foreach ($listes as $liste) {
     50                        $identifiant = $liste['identifiant'];
     51                        $status = (isset($infos['subscriptions'][$identifiant]['status'])?$infos['subscriptions'][$identifiant]['status']:'');
     52                        if ($status === 'on') {
     53                                $deja = false;
     54                                $identifiants[] = $identifiant;
     55                                if ($liste['titre_public']) {
     56                                        include_spip('inc/texte');
     57                                        $titre_liste[] = supprimer_numero(typo($liste['titre_public']));
     58                                }
     59                                else {
     60                                        $titre_liste[] = '#' . $liste['id_mailsubscribinglist'];
     61                                }
     62                        }
    4563                }
    46                 else {
    47                         $titre_liste = '#' . $liste['id_mailsubscribinglist'];
    48                 }
     64                $nb_listes = count($titre_liste);
     65                $titre_liste = implode(', ', $titre_liste);
    4966        }
    5067
    51         if ($status !== 'on') {
     68        if ($deja) {
    5269                $titre = _T('mailsubscriber:unsubscribe_deja_texte', array('email' => $email));
    5370        }
     
    5875                $env = array(
    5976                        'email' => "<b>$email</b>",
     77                        'nb_listes' => $nb_listes,
    6078                        'titre_liste' => $titre_liste,
    6179                        'nom_site_spip' => $GLOBALS['meta']['nom_site'],
     
    6482                if ($double_optin) {
    6583                        include_spip('inc/filtres');
    66                         if ($titre_liste) {
    67                                 $titre = _T('mailsubscriber:unsubscribe_texte_confirmer_email_liste_1', $env);
    68                                 // bouton de desinscription a cette liste si on y est abonne ET si plusieurs abonnements
    69                                 if (isset($infos['subscriptions'][$identifiant]['status'])
    70                                   and $infos['subscriptions'][$identifiant]['status']=='on'
    71                                   and isset($infos['listes'])
    72                                   and count($infos['listes'])>1) {
    73                                         $titre .= "<br /><br />" . bouton_action(_T('newsletter:bouton_unsubscribe'),
     84                        if ($nb_listes>=1) {
     85                                if ($nb_listes>1) {
     86                                        $titre = _T('mailsubscriber:unsubscribe_texte_confirmer_email_listes_1', $env);
     87                                        $label_bouton_this = _T('newsletter:bouton_unsubscribe_several');
     88                                } elseif ($nb_listes == 1) {
     89                                        $titre = _T('mailsubscriber:unsubscribe_texte_confirmer_email_liste_1', $env);
     90                                        $label_bouton_this = _T('newsletter:bouton_unsubscribe');
     91                                }
     92                                // si il y a d'autres abonnements valides que ceux la, on met un premier bouton pour le desabonnement a cette/ces newsletters
     93                                $has_other = false;
     94                                foreach ($infos['subscriptions'] as $identifiant => $subscription) {
     95                                        if ($subscription['status'] === 'on' and !in_array($identifiant, $identifiants)) {
     96                                                $has_other = true;
     97                                                break;
     98                                        }
     99                                }
     100                                if ($has_other){
     101                                        $titre .= "<br /><br />" . bouton_action($label_bouton_this,
    74102                                                        generer_action_auteur('confirm_unsubscribe_mailsubscriber',
    75                                                                 mailsubscriber_base64url_encode($email . ":$identifiant:".time())));
    76 
     103                                                                mailsubscriber_base64url_encode($email . ":" . implode('-', $id_mailsubscribinglists) . ":" . time())));
    77104                                }
    78                         } else {
     105                        }
     106                        else {
    79107                                $titre = _T('mailsubscriber:unsubscribe_texte_confirmer_email_1', $env);
    80108                        }
    81109
    82                         // bouton de desinscription globale
     110                        // bouton de desinscription de TOUTES : il n'y aura que celui la present si pas d'autre inscription valide que celle(s) qu'on resilie
    83111                        $titre .= "<br /><br />" . bouton_action(_T('newsletter:bouton_unsubscribe_all'),
    84112                                        generer_action_auteur('confirm_unsubscribe_mailsubscriber',
     
    87115                else {
    88116                        $options['force'] = true;
    89                         if ($titre_liste) {
     117                        if ($nb_listes>1) {
     118                                $titre = _T('mailsubscriber:unsubscribe_texte_email_listes_1', $env);
     119                        } elseif ($nb_listes == 1) {
    90120                                $titre = _T('mailsubscriber:unsubscribe_texte_email_liste_1', $env);
    91121                        } else {
    92122                                $titre = _T('mailsubscriber:unsubscribe_texte_email_1', $env);
    93123                        }
    94                         if ($identifiant){
    95                                 $options['listes'] = array($identifiant);
     124                        if ($identifiants){
     125                                $options['listes'] = $identifiants;
    96126                        }
    97127                        $unsubscribe($email, $options);
    98128                }
    99 
    100129        }
    101130
  • _plugins_/mailsubscribers/trunk/inc/mailsubscribers.php

    r112110 r112771  
    1616 * @param string $action
    1717 * @return array
     18 *   email, $id_mailsubscribinglists
    1819 */
    1920function mailsubscribers_verifier_args_action($action) {
     
    2122        $arg = _request('arg');
    2223
     24        // reparer le arg ou le retrouver dans la QUERY_STRING si jamais il était coupé
    2325        if (is_null($arg) OR is_null($email)) {
    2426                $query = $_SERVER["QUERY_STRING"];
     
    3436                $arg = strtolower($args['arg']);
    3537                $email = $args['email'];
    36                 if (strlen($arg) > 40) {
    37                         $arg = substr($arg, -40);
     38                if ($p = strpos($arg, '-') === false) {
     39                        if (strlen($arg) > 40) {
     40                                $arg = substr($arg, -40);
     41                        }
     42                }
     43                else {
     44                        // faisons un preg_match pour retrouver tous les elements malgre le caca qui a ete ajoute
     45                        if (preg_match(",^(\d+-)+[0-9a-f]{40},", $arg, $m)) {
     46                                $arg = $m[0];
     47                        }
     48                        else {
     49                                $arg = null;
     50                        }
    3851                }
    3952                if ($arg AND $email) {
     
    5568                changer_langue($row['lang']);
    5669               
    57                 $identifiant = "";
    58                 // verifier la cle telle quelle => generique, applicable pour toutes les listes
    59                 $cle = mailsubscriber_cle_action($action, $email, $row['jeton']);
    60                 if ($arg !== $cle) {
     70                $identifiants = array();
     71                $jeton = $row['jeton'];
     72                $id_mailsubscribinglists = explode('-', $arg);
     73                array_pop($id_mailsubscribinglists); // le hash
     74                if (!$id_mailsubscribinglists) {
     75                        $id_mailsubscribinglists = null;
     76                }
     77                // verifier la cle telle quelle
     78                // => soit une cle generique, applicable pour toutes les listes
     79                // => soit une cle avec des id_mailsubscribinglists
     80                $cle = mailsubscriber_cle_action($action, $email, $jeton, $id_mailsubscribinglists);
     81                // si elle ne match pas et que arg ne contient aucun $id_mailsubscribinglists cherchons si c'est un hash ancien format
     82                // avec juste une liste ajoute sous la forme jeton+id_mailsubscribinglist
     83                if ($arg !== $cle and is_null($id_mailsubscribinglists)) {
     84                        $id_mailsubscribinglists = array();
     85                        // on ne cherche que dans les subscriptions connues pour cet inscrit, sinon rien a faire
    6186                        $subscriptions = sql_allfetsel('*', 'spip_mailsubscriptions', 'id_mailsubscriber=' . intval($row['id_mailsubscriber']));
    6287                        foreach ($subscriptions as $subscription){
    6388                                // verifier la cle pour cette liste
    64                                 $cle = mailsubscriber_cle_action($action, $email, $row['jeton'] . '+' . $subscription['id_mailsubscribinglist']);
     89                                $cle = mailsubscriber_cle_action($action, $email, $jeton . '+' . $subscription['id_mailsubscribinglist']);
    6590                                if ($arg == $cle) {
    66                                         $identifiant = sql_getfetsel('identifiant', 'spip_mailsubscribinglists', 'id_mailsubscribinglist=' . intval($subscription['id_mailsubscribinglist']));
     91                                        $id_mailsubscribinglists[] = $subscription['id_mailsubscribinglist'];
    6792                                        break;
    6893                                }
    6994                        }
    7095                        // pas de correspondance => cle incorrecte
    71                         if (!$identifiant){
     96                        if (!$subscription['id_mailsubscribinglist']){
    7297                                spip_log(_request('action')." : cle $arg incorrecte pour email $email", "mailsubscribers"._LOG_INFO_IMPORTANTE);
    7398                                return false;
     
    76101        }
    77102
    78         return array($email, $identifiant);
     103        return array($email, $id_mailsubscribinglists);
    79104}
    80105
  • _plugins_/mailsubscribers/trunk/lang/mailsubscriber_fr.php

    r112742 r112771  
    2424        'confirmsubscribe_texte_email_3' => 'S’il s’agit d’une erreur de notre part ou si vous avez changé d’avis, vous pouvez ignorer ce mail : cette demande sera automatiquement annulée.',
    2525        'confirmsubscribe_texte_email_envoye' => 'Un email a été envoyé à cette adresse pour confirmation.',
    26         'confirmsubscribe_texte_email_liste_1' => 'Vous avez demandé à vous inscrire à la newseletter « @titre_liste@ » de @nom_site_spip@ avec l’adresse email @email@.',
     26        'confirmsubscribe_texte_email_liste_1' => 'Vous avez demandé à vous inscrire à la newsletter « @titre_liste@ » de @nom_site_spip@ avec l’adresse email @email@.',
     27        'confirmsubscribe_texte_email_listes_1' => 'Vous avez demandé à vous inscrire aux newsletters « @titre_liste@ » de @nom_site_spip@ avec l’adresse email @email@.',
    2728        'confirmsubscribe_titre_email' => 'Confirmation d’inscription à la Newsletter',
    2829        'confirmsubscribe_titre_email_liste' => 'Confirmation d’inscription à la newsletter « <b>@titre_liste@</b> »',
     
    9798@url_unsubscribe@',
    9899        'subscribe_texte_email_liste_1' => 'Nous avons bien pris en compte votre inscription à la newsletter « @titre_liste@ » avec l’adresse email @email@.',
     100        'subscribe_texte_email_listes_1' => 'Nous avons bien pris en compte votre inscription aux newsletters « @titre_liste@ » avec l’adresse email @email@.',
    99101        'subscribe_titre_email' => 'Inscription à la Newsletter',
    100102        'subscribe_titre_email_liste' => 'Inscription à la newsletter « <b>@titre_liste@</b> »',
     
    129131        'unsubscribe_texte_email_3' => 'En cas d’erreur de notre part, ou si vous changez d’avis, vous pouvez vous réinscrire à tout moment au moyen du lien suivant :
    130132@url_subscribe@',
    131         'unsubscribe_texte_email_liste_1' => 'L’adresse email @email@ a bien été retirée de notre liste de diffusion de la newsletter <b>@titre_liste@</b>.',
     133        'unsubscribe_texte_email_liste_1' => 'L’adresse email @email@ a bien été retirée de la liste de diffusion de la newsletter <b>@titre_liste@</b>.',
     134        'unsubscribe_texte_email_listes_1' => 'L’adresse email @email@ a bien été retirée des listes de diffusion aux newsletters <b>@titre_liste@</b>.',
    132135        'unsubscribe_titre_email' => 'Désinscription de la Newsletter',
    133136        'unsubscribe_titre_email_liste' => 'Désinscription de la newsletter <b>@titre_liste@</b>'
  • _plugins_/mailsubscribers/trunk/lang/newsletter_fr.php

    r112742 r112771  
    1010        'bouton_subscribe' => 'M\'inscrire à cette Newsletter',
    1111        'bouton_unsubscribe' => 'Me désinscrire de cette Newsletter',
     12        'bouton_unsubscribe_several' => 'Me désinscrire de ces Newsletters',
    1213        'bouton_unsubscribe_all' => 'Me désinscrire de TOUTES les Newsletters',
    1314
Note: See TracChangeset for help on using the changeset viewer.