Table des matières

Déploiement de configuration pour Thunderbird et Firefox

Il est possible de gérer la configuration des logiciels Mozilla Thunderbird et Mozilla Firefox de façon centralisée, grâce la fonction appelée MCD 1) (aussi appelée AutoConfig). Le problème est simplement que cette fonction n'est pas très bien documentée. On peut trouver quelques informations par ci par là, mais rien de très complet. Cette page essaiera de combler ce vide. Je tiens quand même à préciser que je n'ai rien inventé ici, je me suis contenté de glaner des informations sur différents sites web. Une de mes principales sources d'inspiration a été cette page

Prérequis

La méthode décrite ici nécessite:

Le serveur LDAP et le serveur web peuvent tout à fait être séparés, tout dépend de votre infrastructure en place.

Principes

Le déploiement de configuration se passe en plusieurs étapes. Il faut d'abord indiquer à Thunderbird et Firefox où récupérer leur configuration. La configuration peut être récupérée de plusieurs façon (fichier local, http, ftp etc…). Dans cet exemple, ce sera une URI HTTP qui sera utilisée. À chaque démarrage, Thunderbird va contacter le serveur qui héberge la configuration, en passant en paramètre l'utilisateur en cours (qui sera récupéré dans une variable d'environnement). À partir du nom d'utilisateur, un script en PHP sur votre serveur va interroger un annuaire LDAP pour connaitre les adresses mails attribuées, et éventuellement d'autres informations (comme l'appartenance à des groupes spécifiques). La sortie de ce script PHP sera une configuration pour Thunderbird, qui sera appliquée sur le poste et conservée en cache. Si Thunderbird ne peut pas contacter le serveur, alors la dernière configuration connue sera appliquée.

Script de génération de configuration

Commençons par mettre en place le script PHP qui se chargera de générer la configuration pour les clients. Placez ces scripts dans /usr/share/mozilla-mcd (par exemple):

thunderbird.php
<?php
ini_set('log_errors', 1);
ini_set('display_errors', 0);
 
 
require('conf.php');
 
 
if(isset($_SERVER['QUERY_STRING']) && preg_match('/^.+@' . DOMAIN . '$/', $_SERVER['QUERY_STRING'])) {
    $temp = explode('@', $_SERVER['QUERY_STRING']);
    $uid = $temp[0];
 
 
    // Bind to the LDAP server
    $link = @ldap_connect(LDAP_SERVER) or die ("Couldn't connect to the LDAP server");
    ldap_set_option($link, LDAP_OPT_PROTOCOL_VERSION, 3);
    @ldap_bind($link) or die ("Couldn't bind to the LDAP server");
    // Lookup the user
    $result = ldap_search($link, USER_BASE, "uid=" . $uid);
    $user = ldap_get_entries($link, $result);
    if($user['count'] == 0) {
        // user not found
        exit;
    }
    $pref = TB_PREF;
    // Don't lock pref if the user is member of some special groups
    // regardless of the setting
    foreach ($user[0]['posixmemberof'] as $group){
        if (in_array($group, $NOENFORCEGROUPS)){
            $pref = 'defaultPref';
            break;
        }
    }
}
else {
    exit;
}
?>
 
 
// Linux / UNIX ?
if(getenv("USER") != "") {
   var path_sep = '/';
   var path_profile = getenv("HOME");
}
// Windows ?
else {
   var path_sep = '\\';
   var path_profile = getenv("USERPROFILE");
}
// Local Account
<?php echo $pref;?>("mail.account.account1.server", "server1");
<?php echo $pref;?>("mail.accountmanager.localfoldersserver", "server1");
<?php echo $pref;?>("mail.server.server1.directory-rel", "[ProfD]Mail/Local Folders");
<?php echo $pref;?>("mail.server.server1.hostname", "Local Folders");
<?php echo $pref;?>("mail.server.server1.name", "Dossiers locaux");
<?php echo $pref;?>("mail.server.server1.type", "none");
<?php echo $pref;?>("mail.server.server1.userName", "nobody");
 
 
// SMTP config
<?php echo $pref;?>("mail.smtp.defaultserver", "smtp1");
<?php echo $pref;?>("mail.smtpservers", "smtp1");
<?php echo $pref;?>("mail.smtpserver.smtp1.try_ssl", 3);
<?php echo $pref;?>("mail.smtpserver.smtp1.port", <?php echo SMTP_PORT; ?>);
<?php echo $pref;?>("mail.smtpserver.smtp1.hostname", "<?php echo SMTP_SERVER; ?>");
<?php echo $pref;?>("mail.smtpserver.smtp1.username", "<?php echo $uid; ?>");
 
 
// Default account is acocunt2 (the personal account)
<?php echo $pref;?>("mail.accountmanager.defaultaccount", "account2");
 
 
<?php
$mail = explode('@', $user[0]['mail'][0]);
$account = 2;
$id = 1;
$server = 2;
$accountlist = 'account1';
$identities = ''
?>
 
 
// Personnal account
<?php echo $pref;?>("mail.account.account2.server", "server<?php echo $server?>");
<?php echo $pref;?>("mail.server.server2.hostname", "<?php echo IMAP_SERVER; ?>");
<?php echo $pref;?>("mail.server.server2.name", "<?php echo $user[0]['mail'][0]; ?>");
<?php echo $pref;?>("mail.server.server2.port", <?php echo IMAP_PORT; ?>);
<?php echo $pref;?>("mail.server.server2.socketType", 3);
<?php echo $pref;?>("mail.server.server2.type", "imap");
<?php echo $pref;?>("mail.server.server2.userName", "<?php echo $uid; ?>");
<?php
for ($i=0; $i <count($user[0]['mail'])-1; $i++){
?>
<?php echo $pref;?>("mail.identity.id<?php echo $id; ?>.fullName", "<?php echo $user[0]['cn'][0]; ?>");
<?php echo $pref;?>("mail.identity.id<?php echo $id; ?>.organization", "<?php echo $user[0]['o'][0]; ?>");
<?php echo $pref;?>("mail.identity.id<?php echo $id; ?>.smtpServer", "smtp1");
<?php echo $pref;?>("mail.identity.id<?php echo $id; ?>.useremail", "<?php echo $user[0]['mail'][$i]; ?>");
<?php echo $pref;?>("mail.identity.id<?php echo $id; ?>.valid", true);
defaultPref("mail.identity.id<?php echo $id; ?>.fcc_folder", "imap://<?php echo $uid; ?>@<?php echo IMAP_SERVER; ?>/Sent");
defaultPref("mail.identity.id<?php echo $id; ?>.draft_folder", "imap://<?php echo $uid; ?>@<?php echo IMAP_SERVER; ?>/Drafts");
defaultPref("mail.identity.id<?php echo $id; ?>.stationery_folder", "imap://<?php echo $uid; ?>@<?php echo IMAP_SERVER; ?>/Templates");
defaultPref("mail.identity.id<?php echo $id; ?>.attach_signature", true);
defaultPref("mail.identity.id<?php echo $id; ?>.sig_file", path_profile+path_sep+"signature"+path_sep+"email.html");
<?php
$identities .= ',id' . $id;
$account++;
$id++;
}
?>
<?php echo $pref;?>("mail.account.account2.identities", "<?php echo $identities;?>");
<?php echo $pref;?>("mail.accountmanager.accounts", "account1,account2");
 
 
// Disable auto updates
<?php echo $pref;?>("app.update.enabled", false);
<?php echo $pref;?>("app.update.auto", false);
 
 
// Extensions
<?php echo $pref;?>("extensions.installDistroAddons", true);
<?php echo $pref;?>("extensions.enabledScopes", 13);
<?php echo $pref;?>("extensions.autoDisableScopes", 2);
 
 
// Spam
<?php echo $pref;?>("mail.adaptivefilters.junk_threshold", 500);
 
 
// Checks IMAP folders
defaultPref("mail.check_all_imap_folders_for_new", true);
 
 
// Composition
defaultPref("mail.default_html_action", 3);
 
 
// Attachments
defaultPref("mail.content_disposition_type ", 1);
 
 
// Expunge
defaultPref("mail.imap.expunge_option", 3);
defaultPref("mail.imap.expunge_threshold_number", 100);
// Adds the domain from your email address to the
// recipients email address if it doesn't have a domain
<?php echo $pref;?>("mail.enable_autocomplete", true);
 
 
// Hide useless messages
<?php echo $pref;?>("mail.ui.show.migration.on.upgrade", false);
<?php echo $pref;?>("app.update.showInstalledUI", false);
<?php echo $pref;?>("browser.startup.homepage_override.mstone", "ignore");
<?php echo $pref;?>("mailnews.start_page_override.mstone", "ignore");
<?php echo $pref;?>("mail.rights.version", 1);
 
 
<?php
// Include other conf fragment if they exist
if (is_array(glob("thunderbird.mod.*.php"))){
    foreach (glob("thunderbird.mod.*.php") as $filename){
        require($filename);
    }
}
?>
firefox.php
<?php
ini_set('log_errors', 1);
ini_set('display_errors', 0);
 
 
require('conf.php');
 
 
if(isset($_SERVER['QUERY_STRING']) && preg_match('/^.+@' . DOMAIN . '$/', $_SERVER['QUERY_STRING'])) {
    $temp = explode('@', $_SERVER['QUERY_STRING']);
    $uid = $temp[0];
 
 
    // Bind to the LDAP server
    // Not used for now, but might be usefull one day to generate conf per group or per user
    $link = @ldap_connect(LDAP_SERVER) or die ("Couldn't connect to the LDAP server");
    ldap_set_option($link, LDAP_OPT_PROTOCOL_VERSION, 3);
    @ldap_bind($link) or die ("Couldn't bind to the LDAP server");
    // Lookup the user
    $result = ldap_search($link, USER_BASE, "uid=" . $uid);
    $user = ldap_get_entries($link, $result);
    if($user['count'] == 0) {
        // user not found
        exit;
    }
    $pref = FF_PREF;
    // Don't lock pref if the user is member of some special groups
    // regardless of the setting
    foreach ($user[0]['posixmemberof'] as $group){
        if (in_array($group, $NOENFORCEGROUPS)){
            $pref = 'defaultPref';
            break;
        }
    }
    $url = HOME_URL;
    if (preg_match('/^https?:///', $user[0]['labeleduri'][0]))
        $url = $user[0]['labeleduri'][0];
 
 
}
else {
    exit;
}
?>
// Disable auto updates
<?php echo $pref;?>("app.update.enabled", false);
<?php echo $pref;?>("app.update.auto", false);
 
 
// Extensions
<?php echo $pref;?>("extensions.installDistroAddons", true);
<?php echo $pref;?>("extensions.enabledScopes", 13);
<?php echo $pref;?>("extensions.autoDisableScopes", 2);
 
 
// Disable the "know your rights" message
<?php echo $pref;?>("browser.rights.3.shown", true);
 
 
// Home page
<?php
if ($pref == 'defaultPref'){
    // startup.homepage is a complex setting.
    // see http://mike.kaply.com/2012/08/29/setting-the-default-firefox-homepage-with-autoconfig/
    $url = 'data:text/plain,browser.startup.homepage='.$url;
}
?>
<?php echo $pref;?>("browser.startup.homepage", "<?php echo $url;?>");
<?php echo $pref;?>("browser.startup.page", 1);
<?php echo $pref;?>("startup.homepage_override_url", "");
<?php echo $pref;?>("startup.homepage_welcome_url", "");
 
 
// Do not check for default browser
<?php echo $pref;?>("browser.shell.checkDefaultBrowser", false);
 
 
// Disable popup blocker
// not that very useful anymore, and blocks legitim popups from SOGo
<?php echo $pref;?>("dom.disable_open_during_load", false);
 
 
// Block 3rd party cookies
<?php echo $pref;?>("network.cookie.cookieBehavior", 1);
 
 
<?php
// Include other conf fragment if they exist
if (is_array(glob("firefox.mod.*.php"))){
    foreach (glob("firefox.mod.*.php") as $filename){
        require($filename);
    }
}
?>
conf.php
<?php
 
 
define('DOMAIN', 'domain.tld');
define('USER_BASE', 'ou=Users,dc=domain,dc=tld');
define('IMAP_SERVER', 'imap.domain.tld');
define('IMAP_PORT', '993');
define('SMTP_SERVER', 'smtp.domain.tld');
define('SMTP_PORT', '465');
define('LDAP_SERVER', 'localhost');
define('TB_PREF', 'lockPref');
define('FF_PREF', 'defaultPref');
define('HOME_URL', 'https://www.my-super-company.com');
$NOENFORCEGROUPS = array('admins','bigboss');
 
 
?>

Explications sur conf.php

Le script conf.php vous permet de définir votre nom de domaine, le serveur LDAP et la base qui contient les utilisateurs, les paramètres de votre serveur IMAP (nom d'hôte et port) ainsi que de votre serveur SMTP. La page d'accueil pour Firefox, le type de préférence pour Firefox et Thunderbird (defaultPref ne configure que des paramètres par défaut, les utilisateurs peuvent les changer, alors que lockPref vérouille les paramètres). Vous pouvez aussi définir une liste de groupes d'utilisateurs pour lesquels les préférences ne seront jamais verrouillés. Pour cette dernière fonction, on utilise un attribut LDAP non standard nommé posixMemberOf, qui donne la liste des groupes pour chaque utilisateur (un peu comme le memberOf sur AD, mais sans utiliser de DN complet). Si votre annuaire ne dispose pas de cet attribut (ce qui sera probablement le cas sauf si vous utilisez une iPasserelle), il faudra adapter les scripts thunderbird.php et firefox.php pour utiliser une autre requête LDAP.

Configuration du serveur web

Il ne reste plus qu'à rendre ces scripts accessible par votre serveur web, par exemple pour apache, quelque chose comme ça devrait faire l'affaire:

Alias /thunderbird.cfg /usr/share/mozilla-mcd/thunderbird.php
Alias /firefox.cfg /usr/share/mozilla-mcd/firefox.php
 
 
<Directory /usr/share/mozilla-mcd/>
    AddType application/x-httpd-php .php .php3
    php_admin_value open_basedir /usr/share/mozilla-mcd
    Order deny,allow
    Deny from all
    Allow from 192.168.23.0/24
    <FilesMatch "conf.php>
        order deny,allow
        Deny from all
    </FilesMatch>
</Directory>

Testez le tout

Vous pouvez déjà vérifier le fonctionnement en vous rendant avec votre navigateur sur https://votre-serveur.com/thunderbird.php?utilisateur@domain.tld (utilisateur doit être un identifiant valide et présent dans votre annuaire LDAP). N'allez pas plus loin si cette partie ne fonctionne pas, vous devez ici obtenir un fichier de configuration.

Configuration sur les postes clients

Il ne reste plus qu'à indiquer sur les postes l'URI pour récupérer la configuration. Pour celà, il faut créer deux fichiers pour Thunderbird:

autoconf.js
// Autoconfig
pref("general.config.obscure_value", 0);
pref("general.config.filename", "thunderbird.cfg");
thunderbird.cfg
// Autoconf
 
 
if(getenv("USER") != "") {
var user = getenv("USER");
} else {
var env_user = getenv("USERNAME");
}
 
 
var mail = env_user + '@domain.tld';
 
 
lockPref("mail.identity.useremail", mail);
lockPref("autoadmin.append_emailaddr", true);
lockPref("autoadmin.global_config_url", "https://mon-serveur.com/thunderbird.cfg");
lockPref("autoadmin.failover_to_cached", true);
lockPref("autoadmin.offline_failover", true);
autoconf.js
// Autoconfig
pref("general.config.obscure_value", 0);
pref("general.config.filename", "firefox.cfg");
firefox.cfg
// Autoconf
 
 
if(getenv("USER") != "") {
var user = getenv("USER");
} else {
var env_user = getenv("USERNAME");
}
 
 
var mail = env_user + '@domain.tld';
 
 
lockPref("mail.identity.useremail", mail);
lockPref("autoadmin.append_emailaddr", true);
lockPref("autoadmin.global_config_url", "https://mon-serveur.com/firefox.cfg");
lockPref("autoadmin.failover_to_cached", true);
lockPref("autoadmin.offline_failover", true);

Il est possible de déployer ces fichiers de configuration sur l'ensemble de vos postes, avec WPKG par exemple.

1)
Mission Control Desktop