diff --git a/Makefile.am b/Makefile.am index 13675a2..a9ca8d9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 diff --git a/configure.ac b/configure.ac index 1ee3dc1..a29f445 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/src/apps/sendmail/sendmail.c b/src/apps/sendmail/sendmail.c index 85501dd..9cbd094 100644 --- a/src/apps/sendmail/sendmail.c +++ b/src/apps/sendmail/sendmail.c @@ -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); diff --git a/src/libs/mdb-xldap/mdbldap.c b/src/libs/mdb-xldap/mdbldap.c index a289376..6b49a4c 100644 --- a/src/libs/mdb-xldap/mdbldap.c +++ b/src/libs/mdb-xldap/mdbldap.c @@ -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; diff --git a/src/libs/mdb-xldap/mdbldapp.h b/src/libs/mdb-xldap/mdbldapp.h index 3cf019f..9feaf63 100644 --- a/src/libs/mdb-xldap/mdbldapp.h +++ b/src/libs/mdb-xldap/mdbldapp.h @@ -3,6 +3,29 @@ #include #include +/* 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) diff --git a/src/libs/xpl/fsys.c b/src/libs/xpl/fsys.c index 896546e..4496922 100644 --- a/src/libs/xpl/fsys.c +++ b/src/libs/xpl/fsys.c @@ -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