source: spip-zone/_plugins_/inscription2/inscription2_2_0/formulaires/inscription2.php @ 33699

Last change on this file since 33699 was 33699, checked in by pierre.fiches@…, 10 years ago

Régler le nombre minimal de caractère pour le mot de passe (sur l'espace public)

Estimer le temps nécessaire au craquage hard (comme Michel Fraisse l'a suggéré pour spip)

File size: 13.5 KB
Line 
1<?php
2/**
3 * Formulaire d'inscription et de modification de profil amélioré au site
4 *
5 * Pour l'utiliser en tant que formulaire d'inscription :
6 * - #FORMULAIRE_INSCRIPTION2
7 *
8 * Pour l'utiliser afin de modifier le profil d'un utilisateur :
9 * - #FORMULAIRE_INSCRIPTION2{#ID_AUTEUR} dans une boucle auteur
10 * - #FORMULAIRE_INSCRIPTION2{#ENV{id_auteur}} si l'id_auteur est dans
11 * l'environnement (modèle / page spécifique)
12 * - #FORMULAIRE_INSCRIPTION2{2} pour éditer le profil d'un utilisateur en
13 * particulier (ici l'id_auteur numéro 2)
14 *
15 */
16
17if (!defined("_ECRIRE_INC_VERSION")) return;
18
19// charger cfg
20include_spip('cfg_options');
21include_spip('inc/autoriser');
22
23/**
24 *
25 * Chargement des valeurs par defaut des champs du formulaire
26 *
27 * @return array L'ensemble des champs et de leur valeurs
28 * @param int $id_auteur[optional] Si cette valeur est utilisée, on entre dans le cadre de
29 * la modification d'un auteur, et plus dans la création
30 */
31function formulaires_inscription2_charger_dist($id_auteur = NULL,$redirect = null){
32
33        //initialise les variables d'environnement pas défaut
34        $valeurs = array();
35
36        //recupere la liste des champs possible
37        $chercher_champs = charger_fonction('inscription2_champs_formulaire','inc');
38        $champs = $chercher_champs($id_auteur);
39
40        /**
41         * si on a un auteur alors on preremplit le formulaire avec ses informations
42         * les nom des champs sont les memes que ceux de la base de données
43         */
44        if (is_numeric($id_auteur)) {
45                if (!autoriser('modifier','auteur',$id_auteur)) {
46                        return;
47                }
48                /**
49                 * On sélectionne tout pour éviter les champs qui ne sont pas dans la
50                 * base de donnée.
51                 * par exemple : logo_auteur et reglement
52                 */
53                $auteur = sql_fetsel(
54                        '*',
55                        'spip_auteurs LEFT JOIN spip_auteurs_elargis USING(id_auteur)',
56                        'spip_auteurs_elargis.id_auteur ='.$id_auteur
57                );
58                $auteur['id_auteur'] = $id_auteur;
59                if(in_array('naissance',$champs)){
60                        if(preg_match("/([0-9]{4})-([0-9]{2})-([0-9]{2})/",$auteur['naissance'],$date_naissance)){
61                                include_spip('inc/date');
62                                $auteur['annee'] = $date_naissance[1];
63                                $auteur['mois'] = $date_naissance[2];
64                                $auteur['jour'] = $date_naissance[3];
65                        }
66                }
67                $champs = $auteur;
68        } else {
69            //si on est en mode creation et que l'utilisateur a saisi ses valeurs on les prends en compte
70            foreach($champs as $clef =>$valeurs) {
71            if (_request($valeurs)) {
72                $champs[$valeurs] = trim(_request($valeurs));
73            }
74            if($valeurs == 'naissance'){
75                                include_spip('inc/date');
76                                $champs['annee'] = _request('annee');
77                                $champs['mois'] = _request('mois');
78                                $champs['jour'] = _request('jour');
79            }
80            }
81        }
82
83        //Offrir aux autres plugins la possibilite de charger les donnees
84        $champs = pipeline('i2_charger_formulaire',
85                array(
86                        'args' => '',
87                        'data' => $champs
88                )
89        );
90
91        return $champs;
92}
93
94function formulaires_inscription2_verifier_dist($id_auteur = null,$redirect = null){
95
96        //initialise le tableau des erreurs
97        $erreurs = array();
98
99    //initialise le tableau de valeurs $champs => $valeur
100    $valeurs = array();
101
102        //recupere la liste des champs possible
103        $chercher_champs = charger_fonction('inscription2_champs_formulaire','inc');
104        $champs = $chercher_champs($id_auteur);
105
106        $champs_a_verifier = pipeline('i2_verifications_specifiques',array());
107
108        //gere la correspondance champs -> _request(champs)
109        foreach($champs as $clef => $valeur) {
110
111                // On récupère sa valeur
112                $valeurs[$valeur] = trim(_request($valeur));
113
114                // On vérifie s'il est obligatoire et s'il est bien rempli
115                if ((lire_config('inscription2/'.$valeur.'_obligatoire') == 'on' ) && ((empty($valeurs[$valeur]) OR (strlen(_request($valeur)) == 0)))) {
116                        $erreurs[$valeur] = _T('inscription2:champ_obligatoire');
117                        $erreurs_obligatoires = true;
118                        if($valeur == 'naissance'){
119                                $annee = trim(_request('annee'));
120                                $mois = trim(_request('mois'));
121                                $jour = trim(_request('jour'));
122                                if($annee && $mois && $jour){
123                                        unset($erreurs['naissance']);
124                                }
125                        }
126                        if(is_numeric($id_auteur) && (lire_config('inscription2/pass_fiche_mod') == 'on') && (strlen(_request('pass')) == 0)){
127                                // Si le password est vide et que l'on est dans le cas de la modification d'un auteur
128                                // On garde le pass original
129                                unset($erreurs['pass']);
130                                $pass == 'ok';
131                        }
132                }
133
134                // Sinon on la vérifie une seconde fois si nécessaire avec les fonctions spécifiques de validations
135                if(!$erreurs[$valeur]){
136                        if(array_key_exists($valeur,$champs_a_verifier)){
137                                $fonction_verif_{$valeur} = charger_fonction('inscription2_'.$champs_a_verifier[$valeur],'inc');
138                                if($val = $fonction_verif_{$valeur}($valeurs[$valeur],$id_auteur)){
139                                        $erreurs[$valeur] = $val;
140                                }
141                        }
142                }
143        }
144
145        //Verifier certains champs specifiquement
146
147        //messages d'erreur au cas par cas (PASSWORD)
148        /**
149         * Il se peut que l'on active pas le password à l'inscription
150         * mais uniquement à la modification ...
151         * On le test ici en créant la variable $pass_actif
152         * pass et password1 sont les variables a la creation du compte
153         * password et password1 sont les variables a la modification du compte
154         */ 
155        $pass_actif = false;
156        if(is_numeric($id_auteur) && (lire_config('inscription2/pass_fiche_mod') == 'on')){
157                $pass_actif = true;
158        }else if(!$id_auteur && (lire_config('inscription2/pass') == 'on')){
159                $pass_actif = true;
160        }
161        if(($pass != 'ok') && $pass_actif) {
162                if (strlen(_request('password')) != 0){
163                        $p = _request('password');
164                }
165                else{
166                        $p = _request('pass');
167                }
168                if($p){
169                        if(strlen($p)){
170                                $pass_min = !defined('_PASS_MIN') ? 6 : _PASS_MIN; 
171                                if (strlen($p) < $pass_min) {
172                                        $erreurs['pass'] = _T('info_passe_trop_court');
173                                        $erreurs['message_erreur'] .= _T('info_passe_trop_court')."<br />";
174                                } elseif ($p != _request('password1')) {
175                                        $erreurs['pass'] = _T('info_passes_identiques');
176                                        $erreurs['message_erreur'] .= _T('info_passes_identiques')."<br />";
177                                }
178                        }else{
179                                if(!is_numeric($id_auteur)){
180                                        // (1) Si on est dans la modif d'id_auteur on garde l'ancien pass si rien n'est rentre
181                                        // donc on accepte la valeur vide
182                                        // dans le cas de la création d'un auteur ... le password sera necessaire
183                                        $erreurs['pass'] = _T('inscription2:password_obligatoire');
184                                }
185                        }
186                }
187        }
188
189        //Offrir aux autres plugins la possibilite de verifier les donnees
190        $erreurs = pipeline('i2_verifier_formulaire',
191                array(
192                        'args' => array(
193                            'champs' => $valeurs
194                        ),
195                'data' => $erreurs
196                )
197        );
198
199        //verifier que l'auteur a bien des droits d'edition
200        if (is_numeric($id_auteur)) {
201                if (!autoriser('modifier','auteur',$id_auteur)) {
202                        $erreurs['message_erreur'] .= _T('inscription2:profil_droits_insuffisants');
203                }
204        }
205
206        //message d'erreur generalise
207        if (count($erreurs)) {
208                if(isset($erreurs_obligatoires)){
209                        $erreurs['message_erreur'] .= _T('inscription2:formulaire_remplir_obligatoires');
210                }else{
211                        $erreurs['message_erreur'] .= _T('inscription2:formulaire_remplir_validation');
212                }
213
214        }
215
216    return $erreurs; // si c'est vide, traiter sera appele, sinon le formulaire sera resoumis
217}
218
219function formulaires_inscription2_traiter_dist($id_auteur = NULL,$redirect = null){
220
221        $retour = array();
222        $data = array();
223
224        if((is_numeric($id_auteur) && (lire_config('inscription2/pass_fiche_mod') != 'on'))
225                OR (is_numeric($id_auteur) && (lire_config('inscription2/pass_fiche_mod') == 'on')) && (strlen(_request('password')) == 0)){
226                $mode = 'modification_auteur_simple';
227        }
228        else if((is_numeric($id_auteur) && (lire_config('inscription2/pass_fiche_mod') == 'on')) and (strlen(_request('password')) != 0)){
229                $mode = 'modification_auteur_pass';
230        }
231        else if((lire_config('inscription2/pass') == 'on') && (strlen(_request('pass')))){
232                $mode = 'inscription_pass';
233        }
234        else{
235                $mode = 'inscription';
236        }
237
238        /* Generer la liste des champs a traiter
239        * champ => valeur formulaire
240        */
241        if(!is_numeric($id_auteur)){
242                $new = true;
243        }
244
245        $chercher_champs = charger_fonction('inscription2_champs_formulaire','inc');
246        $champs = $chercher_champs($id_auteur);
247
248        foreach($champs as $clef => $valeur) {
249                $valeurs[$valeur] = trim(_request($valeur));
250                if($valeur == 'naissance'){
251                        include_spip('inc/date');
252                        $annee = trim(_request('annee'));
253                        $mois = _request('mois');
254                        $jour = _request('jour');
255                        $valeurs[$valeur] = format_mysql_date($annee,$mois,$jour);
256                        spip_log("on récupère la valeur du champs naissance : ".$valeurs[$valeur]);
257                }
258        }
259        // Definir le login s'il a besoin de l'etre
260        // NOM et LOGIN sont des champs obligatoires donc a la creation il ne doivent pas etre vide
261        // Apres on s'en fiche s'il n'est pas dans le formulaire
262        if($new){
263                if(!$valeurs['nom']){
264                        if($valeurs['nom_famille']||$valeurs['prenom']){
265                                $valeurs['nom'] = $valeurs['prenom'].' '.$valeurs['nom_famille'];
266                        }
267                        else{
268                                $valeurs['nom'] = strtolower(translitteration(preg_replace('/@.*/', '', $valeurs['email'])));
269                        }
270                }
271                if(!$valeurs['login']){
272                        $definir_login = charger_fonction('inscription2_definir_login','inc');
273                        $valeurs['login'] = $definir_login($valeurs['nom'], $valeurs['email']);
274                }
275        }
276
277        $trouver_table = charger_fonction('trouver_table','base');
278
279        //$valeurs contient donc tous les champs remplit ou non
280        include_spip('inc/inscription2_compat_php4');
281        //definir les champs pour spip_auteurs
282        $table = "spip_auteurs";
283
284        //genere le tableau des valeurs a mettre a jour pour spip_auteurs
285        //toutes les clefs qu'inscription2 peut mettre a jour
286
287        //$clefs = array_fill_keys(array('login','nom','email','bio','nom_site','url_site','pgp'),'');
288        $clefs = $trouver_table('auteurs');
289        $clefs = $clefs['field'];
290
291        //extrait uniquement les donnees qui ont ete proposees a la modification
292        $val = array_intersect_key($valeurs,$clefs);
293
294        //Verification du password
295        if(($mode == 'inscription_pass') || ($mode == 'modification_auteur_pass')){
296                if (strlen(_request('password')) != 0)
297                        $new_pass = _request('password');
298                elseif($mode == 'inscription_pass')
299                        $new_pass = _request('pass'); 
300
301                if (strlen($new_pass)>0) {
302                        include_spip('inc/acces');
303                        $htpass = generer_htpass($new_pass);
304                        $alea_actuel = creer_uniqid();
305                        $alea_futur = creer_uniqid();
306                        $pass = md5($alea_actuel.$new_pass);
307                        $val['pass'] = $pass;
308                        $val['htpass'] = $htpass;
309                        $val['alea_actuel'] = $alea_actuel;
310                        $val['alea_futur'] = $alea_futur;
311                        $val['low_sec'] = '';
312                }
313               
314                if(!is_numeric($id_auteur)){
315                        $val['statut'] = lire_config('inscription2/statut_nouveau','6forum');
316                }
317        }else{
318                if(!is_numeric($id_auteur)){
319                        $val['statut'] = 'aconfirmer';
320                }
321        }
322        $pass_length = strlen($val['pass']);
323        if($pass_length == 0){
324                unset($val['pass']);
325        }
326
327        // affecter $id_auteur avec la session si dispo
328        // présent depuis moins de quelques minutes ou inscrit partiel
329        include_spip("inc/inscription2_session");
330        if($id_inscrit = i2_session_valide()){
331                $id_auteur = $id_inscrit ;
332                $modif_par_session = true ;
333                $data["modif"] = true ;
334        }
335       
336
337        //inserer les donnees dans spip_auteurs -- si $id_auteur : mise a jour - autrement : nouvelle entree
338        if (!$new or $modif_par_session) {
339                $where = 'id_auteur = '.$id_auteur;
340                sql_updateq(
341                        $table,
342                        $val,
343                        $where
344                );
345        } else {
346                $id_auteur = sql_insertq(
347                        $table,
348                        $val
349                );
350        }
351
352        $table = 'spip_auteurs_elargis';
353        //extrait les valeurs propres a spip_auteurs_elargis
354
355        //genere le tableau des valeurs a mettre a jour pour spip_auteurs
356        //toutes les clefs qu'inscription2 peut mettre a jour
357        //s'appuie sur les tables definies par le plugin
358
359        $clefs = $trouver_table('auteurs_elargis');
360        $clefs = $clefs['field'];
361
362        if(is_array($clefs)){
363                //extrait uniquement les donnees qui ont ete proposees a la modification
364                $val = array_intersect_key($valeurs,$clefs);
365        }else{
366                $where = 'id_auteur='.sql_quote($id_auteur);
367                $res = sql_select('*',$table,$where);
368                $clefs = sql_fetch($res);
369                $val = array_intersect_key($valeurs,$clefs);
370        }
371
372        unset($val['login']);
373
374        //recherche la presence d'un complement sur l'auteur
375        $id_elargi = sql_getfetsel('id_auteur','spip_auteurs_elargis','id_auteur='.$id_auteur);
376
377        if ($id_elargi) {
378                $where = 'id_auteur = '.$id_auteur;
379                sql_updateq(
380                        $table,
381                        $val,
382                        $where
383                );
384        } else {
385                // Si on utilise la date de creation de la fiche
386                if(lire_config('inscription2/creation') == 'on'){
387                        $val['creation'] = date("Y-m-d H:i:s",time());
388                }
389                $val['id_auteur'] = $id_auteur;
390                $id = sql_insertq(
391                        $table,
392                        $val
393                );
394        }
395
396        if(isset($_FILES['logo_auteur'])){
397                $chercher_logo = charger_fonction('chercher_logo', 'inc');
398               
399                // supprimer l'ancien logo
400                $on = $chercher_logo($id_auteur, 'id_auteur', 'on');
401                if ($on) @unlink($on[0]);
402
403                // ajouter le nouveau
404                include_spip('action/iconifier');
405                action_spip_image_ajouter_dist(
406                        type_du_logo('id_auteur').'on'.$id_auteur, false, false
407                ); // beurk
408                // indiquer qu'on doit recalculer les images
409                $GLOBALS['var_images'] = true;
410        }
411
412        $traiter_plugin = pipeline('i2_traiter_formulaire',
413                array(
414                        'args' => array(
415                                'id_auteur' => $id_auteur,
416                                'champs' => $valeurs
417                        ),
418                'data' => $data
419                )
420        );
421
422    if (!$new){
423        $message = _T('inscription2:profil_modifie_ok');
424        if($mode == 'modification_auteur_simple'){
425                $message .= '<br />'._T('inscription2:mot_passe_reste_identique');
426        }
427        $editable = true;
428    } else {
429                if(!$traiter_plugin['ne_pas_confirmer_par_mail']){
430                        $envoyer_inscription = charger_fonction('envoyer_inscription2','inc');
431                        $envoyer_inscription($id_auteur,$mode);
432                        $message = _T('inscription2:formulaire_inscription_ok');
433                }
434                if($traiter_plugin['message_ok'])
435                        $message = $traiter_plugin['message_ok'];
436                        $editable = false;
437    }
438
439        // Invalider les caches
440        include_spip('inc/invalideur');
441    suivre_invalideur("id='id_auteur/$id_auteur'");
442       
443        $retour['editable'] = $editable;
444        $retour['message_ok'] = $message;
445
446        if($redirect){
447                $retour['redirect'] = $redirect;
448        }
449
450    return $retour;
451}
452?>
Note: See TracBrowser for help on using the repository browser.