fixes from Albert Lee

- Support the Sun LDAP library as an alternative to OpenLDAP (Novell/Mozilla use the same API and will be supported later). 
- Support the Solaris variants of the re-entrant pwd.h functions.
- Add example SMF manifest and method files for Bongo.
This commit is contained in:
pfelt
2007-07-04 02:42:17 +00:00
parent c3904338e0
commit 94c7c429e8
6 changed files with 126 additions and 56 deletions
+2
View File
@@ -52,6 +52,8 @@ EXTRA_DIST := \
init/bongo.init.fc4.in \
init/bongo.init.sles9.in \
init/bongo.init.suse10.in \
init/svc-bongo.solaris-smf.in \
init/network-bongo.xml.solaris-smf \
mkinstalldirs
pkgconfigdir = $(libdir)/pkgconfig
+1
View File
@@ -608,6 +608,7 @@ include/Makefile
init/bongo.init.fc4
init/bongo.init.sles9
init/bongo.init.suse10
init/svc-bongo.solaris-smf
po/Makefile.in
src/agents/alarm/Makefile
src/agents/antispam/Makefile
+4
View File
@@ -50,7 +50,11 @@ LookupUser(uid_t uid)
buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
buf = MemMalloc(buflen + 1);
#if defined(__SVR4) && defined(__sun) && !defined(_POSIX_PTHREAD_SEMANTICS)
pw = getpwuid_r(uid, &pwbuf, buf, buflen);
#else
getpwuid_r(uid, &pwbuf, buf, buflen, &pw);
#endif
if (!pw) {
MemFree(buf);
+89 -56
View File
@@ -1015,39 +1015,57 @@ static BOOL
LdapVerify(const char *Base, const char *Password)
{
LDAP *ldap;
int err;
int err, tries;
BOOL result = FALSE;
char *url;
#ifdef _SOLARIS_SDK
if (MdbLdap.LdapTls) {
url = malloc(32 + strlen(MdbLdap.LdapHostAddress));
if (url) {
sprintf(url, "ldap://%s:%d", MdbLdap.LdapHostAddress,
MdbLdap.LdapHostPort);
ldap_initialize(&ldap, url);
if (ldap) {
err = ldap_start_tls_s(ldap, NULL, NULL);
if (err != LDAP_SUCCESS) {
Log(LOG_ERROR, "ldap_start_tls_s() failed: %s",
ldap_err2string(err));
ldap_unbind_s(ldap);
ldap = NULL;
}
}
free(url);
}
} else {
err = ldapssl_client_init(NULL, NULL);
ldap = ldap_init(MdbLdap.LdapHostAddress, MdbLdap.LdapHostPort);
}
if (ldap) {
if (err == LDAP_SUCCESS) {
err = ldapssl_install_routines(ldap);
}
if (err == LDAP_SUCCESS) {
#ifdef LDAP_OPT_SSL
err = ldap_set_option(ldap, LDAP_OPT_SSL, LDAP_OPT_ON);
#endif
ldap_set_option(ldap, LDAP_OPT_RECONNECT, LDAP_OPT_ON);
}
if (err != LDAP_SUCCESS) {
Log(LOG_ERROR, "Enabling TLS failed: %s",
ldap_err2string(err));
ldap_unbind_ext(ldap, NULL, NULL);
ldap = NULL;
}
}
} else {
ldap = ldap_init(MdbLdap.LdapHostAddress, MdbLdap.LdapHostPort);
}
#else
ldap = ldap_init(MdbLdap.LdapHostAddress, MdbLdap.LdapHostPort);
if (ldap) {
err = ldap_simple_bind_s(ldap, Base, Password);
if (MdbLdap.LdapTls) {
err = ldap_start_tls_s(ldap, NULL, NULL);
if (err != LDAP_SUCCESS) {
Log(LOG_ERROR, "ldap_start_tls_s() failed: %s",
ldap_err2string(err));
ldap_unbind_ext(ldap, NULL, NULL);
ldap = NULL;
}
}
}
#endif
if (err == LDAP_SUCCESS) {
result = TRUE;
if (ldap) {
for (tries = 0; tries < 3; tries++) {
err = ldap_simple_bind_s(ldap, Base, Password);
if (err == LDAP_SUCCESS) {
result = TRUE;
break;
}
}
ldap_unbind_s(ldap);
@@ -1203,39 +1221,55 @@ static LDAP *
InitLdapConnection(char *BindDn, char *Passwd, void *rebind_proc,
MDBLDAPContextStruct *Context)
{
char *url;
LDAP *ldap = NULL;
int err;
int err, tries;
#ifdef _SOLARIS_SDK
if (MdbLdap.LdapTls) {
url = malloc(32 + strlen(MdbLdap.LdapHostAddress));
if (url) {
sprintf(url, "ldap://%s:%d", MdbLdap.LdapHostAddress,
MdbLdap.LdapHostPort);
ldap_initialize(&ldap, url);
if (ldap) {
err = ldap_start_tls_s(ldap, NULL, NULL);
/* does ldap_start_tls_s() not return
LDAP_SUCCESS on success?
*/
if (err != LDAP_SUCCESS) {
Log(LOG_ERROR, "ldap_start_tls_s() failed: %s",
ldap_err2string(err));
ldap_unbind_s(ldap);
ldap = NULL;
}
}
free(url);
}
} else {
err = ldapssl_client_init(NULL, NULL);
ldap = ldap_init(MdbLdap.LdapHostAddress, MdbLdap.LdapHostPort);
}
if (ldap) {
if (err == LDAP_SUCCESS) {
err = ldapssl_install_routines(ldap);
}
if (err == LDAP_SUCCESS) {
#ifdef LDAP_OPT_SSL
err = ldap_set_option(ldap, LDAP_OPT_SSL, LDAP_OPT_ON);
#endif
ldap_set_option(ldap, LDAP_OPT_RECONNECT, LDAP_OPT_ON);
}
if (err != LDAP_SUCCESS) {
Log(LOG_ERROR, "Enabling TLS failed: %s",
ldap_err2string(err));
ldap_unbind_ext(ldap, NULL, NULL);
ldap = NULL;
}
}
} else {
ldap = ldap_init(MdbLdap.LdapHostAddress, MdbLdap.LdapHostPort);
}
#else
ldap = ldap_init(MdbLdap.LdapHostAddress, MdbLdap.LdapHostPort);
if (ldap) {
err = ldap_simple_bind_s(ldap, BindDn, Passwd);
if (MdbLdap.LdapTls) {
err = ldap_start_tls_s(ldap, NULL, NULL);
if (err != LDAP_SUCCESS) {
Log(LOG_ERROR, "ldap_start_tls_s() failed: %s",
ldap_err2string(err));
ldap_unbind_ext(ldap, NULL, NULL);
ldap = NULL;
}
}
}
#endif
if (ldap) {
for (tries = 0; tries < 3; tries++) {
err = ldap_simple_bind_s(ldap, BindDn, Passwd);
if (err == LDAP_SUCCESS) {
break;
}
}
if (err == LDAP_SUCCESS) {
ldap_set_rebind_proc(ldap, rebind_proc, Context);
@@ -1250,7 +1284,6 @@ InitLdapConnection(char *BindDn, char *Passwd, void *rebind_proc,
Log(LOG_ERROR, "ldap_init() failed: %s", ldap_err2string(errno));
Log(LOG_ERROR, "host: %s:%d", MdbLdap.LdapHostAddress,
MdbLdap.LdapHostPort);
ldap = NULL;
}
return ldap;
+23
View File
@@ -3,6 +3,29 @@
#include <config.h>
#include <xpl.h>
/* compatibility with different client libraries */
#ifndef LDAP_CONST
#define LDAP_CONST const
#endif
#ifndef LDAP_OPT_SUCCESS
#define LDAP_OPT_SUCCESS 0
#endif
#ifndef LDAP_EXOP_MODIFY_PASSWD
#define LDAP_EXOP_MODIFY_PASSWD "1.3.6.1.4.1.4203.1.11.1"
#endif
#ifndef LDAP_TAG_EXOP_MODIFY_PASSWD_ID
#define LDAP_TAG_EXOP_MODIFY_PASSWD_ID ((ber_tag_t) 0x80U)
#endif
#ifndef LDAP_TAG_EXOP_MODIFY_PASSWD_OLD
#define LDAP_TAG_EXOP_MODIFY_PASSWD_OLD ((ber_tag_t) 0x81U)
#endif
#ifndef LDAP_TAG_EXOP_MODIFY_PASSWD_NEW
#define LDAP_TAG_EXOP_MODIFY_PASSWD_NEW ((ber_tag_t) 0x82U)
#endif
#ifndef LBER_USE_DER
#define LBER_USE_DER 0x01
#endif
#define MDBLDAP_FLAGS_ALLOCATED_HANDLE (unsigned long)(1 << 0)
#define MDBLDAP_FLAGS_CONTEXT_VALID (unsigned long)(1 << 1)
#define MDBLDAP_FLAGS_CONTEXT_DUPLICATE (unsigned long)(1 << 2)
+7
View File
@@ -59,9 +59,16 @@ XplLookupUser(const char *username, uid_t *uid, gid_t *gid)
char buffer[2048];
#if defined(__SVR4) && defined(__sun) && !defined(_POSIX_PTHREAD_SEMANTICS)
errno = 0;
pw = getpwnam_r(username, &pwBuf, buffer, sizeof(buffer));
if (errno != 0 || pw == NULL) {
printf ("errno: %d, pw: %p\n", errno, pw);
#else
ret = getpwnam_r(username, &pwBuf, buffer, sizeof(buffer), &pw);
if (ret != 0 || pw == NULL) {
printf ("ret: %d, pw: %p\n", ret, pw);
#endif
return -1;
}
#else