Aide à la gestion d'un grand nombre de listes

On peut être amené à gérer/modérer un grand nombre de listes de courriel (mailing lists). Pour chacune, un mot de passe administrateur est défini, soit le même pour toutes, soit de façon différente pour chacune. Cette dernière solution est indispensable si l'administration des listes est partagée entre divers administrateurs, n'ayant pas tous accès à toutes les listes.

le support des données

Le principe est simplement une page HTML contenant du JavaScript, page à ne pas partager et à conserver uniquement sur l'ordinateur de l'administrateur d'un ensemble de listes car cette page contient les mots de passe.

Elle propose un lien vers chacune des pages d'administration de chacune des listes et copie dans le presse-papier le mot de passe de la liste. Lors de l'identification de l'administrateur, un simple coller suffira.


<!DOCTYPE html>
<html>
<script >
var racineURL = "https://mon.server.de.mail.tld/cgi-bin/mailman/admin/" ;
var listes = {
	"<h2>Association n°1</h2>" : "",
	
	"Adherents-Asso1" : "pwd",
	"Sympa-Asso1" : "pwd",
	"Bureau-Asso1" : "pwd",

//	...
	
	"<h2>Association n°2</h2>" : "",
	
	"Adherents-Asso2" : "pwd",
	"ca-Asso2" : "pwd",

//	...	
	
	} ;

Dans ce premier script, on peut voir l'URL du gestionnaire de liste, ici Mailman, et un tableau associatif dont chaque ligne est composée du nom de la liste et de de son mot de passe séparés par :

Certains noms de liste commencent par <h : ce sont de faux noms de liste qui permettent de mettre des séparateurs et de répéter le bouton . Cette page donne un exemple du résultat

les fonctions JavaScript

La fonction getRadioVal() suivante est extraite de Dynamic Web Coding

function getRadioVal(form, name)
{
    var val;
    // get list of radio buttons with specified name
    var radios = form.elements[name];    
    // loop through list of radio buttons
    for (var i=0, len=radios.length; i<len; i++) {
        if ( radios[i].checked ) { // radio checked?
            val = radios[i].id; // if so, hold its value in val
            break; // and break out of for loop
        }
    }
    return val; // return value of checked radio or undefined if none checked
}

La fonction ouvrir ajoute provisoirement un champ t à la page, y inscrit le mot de passe avant de sélectionner le contenu de ce champ t, copier sa valeur, soit le mot de passe, dans le presse-papier puis supprimer ce champ.
Pour finir, elle ouvre la fenêtre de la page de gestion de la liste.


function ouvrir (c)
{
	var liste = getRadioVal(c, "choisi" );
	var t = document.createElement('TEXTAREA')
		t.textContent = listes [liste];
		document.body.appendChild(t);
  		t.select();
  		document.execCommand('copy');
  		t.parentNode.removeChild(t);
   var url = racineURL + liste;
   window.open(url, "_blank");
   document.execCommand('copy')
}
</script>

Le code html

Peu de chose à dire. Une simple balise <form>dont le bouton lance la fonction ouvrir avec en paramètre la référence à la forme.

Le code JavaScript parcourt la liste des listes et pour chacune écrit le code HTML


<!DOCTYPE html>
<html>
	<meta charset="utf-8" />
	<title>Listes Retzien</title> 
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
   <link href="http://asso.consom-acteurs.local/commun/consom.css" media="all" rel="stylesheet" type="text/css" />
</head>
<body> 
<h1>Gestion des listes</h1>

<form >

<script>
	for (var liste in listes) 
	{
		if ("<h" == liste.substr(0,2))
		{
			document.write(liste);
			document.write ('<h2><input type="button" name = "choix" value = "Ouvrir" onClick = "ouvrir(this.form);" /></h2>');
		}
		else
		{
		document.write (
				 	'<input type="radio" checked name="choisi" ' + '" id="' + liste, '"/>'
		 				+ '<label for="' + liste + '"> ' +  liste + "</label>"
		 				+ '<br />');
		}	
	}
</script>
	<h2><input type="button" name ="choix" value="Ouvrir" onClick="ouvrir(this.form);" /></h2>
</form>
</body>

Les différents morceaux de code peuvent être regroupés en une seule page HTML qui se suffira.
Attention en installant noms de listes et mots de passe => la moindre faute de syntaxe entraînera un dysfonctionnement.