From cb606f1d279b8911118c90be31c5f291675becd9 Mon Sep 17 00:00:00 2001 From: Pierre Date: Tue, 4 Feb 2020 01:03:20 +0100 Subject: [PATCH] =?UTF-8?q?Finalisation=20de=20la=20page=20"G=C3=A9rer=20m?= =?UTF-8?q?embres"=20et=20simplification/adaptation=20du=20formulaire=20d'?= =?UTF-8?q?=C3=A9dition=20des=20membres?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contacter_auteur.html | 4 +- content/gerer_auteurs.html | 57 ++- .../editer_auteur.html => editer_auteur.html | 14 +- formulaires/editer_membre.html | 41 ++ formulaires/editer_membre.php | 465 ++++++++++++++++++ formulaires/inc-instituer_auteur.html | 6 + 6 files changed, 564 insertions(+), 23 deletions(-) rename content/editer_auteur.html => editer_auteur.html (57%) create mode 100644 formulaires/editer_membre.html create mode 100644 formulaires/editer_membre.php create mode 100644 formulaires/inc-instituer_auteur.html diff --git a/contacter_auteur.html b/contacter_auteur.html index 86e5a17..56c6305 100644 --- a/contacter_auteur.html +++ b/contacter_auteur.html @@ -1,7 +1,7 @@ - +

Contacter #NOM

[
Téléphone : (#TELEPHONE) [ou (#TELEPHONE2)]
] #FORMULAIRE_ECRIRE_AUTEUR - +
\ No newline at end of file diff --git a/content/gerer_auteurs.html b/content/gerer_auteurs.html index aa1cfc2..c067014 100644 --- a/content/gerer_auteurs.html +++ b/content/gerer_auteurs.html @@ -4,21 +4,52 @@ Créer un nouveau membre - - + + + + + + + + + + + + + + + - - + + + + + + + + + + +
NomStatutAnimateurEmailTéléphoneTéléphone 2Actions
#NOM + [(#STATUT|=={0minirezo}|oui) Administrateur] + [(#STATUT|=={1comite}|oui) Rédacteur] + [(#STATUT|=={6forum}|oui) Membre] + + + [(#SURTITRE|unique)] + + #EMAIL#TELEPHONE#TELEPHONE2 + + + + + + +
+
Vous n'êtes pas autorisé à gérer les membres de l'association.
+
- [(#SESSION{statut}|=={0minirezo}|oui) - [(#ENV{id_auteur}|?{ + [(#ENV{id_auteur}|oui)

Éditer un membre

- [(#FORMULAIRE_EDITER_MEMBRE{#ENV{id_auteur}})]
+ [(#FORMULAIRE_EDITER_MEMBRE{#ENV{id_auteur},#URL_PAGE{gerer_auteurs}})]
- , + ] + [(#ENV{id_auteur}|non)

Enregistrer un nouveau membre

- [(#FORMULAIRE_EDITER_MEMBRE)]
+ [(#FORMULAIRE_EDITER_MEMBRE{0,#URL_PAGE{gerer_auteurs}})]
- })] - ] [(#SESSION{statut}|=={0minirezo}|non) diff --git a/formulaires/editer_membre.html b/formulaires/editer_membre.html new file mode 100644 index 0000000..4e4535f --- /dev/null +++ b/formulaires/editer_membre.html @@ -0,0 +1,41 @@ +
+ [

(#ENV**{message_ok})

] + [

(#ENV*{message_erreur}) <:info_recommencer:>

] +
+ [(#REM) declarer les hidden qui declencheront le service du formulaire + parametre : url d'action ] + #ACTION_FORMULAIRE{#ENV{action}} + + [] + +
+
+
+ [ + (#ENV**{erreurs}|table_valeur{nom}) + ] +
+ [(#REM) + Modification de l'email + ou message disant que seuls les admins peuvent le modifier + ] +
+ [][ + (#ENV**{erreurs}|table_valeur{email}) + ] +
+
+
+ + [(#REM) + Statut + ] + [(#AUTORISER{modifier,auteur,#ID_AUTEUR,'',#ARRAY{statut,'?'}}|oui) +
+ #INCLURE{fond=formulaires/inc-instituer_auteur,statut=#ENV**{statut,6forum},id_auteur,webmestre} +
] + + +

+ +
diff --git a/formulaires/editer_membre.php b/formulaires/editer_membre.php new file mode 100644 index 0000000..647ecc7 --- /dev/null +++ b/formulaires/editer_membre.php @@ -0,0 +1,465 @@ + true))); + $config['edit_pass'] = + (auth_autoriser_modifier_pass($auth_methode) + and autoriser('modifier', 'auteur', $row['id_auteur'])); + + return $config; +} + +/** + * Vérifications du formulaire d'édition d'un auteur + * + * Vérifie en plus des vérifications prévues : + * - qu'un rédacteur ne peut pas supprimer son adresse mail, + * - que le mot de passe choisi n'est pas trop court et identique à sa + * deuxième saisie + * + * @see formulaires_editer_objet_verifier() + * + * @param int|string $id_auteur + * Identifiant de l'auteur. 'new' pour une nouvel auteur. + * @param string $retour + * URL de redirection après le traitement + * @param string $associer_objet + * Éventuel 'objet|x' indiquant de lier le mot créé à cet objet, + * tel que 'article|3' + * @param string $config_fonc + * Nom de la fonction ajoutant des configurations particulières au formulaire + * @param array $row + * Valeurs de la ligne SQL de l'auteur, si connu + * @param string $hidden + * Contenu HTML ajouté en même temps que les champs cachés du formulaire. + * @return array + * Erreurs des saisies + **/ +function formulaires_editer_membre_verifier_dist( + $id_auteur = 'new', + $retour = '', + $associer_objet = '', + $config_fonc = 'auteurs_edit_config', + $row = array(), + $hidden = '' +) { + // auto-renseigner le nom si il n'existe pas, sans couper + titre_automatique('nom', array('email', 'login'), 255); + + $oblis = array('nom'); + // si on veut renvoyer des identifiants il faut un email et un login + if (_request('reset_password')) { + $oblis[] = 'email'; + $oblis[] = 'new_login'; + } + // mais il reste obligatoire si on a rien trouve + $erreurs = formulaires_editer_objet_verifier('auteur', $id_auteur, $oblis); + if (isset($erreurs['new_login'])) { + $erreurs['login'] = $erreurs['new_login']; + unset($erreurs['new_login']); + } + + $auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)); + $auth_methode = ($auth_methode ? $auth_methode : 'spip'); + include_spip('inc/auth'); + + if (!nom_acceptable(_request('nom'))) { + $erreurs['nom'] = _T('info_nom_pas_conforme'); + } + + if ($email = _request('email')) { + include_spip('inc/filtres'); + include_spip('inc/autoriser'); + // un redacteur qui modifie son email n'a pas le droit de le vider si il y en avait un + if (!autoriser('modifier', 'auteur', $id_auteur, null, array('email' => '?')) + and $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur + and !strlen(trim($email)) + and $email != ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur))) + ) { + $erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email')); + } else { + if (!email_valide($email)) { + $erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email')); + } + } + # Ne pas autoriser d'avoir deux auteurs avec le même email + + #Nouvel auteur + if (intval($id_auteur) == 0) { + #Un auteur existe deja avec cette adresse ? + if (sql_countsel('spip_auteurs', 'email=' . sql_quote($email)) > 0) { + $erreurs['email'] = _T('erreur_email_deja_existant'); + } + } else { + #Un auteur existe deja avec cette adresse ? et n'est pas le user courant. + if ((sql_countsel( + 'spip_auteurs', + 'email=' . sql_quote($email) + ) > 0) and ($id_auteur != ($id_auteur_ancien = sql_getfetsel( + 'id_auteur', + 'spip_auteurs', + 'email=' . sql_quote($email) + )))) { + $erreurs['email'] = _T('erreur_email_deja_existant'); + } + } + } + + // quand c'est un auteur existant on fait le reset password ici + if (!count($erreurs) and _request('reset_password') and intval($id_auteur)) { + $erreurs = auteur_reset_password($id_auteur, $erreurs); + return $erreurs; + } + + // corriger un cas si frequent : www.example.org sans le http:// qui precede + if ($url = _request('url_site') and !tester_url_absolue($url)) { + if (strpos($url, ':') === false and strncasecmp($url, 'www.', 4) === 0) { + $url = 'http://' . $url; + set_request('url_site', $url); + } + } + // traiter les liens implicites avant de tester l'url + include_spip('inc/lien'); + if ($url = calculer_url(_request('url_site')) and !tester_url_absolue($url)) { + $erreurs['url_site'] = _T('info_url_site_pas_conforme'); + } + + $erreurs['message_erreur'] = ''; + + if ($err = auth_verifier_login($auth_methode, _request('new_login'), $id_auteur)) { + $erreurs['new_login'] = $err; + $erreurs['message_erreur'] .= $err; + } else { + // pass trop court ou confirmation non identique + if ($p = _request('new_pass')) { + if ($p != _request('new_pass2')) { + $erreurs['new_pass'] = _T('info_passes_identiques'); + $erreurs['message_erreur'] .= _T('info_passes_identiques'); + } elseif ($err = auth_verifier_pass($auth_methode, _request('new_login'), $p, $id_auteur)) { + $erreurs['new_pass'] = $err; + $erreurs['message_erreur'] .= $err; + } + } + } + + if (!$erreurs['message_erreur']) { + unset($erreurs['message_erreur']); + } + + return $erreurs; +} + + +/** + * Traitements du formulaire d'édition d'un auteur + * + * En plus de l'enregistrement normal des infos de l'auteur, la fonction + * traite ces cas spécifiques : + * + * - Envoie lorsqu'un rédacteur n'a pas forcément l'autorisation changer + * seul son adresse email, un email à la nouvelle adresse indiquée + * pour vérifier l'email saisi, avec un lien dans le mai sur l'action + * 'confirmer_email' qui acceptera alors le nouvel email. + * + * - Crée aussi une éventuelle laision indiquée dans $associer_objet avec + * cet auteur. + * + * @see formulaires_editer_objet_traiter() + * + * @param int|string $id_auteur + * Identifiant de l'auteur. 'new' pour une nouvel auteur. + * @param string $retour + * URL de redirection après le traitement + * @param string $associer_objet + * Éventuel 'objet|x' indiquant de lier le mot créé à cet objet, + * tel que 'article|3' + * @param string $config_fonc + * Nom de la fonction ajoutant des configurations particulières au formulaire + * @param array $row + * Valeurs de la ligne SQL de l'auteur, si connu + * @param string $hidden + * Contenu HTML ajouté en même temps que les champs cachés du formulaire. + * @return array + * Retour des traitements + **/ +function formulaires_editer_membre_traiter_dist( + $id_auteur = 'new', + $retour = '', + $associer_objet = '', + $config_fonc = 'auteurs_edit_config', + $row = array(), + $hidden = '' +) { + + + if (_request('saisie_webmestre') or _request('webmestre')) { + set_request('webmestre', _request('webmestre') ? _request('webmestre') : 'non'); + } + $retour = parametre_url($retour, 'email_confirm', ''); + + set_request( + 'email', + email_valide(_request('email')) + ); // eviter d'enregistrer les cas qui sont acceptés par email_valide dans le verifier : + // "Marie@toto.com " ou encore "Marie Toto " + + include_spip('inc/autoriser'); + if (!autoriser('modifier', 'auteur', $id_auteur, null, array('email' => '?'))) { + $email_nouveau = _request('email'); + set_request('email'); // vider la saisie car l'auteur n'a pas le droit de modifier cet email + // mais si c'est son propre profil on lui envoie un email à l'adresse qu'il a indique + // pour qu'il confirme qu'il possede bien cette adresse + // son clic sur l'url du message permettre de confirmer le changement + // et de revenir sur son profil + if ($GLOBALS['visiteur_session']['id_auteur'] == $id_auteur + and $email_nouveau != + ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur))) + ) { + $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); + $texte = _T( + 'form_auteur_mail_confirmation', + array( + 'url' => generer_action_auteur( + 'confirmer_email', + $email_nouveau, + parametre_url($retour, 'email_modif', 'ok') + ) + ) + ); + $envoyer_mail($email_nouveau, _T('form_auteur_confirmation'), $texte); + set_request('email_confirm', $email_nouveau); + if ($email_ancien) { + $envoyer_mail($email_ancien, _T('form_auteur_confirmation'), + _T('form_auteur_envoi_mail_confirmation', array('email' => $email_nouveau))); + } + $retour = parametre_url($retour, 'email_confirm', $email_nouveau); + } + } + + $res = formulaires_editer_objet_traiter('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden); + + if (_request('reset_password') and !intval($id_auteur) and intval($res['id_auteur'])) { + $erreurs = array(); + $erreurs = auteur_reset_password($res['id_auteur'], $erreurs); + if (isset($erreurs['message_ok'])) { + if (!isset($res['message_ok'])) $res['message_ok'] = ''; + $res['message_ok'] = trim($res['message_ok'] . ' ' . $erreurs['message_ok']); + } + if (isset($erreurs['message_erreur']) and $erreurs['message_erreur']) { + if (!isset($res['message_erreur'])) $res['message_erreur'] = ''; + $res['message_erreur'] = trim($res['message_erreur'] . ' ' . $erreurs['message_erreur']); + } + } + + // Un lien auteur a prendre en compte ? + if ($associer_objet and $id_auteur = $res['id_auteur']) { + $objet = ''; + if (intval($associer_objet)) { + $objet = 'article'; + $id_objet = intval($associer_objet); + } elseif (preg_match(',^\w+\|[0-9]+$,', $associer_objet)) { + list($objet, $id_objet) = explode('|', $associer_objet); + } + if ($objet and $id_objet and autoriser('modifier', $objet, $id_objet)) { + include_spip('action/editer_auteur'); + auteur_associer($id_auteur, array($objet => $id_objet)); + + // Pas de redirection + if (isset($res['redirect'])) { + $res['redirect'] = parametre_url($res['redirect'], 'id_lien_ajoute', $id_auteur, '&'); + } + } + } + + include_spip('inc/invalideur'); + suivre_invalideur("id='id_auteur/1'"); + + return $res; +} + + +function auteur_reset_password($id_auteur, $erreurs = array()) { + $auteur = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)); + $config = auteurs_edit_config($auteur); + + if ($config['edit_pass']) { + if ($email = auteur_regenerer_identifiants($id_auteur)) { + $erreurs['message_ok'] = _T('message_nouveaux_identifiants_ok', array('email' => $email)); + $erreurs['message_erreur'] = ''; + } elseif ($email === false) { + $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec_envoi'); + } else { + $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec'); + } + } else { + $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec'); + } + + return $erreurs; +} + +/** + * Renvoyer des identifiants + * @param int $id_auteur + * @param bool $notifier + * @param array $contexte + * @return string + */ +function auteur_regenerer_identifiants($id_auteur, $notifier=true, $contexte = array()) { + if ($id_auteur){ + $set = array(); + include_spip('inc/access'); + $set['pass'] = creer_pass_aleatoire(); + + include_spip('action/editer_auteur'); + auteur_modifier($id_auteur,$set); + + $row = sql_fetsel('*','spip_auteurs','id_auteur='.intval($id_auteur)); + include_spip('inc/filtres'); + if ($notifier + and $row['email'] + and email_valide($row['email']) + and trouver_fond($fond = 'modeles/mail_nouveaux_identifiants')){ + // envoyer l'email avec login/pass + $c = array( + 'id_auteur' => $id_auteur, + 'nom' => $row['nom'], + 'mode' => $row['statut'], + 'email' => $row['email'], + 'pass' => $set['pass'], + ); + // on merge avec les champs fournit en appel, qui sont passes au modele de notification donc + $contexte = array_merge($contexte, $c); + // si pas de langue explicitement demandee, prendre celle de l'auteur si on la connait, ou a defaut celle du site + // plutot que celle de l'admin qui vient de cliquer sur le bouton + if (!isset($contexte['lang']) or !$contexte['lang']) { + if (isset($row['lang']) and $row['lang']) { + $contexte['lang'] = $row['lang']; + } + else { + $contexte['lang'] = $GLOBALS['meta']['langue_site']; + } + } + lang_select($contexte['lang']); + $message = recuperer_fond($fond, $contexte); + include_spip("inc/notifications"); + notifications_envoyer_mails($row['email'],$message); + lang_select(); + + return $row['email']; + } + + return false; + + } + + return ''; +} diff --git a/formulaires/inc-instituer_auteur.html b/formulaires/inc-instituer_auteur.html new file mode 100644 index 0000000..9c8c9ea --- /dev/null +++ b/formulaires/inc-instituer_auteur.html @@ -0,0 +1,6 @@ + + \ No newline at end of file