diff options
-rw-r--r-- | source3/include/smbldap.h | 2 | ||||
-rw-r--r-- | source3/lib/smbldap.c | 28 | ||||
-rw-r--r-- | source3/param/loadparm.c | 4 |
3 files changed, 34 insertions, 0 deletions
diff --git a/source3/include/smbldap.h b/source3/include/smbldap.h index 17584c4fe4..14ea2de012 100644 --- a/source3/include/smbldap.h +++ b/source3/include/smbldap.h @@ -138,6 +138,8 @@ struct smbldap_state { time_t last_use; smb_event_id_t event_id; + + struct timeval last_rebind; }; #endif /* HAVE_LDAP */ diff --git a/source3/lib/smbldap.c b/source3/lib/smbldap.c index da409dce04..d1117046c3 100644 --- a/source3/lib/smbldap.c +++ b/source3/lib/smbldap.c @@ -661,6 +661,9 @@ static int rebindproc_with_state (LDAP * ld, char **whop, char **credp, } *methodp = LDAP_AUTH_SIMPLE; } + + gettimeofday(&(ldap_state->last_rebind),NULL); + return 0; } #endif /*defined(LDAP_API_FEATURE_X_OPENLDAP) && (LDAP_API_VERSION > 2000)*/ @@ -687,6 +690,8 @@ static int rebindproc_connect_with_state (LDAP *ldap_struct, rc = ldap_simple_bind_s(ldap_struct, ldap_state->bind_dn, ldap_state->bind_secret); + gettimeofday(&(ldap_state->last_rebind),NULL); + return rc; } #endif /*defined(LDAP_API_FEATURE_X_OPENLDAP) && (LDAP_API_VERSION > 2000)*/ @@ -909,6 +914,29 @@ int smbldap_search(struct smbldap_state *ldap_state, SMB_ASSERT(ldap_state); + if (ldap_state->last_rebind.tv_sec > 0) { + struct timeval tval; + int tdiff = 0; + int sleep_time = 0; + + ZERO_STRUCT(tval); + + gettimeofday(&tval,NULL); + + tdiff = 1000000 *(tval.tv_sec - ldap_state->last_rebind.tv_sec) + + (tval.tv_usec - ldap_state->last_rebind.tv_usec); + + sleep_time = ((1000*lp_ldap_rebind_sleep())-tdiff)/1000; + + if (sleep_time > 0) { + /* we wait for the LDAP replication */ + DEBUG(5,("smbldap_search: waiting %d milliseconds for LDAP replication.\n",sleep_time)); + msleep(sleep_time); + DEBUG(5,("smbldap_search: go on!\n")); + ZERO_STRUCT(ldap_state->last_rebind); + } + } + if (push_utf8_allocate(&utf8_filter, filter) == (size_t)-1) { return LDAP_NO_MEMORY; } diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index 124a905a79..31348b559d 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -233,6 +233,7 @@ typedef struct char *szLdapAdminDn; char *szAclCompat; int ldap_passwd_sync; + int ldap_rebind_sleep; BOOL ldap_delete_dn; BOOL bMsAddPrinterWizard; BOOL bDNSproxy; @@ -1077,6 +1078,7 @@ static struct parm_struct parm_table[] = { {"ldap ssl", P_ENUM, P_GLOBAL, &Globals.ldap_ssl, NULL, enum_ldap_ssl, FLAG_ADVANCED}, {"ldap passwd sync", P_ENUM, P_GLOBAL, &Globals.ldap_passwd_sync, NULL, enum_ldap_passwd_sync, FLAG_ADVANCED}, {"ldap delete dn", P_BOOL, P_GLOBAL, &Globals.ldap_delete_dn, NULL, NULL, FLAG_ADVANCED}, + {"ldap rebind sleep", P_INTEGER, P_GLOBAL, &Globals.ldap_rebind_sleep, NULL, NULL, FLAG_ADVANCED}, {N_("Miscellaneous Options"), P_SEP, P_SEPARATOR}, {"add share command", P_STRING, P_GLOBAL, &Globals.szAddShareCommand, NULL, NULL, FLAG_ADVANCED}, @@ -1469,6 +1471,7 @@ static void init_globals(void) Globals.ldap_ssl = LDAP_SSL_ON; Globals.ldap_passwd_sync = LDAP_PASSWD_SYNC_OFF; Globals.ldap_delete_dn = False; + Globals.ldap_rebind_sleep = 1000; /* wait 1 sec for replication */ /* these parameters are set to defaults that are more appropriate for the increasing samba install base: @@ -1698,6 +1701,7 @@ FN_GLOBAL_STRING(lp_ldap_admin_dn, &Globals.szLdapAdminDn) FN_GLOBAL_INTEGER(lp_ldap_ssl, &Globals.ldap_ssl) FN_GLOBAL_INTEGER(lp_ldap_passwd_sync, &Globals.ldap_passwd_sync) FN_GLOBAL_BOOL(lp_ldap_delete_dn, &Globals.ldap_delete_dn) +FN_GLOBAL_INTEGER(lp_ldap_rebind_sleep, &Globals.ldap_rebind_sleep) FN_GLOBAL_STRING(lp_add_share_cmd, &Globals.szAddShareCommand) FN_GLOBAL_STRING(lp_change_share_cmd, &Globals.szChangeShareCommand) FN_GLOBAL_STRING(lp_delete_share_cmd, &Globals.szDeleteShareCommand) |