Valider ef049856 rédigé par esj's avatar esj
Parcourir les fichiers

Ménage dans le traitement des signatures de pétitions pour circonscrire la...

Ménage dans le traitement des signatures de pétitions pour circonscrire la nécessité des verrous Mysql. Auparavant les verrous étaient posés très en amont, en particulier avant le test d'existence du site indiqué ce qui pouvait bloquer l'accès pendant longtemps. Par ailleurs ces verrous ne sont pas nécessaires si ni l'unicité du mail ni l'unicité du site ne sont demandés, ils ne sont plus posés à présent dans cette situation. Pour le reste, rien de changé mais ça permet d'y voir plus clair et de bloquer l'accès un minimum de temps.
parent 0af554d8
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+142 −162
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -68,19 +68,12 @@ function balise_FORMULAIRE_SIGNATURE_dyn($id_article, $petition, $texte, $site_o
	else if (_request('nom_email') AND _request('adresse_email')){ # _POST 
		if (!spip_connect())
		  $reponse = _T('form_pet_probleme_technique');
		else {
		  // Eviter les doublons
			$lock = "petition $id_article $adresse_email";
			if (!spip_get_lock($lock, 5))
				$reponse = _T('form_pet_probleme_technique');
		else {
			$controler_signature = charger_fonction('controler_signature', 'inc');
			$reponse = $controler_signature($id_article,
			_request('nom_email'), _request('adresse_email'),
			_request('message'), _request('signature_nom_site'),
			_request('signature_url_site'), _request('url_page'));
			  spip_release_lock($lock);
			}
		}
	}

@@ -102,6 +95,8 @@ function balise_FORMULAIRE_SIGNATURE_dyn($id_article, $petition, $texte, $site_o
// 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
function reponse_confirmation($var_confirm = '') {
@@ -112,16 +107,12 @@ function reponse_confirmation($var_confirm = '') {
	if ($var_confirm == 'publie' OR $var_confirm == 'poubelle')
		return '';

	if (spip_connect()) {
		include_spip('inc/texte');
		include_spip('inc/filtres');

		// Eviter les doublons
		$lock = "petition $var_confirm";
		if (!spip_get_lock($lock, 5)) {
	if (!spip_connect()) {
		$confirm = _T('form_pet_probleme_technique');
		return '';
	}
		else {
	include_spip('inc/texte');
	include_spip('inc/filtres');

	// Suppression d'une signature par un moderateur ?
	// Cf. plugin notifications
@@ -137,78 +128,55 @@ function reponse_confirmation($var_confirm = '') {
			)) {
			spip_query("UPDATE spip_signatures SET statut='poubelle' WHERE id_signature=$id_signature");
			$confirm = _T('info_signature_supprimee');
				} else {
					$confirm = _T('info_signature_supprimee_erreur');
				}
		} else $confirm = _T('info_signature_supprimee_erreur');
		return '';
	}

	$r = sql_select('*', 'spip_signatures', "statut=" . _q($var_confirm), '', "1");

			$result_sign = sql_select('*', 'spip_signatures', "statut=" . _q($var_confirm));
	if (!spip_num_rows($r)) {
		$confirm = _T('form_pet_aucune_signature');
		return '';
	}

			if (spip_num_rows($result_sign) > 0) {
				while($row = sql_fetch($result_sign)) {
	$row = sql_fetch($r);
	$id_signature = $row['id_signature'];
	$id_article = $row['id_article'];
					$date_time = $row['date_time'];
					$nom_email = $row['nom_email'];
	$adresse_email = $row['ad_email'];
					$nom_site = $row['nom_site'];
	$url_site = $row['url_site'];
					$message = $row['message'];
					$statut = $row['statut'];
				}
				$result_petition = sql_select('*', 'spip_petitions', "id_article=$id_article");

				while ($row = sql_fetch($result_petition)) {
					$id_article = $row['id_article'];
					$email_unique = $row['email_unique'];
					$site_obli = $row['site_obli'];
					$site_unique = $row['site_unique'];
					$message_petition = $row['message'];
					$texte_petition = $row['texte'];
				}
	$r = sql_select('*', 'spip_petitions', "id_article=$id_article");
	$row = sql_fetch($r);

				if ($email_unique == "oui") {
					$result = sql_select('ad_email', 'spip_signatures', "id_article=$id_article AND ad_email=" . _q($adresse_email) . " AND statut='publie'");
					if (spip_num_rows($result) > 0) {
						$confirm= _T('form_pet_deja_signe');
						$refus = "oui";
					}
	$email_unique = $row['email_unique']  == "oui";
	$site_unique = $row['site_unique']  == "oui";
	$lock = false;

	if ($email_unique OR $site_unique) {

		$lock = "petition $id_article $adresse_email";
		if (!spip_get_lock($lock, 5))
			return  _T('form_pet_probleme_technique');
 
		if ($email_unique) {
			$r = sql_countsel('spip_signatures', "id_article=$id_article AND ad_email=" . _q($adresse_email) . " AND statut='publie'","","1");
			if ($r)  $confirm =  _T('form_pet_deja_signe');
		} 

				if ($site_unique == "oui") {
					$result = sql_select('statut', 'spip_signatures', "id_article=$id_article AND url_site=" . _q($url_site) . " AND statut='publie'");
					if (spip_num_rows($result) > 0) {
						$confirm= _T('form_pet_deja_enregistre');
						$refus = "oui";
		if ($site_unique) {
			$r = sql_countsel('spip_signatures', "id_article=$id_article AND url_site=" . _q($url_site) . " AND (statut='publie' OR statut='poubelle')",'','1');
			if ($r) $confirm = _T('form_pet_site_deja_enregistre');
		}
	}

				if ($refus == "oui") {
					$confirm= _T('form_deja_inscrit');
				}
				else {
					$statut = 'publie';
	if (!$confirm) spip_query("UPDATE spip_signatures SET statut='publie', date_time=NOW() WHERE id_signature=$id_signature");
	if ($lock) spip_release_lock($lock);
	if (!$confirm) {
		$confirm = _T('form_pet_signature_validee');

					spip_query("UPDATE spip_signatures SET statut="._q($statut).", date_time=NOW() WHERE id_signature="._q($id_signature));

		// invalider les pages ayant des boucles signatures
		include_spip('inc/invalideur');
		include_spip('inc/meta');
		suivre_invalideur("id='varia/pet$id_article'");
	
				}
			}
			else {
				$confirm= _T('form_pet_aucune_signature');
			}
			spip_release_lock($lock);
		}
	}
	else {
		$confirm= _T('form_pet_probleme_technique');
	}
}

@@ -224,66 +192,84 @@ function inc_controler_signature_dist($id_article, $nom_email, $adresse_email, $

	$envoyer_mail = charger_fonction('envoyer_mail','inc');

	$result_petition = sql_select('*', 'spip_petitions', "id_article=$id_article");

	if ($row = sql_fetch($result_petition)) {
		$email_unique = $row['email_unique'];
		$site_obli = $row['site_obli'];
		$site_unique = $row['site_unique'];
	}

	$texte = '';
	if (strlen($nom_email) < 2)
		$texte = _T('form_indiquer_nom');
		return _T('form_indiquer_nom');
	elseif ($adresse_email == _T('info_mail_fournisseur'))
		$texte = _T('form_indiquer_email');
		return _T('form_indiquer_email');
	elseif (!email_valide($adresse_email)) 
		$texte = _T('form_email_non_valide');
		return _T('form_email_non_valide');
	elseif (strlen(_request('nobot'))
	OR preg_match_all(',\bhref=[\'"]?http,i',$message)>2) {
		$texte = _T('form_pet_probleme_liens');
		OR (@preg_match_all(',\bhref=[\'"]?http,i', // bug PHP
				    $message 
				    # ,  PREG_PATTERN_ORDER
				   )
		    >2)) {
		#envoyer_mail('email_moderateur@example.tld', 'spam intercepte', var_export($_POST,1));
	} else {
		if ($email_unique == "oui") {
			$result = sql_select('statut', 'spip_signatures', "id_article=$id_article AND ad_email=" . _q($adresse_email) . " AND statut='publie'");
			if (spip_num_rows($result) > 0) 
				$texte = _T('form_pet_deja_signe');
		return _T('form_pet_probleme_liens');
	}
		if (!$texte AND $site_obli == "oui") {

	// tout le monde est la.

	$row = sql_fetch(sql_select('titre,lang', 'spip_articles', "id_article=$id_article"));
	$lang = lang_select($row['lang']);
	$titre = textebrut(typo($row['titre']));
	if ($lang) lang_select();

	$result_petition = sql_select('*', 'spip_petitions', "id_article=$id_article");

	if (!$row = sql_fetch($result_petition)) 
		return _T('form_pet_probleme_technique');

	if ($row['site_obli'] == "oui") {
		if (!strlen($nom_site)
		OR !vider_url($url_site)) {
				$texte = _T('form_indiquer_nom_site');
			return  _T('form_indiquer_nom_site');
		}
		include_spip('inc/sites');
			if (!$texte
			AND !recuperer_page($url_site, false, true, 0))
				$texte = _T('form_pet_url_invalide');
		if (!recuperer_page($url_site, false, true, 0))
			return _T('form_pet_url_invalide');
	}
		if (!$texte AND $site_unique == "oui") {
			$result = sql_select('statut', 'spip_signatures', "id_article=$id_article AND url_site=" . _q($url_site) . " AND (statut='publie' OR statut='poubelle')");
			if (spip_num_rows($result) > 0) {
				$texte = _T('form_pet_site_deja_enregistre');

	$email_unique = $row['email_unique']  == "oui";
	$site_unique = $row['site_unique']  == "oui";
	$lock = $msg = false;

	if ($email_unique OR $site_unique) {

		$lock = "petition $id_article $adresse_email";
		if (!spip_get_lock($lock, 5))
			return  _T('form_pet_probleme_technique');
 
		if ($email_unique) {
			$r = sql_countsel('spip_signatures', "id_article=$id_article AND ad_email=" . _q($adresse_email) . " AND statut='publie'","","1");
			if ($r)  $msg =  _T('form_pet_deja_signe');
		} 

		if ($site_unique) {
			$r = sql_countsel('spip_signatures', "id_article=$id_article AND url_site=" . _q($url_site) . " AND (statut='publie' OR statut='poubelle')",'','1');
			if ($r) $msg = _T('form_pet_site_deja_enregistre');
		}
	}
		if ($texte) return $texte;
	
	$passw = test_pass();
	if (!$msg)
		$id_signature = sql_insert('spip_signatures', "(id_article, date_time, statut)", "($id_article, NOW(), '$passw')");
 
		$row = sql_fetch(sql_select('titre,lang', 'spip_articles', "id_article=$id_article"));
		$l = lang_select($row['lang']);
		$titre = textebrut(typo($row['titre']));
		if ($l) lang_select();
	if ($lock) spip_release_lock($lock);
	if ($msg) return $msg;
	if (!$id_signature) return _T('form_pet_probleme_technique');

	// preparer l'url de confirmation
	$url = parametre_url($url_page,	'var_confirm',$passw,'&');
		if ($row['lang'] != $GLOBALS['meta']['langue_site'])
	if ($lang != $GLOBALS['meta']['langue_site'])
		  $url = parametre_url($url, "lang", $row['lang'],'&');
	$url .= "#sp$id_article";

	$messagex = _T('form_pet_mail_confirmation', array('titre' => $titre, 'nom_email' => $nom_email, 'nom_site' => $nom_site, 'url_site' => $url_site, 'url' => $url, 'message' => $message));

		if ($envoyer_mail($adresse_email, _T('form_pet_confirmation')." ".$titre, $messagex)) {
			$id_signature = sql_insert('spip_signatures', "(id_article, date_time, statut)", "($id_article, NOW(), '$passw')");
	if (!$envoyer_mail($adresse_email, _T('form_pet_confirmation')." ".$titre, $messagex)) 
		return _T('form_pet_probleme_technique');

	include_spip('inc/modifier');
	revision_signature($id_signature, array(
				'nom_email' => $nom_email,
@@ -292,13 +278,7 @@ function inc_controler_signature_dist($id_article, $nom_email, $adresse_email, $
				'nom_site' => $nom_site,
				'url_site' => $url_site
				));
			$texte = _T('form_pet_envoi_mail_confirmation');
		}
		else {
			$texte = _T('form_pet_probleme_technique');
		}
	}
	return $texte;
	return _T('form_pet_envoi_mail_confirmation');
}