Previously, we saw that Mozilla MCD can inspect a user’s environment using getEnv()
. It can also retrieve information from an LDAP directory. I use this feature to inform Firefox and Thunderbird of the user in detail. The corporate directory knows the user’s full name, mail server and authentication credentials. autoconfig takes this and, among other useful things, constructs an email account for Thunderbird without user intervention.
The javascript API to deal with LDAP is a bit hackish, however it is all we have. The first task is to define a function called processLDAPValues()
which accepts a queryResults
string as its only argument. Inside processLDAPValues
you extract return data from queryResults
.
Instead of invoking processLDAPValues()
directly, you call getLDAPAttributes()
which in turn gets you to your function. To illustrate, here is the code I use to query the corporate directory server and save the values for later use.
var userInfo = new Object(); // This will hold LDAP results userInfo.envUser = getenv("LOGNAME"); // Unix UID userInfo.envHome = getenv("HOME"); // User home directory var ldapHost = "ldap.example.com"; var ldapBase = "dc=example,dc=com"; if( userInfo.envUser ) { var ldapFilter = "uid=" + userInfo.envUser; } else { throw("Couldn't get UID from the environment"); } // LDAP attributes to retrieve from the server var ldapAttrs = new Array( "cn", "email", "employeenumber", "givenname", "mailhost", "sn", "uid" ); // Define how to process LDAP results before we make the call function processLDAPValues(queryResults) { if( queryResults ) { // Build the userInfo object for later use for( var attr in ldapAttrs ) { userInfo[ ldapAttrs[attr] ] = getLDAPValue( queryResults, ldapAttrs[attr] ); } } else { throw( "No LDAP results" ); } } // Call upon LDAP for the values in ldapAttrs array // Uses the previous processLDAPValues() getLDAPAttributes( ldapHost, ldapBase, ldapFilter, ldapAttrs.join(",") ); |
The first thing I do is create a userInfo
object that will hold LDAP results for use later in the autoconfig. To that object I add attributes for the user’s login name and home directory.
The next bit sets variables to contain the directory server’s hostname, base DN and the LDAP filter to use in the search. It’s a good idea to throw an error if there is no $LOGNAME
. (In a later post I will show how to enhance autoconfig error reporting.)
The ldapAttrs
array names the attributes I want to return from LDAP. Change this array to suit your environment. The last line of code joins the array together with commas and feeds it to getLDAPAttributes
along with the hostname, base DN and filter. getLDAPAttributes
is defined in MOZILLA_HOME/defaults/autoconfig/prefcalls.js
and does the work to perform the query, then call your predefined processLDAPValues()
function.
The example autoconfig script at developer.mozilla.org set preferences inside processLDAPValues
, however this is a bad convention. There are many preferences that require user information and separating pref()
calls away from the main block of preference setting can be confusing. As you can see here I simply run through the array of attributes I’m interested in and get the result from the LDAP query for that attribute, assigning it to the userInfo
object.
Later on in the script I ask the userInfo
object for those stored LDAP attributes. To set the hostname of the user’s mail server, for example, I call
// IMAP server name from corporate LDAP directory defaultPref("mail.server.server1.hostname", userInfo.mailhost ); |
LDAP directories are a great resource. What attributes could you store in your corporate server?