From 39884f2e02b6bc3e6fcd7056f6bd154f066c6522 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Thu, 4 Sep 2008 14:37:37 +0000
Subject: [PATCH] distinguer editer et instituer auteur et ne pas ecraser
 l'email lorsqu'il n'est pas editable (#1503)

---
 .gitattributes                     |  1 +
 ecrire/action/editer_auteur.php    | 90 ++++++++++++++++++++++++++----
 ecrire/action/instituer_auteur.php | 34 +++++++++++
 ecrire/inc/auteur_infos.php        |  2 +-
 4 files changed, 115 insertions(+), 12 deletions(-)
 create mode 100644 ecrire/action/instituer_auteur.php

diff --git a/.gitattributes b/.gitattributes
index 2d68bba543..0840c9a502 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -75,6 +75,7 @@ ecrire/action/export_all.php -text
 ecrire/action/iconifier.php -text
 ecrire/action/index.php -text
 ecrire/action/instituer_article.php -text
+ecrire/action/instituer_auteur.php -text
 ecrire/action/instituer_breve.php -text
 ecrire/action/instituer_collaboration.php -text
 ecrire/action/instituer_forum.php -text
diff --git a/ecrire/action/editer_auteur.php b/ecrire/action/editer_auteur.php
index 1733ee8109..6591d3704e 100644
--- a/ecrire/action/editer_auteur.php
+++ b/ecrire/action/editer_auteur.php
@@ -40,7 +40,7 @@ function action_editer_auteur_dist() {
 			_request('restreintes'),
 			$r[0]);
 
-			if ($echec) {
+			if ($echec AND $redirect) {
 		// revenir au formulaire de saisie
 				$ret = !$redirect
 				? '' 
@@ -48,11 +48,6 @@ function action_editer_auteur_dist() {
 				spip_log("echec editeur auteur: " . join(' ',$echec));
 				$echec = '&echec=' . join('@@@', $echec);
 				$redirect = generer_url_ecrire('auteur_infos',"id_auteur=$id_auteur$echec$ret",'&');
-			} else {
-			// modif: renvoyer le resultat ou a nouveau le formulaire si erreur
-				if (!$redirect)
-					$redirect = generer_url_ecrire("auteur_infos", "id_auteur=$id_auteur", '&', true);
-				else $redirect = rawurldecode($redirect);
 			}
 	}
 	if ($redirect) {
@@ -147,7 +142,7 @@ function action_legender_auteur_post($statut, $nom, $email, $bio, $nom_site_aute
 
 	// Seuls les admins peuvent modifier le mail
 	// les admins restreints ne peuvent modifier celui des autres admins
-	if (autoriser('modifier', 'auteur', $id_auteur, NULL, array('mail'=>1))) {
+	if ($email!==null AND autoriser('modifier', 'auteur', $id_auteur, NULL, array('mail'=>1))) {
 		$email = trim($email);
 		if ($email !='' AND !email_valide($email)) {
 			$echec[]= 'info_email_invalide';
@@ -213,9 +208,40 @@ function action_legender_auteur_post($statut, $nom, $email, $bio, $nom_site_aute
 		sql_insertq('spip_auteurs_articles', array('id_article' => $id_article, 'id_auteur' =>$id_auteur));
 	}
 
-	// Modifier en base (declenche les notifications etc.)
-	instituer_auteur($id_auteur, $c);
+	// Envoyer aux plugins
+	$champs = pipeline('pre_edition',
+		array(
+			'args' => array(
+				'table' => 'spip_auteurs',
+				'id_objet' => $id_auteur
+			),
+			'data' => $c
+		)
+	);
 
+	include_spip('inc/modifier');
+	revision_auteur($id_auteur, $champs);
+	
+	// Invalider les caches
+	include_spip('inc/invalideur');
+	suivre_invalideur("id='id_auteur/$id_auteur'");
+	
+	// Pipeline
+	pipeline('post_edition',
+		array(
+			'args' => array(
+				'table' => 'spip_auteurs',
+				'id_objet' => $id_auteur
+			),
+			'data' => $champs
+		)
+	);
+
+	// Notifications
+	if ($notifications = charger_fonction('notifications', 'inc')) {
+		$notifications('editerauteur', $id_auteur, $champs);
+	}
+	
 	return array($id_auteur, $echec);
 }
 
@@ -224,11 +250,53 @@ function action_legender_auteur_post($statut, $nom, $email, $bio, $nom_site_aute
 function instituer_auteur($id_auteur, $c) {
 	if (!$id_auteur=intval($id_auteur))
 		return false;
-
+	$champs = array();
+	
+	$statut =	$statut_ancien = sql_getfetsel('statut','spip_auteurs','id_auteur='.intval($id_auteur));
+	
 	if (isset($c['statut']))
-		sql_updateq('spip_auteurs', array('statut' => $c['statut']), 'id_auteur='.$id_auteur);
+		$statut = $champs['statut'] = $c['statut'];
+	
+	// Envoyer aux plugins
+	$champs = pipeline('pre_edition',
+		array(
+			'args' => array(
+				'table' => 'spip_auteurs',
+				'id_objet' => $id_auteur
+			),
+			'data' => $champs
+		)
+	);
 
+	if (!count($champs)) return;
+	sql_updateq('spip_auteurs', $champs , 'id_auteur='.$id_auteur);
+	include_spip('inc/modifier');
 	revision_auteur($id_auteur, $c);
+	
+	// Invalider les caches
+	include_spip('inc/invalideur');
+	suivre_invalideur("id='id_auteur/$id_auteur'");
+	
+	// Pipeline
+	pipeline('post_edition',
+		array(
+			'args' => array(
+				'table' => 'spip_auteurs',
+				'id_objet' => $id_auteur
+			),
+			'data' => $champs
+		)
+	);
+
+	// Notifications
+	if ($notifications = charger_fonction('notifications', 'inc')) {
+		$notifications('instituerauteur', $id_auteur,
+			array('statut' => $statut, 'statut_ancien' => $statut_ancien)
+		);
+	}
+
+	return ''; // pas d'erreur
+
 }
 
 ?>
diff --git a/ecrire/action/instituer_auteur.php b/ecrire/action/instituer_auteur.php
new file mode 100644
index 0000000000..aa0c36d44b
--- /dev/null
+++ b/ecrire/action/instituer_auteur.php
@@ -0,0 +1,34 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2008                                                *
+ *  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 action_instituer_auteur_dist() {
+
+	$securiser_action = charger_fonction('securiser_action', 'inc');
+	$arg = $securiser_action();
+
+	list($id_auteur, $statut) = preg_split('/\W/', $arg);
+	if (!$statut) $statut = _request('statut'); // cas POST
+	if (!$statut) return; // impossible mais sait-on jamais
+
+	$id_auteur = intval($id_auteur);
+
+	include_spip('action/editer_auteur');
+
+	$c = array('statut' => $statut);
+
+	instituer_auteur($id_auteur, $c);
+
+}
+
+?>
diff --git a/ecrire/inc/auteur_infos.php b/ecrire/inc/auteur_infos.php
index 39321adf26..6fb976785e 100644
--- a/ecrire/inc/auteur_infos.php
+++ b/ecrire/inc/auteur_infos.php
@@ -34,7 +34,7 @@ function inc_auteur_infos_dist($auteur, $new, $echec, $edit, $id_article, $redir
 			$bloc_statut = $instituer_auteur($auteur);
 			if ($bloc_statut) {
 				$bloc_statut .= "<div style='text-align: right'><input type='submit' value='"._T('bouton_enregistrer')."' class='fondo' /></div>";
-				$bloc_statut =  generer_action_auteur('editer_auteur', $id_auteur, $redirect, $bloc_statut, ' method="post"');
+				$bloc_statut =  generer_action_auteur('instituer_auteur', $id_auteur, self(), $bloc_statut, ' method="post"');
 			}
 		} else {
 			$bloc_statut = "";
-- 
GitLab