From 5504708e3935e6514d0ecc56eec2b7f2c8667db3 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Tue, 8 Oct 2002 19:37:04 +0000
Subject: [PATCH] =?UTF-8?q?groupes=20d'utilisateurs=20(exp=C3=A9rimental)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/auteur_infos.php3      |   2 +
 ecrire/auteur_messagerie.php3 | 110 +++++++++++++++++++++---
 ecrire/auteurs_edit.php3      |   3 +-
 ecrire/groupes.php3           | 156 ++++++++++++++++++++++++++++++++++
 ecrire/inc_base.php3          |  20 ++++-
 ecrire/inc_presentation.php3  |   7 +-
 ecrire/inc_version.php3       |   2 +-
 7 files changed, 285 insertions(+), 15 deletions(-)
 create mode 100644 ecrire/groupes.php3

diff --git a/ecrire/auteur_infos.php3 b/ecrire/auteur_infos.php3
index 6976b7cc39..78f85af65e 100644
--- a/ecrire/auteur_infos.php3
+++ b/ecrire/auteur_infos.php3
@@ -5,6 +5,7 @@ include_ecrire ("inc_acces.php3");
 include_ecrire ("inc_logos.php3");
 include_ecrire ("inc_session.php3");
 include_ecrire ("inc_filtres.php3");
+include_ecrire ("inc_listes.php3");
 
 // securite
 $id_auteur = floor($id_auteur);
@@ -201,6 +202,7 @@ echo "<br><br><br>";
 gros_titre($auteur['nom']);
 
 if (($connect_statut == "0minirezo") OR $connect_id_auteur == $id_auteur) {
+	$statut_auteur=$auteur['statut'];
 	barre_onglets("auteur", "infos");
 }
 
diff --git a/ecrire/auteur_messagerie.php3 b/ecrire/auteur_messagerie.php3
index 215102d3b1..5ae56866a4 100644
--- a/ecrire/auteur_messagerie.php3
+++ b/ecrire/auteur_messagerie.php3
@@ -4,13 +4,7 @@ include ("inc.php3");
 include_ecrire ("inc_acces.php3");
 include_ecrire ("inc_index.php3");
 include_ecrire ("inc_logos.php3");
-
-
-function supp_auteur($id_auteur) {
-	$query="UPDATE spip_auteurs SET statut='5poubelle' WHERE id_auteur=$id_auteur";
-	$result=spip_query($query);
-}
-
+include_ecrire ("inc_listes.php3");
 
 function afficher_auteur_rubriques($leparent){
 	global $id_parent;
@@ -49,8 +43,6 @@ if ($connect_id_auteur == $id_auteur) {
 }
 
 
-
-
 $query = "SELECT * FROM spip_auteurs WHERE id_auteur='$id_auteur'";
 $result = spip_query($query);
 
@@ -68,7 +60,8 @@ if ($row = spip_fetch_array($result)) {
 	$pgp=$row["pgp"];
 	$messagerie=$row["messagerie"];
 	$imessage=$row["imessage"];
-
+	$abonne = $row['abonne'];
+	$abonne_pass = $row['abonne_pass'];
 
 if ($connect_id_auteur == $id_auteur) debut_page($nom_auteur, "redacteurs", "perso");
 else if (ereg("5poubelle",$statut)) debut_page("$nom_auteur","redacteurs","redac-poubelle");
@@ -80,7 +73,8 @@ else debut_page("$nom_auteur","redacteurs","redacteurs");
 echo "<br><br><br>";
 gros_titre($nom);
 
-if (($connect_statut == "0minirezo") OR $connect_id_auteur == $id_auteur) {
+if (($connect_statut == "0minirezo") OR ($connect_id_auteur == $id_auteur)) {
+	$statut_auteur=$statut;
 	barre_onglets("auteur", "messagerie");
 }
 
@@ -199,6 +193,100 @@ function mySel($varaut,$variable) {
 
 	echo "</form>";
 	}
+
+	//
+	// Listes de diffusion
+	//
+	if (($connect_id_auteur == $id_auteur) OR ($connect_statut == '0minirezo')) {
+		$res = get_listes($statut_auteur);
+		$nb_liste = mysql_num_rows($res);
+		if ($nb_liste > 0) {
+
+			echo "<FORM ACTION='auteur_messagerie.php3?id_auteur=$id_auteur' METHOD='post'>";
+			echo "<INPUT TYPE='Hidden' NAME='id_auteur' VALUE=\"$id_auteur\">";
+
+			debut_cadre_formulaire();
+		
+			echo "<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3 WIDTH=\"100%\">";
+			echo "<TR><TD BGCOLOR='$couleur_foncee' BACKGROUND='img_pack/rien.gif'><B><FONT FACE='Verdana,Arial,Helvetica,sans-serif' SIZE=3 COLOR='#FFFFFF'>Liste".(($nb_liste>1)?"s":"")." de diffusion</FONT></B>".aide ("listes")."</TD></TR>";
+			echo "<TR><TD BACKGROUND='img_pack/rien.gif'>";
+			echo "<FONT FACE='Verdana,Arial,Helvetica,sans-serif' SIZE=2>Vous pouvez vous inscrire aux listes suivantes :</FONT>";
+			echo "</TD></TR>";
+
+			$mes_abos = explode(",",$abonne);
+			$mes_abos_new = array();
+			while ($row = mysql_fetch_array($res)) {
+				$id_liste = $row['id_liste'];
+
+				// suis-je abonne ?
+				$abo = false;
+				while (list(,$id) = each($mes_abos))
+					if ($id == $id_liste)	// j'etais abonne
+						$abo = true;
+				$change_liste = "abo_liste$id_liste";
+				if ($$change_liste == 'oui') // je m'abonne
+					$abo = true;
+				else if ($$change_liste == 'non') // me desabonne
+					$abo = false;
+
+				if ($abo) $mes_abos_new[] = $id_liste;
+
+				if ($abo)
+					echo debut_cadre_relief();
+				else
+					echo debut_cadre_enfonce();
+
+				echo "<table width='100%'><tr><td valign='top'>\n";
+				echo "<FONT FACE='Verdana,Arial,Helvetica,sans-serif' SIZE=3 COLOR='#000000'>";
+				echo $row['titre'];
+				echo "</FONT><br>\n";
+				echo "<FONT FACE='Verdana,Arial,Helvetica,sans-serif' SIZE=2 COLOR='#000000'>";
+
+				echo "<p>".propre($row['descriptif'])."</p></font>\n</td><td valign='top'><FONT FACE='Verdana,Arial,Helvetica,sans-serif' SIZE=2>";
+
+				echo "<INPUT TYPE='radio' NAME='abo_liste$id_liste' VALUE='oui' id='on_liste$id_liste'";
+				if ($abo) echo " CHECKED><B>";
+				else echo ">";
+				echo " <label for='on_liste$id_liste'>Abonn&eacute;</label>";
+				if ($abo) echo "</B>";
+				echo "<BR><INPUT TYPE='radio' NAME='abo_liste$id_liste' VALUE='non' id='off_liste$id_liste'";
+				if (!$abo) echo " CHECKED><B>";
+				else echo ">";
+				echo " <label for='off_liste$id_liste'>D&eacute;sabonn&eacute;</label>";
+				if (!$abo) echo "</B>";
+
+				echo "</font></td></tr></table>\n";
+
+				if ($abo)
+					echo fin_cadre_relief();
+				else
+					echo fin_cadre_enfonce();
+			}
+
+			// maj de la base
+			$abonne_new = join(",", $mes_abos_new);
+			if ($abonne_new <> $abonne)
+				spip_query("UPDATE spip_auteurs SET abonne='$abonne_new' WHERE id_auteur=$id_auteur");
+
+			// gestion d'un mot de passe de listes
+			if ($abonne_pass == '')
+				$abonne_pass = substr(creer_uniqid(),0,8);
+			if ($abonne_pass)
+				spip_query("UPDATE spip_auteurs SET abonne_pass='$abonne_pass' WHERE id_auteur=$id_auteur");
+			if ((lire_meta('donner_abonne_pass') == 'oui') AND ($connect_id_auteur == $id_auteur))
+				echo propre("<small>Si le gestionnaire de listes vous demande un mot de passe, indiquez <code>$abonne_pass</code></small>");
+
+			echo "<DIV align='right'><INPUT TYPE='submit' CLASS='fondo' NAME='Valider' VALUE='Valider'></DIV>";
+
+			echo "</TABLE>\n";
+		}
+
+		fin_cadre_formulaire();
+
+	echo "</form>";
+	}
+
+
 }
 
 
diff --git a/ecrire/auteurs_edit.php3 b/ecrire/auteurs_edit.php3
index 5fbe4d4c13..09c614b167 100644
--- a/ecrire/auteurs_edit.php3
+++ b/ecrire/auteurs_edit.php3
@@ -4,7 +4,7 @@ include ("inc.php3");
 include_ecrire ("inc_acces.php3");
 include_ecrire ("inc_index.php3");
 include_ecrire ("inc_logos.php3");
-
+include_ecrire ("inc_listes.php3");
 
 function supp_auteur($id_auteur) {
 	$query="UPDATE spip_auteurs SET statut='5poubelle' WHERE id_auteur=$id_auteur";
@@ -71,6 +71,7 @@ echo "<br><br><br>";
 gros_titre($nom);
 
 if (($connect_statut == "0minirezo") OR $connect_id_auteur == $id_auteur) {
+	$statut_auteur=$statut;
 	barre_onglets("auteur", "auteur");
 }
 
diff --git a/ecrire/groupes.php3 b/ecrire/groupes.php3
new file mode 100644
index 0000000000..1323b029c8
--- /dev/null
+++ b/ecrire/groupes.php3
@@ -0,0 +1,156 @@
+<?php
+	include ("inc.php3");
+	include_ecrire ("inc_connect.php3");
+	include_ecrire ("inc_auth.php3");
+	include_ecrire ("inc_meta.php3");
+
+	if ((lire_meta("mailing_list_manager") == $connect_id_auteur)
+	OR ($connect_statut == '0minirezo'))
+	{
+		if ($show_list) {
+			@header("Content-Type: text/plain");
+
+			// la liste est donnee par son numero ou par son titre
+			if (! ereg("^[0-9]+$", $show_list)) {
+				$res = spip_query("SELECT id_liste FROM spip_listes WHERE titre='".addslashes($show_list)."' LIMIT 0,1");
+				if ($row = spip_fetch_array($res))
+					$show_list = $row['id_liste'];
+				else {
+					@Header("Content-Type: text/plain");
+					echo "\t\t// No list by that name : $show_list\n";
+					exit;
+				}
+			}
+
+			$query = "SELECT auteurs.* FROM spip_auteurs AS auteurs, spip_listes AS listes WHERE FIND_IN_SET(auteurs.statut, listes.droits) AND FIND_IN_SET($show_list,auteurs.abonne) AND id_liste=$show_list";
+			$res = spip_query($query);
+			if ($res AND (spip_num_rows($res) > 0)) {
+				if ($format=='sendmail')
+					@header("Content-Type: text/plain");
+
+				while ($row = spip_fetch_array($res))
+					if (email_valide($row['email'])) {
+						$nom = $row['nom']; // a sanitizer !
+						$passliste = $row['abonne_pass']; // idem !
+						if ($format == 'sendmail')
+							echo "$nom <".$row['email'].">";
+						else
+							echo $row['email']."\t$passliste\t<a href='auteur_messagerie.php3?id_auteur=".$row['id_auteur']."'>$nom</a><br>";
+
+						echo "\n";
+						$subs ++;
+					}
+				if ($format == 'sendmail') {}
+				else
+					echo "\t\t // $subs subscriber(s)\n";
+			} else
+				echo "\t\t// 0 subscriber, empty list\n";
+			exit;
+		}
+		else {
+			// traiter les elements POSTes
+			$lien = $clean_link;
+			if ($modif_liste == 'oui') {
+				modifier_liste($id_liste, $titre, $descriptif, $droits, $statut);
+				$lien->addVar('modif_liste', 'non');
+			}
+
+			if ($creer_liste == 'oui') {
+				$query = "INSERT INTO spip_listes
+					(titre, descriptif, droits, statut) VALUES
+					('Nouvelle liste', '', '0minirezo,1comite', 'prepa')";
+				spip_query($query);
+				$lien->addVar('creer_liste', 'non');
+			}
+
+			if ($HTTP_POST_VARS) {
+				@Header("Location: ".$lien->getUrl());
+				exit;
+			}
+
+			// afficher la liste des listes connues de spip
+			debut_page("Gestion de listes de diffusion");
+			debut_gauche();
+			debut_droite();
+			gros_titre("Listes de diffusion");
+
+			echo "<p>" . propre("{{Ceci est une fonctionnalit&eacute;
+			exp&eacute;rimentale:}} SPIP peut fabriquer des listes de
+			diffusion pr&ecirc;tes &agrave; injecter dans un serveur de
+			listes.") . aide("liste") . "<p>" . propre("Il vous faut pour
+			cela:\n-# Cr&eacute;er un administrateur d&eacute;di&eacute;
+			disposant d'un login et d'un mot de passe (on peut r&eacute;gler
+			sa messagerie sur &laquo;ne pas appara&icirc;tre sur la liste
+			des auteurs connect&eacute;s&raquo;...)\n-# Indiquer ci-dessous
+			la configuration des listes;\n-# Tester la fabrication, par
+			SPIP, des fichiers contenant les listes d'abonn&eacute;s;\n-#
+			Configurer votre gestionnaire de listes pour qu'il accepte de
+			lire ces fichiers.");
+
+			// liste des listes
+			$result = spip_query("SELECT * FROM spip_listes");
+			if (spip_num_rows($result) == 0)
+				echo "\n<p>". propre("{{Ce site ne propose pas de listes de diffusion.}}");
+			else while ($row = spip_fetch_array($result)) {
+				if ($row['statut'] == 'prepa')
+					debut_cadre_enfonce();
+				else
+					debut_cadre_relief();
+				$lien = $GLOBALS['clean_link'];
+				$lien->addVar('id_liste', $row['id_liste']);
+				$lien->addVar('modif_liste', 'oui');
+				echo "\n".$lien->getForm('post');
+				echo "<table width='100%'><tr><td valign='top'>\n";
+				echo "<b>".$row['id_liste']."</b> - adresse de la liste :\n";
+				echo "<br><input type='text' name='titre' value='".entites_html($row['titre'])."'>\n";
+				list($selected_tous,$selected_admin) = ($row['droits']<>'0minirezo') ? array("SELECTED","") : array("","SELECTED");
+				echo "<br>Qui peut s'inscrire :<br><select name='droits'><OPTION VALUE='0minirezo,1comite' $selected_tous>Tous les auteurs\n<OPTION VALUE='0minirezo' $selected_admin>Les administrateurs uniquement\n</select>";
+				list($selected_prepa,$selected_publie) = ($row['statut']<>'publie') ? array("SELECTED","") : array("","SELECTED");
+				echo "<br>Statut :<br><select name='statut'><OPTION VALUE='prepa' $selected_prepa>en pr&eacute;paration\n<OPTION VALUE='publie' $selected_publie>active\n</select>";
+				if (!email_valide($row['titre']))
+					echo "<p><font color='red' size='-1'>> Cette liste ne pourra &ecirc;tre active que lorsque que vous aurez indiqu&eacute; une adresse email valide.</font>\n";
+				echo "</td><td valign='top'>Descriptif : ".propre($row['descriptif']);
+				echo "<br><input type='text' name='descriptif' value='".entites_html($row['descriptif'])."'>\n";
+
+				$lien = $clean_link;
+				$lien->addVar('show_list', $row['id_liste']);
+				
+				echo "<p><small><a href='".$lien->getUrl()."'>Voir les abonn&eacute;s.</a></small>";
+
+				echo "</td></tr><tr><td valign='top'></td>\n";
+				echo "<td valign='top'>";
+
+				echo "<div align='right'><input type='submit' name='Modifier' value='Modifier' class='fondo'></div></td></tr></table>\n";
+				echo "</form>\n";
+
+				if ($row['statut'] == 'prepa')
+					fin_cadre_enfonce();
+				else
+					fin_cadre_relief();
+			}
+
+			// bouton creation nouvelle liste
+			$lien = $GLOBALS['clean_link'];
+			$lien->addVar('creer_liste', 'oui');
+			echo "\n".$lien->getForm('post');
+			echo "<div align='right'><input type='submit' name='creer'
+				value='Ajouter une liste' class='fondo'></div></form>\n";
+			fin_page();			
+		}
+	}
+	else {
+		echo "Vous n'avez pas acc&egrave;s &agrave; ces donn&eacute;es.";
+	}
+
+	function modifier_liste($id_liste, $titre, $descriptif, $droits, $statut) {
+		if (!email_valide($titre))
+			$statut = 'prepa';
+		$titre = addslashes(corriger_caracteres($titre));
+		$descriptif = addslashes(corriger_caracteres($descriptif));
+		if ($droits <> '0minirezo') $droits = '0minirezo,1comite';
+		if ($statut <> 'publie') $statut = 'prepa';
+		settype($id_liste, 'integer');
+		spip_query("UPDATE spip_listes SET titre='$titre', descriptif='$descriptif', droits='$droits', statut='$statut' WHERE id_liste=$id_liste");
+	}
+
+?>
\ No newline at end of file
diff --git a/ecrire/inc_base.php3 b/ecrire/inc_base.php3
index 01acc1537d..085996dcdc 100644
--- a/ecrire/inc_base.php3
+++ b/ecrire/inc_base.php3
@@ -62,6 +62,8 @@ function creer_base() {
 		alea_actuel tinytext NOT NULL,
 		alea_futur tinytext NOT NULL,
 		prefs tinytext NOT NULL,
+		abonne text NOT NULL,
+		abonne_pass tinytext NOT NULL,
 		cookie_oubli tinytext NOT NULL,
 		source VARCHAR(10) DEFAULT 'spip' NOT NULL,
 		PRIMARY KEY (id_auteur),
@@ -212,7 +214,6 @@ function creer_base() {
 		KEY url (url))";
 	$result = spip_query($query);
 
-
 	//
 	// Elements interactifs
 	//
@@ -271,6 +272,17 @@ function creer_base() {
 		KEY statut(statut))";
 	$result = spip_query($query);
 
+	$query = "CREATE TABLE spip_listes (
+		id_liste bigint(21) DEFAULT '0' NOT NULL auto_increment,
+		titre text NOT NULL,
+		statut VARCHAR(10) NOT NULL,
+		descriptif blob NOT NULL,
+		droits text NOT NULL,
+		maj TIMESTAMP,
+		KEY id_liste (id_liste)
+		)";
+	$result = spip_query($query);
+
 	$query = "CREATE TABLE spip_visites_temp (
 		ip INTEGER UNSIGNED NOT NULL,
 		type ENUM('article', 'rubrique', 'breve', 'autre') NOT NULL,
@@ -1042,6 +1054,12 @@ function maj_base() {
 		spip_query("ALTER TABLE spip_auteurs ADD source VARCHAR(10) DEFAULT 'spip' NOT NULL");
 	}
 
+	if ($version_installee < 1.467) {
+		// gestion de listes de diff
+		spip_query("ALTER TABLE spip_auteurs ADD abonne TEXT NOT NULL");
+		spip_query("ALTER TABLE spip_auteurs ADD abonne_pass TINYTEXT NOT NULL");
+	}
+
 	//
 	// Mettre a jour le numero de version installee
 	//
diff --git a/ecrire/inc_presentation.php3 b/ecrire/inc_presentation.php3
index b993fd927b..e4a6d29363 100644
--- a/ecrire/inc_presentation.php3
+++ b/ecrire/inc_presentation.php3
@@ -941,7 +941,7 @@ function onglet($texte, $lien, $onglet_ref, $onglet, $icone=""){
 
 
 function barre_onglets($rubrique, $onglet){
-	global $id_auteur, $connect_id_auteur;
+	global $id_auteur, $connect_id_auteur, $connect_statut, $statut_auteur;
 
 	debut_onglet();
 	
@@ -967,6 +967,11 @@ function barre_onglets($rubrique, $onglet){
 		onglet("Informations personnelles", "auteur_infos.php3?id_auteur=$id_auteur", "infos", $onglet, "fiche-perso-24.gif");
 		if ($activer_messagerie!="non" AND $connect_id_auteur == $id_auteur){
 			onglet("Messagerie", "auteur_messagerie.php3?id_auteur=$id_auteur", "messagerie", $onglet, "messagerie-24.gif");
+		} else if ($connect_statut == '0minirezo') { // voir s'il y a des listes
+			$res = get_listes ($statut_auteur);
+			$nb_liste = mysql_num_rows($res);
+			if ($nb_liste>0)
+				onglet("Liste" . (($nb_liste>1)?"s":"") ." de diffusion", "auteur_messagerie.php3?id_auteur=$id_auteur", "messagerie", $onglet, "messagerie-24.gif");
 		}
 		//onglet("Donn&eacute;es de connexion", "auteur_connexion.php3?id_auteur=$id_auteur", "connexion", $onglet, "base-24.gif");
 	}
diff --git a/ecrire/inc_version.php3 b/ecrire/inc_version.php3
index 8156899134..3e15cd911d 100644
--- a/ecrire/inc_version.php3
+++ b/ecrire/inc_version.php3
@@ -12,7 +12,7 @@ define("_ECRIRE_INC_VERSION", "1");
 //
 
 // version de la base
-$spip_version = 1.466;
+$spip_version = 1.467;
 
 // version de spip
 // (mettre a jour a la main et conserver la mention "CVS")
-- 
GitLab