Common subdirectories: li_orig/includes and li_new/includes
diff -upN li_orig/ldapauth.admin.inc li_new/ldapauth.admin.inc
--- li_orig/ldapauth.admin.inc	2009-10-27 10:29:16.000000000 -0400
+++ li_new/ldapauth.admin.inc	2010-02-17 22:48:45.000000000 -0500
@@ -147,8 +147,8 @@ function ldapauth_admin_settings_submit(
  */
 function ldapauth_admin_list() {
   $form['list'] = array();
-  $result = db_query("SELECT sid, name, status, weight FROM {ldapauth} ORDER BY weight");
-  while ($row = db_fetch_object($result)) {
+  $result = ldapauth_get_server_list();
+  foreach($result as $row) {
     $form['list'][$row->sid] = array(
       'name' => array('#value' => $row->name),
       'status' => array('#value' => $row->status),
@@ -179,7 +179,7 @@ function ldapauth_admin_list_submit($for
       foreach ($form_state['clicked_button']['#post'] as $name => $val) {
         if (preg_match('/^sid_.*_weight/', $name)) {
           $sid = preg_replace(array('/^sid_/', '/_weight$/'), array('', ''), $name);
-          db_query("UPDATE {ldapauth} SET weight = %d WHERE sid = %d", $val, $sid);
+          ldapauth_update_server_weight($sid, $val);
         }
       }
       break;
@@ -202,29 +202,13 @@ function ldapauth_admin_list_submit($for
 function ldapauth_admin_form(&$form_state, $op = NULL, $sid = NULL) {
   drupal_add_js(drupal_get_path('module', 'ldapauth') .'/ldapauth.admin.js');
 
+  $edit = ldapauth_get_server($sid);
   if ($op == "edit" && $sid) {
-    $edit = db_fetch_array(db_query("SELECT * FROM {ldapauth} WHERE sid = %d", $sid));
     $form['sid'] = array(
       '#type' => 'hidden',
       '#value' => $sid,
     );
   }
-  else {
-    $edit = array(
-      'name' => '',
-      'server' => '',
-      'port' => '389',
-      'tls' => 0,
-      'encrypted' => 0,
-      'basedn' => '',
-      'user_attr' => LDAPAUTH_DEFAULT_USER_ATTR,
-      'mail_attr' => LDAPAUTH_DEFAULT_MAIL_ATTR,
-      'binddn' => '',
-      'bindpw' => FALSE,
-      'login_php' => '',
-      'filter_php' => '',
-    );
-  }
 
   $form['server-settings'] = array(
     '#type' => 'fieldset',
@@ -325,11 +309,27 @@ function ldapauth_admin_form(&$form_stat
     '#collapsible' => TRUE,
     '#collapsed' => FALSE,
   );
+
+  if ($edit['binddn'] == 'user') {
+    $userbind = TRUE;
+    $binddn = '';
+  }
+  else {
+    $userbind = FALSE;
+    $binddn = $edit['binddn'];
+  }
+
+  $form['advanced']['userbind'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Use credentials of user logging in for non-anonymous search'),
+    '#default_value' => $userbind,
+  );
+
   if (!$edit['bindpw']) {
     $form['advanced']['binddn'] =  array(
       '#type' => 'textfield',
       '#title' => t('DN for non-anonymous search'),
-      '#default_value' => $edit['binddn'],
+      '#default_value' => $binddn,
       '#size' => 50,
       '#maxlength' => 255,
     );
@@ -373,9 +373,11 @@ function ldapauth_admin_form(&$form_stat
 function ldapauth_admin_form_validate($form, &$form_state) {
   $values = $form_state['values'];
 
-  if (!isset($values['sid'])) {
-    if (db_fetch_object(db_query("SELECT name FROM {ldapauth} WHERE name = '%s'", $values['name']))) {
-      form_set_error('name', t('An LDAP config with the  name %name already exists.', array('%name' => $values['name'])));
+  if(!isset($values['sid'])) {
+    $server = ldapauth_get_server($values['name']);
+    if($server['sid']) {
+      form_set_error('name', t('An LDAP config with the  name %name already exists.'
+        , array('%name' => $values['name'])));
     }
   }
   if (!is_numeric($values['port'])) {
@@ -389,27 +391,18 @@ function ldapauth_admin_form_validate($f
 function ldapauth_admin_form_submit($form, &$form_state) {
   $op = $form_state['clicked_button']['#value'];
   $values = $form_state['values'];
+  /* If user credentials will be used to bind, set binddn to 'user' */
+  if ($values['userbind']) {
+    $values['binddn'] = 'user';
+  }
   switch ($op) {
     case t('Save configuration'):
       if (!isset($values['sid'])) {
-        db_query("INSERT INTO {ldapauth} (name, status, server, port, tls, encrypted, basedn, user_attr, mail_attr, binddn, bindpw, login_php, filter_php) VALUES ('%s', %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s')", $values['name'], 1, $values['server'], $values['port'], $values['tls'], $values['encrypted'], $values['basedn'], trim($values['user_attr']), trim($values['mail_attr']), $values['binddn'], $values['bindpw'], trim($values['login_php']), trim($values['filter_php']));
-        drupal_set_message(t('LDAP configuration %name has been added.', array('%name' => $values['name'])));
-        watchdog('ldapauth', 'LDAP configuration %name has been added.', array('%name' => $values['name']));
+        ldapauth_insert_server($values);
       }
       else {
-        if (isset($values['bindpw_clear'])) {
-          db_query("UPDATE {ldapauth} SET name = '%s', server = '%s', port = %d, tls = %d, encrypted = %d, basedn = '%s', user_attr = '%s', mail_attr = '%s', login_php = '%s', filter_php = '%s' WHERE sid = %d", $values['name'], $values['server'], $values['port'], $values['tls'], $values['encrypted'], $values['basedn'], trim($values['user_attr']), trim($values['mail_attr']), trim($values['login_php']), trim($values['filter_php']), $values['sid']);
-          if ($values['bindpw_clear']) {
-            db_query("UPDATE {ldapauth} SET bindpw = '' WHERE sid = %d", $values['sid']);
-          }
-        }
-        else {
-          db_query("UPDATE {ldapauth} SET name = '%s', server = '%s', port = %d, tls = %d, encrypted = %d, basedn = '%s', user_attr = '%s', mail_attr = '%s', binddn = '%s', bindpw = '%s', login_php = '%s', filter_php = '%s' WHERE sid = %d", $values['name'], $values['server'], $values['port'], $values['tls'], $values['encrypted'], $values['basedn'], trim($values['user_attr']), trim($values['mail_attr']), $values['binddn'], $values['bindpw'], trim($values['login_php']), trim($values['filter_php']), $values['sid']);
-        }
-        drupal_set_message(t('LDAP Configuration %name has been updated.', array('%name' => $values['name'])));
-        watchdog('ldapauth', 'LDAP Configuration %name has been updated.', array('%name' => $values['name']));
+        ldapauth_update_server($values);
       }
-
       $form_state['redirect'] = 'admin/settings/ldap/ldapauth/list';
       break;
     case t('Test'):
@@ -419,10 +412,12 @@ function ldapauth_admin_form_submit($for
         $dn = $_ldapauth_ldap->getOption('binddn');
         $pass = $_ldapauth_ldap->getOption('bindpw');
         if (!$_ldapauth_ldap->connect($dn, $pass)) {
-          drupal_set_message(t('Authentication with the LDAP server for the dn %dn and saved password failed.', array('%dn' => $dn)), 'error');
+          drupal_set_message(t('Authentication with the LDAP server for the dn %dn and saved password failed.'
+            , array('%dn' => $dn)), 'error');
         }
         else {
-          drupal_set_message(t('Authentication with the LDAP server for the dn %dn and saved password succeeded.', array('%dn' => $dn)));
+          drupal_set_message(t('Authentication with the LDAP server for the dn %dn and saved password succeeded.'
+            , array('%dn' => $dn)));
         }
       }
       else {
@@ -444,10 +439,10 @@ function ldapauth_admin_form_submit($for
  *  Form array.
  */
 function ldapauth_admin_deactivate(&$form_state, $sid) {
-  if (is_numeric($sid) && ($name = db_result(db_query("SELECT name from {ldapauth} WHERE sid = %d", $sid)))) {
+  if (is_numeric($sid) && ($name = ldapauth_get_server_name($sid))) {
     $form['sid'] = array('#type' => 'hidden', '#value' => $sid);
-
-    return confirm_form($form, t('Are you sure you want to de-activate the server %name?', array('%name' => $name)), 'admin/settings/ldap/ldapauth/list', '', t('De-activate'), t('Cancel'));
+    return confirm_form($form, t('Are you sure you want to de-activate the server %name?'
+      , array('%name' => $name)), 'admin/settings/ldap/ldapauth/list', '', t('De-activate'), t('Cancel'));
   }
   else {
     drupal_not_found();
@@ -462,11 +457,8 @@ function ldapauth_admin_deactivate(&$for
  */
 function ldapauth_admin_deactivate_submit($form, &$form_state) {
   $sid = $form_state['values']['sid'];
-  $result = db_query("SELECT name from {ldapauth} WHERE sid = %d", $sid);
-  if ($row = db_fetch_object($result)) {
-    db_query("UPDATE {ldapauth} SET status = '0' WHERE sid = %d", $sid);
-    drupal_set_message(t('LDAP Configuration %name has been de-activated.', array('%name' => $row->name)));
-    watchdog('ldapauth', 'LDAP server %name was de-activated.', array('%name' => $row->name));
+  if (ldapauth_get_server_name($sid)) {
+    ldapauth_update_server_status($sid, 0);
   }
   drupal_goto('admin/settings/ldap/ldapauth/list');
 }
@@ -483,10 +475,10 @@ function ldapauth_admin_deactivate_submi
  *  Form array.
  */
 function ldapauth_admin_activate(&$form_state, $sid) {
-  if (is_numeric($sid) && ($name = db_result(db_query("SELECT name from {ldapauth} WHERE sid = %d", $sid)))) {
+  if (is_numeric($sid) && ($name = ldapauth_get_server_name($sid))) {
     $form['sid'] = array('#type' => 'hidden', '#value' => $sid);
-
-    return confirm_form($form, t('Are you sure you want to activate the server %name?', array('%name' => $name)), 'admin/settings/ldap/ldapauth/list', '', t('Activate'), t('Cancel'));
+    return confirm_form($form, t('Are you sure you want to activate the server %name?'
+      , array('%name' => $name)), 'admin/settings/ldap/ldapauth/list', '', t('Activate'), t('Cancel'));
   }
   else {
     drupal_not_found();
@@ -501,11 +493,8 @@ function ldapauth_admin_activate(&$form_
  */
 function ldapauth_admin_activate_submit($form, &$form_state) {
   $sid = $form_state['values']['sid'];
-  $result = db_query("SELECT name from {ldapauth} WHERE sid = %d", $sid);
-  if ($row = db_fetch_object($result)) {
-    db_query("UPDATE {ldapauth} SET status = '1' WHERE sid = %d", $sid);
-    drupal_set_message(t('LDAP Configuration %name has been activated.', array('%name' => $row->name)));
-    watchdog('ldapauth', 'LDAP server %name was activated.', array('%name' => $row->name));
+  if (ldapauth_get_server_name($sid)) {
+    ldapauth_update_server_status($sid, 1);
   }
   drupal_goto('admin/settings/ldap/ldapauth/list');
 }
@@ -522,13 +511,13 @@ function ldapauth_admin_activate_submit(
  *   The form structure.
  */
 function ldapauth_admin_delete(&$form_state, $sid) {
-  if (is_numeric($sid) && ($name = db_result(db_query("SELECT name from {ldapauth} WHERE sid = %d", $sid)))) {
+  if (is_numeric($sid) && ($name = ldapauth_get_server_name($sid))) {
     $form = array(
       'sid' => array('#type' => 'hidden', '#value' => $sid),
       'name' => array('#type' => 'hidden', '#value' => $name),
     );
-
-    return confirm_form($form, t('Are you sure you want to delete the LDAP server named %name?', array('%name' => $name)), 'admin/settings/ldap/ldapauth/list', NULL, t('Delete'), t('Cancel'));
+    return confirm_form($form, t('Are you sure you want to delete the LDAP server named %name?'
+      , array('%name' => $name)), 'admin/settings/ldap/ldapauth/list', NULL, t('Delete'), t('Cancel'));
   }
   else {
     drupal_not_found();
@@ -542,9 +531,7 @@ function ldapauth_admin_delete(&$form_st
 function ldapauth_admin_delete_submit($form, &$form_state) {
   $values = $form_state['values'];
   if ($values['confirm'] && $values['sid']) {
-    db_query("DELETE FROM {ldapauth} WHERE sid = %d", $values['sid']);
-    drupal_set_message(t('LDAP Configuration %name has been deleted.', array('%name' => $values['name'])));
-    watchdog('ldapauth', 'LDAP Configuration %name has been deleted.', array('%name' => $values['name']));
+    ldapauth_delete_server($values['sid']);
   }
   drupal_goto('admin/settings/ldap/ldapauth/list');
 }
diff -upN li_orig/ldapauth.db.inc li_new/ldapauth.db.inc
--- li_orig/ldapauth.db.inc	1969-12-31 19:00:00.000000000 -0500
+++ li_new/ldapauth.db.inc	2010-04-15 11:46:24.000000000 -0400
@@ -0,0 +1,417 @@
+<?php
+// $Id:$
+
+/**
+ * @file
+ * database functions for ldapauth, ldapdata and ldapgroups
+ */
+
+
+/**
+ * Get a list of available servers
+ * @param status: 0 for inactive, 1 for active, -1 to ignore
+ * @return: array of server objects
+ */
+function ldapauth_get_server_list($status=-1) {
+  $query="SELECT sid, name, status, weight FROM {ldapauth} ";
+  if ($status == -1) {
+    $result = db_query($query . "ORDER BY weight");
+  }
+  else {
+    $result = db_query($query . "WHERE status = %d ORDER BY weight", $status);
+  }
+  while ($row = db_fetch_object($result)) {
+    $ret[] = $row;
+  }
+  return $ret;
+}
+
+/**
+ * Get a server's name 
+ * @param sid: server ID
+ * @return: string name of server
+ */
+function ldapauth_get_server_name($sid) {
+  return db_result(db_query("SELECT name FROM {ldapauth} WHERE sid = %d", $sid));
+}
+
+/**
+ * Get a server object or array
+ * @param sid: server ID
+ * @param object: TRUE to return an object, FALSE to return an array
+ * @param status: 0 for inactive, 1 for active, -1 to ignore
+ *
+ * @return: server object or array
+ */
+function ldapauth_get_server($sid, $object=FALSE, $status=-1) {
+  $query="SELECT * FROM {ldapauth} WHERE ";
+  if (is_numeric($sid)) {
+    $query .= "sid = %d";
+  }
+  else {
+    $query .= "name = '%s'";
+  }
+  if ($status != -1) {
+    $query .= " AND status = %d";
+    $query = db_query($query, $sid, $status);
+  }
+  else {
+    $query = db_query($query, $sid);
+  }
+    
+  if($object) {
+    $ret = db_fetch_object($query);
+  }
+  else {
+    $ret = db_fetch_array($query);
+  }
+
+  if (!$ret && !object) {
+    $ret = array(
+      'name' => '',
+      'server' => '',
+      'port' => '389',
+      'tls' => 0,
+      'encrypted' => 0,
+      'basedn' => '',
+      'user_attr' => LDAPAUTH_DEFAULT_USER_ATTR,
+      'mail_attr' => LDAPAUTH_DEFAULT_MAIL_ATTR,
+      'binddn' => '',
+      'bindpw' => FALSE,
+      'login_php' => '',
+      'filter_php' => '',
+    );
+  }
+  return $ret;
+}
+
+/**
+ * Insert a new server record
+ * @param values: server array
+ */
+function ldapauth_insert_server($values) {
+  db_query("
+     INSERT INTO {ldapauth} (
+         name
+       , status
+       , server
+       , port
+       , tls
+       , encrypted
+       , basedn
+       , user_attr
+       , mail_attr
+       , binddn
+       , bindpw
+       , login_php
+       , filter_php)
+     VALUES (
+          '%s'
+        , %d
+        , '%s'
+        , %d
+        , %d
+        , %d
+        , '%s'
+        , '%s'
+        , '%s'
+        , '%s'
+        , '%s'
+        , '%s'
+        , '%s')"
+      , $values['name']
+      , 1
+      , $values['server']
+      , $values['port']
+      , $values['tls']
+      , $values['encrypted']
+      , $values['basedn']
+      , trim($values['user_attr'])
+      , trim($values['mail_attr'])
+      , $values['binddn']
+      , $values['bindpw']
+      , trim($values['login_php'])
+      , trim($values['filter_php']
+    )
+  );
+  drupal_set_message(t('LDAP configuration %name has been added.', array('%name' => $values['name'])));
+  watchdog('ldapauth', 'LDAP configuration %name has been added.', array('%name' => $values['name']));
+}
+
+/**
+ * Change a server's weight
+ * @param sid: server ID
+ * @param weight: new weight
+ */
+function ldapauth_update_server_weight($sid, $weight) {
+  db_query("UPDATE {ldapauth} SET weight = %d WHERE sid = %d", $weight, $sid);
+}
+
+/**
+ * Update a server
+ * @param values: server array
+ */
+function ldapauth_update_server($values) {
+  if (isset($values['bindpw_clear'])) {
+    db_query("
+      UPDATE {ldapauth} 
+      SET name = '%s'
+        , server = '%s'
+        , port = %d
+        , tls = %d
+        , encrypted = %d
+        , basedn = '%s'
+        , user_attr = '%s'
+        , mail_attr = '%s'
+        , login_php = '%s'
+        , filter_php = '%s' 
+      WHERE sid = %d"
+      , $values['name']
+      , $values['server']
+      , $values['port']
+      , $values['tls']
+      , $values['encrypted']
+      , $values['basedn']
+      , trim($values['user_attr'])
+      , trim($values['mail_attr'])
+      , trim($values['login_php'])
+      , trim($values['filter_php'])
+      , $values['sid']
+    );
+    if ($values['bindpw_clear']) {
+      db_query("UPDATE {ldapauth} SET bindpw = '' WHERE sid = %d", $values['sid']);
+    }
+  }
+  else {
+    db_query("
+      UPDATE {ldapauth}
+      SET name = '%s'
+        , server = '%s'
+        , port = %d
+        , tls = %d
+        , encrypted = %d
+        , basedn = '%s'
+        , user_attr = '%s'
+        , mail_attr = '%s'
+        , binddn = '%s'
+        , bindpw = '%s'
+        , login_php = '%s'
+        , filter_php = '%s'
+      WHERE sid = %d"
+      , $values['name']
+      , $values['server']
+      , $values['port']
+      , $values['tls']
+      , $values['encrypted']
+      , $values['basedn']
+      , trim($values['user_attr'])
+      , trim($values['mail_attr'])
+      , $values['binddn']
+      , $values['bindpw']
+      , trim($values['login_php'])
+      , trim($values['filter_php'])
+      , $values['sid']
+    );
+  }
+  drupal_set_message(t('LDAP Configuration %name has been updated.', array('%name' => $values['name'])));
+  watchdog('ldapauth', 'LDAP Configuration %name has been updated.', array('%name' => $values['name']));
+}
+
+/**
+ * Change a server's status
+ * @param sid: server ID
+ * @param status: 0 for inactive, 1 for active
+ */
+function ldapauth_update_server_status($sid, $status = '0') {
+  $name = ldapauth_get_server_name($sid);
+  db_query("UPDATE {ldapauth} SET status = '%s' WHERE sid = %d", $status, $sid);
+  if ($status)
+    $msg = 'activated';
+  else
+    $msg = 'de-activated';
+  drupal_set_message(t('LDAP Configuration %name has been %status.', array('%name' => $name, '%status' => $msg)));
+  watchdog('ldapauth', 'LDAP server %name was %status.', array('%name' => $name, '%status' => $msg));
+}
+
+/**
+ * Delete a server
+ * @param sid: server ID
+ */
+function ldapauth_delete_server($sid) {
+  $name = ldapauth_get_server_name($sid);
+  db_query("DELETE FROM {ldapauth} WHERE sid = %d", $sid);
+  drupal_set_message(t('LDAP Configuration %name has been deleted.', array('%name' => $name)));
+  watchdog('ldapauth', 'LDAP Configuration %name has been deleted.', array('%name' => $name));
+}
+
+function ldapauth_serialize($s) {
+  $ret = array();
+  foreach ((trim($s) ? explode("\n", trim($s)) : array()) as $line) {
+    if (trim($line)) {
+      $ret[] = trim($line);
+    }
+  }
+  return !empty($ret) ? serialize($ret) : '';
+}
+
+/**
+ * Update the ldapgroup settins for a server
+ * @param values: array of settings
+ */
+function ldapgroups_update_server($values) {
+  
+  db_query("
+    UPDATE {ldapauth}
+    SET ldapgroups_in_dn = %d
+      , ldapgroups_dn_attribute = '%s'
+      , ldapgroups_in_attr = %d
+      , ldapgroups_attr = '%s'
+      , ldapgroups_as_entries = %d
+      , ldapgroups_entries = '%s'
+      , ldapgroups_entries_attribute = '%s'
+      , ldapgroups_mappings = '%s'
+      , ldapgroups_mappings_filter = %d
+      , ldapgroups_filter_php = '%s'
+      , ldapgroups_groups = '%s'
+    WHERE sid = %d"
+    , $values['ldapgroups_in_dn']
+    , trim($values['ldapgroups_dn_attribute'])
+    , $values['ldapgroups_in_attr']
+    , ldapauth_serialize($values['ldapgroups_attr'])
+    , $values['ldapgroups_as_entries']
+    , ldapauth_serialize($values['ldapgroups_entries'])
+    , trim($values['ldapgroups_entries_attribute'])
+    , ldapauth_serialize($values['ldapgroups_mappings'])
+    , $values['ldapgroups_mappings_filter']
+    , trim($values['ldapgroups_filter_php'])
+    , ldapauth_serialize($values['ldapgroups_groups'])
+    , $values['sid']
+  );
+  drupal_set_message(t('LDAP Group Configuration %name has been updated.', array('%name' => $values['name'])));
+  watchdog('ldapauth', 'LDAP Group Configuration %name has been updated.', array('%name' => $values['name']));
+}
+
+/**
+ * Reset the ldapgroups settings for a server
+ * @param sid: server ID
+ */
+function ldapgroups_reset($sid) {
+  db_query("
+    UPDATE {ldapauth}
+    SET ldapgroups_in_dn = 0
+      , ldapgroups_dn_attribute = ''
+      , ldapgroups_in_attr = 0
+      , ldapgroups_attr = ''
+      , ldapgroups_as_entries = 0
+      , ldapgroups_entries = ''
+      , ldapgroups_entries_attribute = ''
+      , ldapgroups_mappings = ''
+      , ldapgroups_mappings_filter = '0'
+      , ldapgroups_filter_php = ''
+      , ldapgroups_groups = ''
+    WHERE sid = %d", $sid
+  );
+  drupal_set_message(t('LDAP Group Configuration %name has been reset.', array('%name' => $values['name'])));
+  watchdog('ldapauth', 'LDAP Group Configuration %name has been reset.', array('%name' => $values['name']));
+}
+
+/**
+ * Update the ldapdata settings for a server
+ * @param values: array of settings
+ */
+function ldapdata_update_server($values) {
+
+  $ldapdata_attrs = array();
+  $attrs = trim($values['attributes']['ldapdata_attrs']);
+  foreach (($attrs ? explode("\n", $attrs) : array()) as $line) {
+    $ldapdata_attrs += array(trim(array_shift($data)) => $data);
+  }
+
+  $ldapdata_mappings['access'] = $values['ldapdata_mapping'];
+  if ($values['ldapdata_mapping'] >= 4) {
+    foreach(element_children($values) as $attr) {
+      if (preg_match("/ldap_amap/", $attr) && $values[$attr]) {
+        $ldapdata_mappings[$attr] = $values[$attr];
+      }
+    }
+  }
+  $ldapdata_mappings = !empty($ldapdata_mappings)? serialize($ldapdata_mappings) : '';
+
+  $ldapdata_roattrs = isset($values['attributes']['ldapdata_roattrs']) ?
+    array_values(array_intersect($values['attributes']['ldapdata_roattrs'], array_keys($ldapdata_attrs))) : array();
+  $ldapdata_roattrs = !empty($ldapdata_roattrs) ? serialize($ldapdata_roattrs) : '';
+
+  $ldapdata_rwattrs = isset($values['attributes']['ldapdata_rwattrs']) ?
+    array_values(array_intersect($values['attributes']['ldapdata_rwattrs'], array_keys($ldapdata_attrs))) : array();
+  $ldapdata_rwattrs = !empty($ldapdata_rwattrs) ? serialize($ldapdata_rwattrs) : '';
+
+  $ldapdata_attrs = !empty($ldapdata_attrs) ? serialize($ldapdata_attrs) : '';
+
+  $ldapdata_filter_php = trim($values['attributes']['ldapdata_filter_php']);
+
+  $ldapdata_rwattrs = empty($ldapdata_filter_php) ? $ldapdata_rwattrs : '';
+
+  if (!is_null($values['bindpw_clear'])) {
+    db_query("
+      UPDATE {ldapauth}
+      SET ldapdata_rwattrs = '%s'
+        , ldapdata_roattrs = '%s'
+        , ldapdata_mappings = '%s'
+        , ldapdata_attrs = '%s'
+        , ldapdata_filter_php = '%s'
+      WHERE sid = %d"
+      , $ldapdata_rwattrs
+      , $ldapdata_roattrs
+      , $ldapdata_mappings
+      , $ldapdata_attrs
+      , $ldapdata_filter_php
+      , $sid
+    );
+    if ($bindpw_clear) {
+      db_query("UPDATE {ldapauth} SET ldapdata_bindpw = '' WHERE sid = %d", $sid);
+    }
+  }
+  else {
+    db_query("
+      UPDATE {ldapauth}
+      SET ldapdata_binddn = '%s'
+        , ldapdata_bindpw = '%s'
+        , ldapdata_rwattrs = '%s'
+        , ldapdata_roattrs = '%s'
+        , ldapdata_mappings = '%s'
+        , ldapdata_attrs = '%s'
+        , ldapdata_filter_php = '%s'
+      WHERE sid = %d"
+      , $values['ldapdata_binddn']
+      , $values['ldapdata_bindpw']
+      , $ldapdata_rwattrs
+      , $ldapdata_roattrs
+      , $ldapdata_mappings
+      , $ldapdata_attrs
+      , $ldapdata_filter_php
+      , $sid
+    );
+  }
+  drupal_set_message(t('LDAP Data Configuration %name has been updated.', array('%name' => $values['name'])));
+  watchdog('ldapauth', 'LDAP Data Configuration %name has been updated.', array('%name' => $values['name']));
+}
+
+/**
+ * Reset the ldapdata settings for a server
+ * @param sid: server ID
+ */
+function ldapdata_reset($sid) {
+  db_query("
+    UPDATE {ldapauth}
+    SET ldapdata_mappings = ''
+      , ldapdata_roattrs = ''
+      , ldapdata_rwattrs = ''
+      , ldapdata_binddn = ''
+      , ldapdata_bindpw = ''
+      , ldapdata_attrs = ''
+      , ldapdata_filter_php = ''
+    WHERE sid = %d", $sid
+  );
+  drupal_set_message(t('LDAP Data Configuration %name has been reset.', array('%name' => $values['name'])));
+  watchdog('ldapauth', 'LDAP Data Configuration %name has been reset.', array('%name' => $values['name']));
+}
diff -upN li_orig/ldapauth.drush.inc li_new/ldapauth.drush.inc
--- li_orig/ldapauth.drush.inc	1969-12-31 19:00:00.000000000 -0500
+++ li_new/ldapauth.drush.inc	2010-02-22 11:56:00.000000000 -0500
@@ -0,0 +1,237 @@
+<?php
+/**
+ * $Id$
+ *
+ * @file
+ * Drush commands for ldapauth
+ */
+
+/**
+ * Implementation of hook_drush_command().
+ * @return An associative array describing your command(s)
+ */
+function ldapauth_drush_command() {
+  $items['ldap add'] = array(
+    'callback' => 'ldapauth_drush_add',
+    'description' => dt('Add an LDAP server'),
+    'arguments' => array(
+      'name' => dt('Friendly name for the server'),
+      'server' => dt('Address of the server'),
+    ),
+    'options' => array(
+      'port' => dt('Port number (default 389)'),
+      'tls' => dt('Use Start-TLS? (default off)'),
+      'basedn' => dt('Base DN'),
+      'username' => dt('Username attribute'),
+      'email' => dt('Email attribute'),
+      'search_with_user' => dt('Use credentials of user logging in for non-anonymous search?'),
+      'search_dn' => dt('DN for non-anonymous search'),
+      'search_pw' => dt('Password for non-anonymous search'),
+    ),
+  );
+  $items['ldap delete'] = array(
+    'callback' => 'ldapauth_drush_delete',
+    'description' => dt('Delete an LDAP server'),
+    'arguments' => array(
+      'name' => dt('Friendly name for the server'),
+    ),
+  );
+  $items['ldap activate'] = array(
+    'callback' => 'ldapauth_drush_activate',
+    'description' => dt('Activate an LDAP server'),
+    'arguments' => array(
+      'name' => dt('Friendly name for the server'),
+    ),
+  );
+  $items['ldap deactivate'] = array(
+    'callback' => 'ldapauth_drush_deactivate',
+    'description' => dt('De-activate an LDAP server'),
+    'arguments' => array(
+      'name' => dt('Friendly name for the server'),
+    ),
+  );
+  $items['ldap mode'] = array(
+    'callback' => 'ldapauth_variable_set',
+    'callback arguments' => array('ldapauth_login_process'),
+    'arguments' => array('mode' => 'mixed or ldaponly'),
+    'description' => dt('Change authentication mode'),
+  );
+  $items['ldap conflict'] = array(
+    'callback' => 'ldapauth_variable_set',
+    'callback arguments' => array('ldapauth_login_conflict'),
+    'arguments' => array('mode' => 'disallow or resolve'),
+    'description' => dt('Change conflict resolution policy'),
+  );
+  $items['ldap store'] = array(
+    'callback' => 'ldapauth_variable_set',
+    'callback arguments' => array('ldapauth_forget_passwords'),
+    'arguments' => array('mode' => 'on or off'),
+    'description' => dt('Change whether to store passwords during sessions or not'),
+  );
+  $items['ldap sync'] = array(
+    'callback' => 'ldapauth_variable_set',
+    'callback arguments' => array('ldapauth_sync_passwords'),
+    'arguments' => array('mode' => 'on or off'),
+    'description' => dt('Change whether to sync passwords with Drupal or not'),
+  );
+  $items['ldap removepass'] = array(
+    'callback' => 'ldapauth_variable_set',
+    'callback arguments' => array('ldapauth_disable_pass_change'),
+    'arguments' => array('mode' => 'on or off'),
+    'description' => dt('Change whether to remove password change fields or not'),
+  );
+  $items['ldap email'] = array(
+    'callback' => 'ldapauth_variable_set',
+    'callback arguments' => array('ldapauth_alter_email_field'),
+    'arguments' => array('mode' => 'nothing or remove or disable'),
+    'description' => dt('Remove or disable email field from user edit form for LDAP users'),
+  );
+  return $items;
+}
+
+/**
+ * Implementation of hook_drush_help
+ * @param section: the drush command we're seeking help for
+ * @return: A string describing the command
+ */
+function ldapauth_drush_help($section) {
+  switch($section) {
+    case 'drush:ldap add':
+      return dt('Add an LDAP server');
+    case 'drush:ldap delete':
+      return dt('Dlete an LDAP server');
+    case 'drush:ldap activate':
+      return dt('Activate an LDAP server');
+    case 'drush:ldap delete':
+      return dt('De-activate an LDAP server');
+    case 'drush:ldap mode':
+      return dt('Switch between mixed mode or LDAP only mode');
+    case 'drush:ldap conflict':
+      return dt('Switch between disallowing conflicts or resolve conflicts by associating the local account with the LDAP entry');
+    case 'drush:ldap store':
+      return dt('Switch between storing passwords during sessions or not');
+    case 'drush:ldap sync':
+      return dt('Switch between syncing passwords with Drupal or not');
+    case 'drush:ldap removepass':
+      return dt('Switch between removing password change fields or not');
+    case 'drush:ldap email':
+      return dt('Remove or disable email field from user edit form for LDAP users');
+  }
+}
+
+/*
+ * Wrapper for variable set to convert command arguments to db values
+ * @param variable: the name of the variable in Drupal's variable table
+ * @param mode: the argument passed to the drush command
+ */
+function ldapauth_variable_set($variable, $mode) {
+  switch ($variable) {
+    case 'ldapauth_login_process':
+      if ($mode == 'mixed')
+        $mode=0;
+      elseif ($mode == 'ldaponly')
+        $mode=1;
+      break;
+    case 'ldapauth_login_conflict':
+      if ($mode == 'disallow')
+        $mode=0;
+      elseif ($mode == 'resolve')
+        $mode=1;
+      break;
+    case 'ldapauth_forget_passwords':
+      if ($mode == 'on')
+        $mode=0;
+      elseif ($mode == 'off')
+        $mode=1;
+      break;
+    case 'ldapauth_sync_passwords':
+    case 'ldapauth_disable_pass_change':
+      if ($mode == 'on')
+        $mode=1;
+      elseif ($mode == 'off')
+        $mode=0;
+      break;
+    case 'ldapauth_alter_email_field':
+      if ($mode == 'nothing')
+        $mode=0;
+      elseif ($mode == 'remove')
+        $mode=1;
+      elseif ($mode == 'disable')
+        $mode=2;
+      break;
+  }
+  if (!is_numeric($mode))
+    drush_set_error('LDAPAUTH_INVALID_VARIABLE', dt('Invalid setting'));
+  else
+    variable_set($variable, $mode);
+}
+
+/*
+ * Helper function to include the file containing the db functions
+ */
+function ldapauth_drush_include() {
+  $path = drupal_get_path('module', 'ldapauth');
+  include_once($path . "/ldapauth.db.inc");
+}
+
+/*
+ * Add a server
+ * @param name: Friendly server name
+ * @param server: Address of the server
+ */
+function ldapauth_drush_add($name, $server) {
+  if (!$name || !$server) {
+    drush_set_error('LDAPAUTH_MISSING_DATA', dt('Both name and server must be specified'));
+    return;
+  }
+  ldapauth_drush_include();
+  $values['name'] = $name;
+  $values['server'] = $server;
+  $values['port' ] = drush_get_option('port');
+  if (!is_numeric($values['port'])) $values['port'] = 389;
+  $values['tls'] = drush_get_option('tls') ? 1 : 0;
+  $values['basedn'] = drush_get_option('basedn');
+  $values['user_attr'] = drush_get_option('username');
+  $values['mail_attr'] = drush_get_option('email');
+  $values['binddn'] = drush_get_option('search_with_user') ? 'user' : drush_get_option('search_dn');
+  $values['bindpw'] = drush_get_option('search_pw');
+  $values['login_php'] = NULL;
+  $values['filter_php'] = NULL;
+  ldapauth_insert_server($values);
+}
+
+/*
+ * Delete a server
+ * @param name: Friendly server name
+ */
+function ldapauth_drush_delete($name) {
+  ldapauth_drush_include();
+  if (!$name || !($server = ldapauth_get_server($name)))
+    drush_set_error('LDAPAUTH_INVALID_SERVER', dt('Invalid server name specified'));
+  else
+    ldapauth_delete_server($server['sid']);
+}
+
+/*
+ * Activate a server
+ * @param name: Friendly server name
+ */
+function ldapauth_drush_activate($name) {
+  ldapauth_drush_include();
+  if (!$name || !($server = ldapauth_get_server($name)))
+    drush_set_error('LDAPAUTH_INVALID_SERVER', dt('Invalid server name specified'));
+  else
+    ldapauth_update_server_status($server['sid'], 1);
+}
+
+/*
+ * De-activate a server
+ * @param name: Friendly server name
+ */
+function ldapauth_drush_deactivate($name) {
+  ldapauth_drush_include();
+  if (!$name || !($server = ldapauth_get_server($name)))
+    drush_set_error('LDAPAUTH_INVALID_SERVER', dt('Invalid server name specified'));
+  else
+    ldapauth_update_server_status($server['sid']);
+}
diff -upN li_orig/ldapauth.module li_new/ldapauth.module
--- li_orig/ldapauth.module	2009-10-27 10:29:16.000000000 -0400
+++ li_new/ldapauth.module	2010-02-17 22:18:32.000000000 -0500
@@ -34,6 +34,7 @@ define('LDAPAUTH_DEFAULT_MAIL_ATTR',   v
  * Implements hook_init().
  */
 function ldapauth_init() {
+  require_once(drupal_get_path('module', 'ldapauth') .'/ldapauth.db.inc');
   require_once(drupal_get_path('module', 'ldapauth') .'/includes/LDAPInterface.inc');
 }
 
@@ -164,7 +165,7 @@ function ldapauth_user($op, &$edit, &$ac
       break;
     case 'view':
       if (user_access('administer users') && isset($account->ldap_authentified) && $account->ldap_dn) {
-        $row = db_fetch_object(db_query("SELECT * FROM {ldapauth} WHERE sid = %d", $account->ldap_config));
+        $row = ldapauth_get_server($account->ldap_config);
         $account->content[t(LDAPAUTH_PROFILE)] = array(
          '#type' => 'user_profile_category',
          '#title' => t(LDAPAUTH_PROFILE),
@@ -320,7 +321,7 @@ function ldapauth_authenticate($form_val
 
   if (!$account) {
     // Register this new user.
-    if ($ldap_user = _ldapauth_user_lookup($name)) {
+    if ($ldap_user = _ldapauth_user_lookup($name, $pass)) {
       // If mail attribute is missing, set the name as mail.
       $init = $mail = key_exists(($_ldapauth_ldap->getOption('mail_attr') ? $_ldapauth_ldap->getOption('mail_attr') : LDAPAUTH_DEFAULT_MAIL_ATTR), $ldap_user) ? $ldap_user[$_ldapauth_ldap->getOption('mail_attr')][0] : $name;
 
@@ -393,15 +394,15 @@ function _ldapauth_auth($name, $pass) {
     return FALSE;
 
   // Cycle through LDAP configurations.  First one to succeed wins.
-  $result = db_query("SELECT sid FROM {ldapauth} WHERE status = 1 ORDER BY weight");
-  while ($row = db_fetch_object($result)) {
+  $rows = ldapauth_get_server_list(1);
+  foreach($rows as $row) {
 
     // Initialize LDAP.
     if (!_ldapauth_init($row->sid))
       return FALSE;
 
     // Look up the user in LDAP.
-    if (!($ldap = _ldapauth_user_lookup($name)) || !isset($ldap['dn']))
+    if (!($ldap = _ldapauth_user_lookup($name, $pass)) || !isset($ldap['dn']))
       continue;
 
     // Filter users based on their LDAP data.
@@ -426,7 +427,7 @@ function _ldapauth_auth($name, $pass) {
  * @return
  *   An array with user's LDAP data or NULL if not found.
  */
-function _ldapauth_user_lookup($name) {
+function _ldapauth_user_lookup($name, $pass) {
   global $_ldapauth_ldap;
 
   if (!$_ldapauth_ldap)
@@ -436,7 +437,14 @@ function _ldapauth_user_lookup($name) {
   $login_name = ($code = _ldapauth_ldap_info($_ldapauth_ldap->getOption('sid'), 'login_php')) ? eval($code) : $name;
 
   // If there is no bindn and bindpw - the connect will be an anonymous connect.
-  $_ldapauth_ldap->connect($_ldapauth_ldap->getOption('binddn'), $_ldapauth_ldap->getOption('bindpw'));
+  // If binddn is set to user, we'll use the user credentials to bind
+  $binddn = $_ldapauth_ldap->getOption('binddn');
+  if ($binddn == 'user') {
+    $_ldapauth_ldap->connect($name, $pass);
+  } else {
+    $_ldapauth_ldap->connect($binddn, $_ldapauth_ldap->getOption('bindpw'));
+  }
+
   foreach (explode("\r\n", $_ldapauth_ldap->getOption('basedn')) as $base_dn) {
     if (empty($base_dn))
       continue;
@@ -499,7 +507,7 @@ function _ldapauth_init($sid) {
 
   static $servers = array();
   if (!isset($servers[$sid]))
-    $servers[$sid] = db_fetch_object(db_query("SELECT * FROM {ldapauth} WHERE status = 1 AND sid = %d", $sid));
+    $servers[$sid] = ldapauth_get_server($sid, TRUE, 1);
 
   if ($servers[$sid]) {
     $_ldapauth_ldap = new LDAPInterface();
@@ -536,7 +544,7 @@ function _ldapauth_ldap_info($sid, $req)
 
   static $servers = array();
   if (!isset($servers[$sid]))
-    $servers[$sid] = db_fetch_object(db_query("SELECT * FROM {ldapauth} WHERE sid = %d", $sid));
+    $servers[$sid] = ldapauth_get_server($sid, TRUE);
 
   switch ($req) {
     case 'login_php':
diff -upN li_orig/ldapdata.admin.inc li_new/ldapdata.admin.inc
--- li_orig/ldapdata.admin.inc	2009-07-28 10:03:05.000000000 -0400
+++ li_new/ldapdata.admin.inc	2010-04-15 09:48:10.000000000 -0400
@@ -72,8 +72,8 @@ function ldapdata_admin_settings_submit(
  */
 function ldapdata_admin_list() {
   $rows = array();
-  $result = db_query("SELECT sid, name, status FROM {ldapauth} ORDER BY weight");
-  while ($row = db_fetch_object($result)) {
+  $result = ldapauth_get_server_list();
+  foreach($result as $row) {
     $rows[] = array(
       'data' => array(
         $row->name,
@@ -123,7 +123,7 @@ function ldapdata_admin_edit(&$form_stat
     );
   }
   elseif ($op == "edit" && $sid) {
-    $edit = db_fetch_array(db_query("SELECT * FROM {ldapauth} WHERE sid = %d", $sid));
+    $edit = ldapauth_get_server($sid);
 
     $ldapdata_mappings = $edit['ldapdata_mappings'] ? unserialize($edit['ldapdata_mappings']) : array();
     $ldapdata_roattrs = $edit['ldapdata_roattrs'] ? unserialize($edit['ldapdata_roattrs']) : array();
@@ -304,38 +304,14 @@ function ldapdata_admin_edit_validate($f
   $values = $form_state['values'];
   switch ($op) {
     case t('Update'):
-      $form_state['ldapdata_attrs'] = array();
       $ldapdata_attrs = TRUE;
       foreach ((trim($values['attributes']['ldapdata_attrs']) ? explode("\n", trim($values['attributes']['ldapdata_attrs'])) : array()) as $line) {
-        if (count($data = explode('|', trim($line))) == 6)
-          $form_state['ldapdata_attrs'] += array(trim(array_shift($data)) => $data);
-        else
+        if (count($data = explode('|', trim($line))) != 6)
           $ldapdata_attrs = FALSE;
       }
       if (!$ldapdata_attrs)
         form_set_error('attributes][ldapdata_attrs', t('Bad attribute syntax.'));
 
-      $form_state['ldapdata_mappings'] = array();
-      $form_state['ldapdata_mappings']['access'] = $values['ldapdata_mapping'];
-      if ($form_state['ldapdata_mappings']['access'] >= 4) {
-        foreach (element_children($values) as $attr) {
-          if (preg_match("/ldap_amap/", $attr) && $values[$attr])
-            $form_state['ldapdata_mappings'][$attr] = $values[$attr];
-        }
-      }
-      $form_state['ldapdata_mappings'] = !empty($form_state['ldapdata_mappings']) ? serialize($form_state['ldapdata_mappings']) : '';
-
-
-      $form_state['ldapdata_roattrs'] = isset($values['attributes']['ldapdata_roattrs']) ? array_values(array_intersect($values['attributes']['ldapdata_roattrs'], array_keys($form_state['ldapdata_attrs']))) : array();
-      $form_state['ldapdata_roattrs'] = !empty($form_state['ldapdata_roattrs']) ? serialize($form_state['ldapdata_roattrs']) : '';
-
-      $form_state['ldapdata_rwattrs'] = isset($values['attributes']['ldapdata_rwattrs']) ? array_values(array_intersect($values['attributes']['ldapdata_rwattrs'], array_keys($form_state['ldapdata_attrs']))) : array();
-      $form_state['ldapdata_rwattrs'] = !empty($form_state['ldapdata_rwattrs']) ? serialize($form_state['ldapdata_rwattrs']) : '';
-
-      $form_state['ldapdata_attrs'] = !empty($form_state['ldapdata_attrs']) ? serialize($form_state['ldapdata_attrs']) : '';
-
-      $form_state['ldapdata_filter_php'] = trim($values['attributes']['ldapdata_filter_php']);
-      $form_state['ldapdata_rwattrs'] = empty($form_state['ldapdata_filter_php']) ? $form_state['ldapdata_rwattrs'] : '';
       break;
   }
 }
@@ -348,23 +324,14 @@ function ldapdata_admin_edit_submit($for
   $values = $form_state['values'];
   switch ($op) {
     case t('Update'):
-      if (isset($values['ldapdata_bindpw_clear'])) {
-        db_query("UPDATE {ldapauth} SET ldapdata_mappings = '%s', ldapdata_roattrs = '%s', ldapdata_rwattrs = '%s', ldapdata_attrs = '%s', ldapdata_filter_php = '%s' WHERE sid = %d", $form_state['ldapdata_mappings'], $form_state['ldapdata_roattrs'], $form_state['ldapdata_rwattrs'], $form_state['ldapdata_attrs'], $form_state['ldapdata_filter_php'], $values['sid']);
-        if ($values['ldapdata_bindpw_clear']) {
-          db_query("UPDATE {ldapauth} SET ldapdata_bindpw = '' WHERE sid = %d", $values['sid']);
-        }
-      }
-      else {
-        db_query("UPDATE {ldapauth} SET ldapdata_mappings = '%s', ldapdata_roattrs = '%s', ldapdata_rwattrs = '%s', ldapdata_binddn = '%s', ldapdata_bindpw = '%s', ldapdata_attrs = '%s', ldapdata_filter_php = '%s' WHERE sid = %d", $form_state['ldapdata_mappings'], $form_state['ldapdata_roattrs'], $form_state['ldapdata_rwattrs'], $values['ldapdata_binddn'], $values['ldapdata_bindpw'], $form_state['ldapdata_attrs'], $form_state['ldapdata_filter_php'], $values['sid']);
-      }
+      ldapdata_update_server($values);
       drupal_set_message(t('The configuration options have been saved.'));
       $form_state['redirect'] = 'admin/settings/ldap/ldapdata';
       break;
     case t('Reset'):
       if ($values['confirm'] == 1) {
-
         // Settings reset.
-        db_query("UPDATE {ldapauth} SET ldapdata_mappings = '', ldapdata_roattrs = '', ldapdata_rwattrs = '', ldapdata_binddn = '', ldapdata_bindpw = '', ldapdata_attrs = '', ldapdata_filter_php = '' WHERE sid = %d", $values['sid']);
+        ldapdata_reset($values['sid']);
         drupal_set_message(t('The configuration options have been reset to their default values.'));
       }
       $form_state['redirect'] = 'admin/settings/ldap/ldapdata';
diff -upN li_orig/ldapdata.module li_new/ldapdata.module
--- li_orig/ldapdata.module	2009-10-27 10:29:17.000000000 -0400
+++ li_new/ldapdata.module	2010-02-17 22:00:14.000000000 -0500
@@ -26,6 +26,7 @@ define('LDAPDATA_MAP_NOTHING',          
  * Implements hook_init()
  */
 function ldapdata_init() {
+  require_once(drupal_get_path('module', 'ldapdata') .'/ldapauth.db.inc');
   require_once(drupal_get_path('module', 'ldapdata') .'/includes/LDAPInterface.inc');
 }
 
@@ -556,7 +557,7 @@ function _ldapdata_edition($sid) {
   if (!($sid = is_object($sid) ? (isset($sid->ldap_config) ? $sid->ldap_config : NULL) : $sid))
     return;
 
-  $row = db_fetch_object(db_query("SELECT ldapdata_binddn, ldapdata_bindpw FROM {ldapauth} WHERE sid = %d", $sid));
+  $row = ldapauth_get_server($sid, TRUE);
 
   return array(
     'dn' => $row->ldapdata_binddn ? $row->ldapdata_binddn : (isset($_SESSION['ldap_login']['dn']) ? $_SESSION['ldap_login']['dn'] : ''),
@@ -598,7 +599,7 @@ function _ldapdata_init($sid) {
 
   static $servers = array();
   if (!isset($servers[$sid]))
-    $servers[$sid] = db_fetch_object(db_query("SELECT * FROM {ldapauth} WHERE status = 1 AND sid = %d", $sid));
+    $servers[$sid] = ldapauth_get_server($sid, TRUE, 1);
 
   if ($servers[$sid]) {
     // Other modules can invoke user load from hook_init() before ldapdata.
@@ -636,7 +637,7 @@ function _ldapdata_ldap_info($sid, $req)
 
   static $servers = array();
   if (!isset($servers[$sid]))
-    $servers[$sid] = db_fetch_object(db_query("SELECT * FROM {ldapauth} WHERE sid = %d", $sid));
+    $servers[$sid] = ldapauth_get_server($sid, TRUE);
 
   switch ($req) {
     case 'mapping_type':
diff -upN li_orig/ldapgroups.admin.inc li_new/ldapgroups.admin.inc
--- li_orig/ldapgroups.admin.inc	2009-05-03 20:26:17.000000000 -0400
+++ li_new/ldapgroups.admin.inc	2010-04-14 21:50:03.000000000 -0400
@@ -29,8 +29,8 @@ function ldapgroups_admin_settings() {
  */
 function ldapgroups_admin_list() {
   $rows = array();
-  $result = db_query("SELECT sid, name, status FROM {ldapauth} ORDER BY weight");
-  while ($row = db_fetch_object($result)) {
+  $result = ldapauth_get_server_list();
+  foreach($result as $row) {
     $rows[] = array(
       'data' => array(
         $row->name,
@@ -79,7 +79,7 @@ function ldapgroups_admin_edit(&$form_st
     );
   }
   elseif ($op == 'edit' && $sid) {
-    $edit = db_fetch_array(db_query("SELECT * FROM {ldapauth} WHERE sid = %d", $sid));
+    $edit = ldapauth_get_server($sid);
 
     $form['description'] = array(
       '#value' => t('Configure LDAP groups to Drupal roles mapping settings for the %server.', array('%server' => $edit['name'])),
@@ -233,40 +233,6 @@ function ldapgroups_admin_edit_validate(
         form_set_error('ldapgroups_entries', t('Nodes are missing.'));
       if ($values['ldapgroups_as_entries'] && !trim($values['ldapgroups_entries_attribute']))
         form_set_error('ldapgroups_entries_attribute', t('Attribute is missing.'));
-
-      $form_state['ldapgroups_attr'] = array();
-      foreach ((trim($values['ldapgroups_attr']) ? explode("\n", trim($values['ldapgroups_attr'])) : array()) as $line)
-        if (trim($line))
-          $form_state['ldapgroups_attr'][] = trim($line);
-      $form_state['ldapgroups_attr'] = !empty($form_state['ldapgroups_attr']) ? serialize($form_state['ldapgroups_attr']) : '';
-
-      $form_state['ldapgroups_entries'] = array();
-      foreach ((trim($values['ldapgroups_entries']) ? explode("\n", trim($values['ldapgroups_entries'])) : array()) as $line)
-        if (trim($line))
-          $form_state['ldapgroups_entries'][] = trim($line);
-      $form_state['ldapgroups_entries'] = !empty($form_state['ldapgroups_entries']) ? serialize($form_state['ldapgroups_entries']) : '';
-
-      $form_state['ldapgroups_mappings'] = array();
-      $ldapgroups_role_mappings = TRUE;
-      foreach ((trim($values['ldapgroups_mappings']) ? explode("\n", trim($values['ldapgroups_mappings'])) : array()) as $line) {
-        if (count($mapping = explode('|', trim($line))) == 2)
-          $form_state['ldapgroups_mappings'] += array(trim($mapping[0]) => trim($mapping[1]));
-        else
-          $ldapgroups_role_mappings = FALSE;
-      }
-      $form_state['ldapgroups_mappings'] = !empty($form_state['ldapgroups_mappings']) ? serialize($form_state['ldapgroups_mappings']) : '';
-      if (!$ldapgroups_role_mappings)
-        form_set_error('ldapgroups_mappings', t('Bad mapping syntax.'));
-
-      if ($values['ldapgroups_mappings_filter'] && !trim($values['ldapgroups_mappings']))
-        form_set_error('ldapgroups_mappings', t('Mappings are missing.'));
-
-      $form_state['ldapgroups_groups'] = array();
-      foreach ((trim($values['ldapgroups_groups']) ? explode("\n", trim($values['ldapgroups_groups'])) : array()) as $line)
-        if (trim($line))
-          $form_state['ldapgroups_groups'][] = trim($line);
-      $form_state['ldapgroups_groups'] = !empty($form_state['ldapgroups_groups']) ? serialize($form_state['ldapgroups_groups']) : '';
-      break;
   }
 }
 
@@ -278,17 +244,15 @@ function ldapgroups_admin_edit_submit($f
   $values = $form_state['values'];
   switch ($op) {
     case t('Update'):
-
       // Update the ldapgroups configuration.
-      db_query("UPDATE {ldapauth} SET ldapgroups_in_dn = %d, ldapgroups_dn_attribute = '%s', ldapgroups_in_attr = %d, ldapgroups_attr = '%s', ldapgroups_as_entries = %d, ldapgroups_entries = '%s', ldapgroups_entries_attribute = '%s', ldapgroups_mappings = '%s', ldapgroups_mappings_filter = %d, ldapgroups_filter_php = '%s', ldapgroups_groups = '%s' WHERE sid = %d", $values['ldapgroups_in_dn'], trim($values['ldapgroups_dn_attribute']), $values['ldapgroups_in_attr'], $form_state['ldapgroups_attr'], $values['ldapgroups_as_entries'], $form_state['ldapgroups_entries'], trim($values['ldapgroups_entries_attribute']), $form_state['ldapgroups_mappings'], $values['ldapgroups_mappings_filter'], trim($values['ldapgroups_filter_php']), $form_state['ldapgroups_groups'], $values['sid']);
+      ldapgroups_server_update($values);
       drupal_set_message(t('The configuration options have been saved.'));
       $form_state['redirect'] = 'admin/settings/ldap/ldapgroups';
       break;
     case t('Reset'):
       if ($values['confirm'] == 1) {
-
         // Settings reset.
-        db_query("UPDATE {ldapauth} SET ldapgroups_in_dn = 0, ldapgroups_dn_attribute = '', ldapgroups_in_attr = 0, ldapgroups_attr = '', ldapgroups_as_entries = 0, ldapgroups_entries = '', ldapgroups_entries_attribute = '', ldapgroups_mappings = '', ldapgroups_mappings_filter = '0', ldapgroups_filter_php = '', ldapgroups_groups = '' WHERE sid = %d", $values['sid']);
+        ldapgroups_reset($values['sid']);
         drupal_set_message(t('The configuration options have been reset to their default values.'));
       }
       $form_state['redirect'] = 'admin/settings/ldap/ldapgroups';
diff -upN li_orig/ldapgroups.drush.inc li_new/ldapgroups.drush.inc
--- li_orig/ldapgroups.drush.inc	1969-12-31 19:00:00.000000000 -0500
+++ li_new/ldapgroups.drush.inc	2010-04-15 14:01:12.000000000 -0400
@@ -0,0 +1,221 @@
+<?php
+/**
+ * $Id$
+ *
+ * @file
+ * Drush commands for ldapgroups
+ */
+
+/**
+ * Implementation of hook_drush_command().
+ * @return An associative array describing your command(s)
+ */
+function ldapgroups_drush_command() {
+  $items['ldap group dn'] = array(
+    'callback' => 'ldapgroups_drush_set_dn',
+    'description' => dt('Add group by DN setting to a server'),
+    'arguments' => array(
+      'name' => dt('Friendly name for the server'),
+      'attribute' => dt('The name of the attribute which contains the group name'),
+    ),
+  );
+  $items['ldap group attr'] = array(
+    'callback' => 'ldapgroups_drush_set_attr',
+    'description' => dt('Add group by attribute setting to a server'),
+    'arguments' => array(
+      'name' => dt('Friendly name for the server'),
+      'attributes' => dt('newline separated list of attributes'),
+    ),
+  );
+  $items['ldap group entry'] = array(
+    'callback' => 'ldapgroups_drush_set_entry',
+    'description' => dt('Add group by entry to a server'),
+    'arguments' => array(
+      'name' => dt('Friendly name for the server'),
+      'attribute' => dt('Name of the multivalued attribute which holds the CNs of group members, for example: memberUid'),
+      'DNs' => dt('newline separated list of DNs to look for groups under'),
+    ),
+  );
+  $items['ldap group allow'] = array(
+    'callback' => 'ldapgroups_drush_allow',
+    'description' => dt('Allow access from selected LDAP groups'),
+    'arguments' => array(
+      'name' => dt('Friendly name for the server'),
+      'groups' => dt('newline separated list of groups to allow'),
+    ),
+  );
+  $items['ldap group map'] = array(
+    'callback' => 'ldapgroups_drush_map',
+    'description' => dt('Map LDAP groups to Drupal roles'),
+    'arguments' => array(
+      'name' => dt('Friendly name for the server'),
+      'mappings' => dt('list of LDAP groups and their Drupal role mappings, one per line with a | delimiter.'),
+    ),
+  );
+  $items['ldap group php'] = array(
+    'callback' => 'ldapgroups_drush_php',
+    'description' => dt('PHP filtering'),
+    'arguments' => array(
+      'name' => dt('Friendly name for the server'),
+      'PHP' => dt('PHP code to filter groups with'),
+    ),
+  );
+  return $items;
+}
+
+/**
+ * Implementation of hook_drush_help
+ * @param section: the drush command we're seeking help for
+ * @return: A string describing the command
+ */
+function ldapgroups_drush_help($section) {
+  switch($section) {
+    case 'drush:ldap group dn':
+      return dt('Configure LDAP group support by DN');
+    case 'drush:ldap group entry':
+      return dt('Configure LDAP group support by LDAP entry');
+    case 'drush:ldap group attr':
+      return dt('Configure LDAP group support by user attribute');
+    case 'drush:ldap group allow':
+      return dt('Define LDAP groups to allow in');
+    case 'drush:ldap group map':
+      return dt('Map LDAP groups to Drupal roles');
+    case 'drush:ldap group php':
+      return dt('Define PHP for filtering roles');
+  }
+}
+
+/*
+ * Helper function to include the file containing the db functions
+ */
+function ldapauth_drush_include() {
+  $path = drupal_get_path('module', 'ldapauth');
+  include_once($path . "/ldapauth.db.inc");
+}
+
+/*
+ * Set group DN attribute
+ * @param name: Friendly server name
+ * @param attribute: attribute containing the group
+ */
+function ldapgroups_drush_set_dn($name, $attribute) {
+  if (!$name || !$attribute) {
+    drush_set_error('LDAPGROUPS_MISSING_DATA', dt('Both name and attribute must be specified'));
+    return;
+  }
+  ldapauth_drush_include();
+  if (!$server = ldapauth_get_server($name)) {
+    drush_set_error('LDAPGROUPS_INVALID_SERVER', dt('Invalid server name specified'));
+    return;
+  }
+
+  $server['ldapgroups_in_dn'] = 1;
+  $server['ldapgroups_dn_attribute' ] = $attribute;
+  ldapgroups_update_server($values);
+}
+
+/*
+ * Set group by attribute
+ * @param name: Friendly server name
+ * @param attributes: list of attributes containing groups
+ */
+function ldapgroups_drush_set_attr($name, $attributes) {
+  if (!$name || !$attributes) {
+    drush_set_error('LDAPGROUPS_MISSING_DATA', dt('Both name and attributes must be specified'));
+    return;
+  }
+  ldapauth_drush_include();
+  if (!$server = ldapauth_get_server($name)) {
+    drush_set_error('LDAPGROUPS_INVALID_SERVER', dt('Invalid server name specified'));
+    return;
+  }
+
+  $server['ldapgroups_in_attr'] = 1;
+  $server['ldapgroups_attr' ] = $attributes;
+  ldapgroups_update_server($values);
+}
+
+/*
+ * Set group by entry
+ * @param name: Friendly server name
+ * @param attribute: name of attribute containing group
+ * @param dns : list of DNs containing group attributes
+ */
+function ldapgroups_drush_set_entry($name, $attribute, $dns) {
+  if (!$name || !$attribute || !$dns) {
+    drush_set_error('LDAPGROUPS_MISSING_DATA', dt('Name, attribute and DNs must be specified'));
+    return;
+  }
+  ldapauth_drush_include();
+  if (!$server = ldapauth_get_server($name)) {
+    drush_set_error('LDAPGROUPS_INVALID_SERVER', dt('Invalid server name specified'));
+    return;
+  }
+
+  $server['ldapgroups_as_entries'] = 1;
+  $server['ldapgroups_entries_attribute' ] = $attribute;
+  $server['ldapgroups_entries' ] = $dns;
+  ldapgroups_update_server($values);
+}
+
+/*
+ * Allow access to certain groups
+ * @param name: Friendly server name
+ * @param groups : list of groups to allow
+ */
+function ldapgroups_drush_allow($name, $groups) {
+  if (!$name || !$groups) {
+    drush_set_error('LDAPGROUPS_MISSING_DATA', dt('Name and groups must be specified'));
+    return;
+  }
+  ldapauth_drush_include();
+  if (!$server = ldapauth_get_server($name)) {
+    drush_set_error('LDAPGROUPS_INVALID_SERVER', dt('Invalid server name specified'));
+    return;
+  }
+
+  $server['ldapgroups_groups'] = $groups;
+  ldapgroups_update_server($values);
+}
+
+/*
+ * Map LDAP groups to Drupal roles
+ * @param name: Friendly server name
+ * @param mappings : list of mappings
+ */
+function ldapgroups_drush_map($name, $mappings) {
+  if (!$name || !mappings) {
+    drush_set_error('LDAPGROUPS_MISSING_DATA', dt('Name and mappings must be specified'));
+    return;
+  }
+  ldapauth_drush_include();
+  if (!$server = ldapauth_get_server($name)) {
+    drush_set_error('LDAPGROUPS_INVALID_SERVER', dt('Invalid server name specified'));
+    return;
+  }
+
+  $server['ldapgroups_mappings_filter'] = 1;
+  $server['ldapgroups_mappings'] = $mappings;
+  ldapgroups_update_server($values);
+}
+
+/*
+ * Define PHP for filtering
+ * @param name: Friendly server name
+ * @param php : PHP code
+ */
+function ldapgroups_drush_php($name, $php) {
+  if (!$name || !$php) {
+    drush_set_error('LDAPGROUPS_MISSING_DATA', dt('Name and PHP must be specified'));
+    return;
+  }
+  ldapauth_drush_include();
+  if (!$server = ldapauth_get_server($name)) {
+    drush_set_error('LDAPGROUPS_INVALID_SERVER', dt('Invalid server name specified'));
+    return;
+  }
+
+  $server['ldapgroups_filter_php'] = $php;
+  ldapgroups_update_server($values);
+}
+
diff -upN li_orig/ldapgroups.inc li_new/ldapgroups.inc
--- li_orig/ldapgroups.inc	2009-08-25 09:53:20.000000000 -0400
+++ li_new/ldapgroups.inc	2010-02-17 19:39:36.000000000 -0500
@@ -92,7 +92,7 @@ function _ldapgroups_detect_groups($user
   // so I just check to see if they would be blank, based on ldap_forget_passwords, and
   // make it read from the database.
   if (LDAPAUTH_FORGET_PASSWORDS || !$_ldapgroups_ldap->connect($dn, $pass)) {
-    $row2 = db_fetch_object(db_query("SELECT binddn, bindpw FROM {ldapauth} WHERE sid = %d", $_ldapgroups_ldap->getOption('sid')));
+    $row2 = ldap_get_server($_ldapgroups_ldap->getOption('sid'), TRUE);
     $dn = $row2->binddn;
     $pass = $row2->bindpw;
     if (!$_ldapgroups_ldap->connect($dn, $pass)) {
@@ -256,7 +256,7 @@ function _ldapgroups_ldap_init($sid) {
 
   static $servers = array();
   if (!isset($servers[$sid]))
-    $servers[$sid] = db_fetch_object(db_query("SELECT * FROM {ldapauth} WHERE status = 1 AND sid = %d", $sid));
+    $servers[$sid] = ldapauth_get_server($sid, TRUE, 1);
 
   if ($servers[$sid]) {
     $_ldapgroups_ldap = new LDAPInterface();
@@ -289,7 +289,7 @@ function _ldapgroups_ldap_info($sid, $re
 
   static $servers = array();
   if (!isset($servers[$sid]))
-    $servers[$sid] = db_fetch_object(db_query("SELECT * FROM {ldapauth} WHERE sid = %d", $sid));
+    $servers[$sid] = ldapauth_get_server($sid, TRUE);
 
   switch ($req) {
     case 'ldapgroups_in_dn':
diff -upN li_orig/ldapgroups.module li_new/ldapgroups.module
--- li_orig/ldapgroups.module	2009-08-25 09:23:37.000000000 -0400
+++ li_new/ldapgroups.module	2010-02-17 22:02:03.000000000 -0500
@@ -14,6 +14,10 @@ define('LDAPGROUPS_DEFAULT_ENTRIES_ATTRI
 //////////////////////////////////////////////////////////////////////////////
 // Core API hooks
 
+function ldapgroups_init() {
+  require_once(drupal_get_path('module', 'ldapgroups') .'/ldapauth.db.inc');
+}
+
 /**
  * Implementation of hook_menu().
  */
Common subdirectories: li_orig/translations and li_new/translations
