--- vldap.c.orig	Sat Jun 22 00:34:57 2002
+++ vldap.c	Tue Sep 17 17:33:30 2002
@@ -35,7 +35,13 @@
 LDAP *ld = NULL;
 LDAPMessage *glm = NULL;
 
-char *ldap_fields[8] = {
+#ifdef CLEAR_PASS
+#	define NUM_LDAP_FIELDS	9
+#else
+#	define NUM_LDAP_FIELDS	8
+#endif
+
+char *ldap_fields[NUM_LDAP_FIELDS] = {
   "uid",			/* 0 pw_name   */ 
   "userPassword",		/* 1 pw_passwd */
   "qmailUID",			/* 2 pw_uid    */
@@ -43,9 +49,15 @@
   "qmaildomain",		/* 4 pw_gecos  */
   "mailMessageStore",		/* 5 pw_dir    */
   "mailQuota",			/* 6 pw_shell  */
+#ifndef CLEAR_PASS
   "objectclass"			/* 7 ldap      */
+#else
+  "clearPassword",		/* 7 pw_clear_passwd */
+  "objectclass"			/* 8 ldap      */
+#endif
 };
 
+
 struct vqpasswd *vauth_getpw(char *user, char *domain)
 {
   int ret = 0;
@@ -287,8 +299,27 @@
   	ldap_value_free(vals);
   }
 
+#ifdef CLEAR_PASS
+  /* for pw_clear_passwd */
+  vals = ldap_get_values(ld, msg, "clearPassword");
+  if ( vals ) {
+  	vpw.pw_clear_passwd = (char *)malloc((strlen(*vals) + 1));
+	if (vpw.pw_clear_passwd == NULL) {
+    		free(vpw.pw_passwd);
+    		free(vpw.pw_name);
+    		free(vpw.pw_shell);
+    		ldap_value_free(vals);
+    		return NULL;
+	}
+  	memset((char *)vpw.pw_clear_passwd, 0, (strlen(*vals) + 1));
+  	memcpy((char *)vpw.pw_clear_passwd, (char *)(*vals), strlen(*vals));
+  	ldap_value_free(vals);
+  }
+#endif
+
   return(&vpw);
 }
+
 void vauth_end_getall()
 {
 }
@@ -401,7 +432,6 @@
   char *b = NULL;
   char crypted[100] = { 0 };
 
-
   if ((dir) && (*dir))
      vd = 1;
 
@@ -436,10 +466,10 @@
         return -99;
   }
 
-  lm = (LDAPMod **)malloc(sizeof(LDAPMod *) * 9);
+  lm = (LDAPMod **)malloc(sizeof(LDAPMod *) * (NUM_LDAP_FIELDS +1));
   if (lm == NULL) return -98;   
 
-  for(i=0;i<8;++i) {
+  for(i=0;i<NUM_LDAP_FIELDS;++i) {
     lm[i] = (LDAPMod *)malloc(sizeof(LDAPMod)); 
     if (lm[i] == NULL) {
       for(j=0;j<i;++j) free(lm[j]);
@@ -452,7 +482,7 @@
     lm[i]->mod_values = (char **)malloc(sizeof(char *) * 2);
     lm[i]->mod_values[1] = NULL;
   }
-  lm[8] = NULL;
+  lm[NUM_LDAP_FIELDS] = NULL;
 
   lm[0]->mod_values[0] = strdup(user);
 
@@ -484,15 +514,17 @@
 #else
   lm[6]->mod_values[0] = strdup("NOQUOTA");
 #endif
-  lm[7]->mod_values[0] = strdup("qmailUser");
-
+  lm[NUM_LDAP_FIELDS-1]->mod_values[0] = strdup("qmailUser");
+#ifdef CLEAR_PASS
+  lm[7]->mod_values[0] = strdup(password);
+#endif
 
   ret = 4 + strlen(user) + 2 + strlen(VLDAP_BASEDN) - 2 + strlen(domain) + 1;
   b = (char *)malloc(ret);
 
   dn = (char *)malloc(ret);
   if (dn == NULL) {
-     for(i=0;i<8;++i) { 
+     for(i=0;i<NUM_LDAP_FIELDS;++i) { 
 	free(lm[i]->mod_type);
 	free(lm[i]->mod_values[0]);
      }
@@ -510,7 +542,7 @@
   ret = ldap_add_s(ld, dn, lm);
  
   free(dn);
-  for(i=0;i<8;++i) {
+  for(i=0;i<NUM_LDAP_FIELDS;++i) {
   	free(lm[i]->mod_type);
   	free(lm[i]->mod_values[0]);
   }
@@ -761,11 +793,11 @@
         return -99;
   }
 
-  lm = (LDAPMod **)malloc(sizeof(LDAPMod *) * 9);
+  lm = (LDAPMod **)malloc(sizeof(LDAPMod *) * NUM_LDAP_FIELDS + 1);
   if (lm == NULL)
      return -98;   
 
-  for(i=0;i<8;++i) {
+  for(i=0;i<NUM_LDAP_FIELDS;++i) {
   	lm[i] = (LDAPMod *)malloc(sizeof(LDAPMod)); 
   	if (lm[i] == NULL) {
 		for(j=0;j<i;++j) free(lm[j]);
@@ -778,13 +810,16 @@
     lm[i]->mod_values[1] = NULL;
     lm[i]->mod_type = strdup(ldap_fields[i]);
   }
-  lm[8] = NULL;
+  lm[NUM_LDAP_FIELDS] = NULL;
 
   lm[0]->mod_values[0] = strdup(inpw->pw_name);  
 
   lm[1]->mod_values[0] = malloc(strlen(inpw->pw_passwd) + 7 + 1);
-  snprintf(lm[1]->mod_values[0], strlen(inpw->pw_passwd) + 7 + 1, 
-	"{crypt}%s", inpw->pw_passwd);
+#ifdef MD5_PASSWORDS
+  snprintf(lm[1]->mod_values[0], strlen(inpw->pw_passwd) + 7 + 1, "{MD5}%s", inpw->pw_passwd);
+#else
+  snprintf(lm[1]->mod_values[0], strlen(inpw->pw_passwd) + 7 + 1, "{crypt}%s", inpw->pw_passwd);
+#endif
 
   lm[2]->mod_values[0] = malloc(10);
   sprintf(lm[2]->mod_values[0], "%d", inpw->pw_uid);
@@ -799,7 +834,10 @@
   }
   lm[5]->mod_values[0] = strdup(inpw->pw_dir);
   lm[6]->mod_values[0] = strdup(inpw->pw_shell);  
-  lm[7]->mod_values[0] = strdup("qmailUser");
+  lm[NUM_LDAP_FIELDS-1]->mod_values[0] = strdup("qmailUser");
+#ifdef CLEAR_PASS
+  lm[7]->mod_values[0] = strdup(inpw->pw_clear_passwd);
+#endif
 
   ret = 4 + strlen(inpw->pw_name) + 2 + strlen(VLDAP_BASEDN) - 2 + strlen(domain) + 1;
   b = (char *)malloc(ret);
@@ -820,7 +858,7 @@
   ret = ldap_modify_s(ld, dn, lm);
  
   free(dn);
-  for(i=0;i<8;++i) free(lm[i]);
+  for(i=0;i<NUM_LDAP_FIELDS;++i) free(lm[i]);
   free(lm);
 
   if (ret != LDAP_SUCCESS)
