3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2014 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
13 if (!defined("_ECRIRE_INC_VERSION")) return;
15 function formulaires_signature_charger_dist($id_article) {
16 include_spip('base/abstract_sql');
17 // pas de petition, pas de signature
18 if (!$r = sql_fetsel('*','spip_petitions','id_article='.intval($id_article)))
20 // pas de signature sur une petition fermee (TODO) ou poubelle
21 if (isset($r['statut']) AND in_array($r['statut'],array('off','poubelle')))
23 $id_petition = $r['id_petition'];
26 'id_petition' => $id_petition,
27 'id_article' => $id_article, # pour compat
28 'session_nom' => isset($GLOBALS['visiteur_session']['session_nom'])?
$GLOBALS['visiteur_session']['session_nom']:(isset($GLOBALS['visiteur_session']['nom'])?
$GLOBALS['visiteur_session']['nom']:''),
29 'session_email'=> isset($GLOBALS['visiteur_session']['session_email'])?
$GLOBALS['visiteur_session']['session_email']:(isset($GLOBALS['visiteur_session']['email'])?
$GLOBALS['visiteur_session']['email']:''),
30 'signature_nom_site'=>'',
31 'signature_url_site'=>'http://',
32 '_texte'=>$r['texte'],
33 '_message'=>($r['message'] == 'oui') ?
' ':'',
35 'site_obli' => ($r['site_obli'] == 'oui'?
' ':''),
36 'debut_signatures'=>'' // pour le nettoyer de l'url d'action !
39 if ($c = _request('var_confirm')) {
40 $valeurs['_confirm'] = $c;
41 $valeurs['editable'] = false;
45 function affiche_reponse_confirmation($confirm) {
46 if (!$confirm) return '';
47 $confirmer_signature = charger_fonction('confirmer_signature','action');
48 return $confirmer_signature($confirm); # calculee plus tot: cf petitions_options
51 function formulaires_signature_verifier_dist($id_article) {
53 $oblis = array('session_nom','session_email');
54 include_spip('base/abstract_sql');
55 $row = sql_fetsel('*','spip_petitions','id_article='.intval($id_article));
57 $erreurs['message_erreur'] = _T('petitions:form_pet_probleme_technique');
58 $id_petition = $row['id_petition'];
60 if ($row['site_obli'] == 'oui'){
61 $oblis[] = 'signature_nom_site';
62 $oblis[] = 'signature_url_site';
63 set_request('signature_url_site', vider_url(_request('signature_url_site')));
65 foreach ($oblis as $obli)
67 $erreurs[$obli] = _T('info_obligatoire');
69 if ($nom = _request('session_nom') AND strlen($nom) < 2)
70 $erreurs['session_nom'] = _T('form_indiquer_nom');
72 include_spip('inc/filtres');
73 if (($mail=_request('session_email')) == _T('info_mail_fournisseur'))
74 $erreurs['session_email'] = _T('form_indiquer_email');
75 elseif ($mail AND !email_valide($mail))
76 $erreurs['session_email'] = _T('form_email_non_valide');
77 elseif (strlen(_request('nobot'))
78 OR (@preg_match_all
(',\bhref=[\'"]?http,i', // bug PHP
80 # , PREG_PATTERN_ORDER
83 #$envoyer_mail = charger_fonction('envoyer_mail','inc');
84 #envoyer_mail('email_moderateur@example.tld', 'spam intercepte', var_export($_POST,1));
85 $erreurs['message_erreur'] = _T('petitions:form_pet_probleme_liens');
87 if ($row['site_obli'] == 'oui'){
88 if (!vider_url($url_site = _request('signature_url_site'))) {
89 $erreurs['signature_url_site'] = _T('form_indiquer_nom_site');
91 elseif (!count($erreurs)) {
92 include_spip('inc/distant');
93 if (!recuperer_page($url_site, false, true, 0))
94 $erreurs['signature_url_site'] = _T('petitions:form_pet_url_invalide');
98 if (!count($erreurs)){
99 // tout le monde est la.
100 $email_unique = $row['email_unique'] == "oui";
101 $site_unique = $row['site_unique'] == "oui";
103 // Refuser si deja signe par le mail ou le site quand demande
104 // Il y a un acces concurrent potentiel,
105 // mais ca n'est qu'un cas particulier de qq n'ayant jamais confirme'.
106 // On traite donc le probleme a la confirmation.
109 $r = sql_countsel('spip_signatures', "id_petition=".intval($id_petition)." AND ad_email=" . sql_quote($mail) . " AND statut='publie'");
110 if ($r) $erreurs['message_erreur'] = _T('petitions:form_pet_deja_signe');
114 $r = sql_countsel('spip_signatures', "id_petition=".intval($id_petition)." AND url_site=" . sql_quote($url_site) . " AND (statut='publie' OR statut='poubelle')");
115 if ($r) $erreurs['message_erreur'] = _T('petitions:form_pet_site_deja_enregistre');
122 function formulaires_signature_traiter_dist($id_article) {
123 $reponse = _T('petitions:form_pet_probleme_technique');
124 include_spip('base/abstract_sql');
125 if (spip_connect()) {
126 $controler_signature = charger_fonction('controler_signature', 'inc');
127 $reponse = $controler_signature($id_article,
128 _request('session_nom'), _request('session_email'),
129 _request('message'), _request('signature_nom_site'),
130 _request('signature_url_site'), _request('url_page'));
133 return array('message_ok'=>$reponse);
137 // Recevabilite de la signature d'une petition
138 // les controles devraient mantenant etre faits dans formulaires_signature_verifier()
141 // http://code.spip.net/@inc_controler_signature_dist
142 function inc_controler_signature_dist($id_article, $nom, $mail, $message, $site, $url_site, $url_page) {
144 // tout le monde est la.
145 // cela a ete verifie en amont, dans formulaires_signature_verifier()
146 if (!$row = sql_fetsel('*', 'spip_petitions', "id_article=".intval($id_article)))
147 return _T('petitions:form_pet_probleme_technique');
150 if (!$ret = signature_a_confirmer($id_article, $url_page, $nom, $mail, $site, $url_site, $message, $lang, $statut))
151 return _T('petitions:form_pet_probleme_technique');
153 include_spip('action/editer_signature');
155 $id_signature = signature_inserer($row['id_petition']);
156 if (!$id_signature) return _T('petitions:form_pet_probleme_technique');
158 signature_modifier($id_signature,
163 'message' => $message,
165 'url_site' => $url_site
172 // http://code.spip.net/@signature_a_confirmer
173 function signature_a_confirmer($id_article, $url_page, $nom, $mail, $site, $url, $msg, $lang, &$statut)
175 include_spip('inc/texte');
176 include_spip('inc/filtres');
178 // Si on est deja connecte et que notre mail a ete valide d'une maniere
179 // ou d'une autre, on entre directement la signature dans la base, sans
180 // envoyer d'email. Sinon email de verification
182 // Cas 1: on est loge et on signe avec son vrai email
184 isset($GLOBALS['visiteur_session']['statut'])
185 AND $GLOBALS['visiteur_session']['session_email'] == $GLOBALS['visiteur_session']['email']
186 AND strlen($GLOBALS['visiteur_session']['email'])
189 // Cas 2: on a deja signe une petition, et on conserve le meme email
191 isset($GLOBALS['visiteur_session']['email_confirme'])
192 AND $GLOBALS['visiteur_session']['session_email'] == $GLOBALS['visiteur_session']['email_confirme']
193 AND strlen($GLOBALS['visiteur_session']['session_email'])
196 // Si on est en ajax on demande a reposter sans ajax, car il faut
197 // recharger toute la page pour afficher la signature
198 refuser_traiter_formulaire_ajax();
201 // invalider le cache !
202 include_spip('inc/invalideur');
203 suivre_invalideur("id='article/$id_article'");
205 // message de reussite
207 _T('petitions:form_pet_signature_validee');
212 // Cas normal : envoi d'une demande de confirmation
214 $row = sql_fetsel('titre,lang', 'spip_articles', "id_article=".intval($id_article));
215 $lang = lang_select($row['lang']);
216 $titre = textebrut(typo($row['titre']));
217 if ($lang) lang_select();
219 if (!strlen($statut))
220 $statut = signature_test_pass();
222 if ($lang != $GLOBALS['meta']['langue_site'])
223 $url_page = parametre_url($url_page, "lang", $lang,'&');
225 $url_page = parametre_url($url_page, 'var_confirm', $statut, '&')
228 $r = _T('petitions:form_pet_mail_confirmation',
229 array('titre' => $titre,
236 $titre = _T('petitions:form_pet_confirmation')." ". $titre;
237 $envoyer_mail = charger_fonction('envoyer_mail','inc');
238 if ($envoyer_mail($mail,$titre, $r))
239 return _T('petitions:form_pet_envoi_mail_confirmation',array('email'=>$mail));
241 return false; # erreur d'envoi de l'email
244 // Creer un mot de passe aleatoire et verifier qu'il est unique
245 // dans la table des signatures
246 // http://code.spip.net/@signature_test_pass
247 function signature_test_pass() {
248 include_spip('inc/acces');
250 $passw = creer_pass_aleatoire();
251 } while (sql_countsel('spip_signatures', "statut='$passw'") > 0);