diff -ur proftpd-1.2.10rc3.original/contrib/mod_ldap.c proftpd-1.2.10rc3/contrib/mod_ldap.c
--- proftpd-1.2.10rc3.original/contrib/mod_ldap.c	2004-04-28 22:35:38.000000000 -0500
+++ proftpd-1.2.10rc3/contrib/mod_ldap.c	2005-01-28 07:59:19.478859680 -0600
@@ -53,7 +53,10 @@
 
 /* User attributes */
 #ifndef UID_ATTR
-#define UID_ATTR            "uid"
+#define UID_ATTR            "login"
+#endif
+#ifndef AD_ATTR
+#define AD_ATTR            "sAMAccountName"
 #endif
 #ifndef UIDNUMBER_ATTR
 #define UIDNUMBER_ATTR      "uidNumber"
@@ -513,25 +516,7 @@
       }
 
       if (strcasecmp(ldap_attrs[i], HOMEDIRECTORY_ATTR) == 0) {
-        if (!ldap_hdod || !ldap_hdod_prefix || !*ldap_hdod_prefix) {
-          pr_log_pri(PR_LOG_ERR, "mod_ldap: pr_ldap_user_lookup(): no " HOMEDIRECTORY_ATTR " attr for DN %s and LDAPHomedirOnDemandPrefix was not enabled!", (dn = ldap_get_dn(ld, e)));
-          free(dn);
-          return NULL;
-        }
-
-        if (ldap_hdod_prefix_nouname)
-          pw->pw_dir = pstrcat(session.pool, ldap_hdod_prefix, NULL);
-        else {
-          char **canon_username;
-          if ((canon_username = ldap_get_values(ld, e, UID_ATTR)) == NULL) {
-            pr_log_pri(PR_LOG_ERR, "mod_ldap: pr_ldap_user_lookup(): couldn't get " UID_ATTR " attr for canonical username for %s", (dn = ldap_get_dn(ld, e)));
-            free(dn);
-            return NULL;
-          }
-
-          pw->pw_dir = pstrcat(session.pool, ldap_hdod_prefix, "/", canon_username[0], NULL);
-          ldap_value_free(canon_username);
-        }
+	pw->pw_dir = pstrcat(session.pool, ldap_hdod_prefix, NULL);
 
         ++i;
         continue;
@@ -551,6 +536,11 @@
        * the attr.
        */
 
+      if ((strcasecmp(ldap_attrs[i], UID_ATTR) == 0) || (strcasecmp(ldap_attrs[i], AD_ATTR) == 0)) {
+	      ++i;
+	      continue;
+      }
+
       pr_log_pri(PR_LOG_ERR, "mod_ldap: pr_ldap_user_lookup(): ldap_get_values() failed on attr %s for DN %s, ignoring request (perhaps this DN's entry does not have the attr?)", ldap_attrs[i], (dn = ldap_get_dn(ld, e)));
       free(dn);
       ldap_msgfree(result);
@@ -562,7 +552,7 @@
      * branches below for nonexistant attrs will just never be called.
      */
 
-    if (strcasecmp(ldap_attrs[i], UID_ATTR) == 0)
+    if ((strcasecmp(ldap_attrs[i], UID_ATTR) == 0) || (strcasecmp(ldap_attrs[i], AD_ATTR) == 0))
       pw->pw_name = pstrdup(session.pool, values[0]);
     else if (strcasecmp(ldap_attrs[i], USERPASSWORD_ATTR) == 0)
       pw->pw_passwd = pstrdup(session.pool, values[0]);
@@ -589,7 +579,7 @@
           pw->pw_dir = pstrcat(session.pool, ldap_hdod_prefix, NULL);
         else {
           char **canon_username;
-          if ((canon_username = ldap_get_values(ld, e, UID_ATTR)) == NULL) {
+	  if (((canon_username = ldap_get_values(ld, e, UID_ATTR)) == NULL) && ((canon_username = ldap_get_values(ld, e, AD_ATTR)) == NULL)) {
             pr_log_pri(PR_LOG_ERR, "mod_ldap: pr_ldap_user_lookup(): couldn't get " UID_ATTR " attr for canonical username for %s", (dn = ldap_get_dn(ld, e)));
             free(dn);
             return NULL;
@@ -836,7 +826,7 @@
 static struct passwd *
 pr_ldap_getpwnam(pool *p, const char *username)
 {
-  char *name_attrs[] = {USERPASSWORD_ATTR, UID_ATTR, UIDNUMBER_ATTR,
+  char *name_attrs[] = {USERPASSWORD_ATTR, UID_ATTR, AD_ATTR, UIDNUMBER_ATTR,
                         GIDNUMBER_ATTR, HOMEDIRECTORY_ATTR, LOGINSHELL_ATTR,
                         NULL};
 
@@ -860,7 +850,7 @@
 pr_ldap_getpwuid(pool *p, uid_t uid)
 {
   char uidstr[PR_TUNABLE_BUFFER_SIZE] = {'\0'},
-       *uid_attrs[] = {UID_ATTR, UIDNUMBER_ATTR, GIDNUMBER_ATTR,
+       *uid_attrs[] = {UID_ATTR, AD_ATTR, UIDNUMBER_ATTR, GIDNUMBER_ATTR,
                        HOMEDIRECTORY_ATTR, LOGINSHELL_ATTR, NULL};
 
   snprintf(uidstr, sizeof(uidstr), "%d", uid);
