[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / plugins-dist / petitions / formulaires / signature.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
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 \***************************************************************************/
12
13 if (!defined("_ECRIRE_INC_VERSION")) return;
14
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)))
19 return false;
20 // pas de signature sur une petition fermee (TODO) ou poubelle
21 if (isset($r['statut']) AND in_array($r['statut'],array('off','poubelle')))
22 return false;
23 $id_petition = $r['id_petition'];
24
25 $valeurs = array(
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') ? ' ':'',
34 'message'=>'',
35 'site_obli' => ($r['site_obli'] == 'oui'?' ':''),
36 'debut_signatures'=>'' // pour le nettoyer de l'url d'action !
37 );
38
39 if ($c = _request('var_confirm')) {
40 $valeurs['_confirm'] = $c;
41 $valeurs['editable'] = false;
42 }
43 return $valeurs;
44 }
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
49 }
50
51 function formulaires_signature_verifier_dist($id_article) {
52 $erreurs = array();
53 $oblis = array('session_nom','session_email');
54 include_spip('base/abstract_sql');
55 $row = sql_fetsel('*','spip_petitions','id_article='.intval($id_article));
56 if (!$row)
57 $erreurs['message_erreur'] = _T('petitions:form_pet_probleme_technique');
58 $id_petition = $row['id_petition'];
59
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')));
64 }
65 foreach ($oblis as $obli)
66 if (!_request($obli))
67 $erreurs[$obli] = _T('info_obligatoire');
68
69 if ($nom = _request('session_nom') AND strlen($nom) < 2)
70 $erreurs['session_nom'] = _T('form_indiquer_nom');
71
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
79 _request('message')
80 # , PREG_PATTERN_ORDER
81 )
82 >2)) {
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');
86 }
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');
90 }
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');
95 }
96 }
97
98 if (!count($erreurs)){
99 // tout le monde est la.
100 $email_unique = $row['email_unique'] == "oui";
101 $site_unique = $row['site_unique'] == "oui";
102
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.
107
108 if ($email_unique) {
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');
111 }
112
113 if ($site_unique) {
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');
116 }
117 }
118
119 return $erreurs;
120 }
121
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'));
131 }
132
133 return array('message_ok'=>$reponse);
134 }
135
136 //
137 // Recevabilite de la signature d'une petition
138 // les controles devraient mantenant etre faits dans formulaires_signature_verifier()
139 //
140
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) {
143
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');
148
149 $statut = "";
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');
152
153 include_spip('action/editer_signature');
154
155 $id_signature = signature_inserer($row['id_petition']);
156 if (!$id_signature) return _T('petitions:form_pet_probleme_technique');
157
158 signature_modifier($id_signature,
159 array(
160 'statut' => $statut,
161 'nom_email' => $nom,
162 'ad_email' => $mail,
163 'message' => $message,
164 'nom_site' => $site,
165 'url_site' => $url_site
166 )
167 );
168
169 return $ret;
170 }
171
172 // http://code.spip.net/@signature_a_confirmer
173 function signature_a_confirmer($id_article, $url_page, $nom, $mail, $site, $url, $msg, $lang, &$statut)
174 {
175 include_spip('inc/texte');
176 include_spip('inc/filtres');
177
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
181 if (
182 // Cas 1: on est loge et on signe avec son vrai email
183 (
184 isset($GLOBALS['visiteur_session']['statut'])
185 AND $GLOBALS['visiteur_session']['session_email'] == $GLOBALS['visiteur_session']['email']
186 AND strlen($GLOBALS['visiteur_session']['email'])
187 )
188
189 // Cas 2: on a deja signe une petition, et on conserve le meme email
190 OR (
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'])
194 )
195 ) {
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();
199
200 $statut = 'publie';
201 // invalider le cache !
202 include_spip('inc/invalideur');
203 suivre_invalideur("id='article/$id_article'");
204
205 // message de reussite
206 return
207 _T('petitions:form_pet_signature_validee');
208 }
209
210
211 //
212 // Cas normal : envoi d'une demande de confirmation
213 //
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();
218
219 if (!strlen($statut))
220 $statut = signature_test_pass();
221
222 if ($lang != $GLOBALS['meta']['langue_site'])
223 $url_page = parametre_url($url_page, "lang", $lang,'&');
224
225 $url_page = parametre_url($url_page, 'var_confirm', $statut, '&')
226 . "#sp$id_article";
227
228 $r = _T('petitions:form_pet_mail_confirmation',
229 array('titre' => $titre,
230 'nom_email' => $nom,
231 'nom_site' => $site,
232 'url_site' => $url,
233 'url' => $url_page,
234 'message' => $msg));
235
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));
240
241 return false; # erreur d'envoi de l'email
242 }
243
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');
249 do {
250 $passw = creer_pass_aleatoire();
251 } while (sql_countsel('spip_signatures', "statut='$passw'") > 0);
252
253 return $passw;
254 }
255
256 ?>