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