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()