diff --git a/.gitattributes b/.gitattributes index 843ceabca1c78ea01e7265f7cbe839ccd2c32dca..a02f7b9c073ab49733ba1da977cad74f8d1299e3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1129,6 +1129,14 @@ prive/vignettes/zip.png -text /rien.gif -text /spip.php -text squelettes-dist/favicon.ico.html -text +squelettes-dist/formulaires/ecrire_auteur.php -text +squelettes-dist/formulaires/inscription.php -text +squelettes-dist/formulaires/mot_de_passe.html -text +squelettes-dist/formulaires/mot_de_passe.php -text +squelettes-dist/formulaires/oubli.php -text +squelettes-dist/formulaires/recherche.php -text +squelettes-dist/formulaires/signature.php -text +squelettes-dist/formulaires/site.php -text squelettes-dist/identifiants.html -text squelettes-dist/robots.txt.html -text squelettes-dist/sitemap.xml.html -text diff --git a/squelettes-dist/formulaires/administration.html b/squelettes-dist/formulaires/administration.html new file mode 100644 index 0000000000000000000000000000000000000000..ef56fb6923b03b4207394342b9f1922035445121 --- /dev/null +++ b/squelettes-dist/formulaires/administration.html @@ -0,0 +1,31 @@ + <div[ class="(#ENV{divclass,spip-admin-bloc})"] id='spip-admin' dir="#LANG_DIR">[ + <a href="(#ENV{analyser})" class="spip-admin-boutons" + id="analyser"><:analyse_xml:>[ ((#ENV{xhtml_error}))]</a>] + [<a href="[(#ENV{voir_article})]" class="spip-admin-boutons" + id="voir_article"><:article:> + ((#ENV{id_article}))</a>] + [<a href="[(#ENV{voir_breve})]" class="spip-admin-boutons" + id="voir_breve"><:breve:> + ((#ENV{id_breve}))</a>] + [<a href="[(#ENV{voir_rubrique})]" class="spip-admin-boutons" + id="voir_rubrique"><:rubrique:> + ((#ENV{id_rubrique}))</a>] + [<a href="[(#ENV{voir_mot})]" class="spip-admin-boutons" + id="voir_mot"><:mots_clef:> + ((#ENV{id_mot}))</a>] + [(#ENV{id_syndic}|oui)[(#AUTORISER{modifier,site,#ENV{id_syndic}}|oui) + <a href="[(#ENV{voir_site})]" class="spip-admin-boutons" + id="voir_site"><:info_site:> + [((#ENV{id_syndic}))]</a>]] + [<a href="[(#ENV{voir_auteur})]" class="spip-admin-boutons" + id="voir_auteur"><:auteur:> + ((#ENV{id_auteur}))</a>]<!--extra-->[ + <a href="(#ENV{ecrire})" class="spip-admin-boutons" + id="ecrire"><:espace_prive:></a>] + <a href="[(#SELF|parametre_url{var_mode,#ENV{calcul}})]" class="spip-admin-boutons" + id="var_mode"><:admin_recalculer:>[(#ENV{use_cache})]</a>[ + <a href="(#ENV{preview})" class="spip-admin-boutons" + id="preview"><:previsualisation:></a>][ + <a href="(#ENV{debug})" class="spip-admin-boutons" + id="debug"><:admin_debug:></a>] +</div> diff --git a/squelettes-dist/formulaires/ecrire_auteur.html b/squelettes-dist/formulaires/ecrire_auteur.html new file mode 100644 index 0000000000000000000000000000000000000000..027262de928edcb9fd91a02e9e816476cc7d1e53 --- /dev/null +++ b/squelettes-dist/formulaires/ecrire_auteur.html @@ -0,0 +1,49 @@ +<div class="formulaire_spip formulaire_ecrire_auteur ajax" id="formulaire_ecrire_auteur#ENV{id}"> +<br class='bugajaxie' /> +[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] +[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] +[(#ENV{editable}) +<form method='post' action='#ENV{action}#formulaire_ecrire_auteur#ENV{id}' enctype='multipart/form-data'> + [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] + #ACTION_FORMULAIRE{#ENV{action}} + [(#REM) Previsualisation... ] + [(#ENV*{erreurs}|table_valeur{previsu}|oui) + <fieldset class="previsu"> + <legend><:previsualisation:></legend> + <ul> + <li><strong>#ENV{sujet_message_auteur}</strong> - <em>#ENV{email_message_auteur}</em></li> + <li>[(#ENV{texte_message_auteur}|nl2br)]</li> + </ul> + <p class="boutons"><input type="submit" class="submit" name="confirmer" value="<:form_prop_confirmer_envoi:>" /></p> + </fieldset> + ] + [(#REM) Sinon, formulaire normal ] + <fieldset> + <legend><:envoyer_message:></legend> + <ul> + <li class='saisie_email_message_auteur obligatoire[ (#ENV*{erreurs}|table_valeur{email_message_auteur}|oui)erreur]'> + <label for="email_message_auteur#ENV{id}"><:form_pet_votre_email:></label> + [<span class="erreur_message">(#ENV*{erreurs}|table_valeur{email_message_auteur})</span>] + <input type="text" class="text" name="email_message_auteur" id="email_message_auteur#ENV{id}" value="#ENV{email_message_auteur}" size="30" /> + </li> + <li class='saisie_sujet_message_auteur obligatoire[ (#ENV*{erreurs}|table_valeur{sujet_message_auteur}|oui)erreur]'> + <label for="sujet_message_auteur#ENV{id}"><:form_prop_sujet:></label> + [<span class="erreur_message">(#ENV*{erreurs}|table_valeur{sujet_message_auteur})</span>] + <input type="text" class="text" name="sujet_message_auteur" id="sujet_message_auteur#ENV{id}" value="#ENV{sujet_message_auteur}" size="30" /> + </li> + <li class='saisie_texte_message_auteur obligatoire[ (#ENV*{erreurs}|table_valeur{texte_message_auteur}|oui)erreur]'> + <label for="texte_message_auteur#ENV{id}"><:info_texte_message:></label> + [<span class="erreur_message">(#ENV*{erreurs}|table_valeur{texte_message_auteur})</span>] + <textarea name="texte_message_auteur" id="texte_message_auteur#ENV{id}" rows="8" cols="60">#ENV{texte_message_auteur}</textarea> + </li> + </ul> + </fieldset> + [(#REM) Piege a robots spammeurs ] + <p style="display: none;"> + <label for="nobot"><:antispam_champ_vide:></label> + <input type="text" class="text" name="nobot" id="nobot" value="#ENV{nobot}" size="10" /> + </p> + <p class="boutons"><input type="submit" class="submit" name="valide" value="<:form_prop_envoyer:>" /></p> +</form> +] +</div> diff --git a/squelettes-dist/formulaires/ecrire_auteur.php b/squelettes-dist/formulaires/ecrire_auteur.php new file mode 100644 index 0000000000000000000000000000000000000000..201bccf1dc9fb733fb002b91a30de993528c1edd --- /dev/null +++ b/squelettes-dist/formulaires/ecrire_auteur.php @@ -0,0 +1,78 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2010 * + * 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. * +\***************************************************************************/ + + +function formulaires_ecrire_auteur_charger_dist($id_auteur, $id_article, $mail){ + include_spip('inc/texte'); + $puce = definir_puce(); + $valeurs = array( + 'sujet_message_auteur'=>'', + 'texte_message_auteur'=>'', + 'email_message_auteur'=>$GLOBALS['visiteur_session']['email'] + ); + + // id du formulaire (pour en avoir plusieurs sur une meme page) + $valeurs['id'] = ($id_auteur ? '_'.$id_auteur : '_ar'.$id_article); + // passer l'id_auteur au squelette + $valeurs['id_auteur'] = $id_auteur; + $valeurs['id_article'] = $id_article; + + return $valeurs; +} + +function formulaires_ecrire_auteur_verifier_dist($id_auteur, $id_article, $mail){ + $erreurs = array(); + include_spip('inc/filtres'); + + if (!$adres = _request('email_message_auteur')) + $erreurs['email_message_auteur'] = _T("info_obligatoire"); + elseif(!email_valide($adres)) + $erreurs['email_message_auteur'] = _T('form_prop_indiquer_email'); + else { + include_spip('inc/session'); + session_set('email', $adres); + } + + if (!$sujet=_request('sujet_message_auteur')) + $erreurs['sujet_message_auteur'] = _T("info_obligatoire"); + elseif(!(strlen($sujet)>3)) + $erreurs['sujet_message_auteur'] = _T('forum_attention_trois_caracteres'); + + if (!$texte=_request('texte_message_auteur')) + $erreurs['texte_message_auteur'] = _T("info_obligatoire"); + elseif(!(strlen($texte)>10)) + $erreurs['texte_message_auteur'] = _T('forum_attention_dix_caracteres'); + + if (!_request('confirmer') AND !count($erreurs)) + $erreurs['previsu']=' '; + return $erreurs; +} + +function formulaires_ecrire_auteur_traiter_dist($id_auteur, $id_article, $mail){ + + $adres = _request('email_message_auteur'); + $sujet=_request('sujet_message_auteur'); + $texte=_request('texte_message_auteur'); + + $texte .= "\n\n-- "._T('envoi_via_le_site')." ".supprimer_tags(extraire_multi($GLOBALS['meta']['nom_site']))." (".$GLOBALS['meta']['adresse_site']."/) --\n"; + $envoyer_mail = charger_fonction('envoyer_mail','inc'); + + if ($envoyer_mail($mail, $sujet, $texte, $adres, + "X-Originating-IP: ".$GLOBALS['ip'])) + $message = _T('form_prop_message_envoye'); + else + $message = _T('pass_erreur_probleme_technique'); + + return array('message_ok'=>$message); +} + +?> diff --git a/squelettes-dist/formulaires/inscription.html b/squelettes-dist/formulaires/inscription.html new file mode 100644 index 0000000000000000000000000000000000000000..ede845fa7536d96d24e30ba74868252f5039cbfa --- /dev/null +++ b/squelettes-dist/formulaires/inscription.html @@ -0,0 +1,49 @@ +<div class="formulaire_spip formulaire_inscription ajax" id="formulaire_inscription"> +[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] +[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] +[(#ENV{editable}) +<form method="post" action="#ENV{action}"> + #ACTION_FORMULAIRE{#ENV{action}} + <fieldset> + [(#REM) on affiche plus ce message en cas d'erreur pour eviter d'allonger trop le formulaire] + [(#ENV*{message_erreur}|non) + [<legend><:pass_vousinscrire:></legend> + <p class='explication'>(#ENV*{_commentaire})</p>] + ]<legend><:form_forum_identifiants:></legend> + <p class='explication'><:form_forum_indiquer_nom_email:></p> + <ul> + <li class='saisie_nom_inscription obligatoire[ (#ENV*{erreurs}|table_valeur{nom_inscription}|oui)erreur]'> + <label for="nom_inscription"><:form_pet_votre_nom:></label> + [<span class="erreur_message">(#ENV*{erreurs}|table_valeur{nom_inscription})</span>] + <input type="text" class="text" name="nom_inscription" id="nom_inscription" value="#ENV{nom_inscription}" size="30" /> + </li> + <li class='saisie_mail_inscription obligatoire[ (#ENV*{erreurs}|table_valeur{mail_inscription}|oui)erreur]'> + <label for="mail_inscription"><:form_pet_votre_email:></label> + [<span class="erreur_message">(#ENV*{erreurs}|table_valeur{mail_inscription})</span>] + <input type="text" class="text" name="mail_inscription" id="mail_inscription" value="#ENV{mail_inscription}" size="30" /> + </li> + </ul> + </fieldset> + [(#REM) Piege a robots spammeurs ] + <p style="display: none;"> + <label for="nobot"><:antispam_champ_vide:></label> + <input type="text" class="text" name="nobot" id="nobot" value="#ENV{nobot}" size="10" /> + </p> + <p class="boutons"><input type="submit" class="submit" value="<:bouton_valider:>" /></p> + </form> +[<script type="text/javascript"><!-- +document.getElementById('(#ENV{focus})').focus(); +--></script>] +] +</div> +[(#ENV{focus,''}|?{' '}) +<div style="text-align: #LANG_RIGHT;"> +<script type="text/javascript">/*<!#EVAL{chr(91)}CDATA#EVAL{chr(91)}*/ +document.write("<a style='color: #e86519' href='") +document.write((window.opener) ? "javascript:close()" : "./") +document.write("'><:pass_quitter_fenetre:><" + "/a>"); +/*#EVAL{chr(93)}[(#EVAL{chr(93)})]>*/</script> +<noscript> + [<a href='./'><:pass_retour_public:></a>] +</noscript> +</div>] \ No newline at end of file diff --git a/squelettes-dist/formulaires/inscription.php b/squelettes-dist/formulaires/inscription.php new file mode 100644 index 0000000000000000000000000000000000000000..fbcdaad5f0ec736c47e972053c05533aa21fc056 --- /dev/null +++ b/squelettes-dist/formulaires/inscription.php @@ -0,0 +1,228 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2010 * + * 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; + +function formulaires_inscription_charger_dist($mode, $focus, $id=0) { + $valeurs = array('nom_inscription'=>'','mail_inscription'=>'', 'id'=>$id); + if ($mode=='1comite') + $valeurs['_commentaire'] = _T('pass_espace_prive_bla'); + else + $valeurs['_commentaire'] = _T('pass_forum_bla'); + + if (!tester_config($id, $mode)) + $valeurs['editable'] = false; + + return $valeurs; +} + +// Si inscriptions pas autorisees, retourner une chaine d'avertissement +function formulaires_inscription_verifier_dist($mode, $focus, $id=0) { + + $erreurs = array(); + include_spip('inc/filtres'); + if (!tester_config($id, $mode) OR (strlen(_request('nobot'))>0)) + $erreurs['message_erreur'] = _T('rien_a_faire_ici'); + + if (!$nom = _request('nom_inscription')) + $erreurs['nom_inscription'] = _T("info_obligatoire"); + if (!$mail = _request('mail_inscription')) + $erreurs['mail_inscription'] = _T("info_obligatoire"); + + // compatibilite avec anciennes fonction surchargeables + // plus de definition par defaut + if (!count($erreurs)){ + if (function_exists('test_inscription')) + $f = 'test_inscription'; + else + $f = 'test_inscription_dist'; + $declaration = $f($mode, $mail, $nom, $id); + if (is_string($declaration)) { + $k = (strpos($declaration, 'mail') !== false) ? + 'mail_inscription' : 'nom_inscription'; + $erreurs[$k] = _T($declaration); + } else { + include_spip('base/abstract_sql'); + + if ($row = sql_fetsel("statut, id_auteur, login, email", "spip_auteurs", "email=" . sql_quote($declaration['email']))){ + if (($row['statut'] == '5poubelle') AND !$declaration['pass']) + // irrecuperable + $erreurs['message_erreur'] = _T('form_forum_access_refuse'); + else if (($row['statut'] != 'nouveau') AND !$declaration['pass']) + // deja inscrit + $erreurs['message_erreur'] = _T('form_forum_email_deja_enregistre'); + spip_log($row['id_auteur'] . " veut se resinscrire"); + } + } + } + return $erreurs; +} + +function formulaires_inscription_traiter_dist($mode, $focus, $id=0) { + + $nom = _request('nom_inscription'); + $mail_complet = _request('mail_inscription'); + + if (function_exists('test_inscription')) + $f = 'test_inscription'; + else $f = 'test_inscription_dist'; + $desc = $f($mode, $mail_complet, $nom, $id); + + if (!is_array($desc)) { + $desc = _T($desc); + } else { + include_spip('base/abstract_sql'); + $res = sql_select("statut, id_auteur, login, email", "spip_auteurs", "email=" . sql_quote($desc['email'])); + if (!$res) + $desc = _T('titre_probleme_technique'); + else { + $row = sql_fetch($res); + // s'il n'existe pas deja, creer les identifiants + $desc = $row ? $row : inscription_nouveau($desc); + } + } + + if (is_array($desc)) { + // generer le mot de passe (ou le refaire si compte inutilise) + $desc['pass'] = creer_pass_pour_auteur($desc['id_auteur']); + // charger de suite cette fonction, pour ses utilitaires + $envoyer_mail = charger_fonction('envoyer_mail','inc'); + if (function_exists('envoyer_inscription')) + $f = 'envoyer_inscription'; + else $f = 'envoyer_inscription_dist'; + list($sujet,$msg,$from,$head) = $f($desc, $nom, $mode, $id); + if (!$envoyer_mail($mail_complet, $sujet, $msg, $from, $head)) + $desc = _T('form_forum_probleme_mail'); + // Notifications + if ($notifications = charger_fonction('notifications', 'inc')) { + $notifications('inscription', $desc['id_auteur'], + array('nom' => $desc['nom'], 'email' => $desc['email']) + ); + } + } + + return array('message_ok'=>is_string($desc) ? $desc : _T('form_forum_identifiant_mail')); +} + +// 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 +function test_inscription_dist($mode, $mail, $nom, $id=0) { + + include_spip('inc/filtres'); + $nom = trim(corriger_caracteres($nom)); + if((strlen ($nom) < _LOGIN_TROP_COURT) OR (strlen($nom) > 64)) + return 'ecrire:info_login_trop_court'; + if (!$r = email_valide($mail)) return 'info_email_invalide'; + return array('email' => $r, 'nom' => $nom, 'bio' => $mode); +} + +// On enregistre le demandeur comme 'nouveau', en memorisant le statut final +// provisoirement dans le champ Bio, afin de ne pas visualiser les inactifs +// A sa premiere connexion il obtiendra son statut final. + +// http://doc.spip.org/@inscription_nouveau +function inscription_nouveau($desc) +{ + if (!isset($desc['login'])) + $desc['login'] = test_login($desc['nom'], $desc['email']); + + $desc['statut'] = 'nouveau'; + include_spip('action/editer_auteur'); + $id_auteur = insert_auteur(); + + if (!$id_auteur) return _T('titre_probleme_technique'); + + include_spip('inc/modifier'); + revision_auteur($id_auteur, $desc); + + instituer_auteur($id_auteur, $desc); + + $desc['id_auteur'] = $id_auteur; + + return $desc; +} + +// 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 +function envoyer_inscription_dist($desc, $nom, $mode, $id) { + + $nom_site_spip = nettoyer_titre_email($GLOBALS['meta']["nom_site"]); + $adresse_site = $GLOBALS['meta']["adresse_site"]; + if ($mode == '6forum') { + $adresse_login = generer_url_public('login'); + $msg = 'form_forum_voici1'; + } else { + $adresse_login = $adresse_site .'/'. _DIR_RESTREINT_ABS; + $msg = 'form_forum_voici2'; + } + + $msg = _T('form_forum_message_auto')."\n\n" + . _T('form_forum_bonjour', array('nom'=>$nom))."\n\n" + . _T($msg, array('nom_site_spip' => $nom_site_spip, + 'adresse_site' => $adresse_site . '/', + 'adresse_login' => $adresse_login)) . "\n\n- " + . _T('form_forum_login')." " . $desc['login'] . "\n- " + . _T('form_forum_pass'). " " . $desc['pass'] . "\n\n"; + + return array("[$nom_site_spip] "._T('form_forum_identifiants'), $msg); +} + +// http://doc.spip.org/@test_login +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]/", "_", $nom); + } + 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; + } +} + +// http://doc.spip.org/@creer_pass_pour_auteur +function creer_pass_pour_auteur($id_auteur) { + include_spip('inc/acces'); + $pass = creer_pass_aleatoire(8, $id_auteur); + include_spip('action/editer_auteur'); + instituer_auteur($id_auteur, array('pass'=>$pass)); + return $pass; +} + +?> diff --git a/squelettes-dist/formulaires/mot_de_passe.html b/squelettes-dist/formulaires/mot_de_passe.html new file mode 100644 index 0000000000000000000000000000000000000000..bca8ad73ea6500624bdbccbf499ba1f4f916d1da --- /dev/null +++ b/squelettes-dist/formulaires/mot_de_passe.html @@ -0,0 +1,29 @@ +<div class="formulaire_spip formulaire_mot_de_passe"> +[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] +[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] +[(#ENV*{editable}|?{' '}) +<form id="oubli_form" action="[(#ENV{action})]" method="post"> + [(#REM) activer le traitement auto et dispatch sur charger/verifier/traiter] + #ACTION_FORMULAIRE{#ENV{action}} + <fieldset> + <legend><:pass_nouveau_pass:></legend> + <ul> + <li class="saisie_oubli obligatoire[ (#ENV*{erreurs}|table_valeur{oubli}|oui)erreur]"> + <label for="oubli"><:pass_choix_pass:></label> + [<span class='erreur'>(#ENV**{erreurs}|table_valeur{oubli})</span>] + <input type='password' name='oubli' id='oubli' value="#ENV**{oubli}" /> + </li> + </ul> + </fieldset> + [(#REM) Piege a robots spammeurs ] + <p style="display: none;"> + <label for="nobot"><:antispam_champ_vide:></label> + <input type="text" class="text" name="nobot" id="nobot" value="#ENV{nobot}" size="10" /> + </p> + <p class="boutons"><input type="submit" class="submit" value="<:pass_ok:>" /></p> +</form> +<script type='text/javascript'>/*<!#EVAL{chr(91)}CDATA#EVAL{chr(91)}*/ + document.getElementById('oubli').focus() +/*#EVAL{chr(93)}[(#EVAL{chr(93)})]>*/</script> +] +</div> \ No newline at end of file diff --git a/squelettes-dist/formulaires/mot_de_passe.php b/squelettes-dist/formulaires/mot_de_passe.php new file mode 100644 index 0000000000000000000000000000000000000000..77d0a5801ec7044be4bab6d18fb5312933732b2e --- /dev/null +++ b/squelettes-dist/formulaires/mot_de_passe.php @@ -0,0 +1,93 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2010 * + * 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; + +// chargement des valeurs par defaut des champs du formulaire +/** + * Chargement de l'auteur qui peut changer son mot de passe. + * Soit un cookie d'oubli fourni par #FORMULAIRE_OUBLI est passe dans l'url par &p= + * Soit un id_auteur est passe en parametre #FORMULAIRE_MOT_DE_PASSE{#ID_AUTEUR} + * Dans les deux cas on verifie que l'auteur est autorise + * + * @param int $id_auteur + * @return array + */ +function formulaires_mot_de_passe_charger_dist($id_auteur=null){ + + $valeurs = array(); + if ($id_auteur=intval($id_auteur)) { + $id_auteur = sql_getfetsel('id_auteur','spip_auteurs',array('id_auteur='.intval($id_auteur),"statut<>'5poubelle'","pass<>''")); + } + elseif ($p=_request('p')) { + $p = preg_replace(',[^0-9a-f.],i','',$p); + if ($p AND $id_auteur = sql_getfetsel('id_auteur','spip_auteurs',array('cookie_oubli='.sql_quote($p),"statut<>'5poubelle'","pass<>''"))) + $valeurs['_hidden'] = '<input type="hidden" name="p" value="'.$p.'" />'; + } + + if ($id_auteur){ + $valeurs['id_auteur'] = $id_auteur; // a toutes fins utiles pour le formulaire + } + else { + $valeurs['_hidden'] = _T('pass_erreur_code_inconnu'); + $valeurs['editable'] = false; // pas de saisie + } + return $valeurs; +} + +/** + * Verification de la saisie du mot de passe. + * On verifie qu'un mot de passe est saisi, et que sa longuer est suffisante + * Ce serait le lieu pour verifier sa qualite (caracteres speciaux ...) + * + * @param int $id_auteur + */ +function formulaires_mot_de_passe_verifier_dist($id_auteur=null){ + $erreurs = array(); + if (!_request('oubli')) + $erreurs['oubli'] = _T('info_obligatoire'); + else if (strlen(_request('oubli')) < 6) + $erreurs['oubli'] = _T('info_passe_trop_court'); + + return $erreurs; +} + +/** + * Modification du mot de passe d'un auteur. + * Utilise le cookie d'oubli fourni en url ou l'argument du formulaire pour identifier l'auteur + * + * @param int $id_auteur + */ +function formulaires_mot_de_passe_traiter_dist($id_auteur=null){ + $message = ''; + include_spip('base/abstract_sql'); + if ($id_auteur=intval($id_auteur)) { + $row = sql_fetsel('id_auteur,login','spip_auteurs',array('id_auteur='.intval($id_auteur),"statut<>'5poubelle'","pass<>''")); + } + elseif ($p=_request('p')) { + $p = preg_replace(',[^0-9a-f.],i','',$p); + $row = sql_fetsel('id_auteur,login,source','spip_auteurs',array('cookie_oubli='.sql_quote($p),"statut<>'5poubelle'","pass<>''")); + } + + if ($row + && ($id_auteur = $row['id_auteur']) + && ($oubli = _request('oubli'))) { + include_spip('action/editer_auteur'); + auteurs_set($id_auteur, array('pass'=>$oubli,'cookie_oubli'=>'')); + + $login = $row['login']; + $message = "<b>" . _T('pass_nouveau_enregistre') . "</b>". + "<p>" . _T('pass_rappel_login', array('login' => $login)); + } + return array('message_ok'=>$message); +} +?> diff --git a/squelettes-dist/formulaires/oubli.html b/squelettes-dist/formulaires/oubli.html new file mode 100644 index 0000000000000000000000000000000000000000..c965b97a4732de164c61784884fe6a2f41d6a69f --- /dev/null +++ b/squelettes-dist/formulaires/oubli.html @@ -0,0 +1,29 @@ +<div class="formulaire_spip formulaire_oubli"> +[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] +[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] +[(#ENV*{editable}|?{' '}) +<form id="oubli_form" action="[(#ENV{action})]" method="post"> + [(#REM) activer le traitement auto et dispatch sur charger/verifier/traiter] + #ACTION_FORMULAIRE{#ENV{action}} + <fieldset> + <legend><:pass_nouveau_pass:></legend> + <ul> + <li class="saisie_oubli obligatoire[ (#ENV*{erreurs}|table_valeur{oubli}|oui)erreur]"> + <label for="oubli"><:form_pet_votre_email:></label> + [<span class='erreur'>(#ENV**{erreurs}|table_valeur{oubli})</span>] + <input type='text' name='oubli' id='oubli' value="#ENV**{oubli}" /> + </li> + </ul> + </fieldset> + [(#REM) Piege a robots spammeurs ] + <p style="display: none;"> + <label for="nobot"><:antispam_champ_vide:></label> + <input type="text" class="text" name="nobot" id="nobot" value="#ENV{nobot}" size="10" /> + </p> + <p class="boutons"><input type="submit" class="submit" value="<:pass_ok:>" /></p> +</form> +<script type='text/javascript'>/*<!#EVAL{chr(91)}CDATA#EVAL{chr(91)}*/ + document.getElementById('oubli').focus() +/*#EVAL{chr(93)}[(#EVAL{chr(93)})]>*/</script> +] +</div> \ No newline at end of file diff --git a/squelettes-dist/formulaires/oubli.php b/squelettes-dist/formulaires/oubli.php new file mode 100644 index 0000000000000000000000000000000000000000..21b8548ce34c17f198c8ceefeb48b7ce6ddf0bd2 --- /dev/null +++ b/squelettes-dist/formulaires/oubli.php @@ -0,0 +1,100 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2010 * + * 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; + +// chargement des valeurs par defaut des champs du formulaire +function formulaires_oubli_charger_dist(){ + $valeurs = array('oubli'=>''); + return $valeurs; +} + +// http://doc.spip.org/@message_oubli +function message_oubli($email, $param) +{ + $r = formulaires_oubli_mail($email); + if (is_array($r) AND $r[1]) { + include_spip('inc/acces'); # pour creer_uniqid + $cookie = creer_uniqid(); + sql_updateq("spip_auteurs", array("cookie_oubli" => $cookie), "id_auteur=" . $r[1]['id_auteur']); + + $nom = $GLOBALS['meta']["nom_site"]; + $envoyer_mail = charger_fonction('envoyer_mail','inc'); + + if ($envoyer_mail($email, + ("[$nom] " . _T('pass_oubli_mot')), + _T('pass_mail_passcookie', + array('nom_site_spip' => $nom, + 'adresse_site' => url_de_base(), + 'sendcookie' => generer_url_public('spip_pass', + "$param=$cookie", true)))) ) + return _T('pass_recevoir_mail'); + else + return _T('pass_erreur_probleme_technique'); + } + return _T('pass_erreur_probleme_technique'); +} + +// la saisie a ete validee, on peut agir +function formulaires_oubli_traiter_dist(){ + + $message = message_oubli(_request('oubli'),'p'); + return array('message_ok'=>$message); +} + + +// fonction qu'on peut redefinir pour filtrer les adresses mail +// http://doc.spip.org/@test_oubli +function test_oubli_dist($email) +{ + include_spip('inc/filtres'); # pour email_valide() + if (!email_valide($email) ) + return _T('pass_erreur_non_valide', array('email_oubli' => htmlspecialchars($email))); + return array('mail' => $email); +} + +function formulaires_oubli_verifier_dist(){ + $erreurs = array(); + + $email = _request('oubli'); + + $r = formulaires_oubli_mail($email); + + if (!is_array($r)) + $erreurs['oubli'] = $r; + else { + if (!$r[1]) + $erreurs['oubli'] = _T('pass_erreur_non_enregistre', array('email_oubli' => htmlspecialchars($email))); + + elseif ($r[1]['statut'] == '5poubelle' OR $r[1]['pass'] == '') + $erreurs['oubli'] = _T('pass_erreur_acces_refuse'); + } + + return $erreurs; +} + +function formulaires_oubli_mail($email) +{ + if (function_exists('test_oubli')) + $f = 'test_oubli'; + else + $f = 'test_oubli_dist'; + $declaration = $f($email); + + if (!is_array($declaration)) + return $declaration; + else { + include_spip('base/abstract_sql'); + return array($declaration, sql_fetsel("id_auteur,statut,pass", "spip_auteurs", "email =" . sql_quote($declaration['mail']))); + } +} +?> diff --git a/squelettes-dist/formulaires/recherche.html b/squelettes-dist/formulaires/recherche.html new file mode 100644 index 0000000000000000000000000000000000000000..49f93c18210929352b15dffb66a2d3542bd50374 --- /dev/null +++ b/squelettes-dist/formulaires/recherche.html @@ -0,0 +1,9 @@ +<div class="formulaire_spip formulaire_recherche" id="formulaire_recherche"> +<form action="[(#ENV{action})]" method="get"><div> + [(#ENV{action}|form_hidden)] + [<input type="hidden" name="lang" value="(#ENV{lang})" />] + <label for="recherche"><:info_rechercher_02:></label> + <input type="text" class="text" size="10" name="recherche" id="recherche"[ value="(#ENV{recherche})"] accesskey="4" /> + <input type="submit" class="submit" value=">>" title="<:info_rechercher:>" /> +</div></form> +</div> diff --git a/squelettes-dist/formulaires/recherche.php b/squelettes-dist/formulaires/recherche.php new file mode 100644 index 0000000000000000000000000000000000000000..fff9eabf862dbdd79791cdf93f5319653367e169 --- /dev/null +++ b/squelettes-dist/formulaires/recherche.php @@ -0,0 +1,31 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2010 * + * 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; + +// chargement des valeurs par defaut des champs du formulaire +function formulaires_recherche_charger_dist($lien_filtre = NULL,$lien_arg = NULL){ + $lien = $lien_filtre ? $lien_filtre : $lien_arg; + if ($GLOBALS['spip_lang'] != $GLOBALS['meta']['langue_site']) + $lang = $GLOBALS['spip_lang']; + else + $lang=''; + + return + array( + 'action' => ($lien ? $lien : generer_url_public('recherche')), # action specifique, ne passe pas par Verifier, ni Traiter + 'recherche' => _request('recherche'), + 'lang' => $lang + ); +} + +?> diff --git a/squelettes-dist/formulaires/signature.html b/squelettes-dist/formulaires/signature.html new file mode 100644 index 0000000000000000000000000000000000000000..dcfb85e18fbd94d18a15d0ed39dedf998cff028e --- /dev/null +++ b/squelettes-dist/formulaires/signature.html @@ -0,0 +1,66 @@ +<div class="formulaire_spip formulaire_signature ajax" id="sp#ENV{id_article}"> + +[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok,#ENV*{_confirm}|affiche_reponse_confirmation})</p>] +[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] +[(#ENV{editable}) +<form method="post" action="#ENV{action}#sp#ENV{id_article}"> + #ACTION_FORMULAIRE{#ENV{action}} + + <input type="hidden" name="url_page" value="[(#SELF|url_absolue)]" /> + [<fieldset> + <legend><:info_descriptif:></legend> + <div class='explication'>(#ENV*{_texte}|propre)</div> + </fieldset>] + <fieldset> + <legend><:form_forum_identifiants:></legend> + <ul> + <li class='saisie_nom_email[ (#ENV*{erreurs}|table_valeur{session_nom}|oui)erreur] obligatoire'> + <label for="session_nom"><:form_pet_votre_nom:></label> + [<span class="erreur_message">(#ENV*{erreurs}|table_valeur{session_nom})</span>] + <input type="text" class="text" name="session_nom" id="session_nom" value="#ENV{session_nom}" size="30" /> + </li> + <li class='saisie_adresse_email[ (#ENV*{erreurs}|table_valeur{session_email}|oui)erreur] obligatoire'> + <label for="session_email"><:form_pet_votre_email:></label> + [<span class="erreur_message">(#ENV*{erreurs}|table_valeur{session_email})</span>] + <input type="text" class="text" name="session_email" id="session_email" value="#ENV{session_email}" size="30" /> + </li> + </ul> + </fieldset> + <fieldset> + <legend><:info_lien_hypertexte:></legend> + [<p class='explication'>(#ENV{site_obli})<:form_pet_votre_site:></p>] + <ul> + <li class='saisie_signature_nom_site[ (#ENV*{erreurs}|table_valeur{signature_nom_site}|oui)erreur][(#ENV{site_obli})obligatoire]'> + <label for="signature_nom_site"><:form_pet_nom_site2:></label> + [<span class="erreur_message">(#ENV*{erreurs}|table_valeur{signature_nom_site})</span>] + <input type="text" class="text" name="signature_nom_site" id="signature_nom_site" value="#ENV{signature_nom_site}" size="30" /> + </li> + <li class='saisie_signature_url_site[ (#ENV*{erreurs}|table_valeur{signature_url_site}|oui)erreur][(#ENV{site_obli})obligatoire]'> + <label for="signature_url_site"><:form_pet_adresse_site:></label> + [<span class="erreur_message">(#ENV*{erreurs}|table_valeur{signature_url_site})</span>] + <input type="text" class="text" name="signature_url_site" id="signature_url_site" value="#ENV{signature_url_site}" size="30" /> + </li> + </ul> + </fieldset> + + [(#REM) Piege a robots spammeurs ] + <p style="display: none;"> + <label for="nobot"><:antispam_champ_vide:></label> + <input type="text" class="text" name="nobot" id="nobot" value="#ENV{nobot}" size="10" /> + </p> + + [(#ENV{_message}) + <fieldset> + <legend><:form_pet_message_commentaire:></legend> + <ul> + <li class='saisie_message'> + <label for="message"><:info_texte_message:></label> + <textarea name="message" id="message" rows="6" cols="60">#ENV{message}</textarea> + </li> + </ul> + </fieldset>] + + <p class="boutons"><input type="submit" class="submit" value="<:bouton_valider:>" /></p> +</form> +] +</div> \ No newline at end of file diff --git a/squelettes-dist/formulaires/signature.php b/squelettes-dist/formulaires/signature.php new file mode 100644 index 0000000000000000000000000000000000000000..786d18aefef8de6dbf1fed48aa2e5866a231e83b --- /dev/null +++ b/squelettes-dist/formulaires/signature.php @@ -0,0 +1,384 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2010 * + * 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; + +function formulaires_signature_charger_dist($id_article, $petition, $texte, $site_obli, $message) { + $valeurs = array( + 'id_article' => $id_article, + 'session_nom' => sinon($GLOBALS['visiteur_session']['session_nom'], + $GLOBALS['visiteur_session']['nom']), + 'session_email'=> sinon($GLOBALS['visiteur_session']['session_email'], + $GLOBALS['visiteur_session']['email']), + 'signature_nom_site'=>'', + 'signature_url_site'=>'http://', + '_texte'=>$petition, + '_message'=>$message, + 'message'=>'', + 'site_obli' => $site_obli, + 'debut_signatures'=>'' // pour le nettoyer de l'url d'action ! + ); + + if ($c = _request('var_confirm')) { + $valeurs['_confirm'] = $c; + $valeurs['editable'] = false; + } + return $valeurs; +} +function affiche_reponse_confirmation($confirm) { + $reponse_confirmation = charger_fonction('reponse_confirmation','formulaires/signature/'); + return $reponse_confirmation($confirm); # calculee plus tot: assembler.php +} + +function formulaires_signature_verifier_dist($id_article, $petition, $texte, $site_obli, $message) { + $erreurs = array(); + $oblis = array('session_email','session_email'); + + if ($site_obli){ + $oblis[] = 'signature_nom_site'; + $oblis[] = 'signature_url_site'; + set_request('signature_url_site', vider_url(_request('signature_url_site'))); + } + foreach ($oblis as $obli) + if (!_request($obli)) + $erreurs[$obli] = _T('info_obligatoire'); + + if ($nom = _request('session_nom') AND strlen($nom) < 2) + $erreurs['nom_email'] = _T('form_indiquer_nom'); + + include_spip('inc/filtres'); + if (($mail=_request('session_email')) == _T('info_mail_fournisseur')) + $erreurs['adresse_email'] = _T('form_indiquer'); + elseif ($mail AND !email_valide($mail)) + $erreurs['adresse_email'] = _T('form_email_non_valide'); + elseif (strlen(_request('nobot')) + OR (@preg_match_all(',\bhref=[\'"]?http,i', // bug PHP + $message + # , PREG_PATTERN_ORDER + ) + >2)) { + #$envoyer_mail = charger_fonction('envoyer_mail','inc'); + #envoyer_mail('email_moderateur@example.tld', 'spam intercepte', var_export($_POST,1)); + $erreurs['message_erreur'] = _T('form_pet_probleme_liens'); + } + if ($site_obli){ + if (!vider_url($url_site = _request('signature_url_site'))) { + $erreurs['signature_url_site'] = _T('form_indiquer_nom_site'); + } + elseif (!count($erreurs)) { + include_spip('inc/distant'); + if (!recuperer_page($url_site, false, true, 0)) + $erreurs['signature_url_site'] = _T('form_pet_url_invalide'); + } + } + + if (!count($erreurs)){ + // tout le monde est la. + include_spip('base/abstract_sql'); + $row = sql_fetsel('*', 'spip_petitions', "id_article=".intval($id_article)); + + if (!$row) + $erreurs['message_erreur'] = _T('form_pet_probleme_technique'); + else { + $email_unique = $row['email_unique'] == "oui"; + $site_unique = $row['site_unique'] == "oui"; + + // Refuser si deja signe par le mail ou le site quand demande + // Il y a un acces concurrent potentiel, + // mais ca n'est qu'un cas particulier de qq n'ayant jamais confirme'. + // On traite donc le probleme a la confirmation. + + if ($email_unique) { + $r = sql_countsel('spip_signatures', "id_article=$id_article AND ad_email=" . sql_quote($mail) . " AND statut='publie'"); + if ($r) $erreurs['message_erreur'] = _T('form_pet_deja_signe'); + } + + if ($site_unique) { + $r = sql_countsel('spip_signatures', "id_article=$id_article AND url_site=" . sql_quote($url_site) . " AND (statut='publie' OR statut='poubelle')"); + if ($r) $erreurs['message_erreur'] = _T('form_pet_site_deja_enregistre'); + } + } + } + + return $erreurs; +} + +function formulaires_signature_traiter_dist($id_article, $petition, $texte, $site_obli, $message) { + $reponse = _T('form_pet_probleme_technique'); + include_spip('base/abstract_sql'); + if (spip_connect()) { + $controler_signature = charger_fonction('controler_signature', 'inc'); + $reponse = $controler_signature($id_article, + _request('session_nom'), _request('session_email'), + _request('message'), _request('signature_nom_site'), + _request('signature_url_site'), _request('url_page')); + } + + return array('message_ok'=>$reponse); +} + +// Retour a l'ecran du lien de confirmation d'une signature de petition. +// Si var_confirm est non vide, c'est l'appel dans public/assembler.php +// pour vider le cache au demarrage afin que la nouvelle signature apparaisse. +// Sinon, c'est l'execution du formulaire et on retourne le message +// de confirmation ou d'erreur construit lors de l'appel par assembler.php +// Le controle d'unicite du mail ou du site (si requis) refait ici correspond +// au cas de mails de demande de confirmation laisses sans reponse + +// http://doc.spip.org/@reponse_confirmation_dist +function formulaires_signature_reponse_confirmation_dist($var_confirm = '') { + static $confirm = null; + + // reponse mise en cache dans la session ? + $code_message = 'signature_message_'.strval($var_confirm); + if (isset($GLOBALS['visiteur_session'][$code_message])) + return $GLOBALS['visiteur_session'][$code_message]; + + // reponse deja calculee depuis public/assembler.php + if (isset($confirm)) + return $confirm; + + if ($var_confirm == 'publie' OR $var_confirm == 'poubelle') + return ''; + + if (!spip_connect()) { + $confirm = _T('form_pet_probleme_technique'); + return ''; + } + include_spip('inc/texte'); + include_spip('inc/filtres'); + + // Suppression d'une signature par un moderateur ? + // Cf. plugin notifications + if (isset($_GET['refus'])) { + // verifier validite de la cle de suppression + // l'id_signature est dans var_confirm + include_spip('inc/securiser_action'); + if ($id_signature = intval($var_confirm) + AND ( + $_GET['refus'] == _action_auteur("supprimer signature $id_signature", '', '', 'alea_ephemere') + OR + $_GET['refus'] == _action_auteur("supprimer signature $id_signature", '', '', 'alea_ephemere_ancien') + )) { + sql_updateq("spip_signatures", array("statut" => 'poubelle'), "id_signature=$id_signature"); + $confirm = _T('info_signature_supprimee'); + } else $confirm = _T('info_signature_supprimee_erreur'); + return ''; + } + + $row = sql_fetsel('*', 'spip_signatures', "statut=" . sql_quote($var_confirm), '', "1"); + + if (!$row) { + $confirm = _T('form_pet_aucune_signature'); + return ''; + } + + $id_signature = $row['id_signature']; + $id_article = $row['id_article']; + $adresse_email = $row['ad_email']; + $url_site = $row['url_site']; + + $row = sql_fetsel('email_unique, site_unique', 'spip_petitions', "id_article=$id_article"); + + $email_unique = $row['email_unique'] == "oui"; + $site_unique = $row['site_unique'] == "oui"; + + sql_updateq('spip_signatures', + array('statut' => 'publie', 'date_time' => 'NOW()'), + "id_signature=$id_signature"); + + if ($email_unique) { + + $r = "id_article=$id_article AND ad_email=" . sql_quote($adresse_email); + if (signature_entrop($r)) + $confirm = _T('form_pet_deja_signe'); + } + + if ($site_unique) { + $r = "id_article=$id_article AND url_site=" . sql_quote($url_site); + if (signature_entrop($r)) + $confirm = _T('form_pet_site_deja_enregistre'); + } + + include_spip('inc/session'); + + if (!$confirm) { + $confirm = _T('form_pet_signature_validee'); + + // noter dans la session que l'email est valide + // de facon a permettre de signer les prochaines + // petitions sans refaire un tour d'email + session_set('email_confirme', $adresse_email); + + // invalider les pages ayant des boucles signatures + include_spip('inc/invalideur'); + suivre_invalideur("id='varia/pet$id_article'"); + } + + // Conserver la reponse dans la session du visiteur + if ($confirm) + session_set($code_message, $confirm); +} + +// +// Recevabilite de la signature d'une petition +// les controles devraient mantenant etre faits dans formulaires_signature_verifier() +// + +// http://doc.spip.org/@inc_controler_signature_dist +function inc_controler_signature_dist($id_article, $nom, $mail, $message, $site, $url_site, $url_page) { + + include_spip('inc/texte'); + include_spip('inc/filtres'); + + // tout le monde est la. + // cela a ete verifie en amont, dans formulaires_signature_verifier() + if (!$row = sql_fetsel('*', 'spip_petitions', "id_article=$id_article")) + return _T('form_pet_probleme_technique'); + + $statut = ""; + if (!$ret = signature_a_confirmer($id_article, $url_page, $nom, $mail, $site, $url_site, $message, $lang, $statut)) + return _T('form_pet_probleme_technique'); + + $id_signature = sql_insertq('spip_signatures', array( + 'id_article' => $id_article, + 'date_time' => 'NOW()', + 'statut' => $statut, + 'ad_email' => $mail, + 'url_site' => $url_site)); + + if (!$id_signature) return _T('form_pet_probleme_technique'); + + include_spip('inc/modifier'); + revision_signature($id_signature, array( + 'nom_email' => $nom, + 'ad_email' => $mail, + 'message' => $message, + 'nom_site' => $site, + 'url_site' => $url_site + )); + + return $ret; +} + +// http://doc.spip.org/@signature_a_confirmer +function signature_a_confirmer($id_article, $url_page, $nom, $mail, $site, $url, $msg, $lang, &$statut) +{ + + // Si on est deja connecte et que notre mail a ete valide d'une maniere + // ou d'une autre, on entre directement la signature dans la base, sans + // envoyer d'email. Sinon email de verification + if ( + // Cas 1: on est loge et on signe avec son vrai email + ( + isset($GLOBALS['visiteur_session']['statut']) + AND $GLOBALS['visiteur_session']['session_email'] == $GLOBALS['visiteur_session']['email'] + AND strlen($GLOBALS['visiteur_session']['email']) + ) + + // Cas 2: on a deja signe une petition, et on conserve le meme email + OR ( + isset($GLOBALS['visiteur_session']['email_confirme']) + AND $GLOBALS['visiteur_session']['session_email'] == $GLOBALS['visiteur_session']['email_confirme'] + AND strlen($GLOBALS['visiteur_session']['session_email']) + ) + ) { + // Si on est en ajax on demande a reposter sans ajax, car il faut + // recharger toute la page pour afficher la signature + refuser_traiter_formulaire_ajax(); + + $statut = 'publie'; + // invalider le cache ! + include_spip('inc/invalideur'); + suivre_invalideur("id='varia/pet$id_article'"); + + // message de reussite : en ajax, preciser qu'il faut recharger la page + // pour voir le resultat + return + _T('form_pet_signature_validee'); + } + + + // + // Cas normal : envoi d'une demande de confirmation + // + $row = sql_fetsel('titre,lang', 'spip_articles', "id_article=$id_article"); + $lang = lang_select($row['lang']); + $titre = textebrut(typo($row['titre'])); + if ($lang) lang_select(); + + if (!strlen($statut)) + $statut = signature_test_pass(); + + if ($lang != $GLOBALS['meta']['langue_site']) + $url_page = parametre_url($url_page, "lang", $lang,'&'); + + $url_page = parametre_url($url_page, 'var_confirm', $statut, '&') + . "#sp$id_article"; + + $r = _T('form_pet_mail_confirmation', + array('titre' => $titre, + 'nom_email' => $nom, + 'nom_site' => $site, + 'url_site' => $url, + 'url' => $url_page, + 'message' => $msg)); + + $titre = _T('form_pet_confirmation')." ". $titre; + $envoyer_mail = charger_fonction('envoyer_mail','inc'); + if ($envoyer_mail($mail,$titre, $r)) + return _T('form_pet_envoi_mail_confirmation',array('email'=>$mail)); + + return false; # erreur d'envoi de l'email +} + +// Pour eviter le recours a un verrou (qui bloque l'acces a la base), +// on commence par inserer systematiquement la signature +// puis on demande toutes celles ayant la propriete devant etre unique +// (mail ou site). S'il y en a plus qu'une on les retire sauf la premiere +// En cas d'acces concurrents il y aura des requetes de retraits d'elements +// deja detruits. Bizarre ? C'est mieux que de bloquer! + +// http://doc.spip.org/@signature_entrop +function signature_entrop($where) +{ + $where .= " AND statut='publie'"; + $query = sql_select('id_signature', 'spip_signatures', $where,'',"date_time desc"); + $n = sql_count($query); + if ($n>1) { + $entrop = array(); + for ($i=$n-1;$i;$i--) { + $r = sql_fetch($query); + $entrop[]=$r['id_signature']; + } + sql_free($query); + $where .= " OR " . sql_in('id_signature', $entrop); + + sql_delete('spip_signatures', $where); + } + + return $entrop; +} + +// Creer un mot de passe aleatoire et verifier qu'il est unique +// dans la table des signatures +// http://doc.spip.org/@signature_test_pass +function signature_test_pass() { + include_spip('inc/acces'); + do { + $passw = creer_pass_aleatoire(); + } while (sql_countsel('spip_signatures', "statut='$passw'") > 0); + + return $passw; +} + +?> diff --git a/squelettes-dist/formulaires/site.html b/squelettes-dist/formulaires/site.html new file mode 100644 index 0000000000000000000000000000000000000000..d7f00ca61b04db456fdea377f94bfe1ada6e4ade --- /dev/null +++ b/squelettes-dist/formulaires/site.html @@ -0,0 +1,36 @@ +<div class="formulaire_spip formulaire_site ajax" id="formulaire_site"> +[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] +[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] +[(#ENV{editable}) +<form method="post" action="#ENV{action}"> + #ACTION_FORMULAIRE{#ENV{action}} + <fieldset> + <legend><:info_site:></legend> + <p class='explication'><:proposer_site:></p> + <ul> + <li class='saisie_nom_site obligatoire[ (#ENV*{erreurs}|table_valeur{nom_site}|oui)erreur]'> + <label for="nom_site"><:form_prop_nom_site:></label> + [<span class="erreur_message">(#ENV*{erreurs}|table_valeur{nom_site})</span>] + <input type="text" class="text" name="nom_site" id="nom_site" value="#ENV{nom_site}" size="30" /> + </li> + <li class='saisie_url_site[ (#ENV*{erreurs}|table_valeur{url_site}|oui)erreur]'> + <label for="url_site"><:form_prop_url_site:></label> + [<span class="erreur_message">(#ENV*{erreurs}|table_valeur{url_site})</span>] + <input type="text" class="text" name="url_site" id="url_site" value="#ENV{url_site}" size="30" /> + </li> + <li class='saisie_description_site[ (#ENV*{erreurs}|table_valeur{description_site}|oui)erreur]'> + <label for="description_site"><:form_prop_description:></label> + [<span class="erreur_message">(#ENV*{erreurs}|table_valeur{description_site})</span>] + <textarea name="description_site" id="description_site" rows="6" cols="60">#ENV{description_site}</textarea> + </li> + </ul> + </fieldset> + [(#REM) Piege a robots spammeurs ] + <p style="display: none;"> + <label for="nobot"><:antispam_champ_vide:></label> + <input type="text" class="text" name="nobot" id="nobot" value="#ENV{nobot}" size="10" /> + </p> + <p class="boutons"><input type="submit" class="submit" value="<:bouton_valider:>" /></p> +</form> +] +</div> \ No newline at end of file diff --git a/squelettes-dist/formulaires/site.php b/squelettes-dist/formulaires/site.php new file mode 100644 index 0000000000000000000000000000000000000000..146390bca9b4bf2690d8f25d0dc74c7a7f20ab49 --- /dev/null +++ b/squelettes-dist/formulaires/site.php @@ -0,0 +1,64 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2010 * + * 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; + +function formulaires_site_charger_dist($id_rubrique) { + + return array('nom_site'=>'','url_site'=>'http://','description_site'=>''); +} + +function formulaires_site_verifier_dist($id_rubrique){ + + $erreurs = array(); + if (!$nom = _request('nom_site')) + $erreurs['nom_site'] = _T("info_obligatoire"); + else { + if((strlen ($nom) < 2) OR (strlen(_request('nobot'))>0)) + $erreurs['email_message_auteur'] = _T('form_prop_indiquer_nom_site'); + } + if (!$url = _request('url_site')) + $erreurs['url_site'] = _T("info_obligatoire"); + + if (!count($erreurs)) { + // Tester l'URL du site + include_spip('inc/distant'); + if (!recuperer_page($url)) + $erreurs['url_site'] = _T('form_pet_url_invalide'); + } + return $erreurs; +} + +function formulaires_site_traiter_dist($id_rubrique){ + $res = array('message_erreur'=>_T('titre_probleme_technique')); + + $nom = _request('nom_site'); + $url = _request('url_site'); + $desc = _request('description_site'); + + include_spip('base/abstract_sql'); + if ($id_syndic = sql_insertq('spip_syndic', array( + 'nom_site' => $nom, + 'url_site' => $url, + 'id_rubrique' => $id_rubrique, + 'id_secteur' => sql_getfetsel('id_secteur','spip_rubriques','id_rubrique='.sql_quote($id_rubrique)), + 'descriptif' => $desc, + 'date' => date('Y-m-d H:i:s'), + 'date_syndic' => date('Y-m-d H:i:s'), + 'statut' => 'prop', + 'syndication' => 'non'))) + $res = array('message_ok' => _T('form_prop_enregistre'), 'id_syndic'=>$id_syndic); + + return $res; +} + +?>