[SPIP] +installation version 3.0.10
[lhc/web/www.git] / www / ecrire / action / inscrire_auteur.php
diff --git a/www/ecrire/action/inscrire_auteur.php b/www/ecrire/action/inscrire_auteur.php
new file mode 100644 (file)
index 0000000..d7de112
--- /dev/null
@@ -0,0 +1,332 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2012                                                *
+ *  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;
+
+
+/**
+ * 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
+ *
+ * @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
+ * @return array|string
+ */
+function action_inscrire_auteur_dist($statut, $mail_complet, $nom, $options = array()){
+       if (!is_array($options))
+               $options = array('id'=>$options);
+
+       if (function_exists('test_inscription'))
+               $f = 'test_inscription';
+       else    $f = 'test_inscription_dist';
+       $desc = $f($statut, $mail_complet, $nom, $options);
+
+       // erreur ?
+       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)
+               return _T('titre_probleme_technique');
+
+       $row = sql_fetch($res);
+       sql_free($res);
+       if ($row){
+               if (isset($options['force_nouveau']) AND $options['force_nouveau']==true){
+                       $desc['id_auteur'] = $row['id_auteur'];
+                       $desc = inscription_nouveau($desc);
+               }
+               else
+                       $desc = $row;
+       }
+       else
+               // s'il n'existe pas deja, creer les identifiants
+               $desc = inscription_nouveau($desc);
+
+       // erreur ?
+       if (!is_array($desc))
+               return $desc;
+
+
+       // generer le mot de passe (ou le refaire si compte inutilise)
+       $desc['pass'] = creer_pass_pour_auteur($desc['id_auteur']);
+
+       // attribuer un jeton pour confirmation par clic sur un lien
+       $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);
+
+       $notifications = charger_fonction('notifications', 'inc');
+       notifications_envoyer_mails($mail_complet, $msg, $sujet, $from, $head);
+
+       // Notifications
+       $notifications('inscription', $desc['id_auteur'],
+               array('nom' => $desc['nom'], 'email' => $desc['email'])
+       );
+
+       return $desc;
+}
+
+
+/**
+ * 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
+ *
+ * http://doc.spip.org/@test_inscription_dist
+ *
+ * @param string $statut
+ * @param string $mail
+ * @param string $nom
+ * @param string $options
+ * @return array|string
+ */
+function test_inscription_dist($statut, $mail, $nom, $options) {
+       include_spip('inc/filtres');
+       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))
+                       $res['login'] = $login;
+       }
+       if(!isset($res['login']) AND ((strlen ($nom) < _LOGIN_TROP_COURT) OR (strlen($nom) > 64)))
+               return 'ecrire:info_login_trop_court';
+       return $res;
+}
+
+
+/**
+ * On enregistre le demandeur comme 'nouveau', en memorisant le statut final
+ * 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']))
+               $desc['login'] = test_login($desc['nom'], $desc['email']);
+
+       $desc['statut'] = 'nouveau';
+       include_spip('action/editer_auteur');
+       if (isset($desc['id_auteur']))
+               $id_auteur = $desc['id_auteur'];
+       else
+               $id_auteur = auteur_inserer();
+
+       if (!$id_auteur) return _T('titre_probleme_technique');
+
+       include_spip('inc/autoriser');
+       // lever l'autorisation pour pouvoir modifier le statut
+       autoriser_exception('modifier','auteur',$id_auteur);
+       auteur_modifier($id_auteur, $desc);
+       autoriser_exception('modifier','auteur',$id_auteur,false);
+
+       $desc['id_auteur'] = $id_auteur;
+
+       return $desc;
+}
+
+
+/**
+ * http://doc.spip.org/@test_login
+ *
+ * @param string $nom
+ * @param string $mail
+ * @return string
+ */
+function test_login($nom, $mail) {
+       include_spip('inc/charsets');
+       $nom = strtolower(translitteration($nom));
+       $login_base = preg_replace("/[^\w\d_]/", "_", $nom);
+
+       // il faut eviter que le login soit vraiment trop court
+       if (strlen($login_base) < 3) {
+               $mail = strtolower(translitteration(preg_replace('/@.*/', '', $mail)));
+               $login_base = preg_replace("/[^\w\d]/", "_", $mail);
+       }
+       if (strlen($login_base) < 3)
+               $login_base = 'user';
+
+       // eviter aussi qu'il soit trop long (essayer d'attraper le prenom)
+       if (strlen($login_base) > 10) {
+               $login_base = preg_replace("/^(.{4,}(_.{1,7})?)_.*/",
+                       '\1', $login_base);
+               $login_base = substr($login_base, 0,13);
+       }
+
+       $login = $login_base;
+
+       for ($i = 1; ; $i++) {
+               if (!sql_countsel('spip_auteurs', "login='$login'"))
+                       return $login;
+               $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
+ *
+ * http://doc.spip.org/@envoyer_inscription_dist
+ *
+ * @param array $desc
+ * @param string $nom
+ * @param string $mode
+ * @param array $options
+ * @return array
+ */
+function envoyer_inscription_dist($desc, $nom, $mode, $options=array()) {
+
+       $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']);
+
+       $message = recuperer_fond('modeles/mail_inscription',$contexte);
+       $from = (isset($options['from'])?$options['from']:null);
+       $head = null;
+       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
+ */
+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));
+       return $pass;
+}
+
+/**
+ * @deprecated a virer en 3.1 car pas utilise dans les squelettes
+ *
+ * voir l'autorisation correspondante
+ *
+ * @param string $statut_tmp
+ * @return string
+ */
+function tester_statut_inscription($statut_tmp){
+       include_spip('inc/autoriser');
+       return autoriser('inscrireauteur', $statut_tmp) ? $statut_tmp : '';
+}
+
+
+/**
+ * Un nouvel inscrit prend son statut definitif a la 1ere connexion.
+ * Le statut a ete memorise dans prefs (cf test_inscription_dist).
+ * 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){
+       // securite
+       if ($auteur['statut'] != 'nouveau') return $auteur;
+
+       include_spip('inc/autoriser');
+       if (!autoriser('inscrireauteur', $auteur['prefs']))
+               return $auteur;
+       $s = $auteur['prefs'];
+
+       include_spip('inc/autoriser');
+       // accorder l'autorisation de modif du statut auteur
+       autoriser_exception('modifier','auteur',$auteur['id_auteur']);
+       include_spip('action/editer_auteur');
+       // changer le statut
+       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);
+
+       // mettre a jour le statut
+       $auteur['statut'] = $s;
+       return $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){
+       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);
+       return $jeton;
+}
+
+/**
+ * Retrouver l'auteur par son jeton
+ * @param string $jeton
+ * @return array|bool
+ */
+function auteur_verifier_jeton($jeton){
+       // refuser un jeton corrompu
+       if (preg_match(',[^0-9a-f.],i',$jeton))
+               return false;
+
+       $desc = sql_fetsel('*','spip_auteurs',"cookie_oubli=".sql_quote($jeton));
+       return $desc;
+}
+
+/**
+ * Effacer le jeton d'un auteur apres utilisation
+ *
+ * @param int $id_auteur
+ * @return bool
+ */
+function auteur_effacer_jeton($id_auteur){
+       return sql_updateq("spip_auteurs", array("cookie_oubli" => ''), "id_auteur=" . intval($id_auteur));
+}
\ No newline at end of file