[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / ecrire / action / inscrire_auteur.php
index ed1f959..da08309 100644 (file)
@@ -3,68 +3,82 @@
 /***************************************************************************\
  *  SPIP, Systeme de publication pour l'internet                           *
  *                                                                         *
- *  Copyright (c) 2001-2016                                                *
+ *  Copyright (c) 2001-2017                                                *
  *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
  *                                                                         *
  *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-if (!defined('_ECRIRE_INC_VERSION')) return;
+/**
+ * Gestion de l'inscription d'un auteur
+ *
+ * @package SPIP\Core\Inscription
+ **/
+if (!defined('_ECRIRE_INC_VERSION')) {
+       return;
+}
 
 
 /**
  * Inscrire un nouvel auteur sur la base de son nom et son email
- * L'email est utilise pour reperer si il existe deja ou non
- * => identifiant par defaut
+ *
+ * L'email est utilisé pour repérer si il existe déjà ou non
+ * => identifiant par défaut
  *
  * @param string $statut
  * @param string $mail_complet
  * @param string $nom
  * @param array $options
- *   login : login precalcule
- *   id : id_rubrique fournit en second arg de #FORMULAIRE_INSCRIPTION
- *   from : email de l'envoyeur pour l'envoi du mail d'inscription
- *   force_nouveau : forcer le statut nouveau sur l'auteur inscrit, meme si il existait deja en base
- *   modele_mail : squelette de mail a utiliser
+ *   login : login precalcule
+ *   id : id_rubrique fournit en second arg de #FORMULAIRE_INSCRIPTION
+ *   from : email de l'envoyeur pour l'envoi du mail d'inscription
+ *   force_nouveau : forcer le statut nouveau sur l'auteur inscrit, meme si il existait deja en base
+ *   modele_mail : squelette de mail a utiliser
  * @return array|string
  */
-function action_inscrire_auteur_dist($statut, $mail_complet, $nom, $options = array()){
-       if (!is_array($options))
-               $options = array('id'=>$options);
+function action_inscrire_auteur_dist($statut, $mail_complet, $nom, $options = array()) {
+       if (!is_array($options)) {
+               $options = array('id' => $options);
+       }
 
-       if (function_exists('test_inscription'))
+       if (function_exists('test_inscription')) {
                $f = 'test_inscription';
-       else    $f = 'test_inscription_dist';
+       } else {
+               $f = 'test_inscription_dist';
+       }
        $desc = $f($statut, $mail_complet, $nom, $options);
 
        // erreur ?
-       if (!is_array($desc))
+       if (!is_array($desc)) {
                return _T($desc);
+       }
 
        include_spip('base/abstract_sql');
        $res = sql_select("statut, id_auteur, login, email", "spip_auteurs", "email=" . sql_quote($desc['email']));
        // erreur ?
-       if (!$res)
+       if (!$res) {
                return _T('titre_probleme_technique');
+       }
 
        $row = sql_fetch($res);
        sql_free($res);
-       if ($row){
-               if (isset($options['force_nouveau']) AND $options['force_nouveau']==true){
+       if ($row) {
+               if (isset($options['force_nouveau']) and $options['force_nouveau'] == true) {
                        $desc['id_auteur'] = $row['id_auteur'];
                        $desc = inscription_nouveau($desc);
-               }
-               else
+               } else {
                        $desc = $row;
-       }
-       else
-               // s'il n'existe pas deja, creer les identifiants
+               }
+       } else // s'il n'existe pas deja, creer les identifiants
+       {
                $desc = inscription_nouveau($desc);
+       }
 
        // erreur ?
-       if (!is_array($desc))
+       if (!is_array($desc)) {
                return $desc;
+       }
 
 
        // generer le mot de passe (ou le refaire si compte inutilise)
@@ -74,8 +88,8 @@ function action_inscrire_auteur_dist($statut, $mail_complet, $nom, $options = ar
        $desc['jeton'] = auteur_attribuer_jeton($desc['id_auteur']);
 
        // charger de suite cette fonction, pour ses utilitaires
-       $envoyer_inscription = charger_fonction("envoyer_inscription","");
-       list($sujet,$msg,$from,$head) = $envoyer_inscription($desc, $nom, $statut, $options);
+       $envoyer_inscription = charger_fonction("envoyer_inscription", "");
+       list($sujet, $msg, $from, $head) = $envoyer_inscription($desc, $nom, $statut, $options);
 
        $notifications = charger_fonction('notifications', 'inc');
        notifications_envoyer_mails($mail_complet, $msg, $sujet, $from, $head);
@@ -90,34 +104,40 @@ function action_inscrire_auteur_dist($statut, $mail_complet, $nom, $options = ar
 
 
 /**
- * fonction qu'on peut redefinir pour filtrer les adresses mail et les noms,
- * et donner des infos supplementaires
- * Std: controler que le nom (qui sert a calculer le login) est plausible
- * et que l'adresse est valide. On les normalise au passage (trim etc).
- * Retour:
- * - si ok un tableau avec au minimum email, nom, mode (redac / forum)
- * - si ko une chaine de langue servant d'argument a  _T expliquant le refus
+ * Contrôler que le nom (qui sert à calculer le login) est plausible
+ * et que l'adresse courriel est valide.
  *
- * http://doc.spip.org/@test_inscription_dist
+ * On les normalise au passage (trim etc).
+ *
+ * On peut redéfinir cette fonction pour filtrer les adresses mail et les noms,
+ * et donner des infos supplémentaires
  *
  * @param string $statut
  * @param string $mail
  * @param string $nom
- * @param string $options
+ * @param array $options
  * @return array|string
+ *     - array : si ok, tableau avec au minimum email, nom, mode (redac / forum)
+ *     - string : si ko, chaîne de langue servant d'argument au filtre `_T` expliquant le refus
+ *
  */
 function test_inscription_dist($statut, $mail, $nom, $options) {
        include_spip('inc/filtres');
-       if (!$r = email_valide($mail)) return 'info_email_invalide';
+       if (!$r = email_valide($mail)) {
+               return 'info_email_invalide';
+       }
        $nom = trim(corriger_caracteres($nom));
        $res = array('email' => $r, 'nom' => $nom, 'prefs' => $statut);
        if (isset($options['login'])) {
                $login = trim(corriger_caracteres($options['login']));
-               if((strlen ($login) >= _LOGIN_TROP_COURT) AND (strlen($nom) <= 64))
+               if ((strlen($login) >= _LOGIN_TROP_COURT) and (strlen($nom) <= 64)) {
                        $res['login'] = $login;
+               }
        }
-       if(!isset($res['login']) AND ((strlen ($nom) < _LOGIN_TROP_COURT) OR (strlen($nom) > 64)))
+       if (!isset($res['login']) and ((strlen($nom) < _LOGIN_TROP_COURT) or (strlen($nom) > 64))) {
                return 'ecrire:info_login_trop_court';
+       }
+
        return $res;
 }
 
@@ -127,30 +147,33 @@ function test_inscription_dist($statut, $mail, $nom, $options) {
  * provisoirement dans le champ prefs, afin de ne pas visualiser les inactifs
  * A sa premiere connexion il obtiendra son statut final.
  *
- * http://doc.spip.org/@inscription_nouveau
- *
  * @param array $desc
  * @return mixed|string
  */
-function inscription_nouveau($desc)
-{
-       if (!isset($desc['login']) OR !strlen($desc['login']))
+function inscription_nouveau($desc) {
+       if (!isset($desc['login']) or !strlen($desc['login'])) {
                $desc['login'] = test_login($desc['nom'], $desc['email']);
+       }
 
        $desc['statut'] = 'nouveau';
        include_spip('action/editer_auteur');
-       if (isset($desc['id_auteur']))
+       if (isset($desc['id_auteur'])) {
                $id_auteur = $desc['id_auteur'];
-       else
+       } else {
                $id_auteur = auteur_inserer();
+       }
 
-       if (!$id_auteur) return _T('titre_probleme_technique');
+       if (!$id_auteur) {
+               return _T('titre_probleme_technique');
+       }
+
+       $desc['lang'] = $GLOBALS['spip_lang'];
 
        include_spip('inc/autoriser');
        // lever l'autorisation pour pouvoir modifier le statut
-       autoriser_exception('modifier','auteur',$id_auteur);
+       autoriser_exception('modifier', 'auteur', $id_auteur);
        auteur_modifier($id_auteur, $desc);
-       autoriser_exception('modifier','auteur',$id_auteur,false);
+       autoriser_exception('modifier', 'auteur', $id_auteur, false);
 
        $desc['id_auteur'] = $id_auteur;
 
@@ -159,7 +182,7 @@ function inscription_nouveau($desc)
 
 
 /**
- * http://doc.spip.org/@test_login
+ * http://code.spip.net/@test_login
  *
  * @param string $nom
  * @param string $mail
@@ -175,26 +198,28 @@ function test_login($nom, $mail) {
                $mail = strtolower(translitteration(preg_replace('/@.*/', '', $mail)));
                $login_base = preg_replace("/[^\w\d]/", "_", $mail);
        }
-       if (strlen($login_base) < 3)
+       if (strlen($login_base) < 3) {
                $login_base = 'user';
+       }
 
        $login = $login_base;
 
        for ($i = 1; ; $i++) {
-               if (!sql_countsel('spip_auteurs', "login='$login'"))
+               if (!sql_countsel('spip_auteurs', "login='$login'")) {
                        return $login;
-               $login = $login_base.$i;
+               }
+               $login = $login_base . $i;
        }
+
        return $login;
 }
 
 
 /**
- * construction du mail envoyant les identifiants
- * fonction redefinissable qui doit retourner un tableau
- * dont les elements seront les arguments de inc_envoyer_mail
+ * Construction du mail envoyant les identifiants
  *
- * http://doc.spip.org/@envoyer_inscription_dist
+ * Fonction redefinissable qui doit retourner un tableau
+ * dont les elements seront les arguments de inc_envoyer_mail
  *
  * @param array $desc
  * @param string $nom
@@ -202,14 +227,14 @@ function test_login($nom, $mail) {
  * @param array $options
  * @return array
  */
-function envoyer_inscription_dist($desc, $nom, $mode, $options=array()) {
+function envoyer_inscription_dist($desc, $nom, $mode, $options = array()) {
 
-       $contexte = array_merge($desc,$options);
+       $contexte = array_merge($desc, $options);
        $contexte['nom'] = $nom;
        $contexte['mode'] = $mode;
-       $contexte['url_confirm'] = generer_url_action('confirmer_inscription','',true,true);
-       $contexte['url_confirm'] = parametre_url($contexte['url_confirm'],'email',$desc['email']);
-       $contexte['url_confirm'] = parametre_url($contexte['url_confirm'],'jeton',$desc['jeton']);
+       $contexte['url_confirm'] = generer_url_action('confirmer_inscription', '', true, true);
+       $contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'email', $desc['email']);
+       $contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'jeton', $desc['jeton']);
 
        $modele_mail = 'modeles/mail_inscription';
        if (isset($options['modele_mail']) and $options['modele_mail']){
@@ -218,14 +243,13 @@ function envoyer_inscription_dist($desc, $nom, $mode, $options=array()) {
        $message = recuperer_fond($modele_mail, $contexte);
        $from = (isset($options['from']) ? $options['from'] : null);
        $head = null;
-       return array("", $message,$from,$head);
+
+       return array("", $message, $from, $head);
 }
 
 
 /**
  * Creer un mot de passe initial aleatoire
- * 
- * http://doc.spip.org/@creer_pass_pour_auteur
  *
  * @param int $id_auteur
  * @return string
@@ -234,7 +258,8 @@ function creer_pass_pour_auteur($id_auteur) {
        include_spip('inc/acces');
        $pass = creer_pass_aleatoire(8, $id_auteur);
        include_spip('action/editer_auteur');
-       auteur_instituer($id_auteur, array('pass'=>$pass));
+       auteur_instituer($id_auteur, array('pass' => $pass));
+
        return $pass;
 }
 
@@ -247,14 +272,16 @@ function creer_pass_pour_auteur($id_auteur) {
  * @param int $id
  * @return string
  */
-function tester_statut_inscription($statut_tmp, $id){
+function tester_statut_inscription($statut_tmp, $id) {
        include_spip('inc/autoriser');
-       if ($statut_tmp)
+       if ($statut_tmp) {
                return autoriser('inscrireauteur', $statut_tmp, $id) ? $statut_tmp : '';
-       elseif (
-                  autoriser('inscrireauteur', $statut_tmp = "1comite", $id)
-         OR autoriser('inscrireauteur', $statut_tmp = "6forum", $id))
+       } elseif (
+               autoriser('inscrireauteur', $statut_tmp = "1comite", $id)
+               or autoriser('inscrireauteur', $statut_tmp = "6forum", $id)
+       ) {
                return $statut_tmp;
+       }
 
        return '';
 }
@@ -266,32 +293,38 @@ function tester_statut_inscription($statut_tmp, $id){
  * On le verifie, car la config a peut-etre change depuis,
  * et pour compatibilite avec les anciennes versions qui n'utilisaient pas "prefs".
  *
- * http://doc.spip.org/@acces_statut
- *
  * @param array $auteur
  * @return array
  */
-function confirmer_statut_inscription($auteur){
+function confirmer_statut_inscription($auteur) {
        // securite
-       if ($auteur['statut'] != 'nouveau') return $auteur;
+       if ($auteur['statut'] != 'nouveau') {
+               return $auteur;
+       }
 
+       $s = $auteur['prefs'];
+       // securite, au cas ou prefs aurait ete corrompu (ou deja ecrase par un tableau serialize)
+       if (!preg_match(',^\w+$,', $s)) {
+               $s = '6forum';
+       }
        include_spip('inc/autoriser');
-       if (!autoriser('inscrireauteur', $auteur['prefs']))
+       if (!autoriser('inscrireauteur', $s)) {
                return $auteur;
-       $s = $auteur['prefs'];
+       }
 
        include_spip('inc/autoriser');
        // accorder l'autorisation de modif du statut auteur
-       autoriser_exception('modifier','auteur',$auteur['id_auteur']);
+       autoriser_exception('modifier', 'auteur', $auteur['id_auteur']);
        include_spip('action/editer_auteur');
        // changer le statut
-       auteur_modifier($auteur['id_auteur'],array('statut'=> $s));
+       auteur_modifier($auteur['id_auteur'], array('statut' => $s));
        unset($_COOKIE['spip_session']); // forcer la maj de la session
        // lever l'autorisation de modif du statut auteur
-       autoriser_exception('modifier','auteur',$auteur['id_auteur'],false);
+       autoriser_exception('modifier', 'auteur', $auteur['id_auteur'], false);
 
        // mettre a jour le statut
        $auteur['statut'] = $s;
+
        return $auteur;
 }
 
@@ -299,31 +332,36 @@ function confirmer_statut_inscription($auteur){
 /**
  * Attribuer un jeton temporaire pour un auteur
  * en assurant l'unicite du jeton
+ *
  * @param int $id_auteur
  * @return string
  */
-function auteur_attribuer_jeton($id_auteur){
+function auteur_attribuer_jeton($id_auteur) {
        include_spip('inc/acces');
        // s'assurer de l'unicite du jeton pour le couple (email,cookie)
        do {
                $jeton = creer_uniqid();
                sql_updateq("spip_auteurs", array("cookie_oubli" => $jeton), "id_auteur=" . intval($id_auteur));
-       }
-       while (sql_countsel("spip_auteurs","cookie_oubli=".sql_quote($jeton))>1);
+       } while (sql_countsel("spip_auteurs", "cookie_oubli=" . sql_quote($jeton)) > 1);
+
        return $jeton;
 }
 
 /**
  * Retrouver l'auteur par son jeton
+ *
  * @param string $jeton
  * @return array|bool
  */
-function auteur_verifier_jeton($jeton){
+function auteur_verifier_jeton($jeton) {
        // refuser un jeton corrompu
-       if (preg_match(',[^0-9a-f.],i',$jeton))
+       if (preg_match(',[^0-9a-f.],i', $jeton)) {
                return false;
+       }
+
+       // on peut tomber sur un jeton compose uniquement de chiffres, il faut forcer le $type pour sql_quote pour eviter de planter
+       $desc = sql_fetsel('*', 'spip_auteurs', "cookie_oubli=" . sql_quote($jeton, $serveur, 'string'));
 
-       $desc = sql_fetsel('*','spip_auteurs',"cookie_oubli=".sql_quote($jeton, $serveur, 'string'));
        return $desc;
 }
 
@@ -333,6 +371,6 @@ function auteur_verifier_jeton($jeton){
  * @param int $id_auteur
  * @return bool
  */
-function auteur_effacer_jeton($id_auteur){
+function auteur_effacer_jeton($id_auteur) {
        return sql_updateq("spip_auteurs", array("cookie_oubli" => ''), "id_auteur=" . intval($id_auteur));
 }