Hi,

I have enclosed a patch to enable vpopmail to work correctly with LDAP.
The problem was that if you compile vpopmail with LDAP-support quota's were not
modified in LDAP using vsetuserquota.

You should also deactivate clear-passwords ( --enable-clear-passwd=n ), because
there is no coresponding LDAP-entry so this field is alsway a NULL-Pointer.

In vpopmail.c Line 2273 there is a check:

 if ( inpw->pw_shell == NULL )        return(VA_NULL_POINTER);
#ifdef CLEAR_PASS
  if ( inpw->pw_clear_passwd == NULL ) return(VA_NULL_POINTER);
#endif

so using LDAP will always return VA_NULL_POINTER which causes
vauth_setpw ( vldap.c, Line 752 ) silently quit with VA_NULL_POINTER ( -33 )

ret = vcheck_vqpw(inpw, domain);
    if ( ret != 0 ) { return(ret); }

The result is, that LDAP-entries are not modified.

This patch also fixes a bug and *vauth_getpw now correctly returns a pointer to
struct vqpasswd as defined in vauth.h

Enjoy
Jens


----------------------------------------
This mail sent through Novasoft WWW-Mail
--- vldap.c.save        Tue Oct  8 13:03:34 2002
+++ vldap.c     Tue Oct  8 13:11:36 2002
@@ -49,7 +49,7 @@ char *ldap_fields[8] = {
 struct vqpasswd *vauth_getpw(char *user, char *domain)
 {
   int ret = 0;
-  static struct vqpasswd vpw;
+  struct vqpasswd *vpw = NULL;
   LDAPMessage *res = NULL, *msg = NULL;
   char *filter = NULL, **vals = NULL, *h = NULL, *t = NULL, *passwd = NULL;
   int eret = 0;
@@ -58,6 +58,10 @@ struct vqpasswd *vauth_getpw(char *user,
   uid_t uid; 
   gid_t gid;
 
+  vpw = malloc(sizeof(struct vqpasswd));
+  if (vpw == NULL)
+     return NULL;
+
   verrori = 0;
   lowerit(user);
   lowerit(domain);
@@ -67,7 +71,6 @@ struct vqpasswd *vauth_getpw(char *user,
   if ( myuid != 0 && myuid != uid ) {
     return(NULL);
   }
-
   ret = (strlen(user) + 32 + 1);
   eret = (strlen(VLDAP_BASEDN) - 2 + strlen(domain) + 1);
 
@@ -114,8 +117,7 @@ struct vqpasswd *vauth_getpw(char *user,
   ret = ldap_count_entries(ld, msg);
 
   if (ret != 1) return NULL;
-  
-  memset((struct vqpasswd *)&vpw, 0, sizeof(struct vqpasswd));
+  memset((struct vqpasswd *)vpw, 0, sizeof(struct vqpasswd));
   
   /*
      Fetch userPassword first so we can make sure
@@ -181,15 +183,15 @@ struct vqpasswd *vauth_getpw(char *user,
      }
   }
   
-  vpw.pw_passwd = (char *)malloc((strlen(passwd) + 1));
-  if (vpw.pw_passwd == NULL) {
+  vpw->pw_passwd = (char *)malloc((strlen(passwd) + 1));
+  if (vpw->pw_passwd == NULL) {
      free(h - 1);
      ldap_value_free(vals);
      return NULL;
   }
   
-  memset((char *)vpw.pw_passwd, 0, (strlen(passwd) + 1));
-  memcpy((char *)vpw.pw_passwd, (char *)(passwd), strlen(passwd));
+  memset((char *)vpw->pw_passwd, 0, (strlen(passwd) + 1));
+  memcpy((char *)vpw->pw_passwd, (char *)(passwd), strlen(passwd));
 
   /*
      Old passwd pointer.
@@ -204,30 +206,30 @@ struct vqpasswd *vauth_getpw(char *user,
   
   vals = ldap_get_values(ld, msg, "uid");
   if (vals == NULL) {
-     free(vpw.pw_passwd);
+     free(vpw->pw_passwd);
      return NULL;
   }
 
-  vpw.pw_name = (char *)malloc((strlen(*vals) + 1));
-  if (vpw.pw_name == NULL) {
-     free(vpw.pw_passwd);
+  vpw->pw_name = (char *)malloc((strlen(*vals) + 1));
+  if (vpw->pw_name == NULL) {
+     free(vpw->pw_passwd);
      ldap_value_free(vals);
      return NULL;
   }
 
-  memset((char *)vpw.pw_name, 0, (strlen(*vals) + 1));
-  memcpy((char *)vpw.pw_name, (char *)(*vals), strlen(*vals));
+  memset((char *)vpw->pw_name, 0, (strlen(*vals) + 1));
+  memcpy((char *)vpw->pw_name, (char *)(*vals), strlen(*vals));
   ldap_value_free(vals);
 
   vals = ldap_get_values(ld, msg, "mailQuota");
   if (vals)
-     vpw.pw_shell = (char *)malloc((strlen(*vals) + 1));
+     vpw->pw_shell = (char *)malloc((strlen(*vals) + 1));
   else
-     vpw.pw_shell = (char *)malloc(1); 
+     vpw->pw_shell = (char *)malloc(1); 
   
-  if (vpw.pw_shell == NULL) {
-     free(vpw.pw_name);
-     free(vpw.pw_passwd);
+  if (vpw->pw_shell == NULL) {
+     free(vpw->pw_name);
+     free(vpw->pw_passwd);
  
      if (vals)
         ldap_value_free(vals);
@@ -236,56 +238,57 @@ struct vqpasswd *vauth_getpw(char *user,
   }
 
   if (vals) {
-     memset((char *)vpw.pw_shell, 0, (strlen(*vals) + 1));
-     memcpy((char *)vpw.pw_shell, (char *)(*vals), strlen(*vals));     
+     memset((char *)vpw->pw_shell, 0, (strlen(*vals) + 1));
+     memcpy((char *)vpw->pw_shell, (char *)(*vals), strlen(*vals));     
 
      ldap_value_free(vals);
   }
   else
-     *vpw.pw_shell = '\0';
+     *vpw->pw_shell = '\0';
 
   vals = ldap_get_values(ld, msg, "qmaildomain");
   if ( vals ) {
-       vpw.pw_gecos = (char *)malloc((strlen(*vals) + 1));
-       if (vpw.pw_gecos == NULL) {
-               free(vpw.pw_passwd);
-               free(vpw.pw_name);
-               free(vpw.pw_dir);
-               free(vpw.pw_shell);
+       vpw->pw_gecos = (char *)malloc((strlen(*vals) + 1));
+       if (vpw->pw_gecos == NULL) {
+               free(vpw->pw_passwd);
+               free(vpw->pw_name);
+               free(vpw->pw_dir);
+               free(vpw->pw_shell);
                ldap_value_free(vals);
                return NULL;     
        }
-       memset((char *)vpw.pw_gecos, 0, (strlen(*vals) + 1));
-       memcpy((char *)vpw.pw_gecos, (char *)(*vals), strlen(*vals));
+       memset((char *)vpw->pw_gecos, 0, (strlen(*vals) + 1));
+       memcpy((char *)vpw->pw_gecos, (char *)(*vals), strlen(*vals));
        ldap_value_free(vals);
   }
 
   vals = ldap_get_values(ld, msg, "mailMessageStore");
   if ( vals ){
-       vpw.pw_dir = (char *)malloc((strlen(*vals) + 1));
-       if (vpw.pw_dir == NULL) {
-               free(vpw.pw_passwd);
-               free(vpw.pw_name);
-               free(vpw.pw_shell);
+       vpw->pw_dir = (char *)malloc((strlen(*vals) + 1));
+       if (vpw->pw_dir == NULL) {
+               free(vpw->pw_passwd);
+               free(vpw->pw_name);
+               free(vpw->pw_shell);
                ldap_value_free(vals);
                return NULL;
        }  
-       memset((char *)vpw.pw_dir, 0, (strlen(*vals) + 1));
-       memcpy((char *)vpw.pw_dir, (char *)(*vals), strlen(*vals));
+       memset((char *)vpw->pw_dir, 0, (strlen(*vals) + 1));
+       memcpy((char *)vpw->pw_dir, (char *)(*vals), strlen(*vals));
         ldap_value_free(vals);
   }
 
   vals = ldap_get_values(ld, msg, "qmailUID");
   if ( vals ) {
-       vpw.pw_uid = atoi(*vals);
+       vpw->pw_uid = atoi(*vals);
        ldap_value_free(vals);
   }
 
   vals = ldap_get_values(ld, msg, "qmailGID");
   if ( vals ) {
-       vpw.pw_gid = atoi(*vals);
+       vpw->pw_gid = atoi(*vals);
        ldap_value_free(vals);
   }
+ return vpw;
 
 }
 void vauth_end_getall()

Reply via email to