$Log$
+ Revision 614.5 2004/01/17 22:57:54 ajc
+ * Added "Base DN" "Bind DN" and "Bind DN password" config options
+ * serv_ldap.c: added. (New module implementing the LDAP Connector)
+ * Upon startup, connect to LDAP directory and bind to it. Unbind at exit.
+
Revision 614.4 2004/01/17 04:23:28 ajc
* Sysconfig commands for specifying where the LDAP server lives
Fri Jul 10 1998 Art Cancro <ajc@uncensored.citadel.org>
* Initial CVS import
-
serv_bio.o \
serv_expire.o \
serv_vandelay.o \
- serv_calendar.o ical_dezonify.o
+ serv_calendar.o \
+ ical_dezonify.o \
+ serv_ldap.o
UTIL_TARGETS=aidepost msgform \
citmail userlist sendcommand \
struct ExpirePolicy c_mbxep; /* Expire policy for mailbox rooms */
char c_ldap_host[128]; /* Host where LDAP service lives */
int c_ldap_port; /* Port on host where LDAP lives */
+ char c_ldap_base_dn[256]; /* LDAP base DN */
+ char c_ldap_bind_dn[256]; /* LDAP bind DN */
+ char c_ldap_bind_pw[256]; /* LDAP bind password */
};
/*
#ifdef HAVE_LDAP
cprintf("%s\n", config.c_ldap_host);
cprintf("%d\n", config.c_ldap_port);
+ cprintf("%s\n", config.c_ldap_base_dn);
+ cprintf("%s\n", config.c_ldap_bind_dn);
+ cprintf("%s\n", config.c_ldap_bind_pw);
#else
cprintf("\n");
cprintf("0\n");
+ cprintf("\n");
+ cprintf("\n");
+ cprintf("\n");
#endif
cprintf("000\n");
}
case 33:
config.c_ldap_port = atoi(buf);
break;
+ case 34:
+ safestrncpy(config.c_ldap_base_dn, buf,
+ sizeof config.c_ldap_base_dn);
+ break;
+ case 35:
+ safestrncpy(config.c_ldap_bind_dn, buf,
+ sizeof config.c_ldap_bind_dn);
+ break;
+ case 36:
+ safestrncpy(config.c_ldap_bind_pw, buf,
+ sizeof config.c_ldap_bind_pw);
+ break;
#endif
}
++a;
void do_system_configuration(CtdlIPC *ipc)
{
-#define NUM_CONFIGS 34
+#define NUM_CONFIGS 37
char buf[SIZ];
char sc[NUM_CONFIGS][SIZ];
snprintf(sc[25], sizeof sc[25], "%d", a);
/* LDAP settings */
- if (serv_info.serv_supports_qnop) {
+ if (serv_info.serv_supports_ldap) {
a = strlen(&sc[32][0]);
a = (a ? 1 : 0); /* Set only to 1 or 0 */
a = boolprompt("Connect this Citadel to an LDAP directory", a);
&sc[32][0], 127);
strprompt("Port number of LDAP service",
&sc[33][0], 5);
+ strprompt("Base DN", &sc[34][0], 255);
+ strprompt("Bind DN", &sc[35][0], 255);
+ strprompt("Password for bind DN", &sc[36][0], 255);
}
else {
strcpy(&sc[32][0], "");
-char *serv_inithat_init(void)
+char *serv_chat_init(void)
{
CtdlRegisterProtoHook(cmd_chat, "CHAT", "Begin real-time chat");
CtdlRegisterProtoHook(cmd_pexp, "PEXP", "Poll for express messages");
{
serv_bio_init();
serv_calendar_init();
- serv_inithat_init();
+ serv_ldap_init();
+ serv_chat_init();
serv_expire_init();
serv_imap_init();
serv_inetcfg_init();
*/
char *serv_bio_init(void);
char *serv_calendar_init(void);
-char *serv_inithat_init(void);
+char *serv_ldap_init(void);
+char *serv_chat_init(void);
char *serv_expire_init(void);
char *serv_imap_init(void);
char *serv_inetcfg_init(void);
--- /dev/null
+/*
+ * $Id$
+ *
+ * A module which implements the LDAP connector for Citadel.
+ *
+ */
+
+#include "sysdep.h"
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <pwd.h>
+#include <errno.h>
+#include <sys/types.h>
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+
+#include <sys/wait.h>
+#include <string.h>
+#include <limits.h>
+#include "citadel.h"
+#include "server.h"
+#include "sysdep_decls.h"
+#include "citserver.h"
+#include "support.h"
+#include "config.h"
+#include "serv_extensions.h"
+#include "room_ops.h"
+#include "policy.h"
+#include "database.h"
+#include "msgbase.h"
+
+#ifdef HAVE_LDAP
+
+#include <ldap.h>
+
+LDAP *dirserver = NULL;
+
+/*
+ * LDAP connector cleanup function
+ */
+void serv_ldap_cleanup(void)
+{
+ if (!dirserver) return;
+
+ lprintf(7, "Unbinding from directory server\n");
+ ldap_unbind(dirserver);
+ dirserver = NULL;
+}
+
+#endif /* HAVE_LDAP */
+
+
+void CtdlConnectToLdap(void) {
+ int i;
+ int ldap_version = 3;
+
+ lprintf(7, "Connecting to LDAP server %s:%d...\n",
+ config.c_ldap_host, config.c_ldap_port);
+
+ dirserver = ldap_init(config.c_ldap_host, config.c_ldap_port);
+ if (dirserver == NULL) {
+ lprintf(3, "Could not connect to %s:%d : %s\n",
+ config.c_ldap_host,
+ config.c_ldap_port,
+ strerror(errno));
+ return;
+ }
+
+ ldap_set_option(dirserver, LDAP_OPT_PROTOCOL_VERSION, &ldap_version);
+
+ lprintf(7, "Binding to %s\n", config.c_ldap_bind_dn);
+
+ i = ldap_simple_bind_s(dirserver,
+ config.c_ldap_bind_dn,
+ config.c_ldap_bind_pw
+ );
+ if (i != LDAP_SUCCESS) {
+ lprintf(3, "Cannot bind: %s (%d)\n", ldap_err2string(i), i);
+ dirserver = NULL; /* FIXME disconnect from ldap */
+ }
+}
+
+
+/*
+ * Initialize the LDAP connector module ... or don't, if we don't have LDAP.
+ */
+char *serv_ldap_init(void)
+{
+#ifdef HAVE_LDAP
+ CtdlRegisterCleanupHook(serv_ldap_cleanup);
+
+ if (strlen(config.c_ldap_host) > 0) {
+ CtdlConnectToLdap();
+ }
+
+#endif /* HAVE_LDAP */
+ return "$Id$";
+}
cprintf("%d\n", config.c_mbxep.expire_value);
cprintf("%s\n", config.c_ldap_host);
cprintf("%d\n", config.c_ldap_port);
+ cprintf("%s\n", config.c_ldap_base_dn);
+ cprintf("%s\n", config.c_ldap_bind_dn);
+ cprintf("%s\n", config.c_ldap_bind_pw);
/* Export the control file */
get_control();
client_gets(buf); config.c_mbxep.expire_value = atoi(buf);
client_gets(config.c_ldap_host);
client_gets(buf); config.c_ldap_port = atoi(buf);
+ client_gets(config.c_ldap_base_dn);
+ client_gets(config.c_ldap_bind_dn);
+ client_gets(config.c_ldap_bind_pw);
put_config();
lprintf(7, "Imported config file\n");
}