From c5179f2a4a27dfe9e852a22b10c60ddeb4269ce7 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Thu, 9 Sep 2010 16:20:03 +0000
Subject: [PATCH] gestion des droits de webmestre : etre un peu plus smart avec
 les utilisateurs.

Lorsqu'un define force les droits de webmestre, l'indiquer sur sa fiche perso (si on ne l'est pas) ou lors de la tentative d'edition des statuts d'un admin (si on l'est)
Si on n'est pas webmestre et que ce n'est pas gere par un define, un bouton 'Me donner les droits de webmestre' permet de se promouvoir avec verification par FTP sans avoir a refaire l'installation.
---
 .gitattributes                   |  1 +
 ecrire/action/editer_auteur.php  |  4 +--
 ecrire/action/etre_webmestre.php | 47 ++++++++++++++++++++++++++++++++
 ecrire/inc/instituer_auteur.php  | 39 +++++++++++++++++---------
 ecrire/lang/ecrire_fr.php        |  3 ++
 5 files changed, 79 insertions(+), 15 deletions(-)
 create mode 100644 ecrire/action/etre_webmestre.php

diff --git a/.gitattributes b/.gitattributes
index 85576dd377..e56fa239f9 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -27,6 +27,7 @@ ecrire/action/editer_mot.php -text
 ecrire/action/editer_mots.php -text
 ecrire/action/editer_rubrique.php -text
 ecrire/action/editer_site.php -text
+ecrire/action/etre_webmestre.php -text
 ecrire/action/export_all.php -text
 ecrire/action/iconifier.php -text
 ecrire/action/index.php -text
diff --git a/ecrire/action/editer_auteur.php b/ecrire/action/editer_auteur.php
index fc4346a8a4..945ce4a73b 100644
--- a/ecrire/action/editer_auteur.php
+++ b/ecrire/action/editer_auteur.php
@@ -152,7 +152,7 @@ function auteur_referent($id_auteur,$c){
 }
 
 // http://doc.spip.org/@instituer_auteur
-function instituer_auteur($id_auteur, $c) {
+function instituer_auteur($id_auteur, $c, $force_webmestre = false) {
 	if (!$id_auteur=intval($id_auteur))
 		return false;
 	// commencer par traiter les cas particuliers des logins et pass
@@ -184,7 +184,7 @@ function instituer_auteur($id_auteur, $c) {
 			$c['restreintes'] = array($c['id_parent']);
 	}
 
-	if (isset($c['webmestre']) AND autoriser('modifier', 'auteur', $id_auteur,null, array('webmestre' => '?')))
+	if (isset($c['webmestre']) AND ($force_webmestre OR autoriser('modifier', 'auteur', $id_auteur,null, array('webmestre' => '?'))))
 		$champs['webmestre'] = $c['webmestre']=='oui'?'oui':'non';
 	
 	// Envoyer aux plugins
diff --git a/ecrire/action/etre_webmestre.php b/ecrire/action/etre_webmestre.php
new file mode 100644
index 0000000000..f8f6552340
--- /dev/null
+++ b/ecrire/action/etre_webmestre.php
@@ -0,0 +1,47 @@
+<?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;
+
+include_spip('inc/actions');
+
+/**
+ * Prouver qu'on a les droits de webmestre via un ftp, et
+ * devenir webmestre sans refaire l'install
+ * @return <type>
+ */
+function action_etre_webmestre_dist() {
+	$securiser_action = charger_fonction('securiser_action', 'inc');
+	$time = $securiser_action();
+
+	if (time()-$time<15*60
+		AND $GLOBALS['visiteur_session']['statut']=='0minirezo'
+		AND $GLOBALS['visiteur_session']['webmestre']!=='oui') {
+		$action = _T('info_admin_etre_webmestre');
+		$admin = charger_fonction('admin', 'inc');
+		// lance la verif par ftp et l'appel
+		// a base_etre_webmestre_dist quand c'est OK
+		if ($r = $admin('etre_webmestre', $action)) {
+			echo $r;
+			exit;
+		}
+	}
+
+}
+
+function base_etre_webmestre_dist() {
+	if ($GLOBALS['visiteur_session']['statut']=='0minirezo' AND $GLOBALS['visiteur_session']['webmestre']!=='oui') {
+		include_spip('action/editer_auteur');
+		instituer_auteur($GLOBALS['visiteur_session']['id_auteur'], array('webmestre'=>'oui'), true);
+	}
+}
+?>
diff --git a/ecrire/inc/instituer_auteur.php b/ecrire/inc/instituer_auteur.php
index 07226b9e9e..f1f1947094 100644
--- a/ecrire/inc/instituer_auteur.php
+++ b/ecrire/inc/instituer_auteur.php
@@ -21,7 +21,7 @@ include_spip('inc/autoriser');
 
 //  affiche le statut de l'auteur dans l'espace prive
 // les admins voient et peuvent modifier les droits d'un auteur
-// les admins restreints les voient mais 
+// les admins restreints les voient mais
 // ne peuvent les utiliser que pour mettre un auteur a la poubelle
 
 // http://doc.spip.org/@inc_instituer_auteur_dist
@@ -41,9 +41,9 @@ function inc_instituer_auteur_dist($auteur, $modif = true) {
 	$res = "<$label>" . _T('info_statut_auteur')."</$label> " . $menu;
 
 	if ($modif)
-		$res .= editer_choix_webmestre($auteur);
+		$res .= "<div>".editer_choix_webmestre($auteur)."</div>";
 	else
-		$res .= afficher_webmestre($auteur);
+		$res .= (($w=afficher_webmestre($auteur))?" ($w)":"");
 
 	// Prepare le bloc des rubriques pour les admins eventuellement restreints ;
 	// si l'auteur n'est pas '0minirezo', on le cache, pour pouvoir le reveler
@@ -65,23 +65,36 @@ function inc_instituer_auteur_dist($auteur, $modif = true) {
 
 function afficher_webmestre($auteur){
 	if (autoriser('webmestre','',0,$auteur['id_auteur']))
-		return "<p>"._L("Cet administrateur est <b>webmestre</b>")."</p>";
+		if ($auteur['id_auteur']==$GLOBALS['visiteur_session']['id_auteur'])
+			return _T("info_admin_je_suis_webmestre");
+		else
+			return _T("info_admin_webmestre");
+
+	// si c'est ma fiche perso, en dire un peu plus
+	if ($auteur['id_auteur']==$GLOBALS['visiteur_session']['id_auteur']) {
+		if (defined('_ID_WEBMESTRES'))
+			return _T('info_webmestre_forces',array('file_options'=>basename(_FILE_OPTIONS)));
+		else
+			return bouton_action (_T('info_admin_etre_webmestre'), generer_action_auteur('etre_webmestre', time(), self()));
+	}
 	return "";
 }
 
 function editer_choix_webmestre($auteur){
 	$res = "";
-	$style = "";
+	$style = "";	
 	if (!autoriser('modifier', 'auteur', $auteur['id_auteur'],
 	null, array('webmestre' => '?'))){
 		$res =  afficher_webmestre($auteur);
+		if (defined('_ID_WEBMESTRES'))
+			$res .= ' '._T('info_webmestre_forces',array('file_options'=>basename(_FILE_OPTIONS)));
 	}
 	else {
 		$res = "<input type='checkbox' class='checkbox' name='webmestre' id='webmestre' value='oui'"
 			. ($auteur['webmestre']=='oui'?" checked='checked'":"")
 			. " />"
 			. "<label for='webmestre'>"
-			. _L("Donner a cet administrateur les droits de webmestre")
+			. _T("info_admin_statuer_webmestre")
 			. "</label>";
 
 		$res .= "<input type='hidden' name='saisie_webmestre' value='1' />";
@@ -101,14 +114,14 @@ function traduire_statut_auteur($statut){
 		       );
 	if (isset($recom[$statut]))
 		return $recom[$statut];
-	
+
 	// retrouver directement par le statut sinon
 	if ($t = array_search($statut, $GLOBALS['liste_des_statuts'])){
 	  if (isset($recom[$t]))
 			return $recom[$t];
 		return $t;
 	}
-	
+
 	return '';
 }
 
@@ -121,7 +134,7 @@ function choix_statut_auteur($statut, $id_auteur, $ancre) {
 	null, array('statut' => '?')))
 		return '';
 
-	// A-t-on le droit de promouvoir cet auteur comme admin 
+	// A-t-on le droit de promouvoir cet auteur comme admin
 	// et y a-t-il des visiteurs ?
 
 	$droits = $GLOBALS['liste_des_statuts'];
@@ -157,7 +170,7 @@ function choix_statut_auteur($statut, $id_auteur, $ancre) {
 		$menu .= mySel('nouveau',$statut,_T('info_statut_auteur_a_confirmer'));
 
 	$statut_rubrique = str_replace(',', '|', _STATUT_AUTEUR_RUBRIQUE);
-	return "<select class='select fondl' name='statut' id='statut' size='1'
+	return "<select class='select' name='statut' id='statut' size='1'
 		onchange=\"(this.options[this.selectedIndex].value.match(/^($statut_rubrique)\$/))?jQuery('#$ancre:hidden').slideDown():jQuery('#$ancre:visible').slideUp();"
 	. "(this.options[this.selectedIndex].value=='0minirezo')?jQuery('#choix-webmestre:hidden').slideDown():jQuery('#choix-webmestre:visible').slideUp();\">"
 	. $menu
@@ -175,7 +188,7 @@ function afficher_rubriques_admin_restreintes($auteur, $modif = true){
 
 	$id_auteur = intval($auteur['id_auteur']);
 
-	$result = sql_select("R.id_rubrique, " . sql_multi ("titre", $spip_lang), "spip_auteurs_rubriques AS L LEFT JOIN spip_rubriques AS R ON L.id_rubrique=R.id_rubrique", "L.id_auteur=$id_auteur", "", "multi");
+	$result = sql_select("rubriques.id_rubrique, " . sql_multi ("titre", $spip_lang) . "", "spip_auteurs_rubriques AS lien LEFT JOIN spip_rubriques AS rubriques ON lien.id_rubrique=rubriques.id_rubrique", "lien.id_auteur=$id_auteur", "", "multi");
 
 	$menu = $restreint = '';
 	// L'autorisation de modifier les rubriques restreintes
@@ -200,7 +213,7 @@ function afficher_rubriques_admin_restreintes($auteur, $modif = true){
 	} else {
 
 		$menu =  "<ul id='liste_rubriques_restreintes' style='list-style-image: url("
-			. chemin_image("rubrique-12.png")
+			. chemin_image("rubrique-12.gif")
 			. ")'>"
 			. $restreint
 			. "</ul>\n";
@@ -238,7 +251,7 @@ function choix_rubriques_admin_restreint($auteur, $modif=true) {
 		$res .= debut_block_depliable(true,"statut$id_auteur")
 		. "\n<div id='ajax_rubrique' class='arial1'>\n"
 		. "<b>"
-		. $label 
+		. $label
 		. "</b>"
 		. "\n<input name='id_auteur' value='"
 		. $id_auteur
diff --git a/ecrire/lang/ecrire_fr.php b/ecrire/lang/ecrire_fr.php
index fdb50b57ec..d7ce58d24f 100644
--- a/ecrire/lang/ecrire_fr.php
+++ b/ecrire/lang/ecrire_fr.php
@@ -287,6 +287,8 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 'info_admin_gere_rubriques' => 'Cet administrateur g&egrave;re les rubriques suivantes :',
 'info_admin_gere_toutes_rubriques' => 'Cet administrateur g&egrave;re <b>toutes les rubriques</b>.',
 'info_admin_statuer_webmestre' => 'Donner &agrave; cet administrateur les droits de webmestre',
+'info_admin_etre_webmestre' => 'Me donner les droits de webmestre',
+'info_admin_je_suis_webmestre' => 'Je suis <b>webmestre</b>',
 'info_admin_webmestre' => 'Cet administrateur est <b>webmestre</b>',
 'info_administrateur' => 'Administrateur',
 'info_administrateur_1' => 'Administrateur',
@@ -712,6 +714,7 @@ exige d\'avoir un acc&egrave;s FTP au site Web.</p>',
 Les traductions sont associ&eacute;es &agrave; l\'original,
 dans une couleur qui indique leur &eacute;tat&nbsp;:',
 'info_travail_colaboratif' => 'Travail collaboratif sur les articles',
+'info_webmestre_forces' => 'Les webmestres sont actuellement d&eacute;finis dans <tt>@file_options@</tt>.',
 'info_un_article' => 'un article,',
 'info_un_mot' => 'Un seul mot &agrave; la fois',
 'info_un_site' => 'un site,',
-- 
GitLab