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
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.
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.
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):
<?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); } } ?>
<?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); } } ?>
<?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'); ?>
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.
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>
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.
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:
// Autoconfig pref("general.config.obscure_value", 0); pref("general.config.filename", "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);
// Autoconfig pref("general.config.obscure_value", 0); pref("general.config.filename", "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.