#include <sys/wait.h>
#include <string.h>
#include <limits.h>
+#include <libcitadel.h>
#include "citadel.h"
#include "server.h"
#include "citserver.h"
#include "policy.h"
#include "database.h"
#include "serv_ldap.h"
-#include "tools.h"
#include "ctdl_module.h"
LDAP *dirserver = NULL;
int ldap_time_disconnect = 0;
+
+
+/* There is a forward referance so.... */
+int delete_from_ldap(char *cn, char *ou, void **object);
+
+
/*
* LDAP connector cleanup function
*/
"LDAP: Could not connect to server.");
return -1;
}
+ else {
+ CtdlAideMessage(
+ "WARNING: populating an external LDAP address book is deprecated.\n"
+ "This function will be discontinued in a future release.\n"
+ "Please migrate to vCard-based address books as soon as possible.\n"
+ "Visit the Citadel support forum if you need further assistance.\n"
+ ,
+ "Warning: LDAP address book is deprecated"
+ );
+ }
ldap_set_option(dirserver, LDAP_OPT_PROTOCOL_VERSION,
&ldap_version);
*/
int save_ldap_object(char *cn, char *ou, void **object)
{
- int i, j;
+ int i;
char this_dn[SIZ];
LDAPMod **attrs;
}
/* If the entry already exists, repopulate it instead */
+ /* repopulating doesn't work as Citadel may want some attributes to be deleted.
+ * we have no way of knowing which attributes to delete and LDAP won't work it out for us
+ * so now we delete the old entry and create a new one.
+ */
if (i == LDAP_ALREADY_EXISTS) {
- for (j = 0; j < (num_attrs); ++j) {
- attrs[j]->mod_op = LDAP_MOD_REPLACE;
- }
+ end_critical_section(S_LDAP);
+ CtdlLogPrintf(CTDL_INFO,
+ "LDAP: Create, already exists, deleteing first.\n");
+ if (delete_from_ldap(cn, ou, NULL))
+ return -1;
+ begin_critical_section(S_LDAP);
CtdlLogPrintf(CTDL_INFO,
- "LDAP: Calling ldap_modify_s() for dn of '%s'\n",
+ "LDAP: Calling ldap_add_s() to recreate for dn of '%s'\n",
this_dn);
- i = ldap_modify_s(dirserver, this_dn, attrs);
+ i = ldap_add_s(dirserver, this_dn, attrs);
}
if (i != LDAP_SUCCESS) {
if (dirserver == NULL)
return -1;
- if (ou == NULL)
- return -1;
if (cn == NULL)
return -1;
*/
CTDL_MODULE_INIT(ldap)
{
+ if (!threading)
+ {
#ifdef HAVE_LDAP
- if (!IsEmptyStr(config.c_ldap_base_dn)) {
- CtdlRegisterCleanupHook(serv_ldap_cleanup);
- CtdlRegisterSessionHook(ldap_disconnect_timer, EVT_TIMER);
- CtdlRegisterDirectoryServiceFunc(delete_from_ldap,
- DIRECTORY_USER_DEL,
- "ldap");
- CtdlRegisterDirectoryServiceFunc(create_ldap_host_OU,
- DIRECTORY_CREATE_HOST,
- "ldap");
- CtdlRegisterDirectoryServiceFunc(create_ldap_object,
- DIRECTORY_CREATE_OBJECT,
- "ldap");
- CtdlRegisterDirectoryServiceFunc(add_ldap_object,
- DIRECTORY_ATTRIB_ADD,
- "ldap");
- CtdlRegisterDirectoryServiceFunc(save_ldap_object,
- DIRECTORY_SAVE_OBJECT,
- "ldap");
- CtdlRegisterDirectoryServiceFunc(free_ldap_object,
- DIRECTORY_FREE_OBJECT,
- "ldap");
- create_ldap_root();
- }
+ if (!IsEmptyStr(config.c_ldap_base_dn)) {
+ CtdlRegisterCleanupHook(serv_ldap_cleanup);
+ CtdlRegisterSessionHook(ldap_disconnect_timer, EVT_TIMER);
+ CtdlRegisterDirectoryServiceFunc(delete_from_ldap,
+ DIRECTORY_USER_DEL,
+ "ldap");
+ CtdlRegisterDirectoryServiceFunc(create_ldap_host_OU,
+ DIRECTORY_CREATE_HOST,
+ "ldap");
+ CtdlRegisterDirectoryServiceFunc(create_ldap_object,
+ DIRECTORY_CREATE_OBJECT,
+ "ldap");
+ CtdlRegisterDirectoryServiceFunc(add_ldap_object,
+ DIRECTORY_ATTRIB_ADD,
+ "ldap");
+ CtdlRegisterDirectoryServiceFunc(save_ldap_object,
+ DIRECTORY_SAVE_OBJECT,
+ "ldap");
+ CtdlRegisterDirectoryServiceFunc(free_ldap_object,
+ DIRECTORY_FREE_OBJECT,
+ "ldap");
+ create_ldap_root();
+ }
#endif /* HAVE_LDAP */
-
+ }
+
/* return our Subversion id for the Log */
return "$Id$";
}