#include "citadel_dirs.h"
#include "genstamp.h"
#include "threads.h"
+#include "citadel_ldap.h"
+
+#include "ctdl_module.h"
/* These pipes are used to talk to the chkpwd daemon, which is forked during startup */
int chkpwd_write_pipe[2];
}
+#ifdef HAVE_LDAP
+ else if ((config.c_auth_mode == AUTHMODE_LDAP) || (config.c_auth_mode == AUTHMODE_LDAP_AD)) {
+
+ /* LDAP auth mode */
+
+ uid_t ldap_uid;
+ char ldap_cn[256];
+ char ldap_dn[256];
+
+ found_user = CtdlTryUserLDAP(username, ldap_dn, sizeof ldap_dn, ldap_cn, sizeof ldap_cn, &ldap_uid);
+ if (found_user != 0) {
+ return login_not_found;
+ }
+
+ found_user = getuserbyuid(&CC->user, ldap_uid);
+ if (found_user != 0) {
+ create_user(trythisname, 0);
+ found_user = getuserbyuid(&CC->user, ldap_uid);
+ }
+
+ if (found_user == 0) {
+ if (CC->ldap_dn != NULL) free(CC->ldap_dn);
+ CC->ldap_dn = strdup(ldap_dn);
+ }
+
+ }
+#endif
+
else {
/* native auth mode */
char username[256];
int a;
+ CtdlLogPrintf(CTDL_DEBUG, "cmd_user(%s)\n", cmdbuf);
extract_token(username, cmdbuf, 0, '|', sizeof username);
+ CtdlLogPrintf(CTDL_DEBUG, "username: %s\n", username);
striplt(username);
+ CtdlLogPrintf(CTDL_DEBUG, "username: %s\n", username);
a = CtdlLoginExistingUser(NULL, username);
switch (a) {
/* Create any personal rooms required by the system.
* (Technically, MAILROOM should be there already, but just in case...)
*/
- create_room(MAILROOM, 4, "", 0, 1, 0, VIEW_MAILBOX);
- create_room(SENTITEMS, 4, "", 0, 1, 0, VIEW_MAILBOX);
- create_room(USERTRASHROOM, 4, "", 0, 1, 0, VIEW_MAILBOX);
+ CtdlCreateRoom(MAILROOM, 4, "", 0, 1, 0, VIEW_MAILBOX);
+ CtdlCreateRoom(SENTITEMS, 4, "", 0, 1, 0, VIEW_MAILBOX);
+ CtdlCreateRoom(USERTRASHROOM, 4, "", 0, 1, 0, VIEW_MAILBOX);
+ /* CtdlCreateRoom(USERDRAFTROOM, 4, "", 0, 1, 0, VIEW_MAILBOX); temporarily disabled for 7.60 */
/* Run any startup routines registered by loadable modules */
PerformSessionHooks(EVT_LOGIN);
/* Enter the lobby */
- usergoto(config.c_baseroom, 0, 0, NULL, NULL);
+ CtdlUserGoto(config.c_baseroom, 0, 0, NULL, NULL);
}
purge_user(CCC->user.fullname);
/* Free any output buffers */
- if (CCC->output_buffer != NULL) {
- unbuffer_output();
- }
+ unbuffer_output();
}
/*
static int validpw(uid_t uid, const char *pass)
{
char buf[256];
+ int rv = 0;
if (IsEmptyStr(pass)) {
CtdlLogPrintf(CTDL_DEBUG, "refusing to check empty password for uid=%d using chkpwd...\n", uid);
CtdlLogPrintf(CTDL_DEBUG, "Validating password for uid=%d using chkpwd...\n", uid);
begin_critical_section(S_CHKPWD);
- write(chkpwd_write_pipe[1], &uid, sizeof(uid_t));
- write(chkpwd_write_pipe[1], pass, 256);
- read(chkpwd_read_pipe[0], buf, 4);
+ rv = write(chkpwd_write_pipe[1], &uid, sizeof(uid_t));
+ rv = write(chkpwd_write_pipe[1], pass, 256);
+ rv = read(chkpwd_read_pipe[0], buf, 4);
end_critical_section(S_CHKPWD);
if (!strncmp(buf, "PASS", 4)) {
}
}
+#ifdef HAVE_LDAP
+ else if ((config.c_auth_mode == AUTHMODE_LDAP) || (config.c_auth_mode == AUTHMODE_LDAP_AD)) {
+
+ /* LDAP auth mode */
+
+ if ((CC->ldap_dn) && (!CtdlTryPasswordLDAP(CC->ldap_dn, password))) {
+ code = 0;
+ }
+ else {
+ code = (-1);
+ }
+ }
+#endif
+
else {
/* native auth mode */
char password[256];
int a;
+ memset(password, 0, sizeof(password));
extract_token(password, buf, 0, '|', sizeof password);
a = CtdlTryPassword(password);
uid = pd.pw_uid;
if (IsEmptyStr (username))
{
- CtdlLogPrintf (CTDL_EMERG,
- "Can't find Realname for user %s [%d] in the Host Auth Database; giving up.\n",
- newusername, pd.pw_uid);
- snprintf(buf, SIZ,
- "Can't find Realname for user %s [%d] in the Host Auth Database; giving up.\n",
- newusername, pd.pw_uid);
- aide_message(buf, "User Creation Failure Notice");
-
+ safestrncpy(username, pd.pw_name, sizeof username);
}
}
else {
return (ERROR + NO_SUCH_USER);
}
}
+
+#ifdef HAVE_LDAP
+ if ((config.c_auth_mode == AUTHMODE_LDAP) || (config.c_auth_mode == AUTHMODE_LDAP_AD)) {
+ if (CtdlTryUserLDAP(username, NULL, 0, username, sizeof username, &uid) != 0) {
+ return(ERROR + NO_SUCH_USER);
+ }
+ }
+#endif /* HAVE_LDAP */
if ((retval = internal_create_user(username, &usbuf, uid)) != 0)
return retval;
* Make the latter an invisible system room.
*/
MailboxName(mailboxname, sizeof mailboxname, &usbuf, MAILROOM);
- create_room(mailboxname, 5, "", 0, 1, 1, VIEW_MAILBOX);
+ CtdlCreateRoom(mailboxname, 5, "", 0, 1, 1, VIEW_MAILBOX);
MailboxName(mailboxname, sizeof mailboxname, &usbuf, USERCONFIGROOM);
- create_room(mailboxname, 5, "", 0, 1, 1, VIEW_BBS);
- if (lgetroom(&qrbuf, mailboxname) == 0) {
+ CtdlCreateRoom(mailboxname, 5, "", 0, 1, 1, VIEW_BBS);
+ if (CtdlGetRoomLock(&qrbuf, mailboxname) == 0) {
qrbuf.QRflags2 |= QR2_SYSTEM;
- lputroom(&qrbuf);
+ CtdlPutRoomLock(&qrbuf);
}
/* Perform any create functions registered by server extensions */
/*
* get user parameters
*/
-void cmd_getu(void)
+void cmd_getu(char *cmdbuf)
{
if (CtdlAccessCheck(ac_logged_in))
return;
}
+void cmd_invt(char *iuser) {cmd_invt_kick(iuser, 1);}
+void cmd_kick(char *iuser) {cmd_invt_kick(iuser, 0);}
/*
* Forget (Zap) the current room (API call)
lputuser(&CC->user);
/* Return to the Lobby, so we don't end up in an undefined room */
- usergoto(config.c_baseroom, 0, 0, NULL, NULL);
+ CtdlUserGoto(config.c_baseroom, 0, 0, NULL, NULL);
return(0);
}
/*
* forget (Zap) the current room
*/
-void cmd_forg(void)
+void cmd_forg(char *argbuf)
{
if (CtdlAccessCheck(ac_logged_in)) {
/*
* Get Next Unregistered User
*/
-void cmd_gnur(void)
+void cmd_gnur(char *argbuf)
{
struct cdbdata *cdbus;
struct ctdluser usbuf;
/*
* assorted info we need to check at login
*/
-void cmd_chek(void)
+void cmd_chek(char *argbuf)
{
int mail = 0;
int regis = 0;
int num_msgs = 0;
MailboxName(mailboxname, sizeof mailboxname, &CC->user, MAILROOM);
- if (getroom(&mailbox, mailboxname) != 0)
+ if (CtdlGetRoom(&mailbox, mailboxname) != 0)
return (0);
CtdlGetRelationship(&vbuf, &CC->user, &mailbox);
cprintf("%d An unknown error occurred.\n", ERROR);
}
+
+
+
+/*****************************************************************************/
+/* MODULE INITIALIZATION STUFF */
+/*****************************************************************************/
+
+
+CTDL_MODULE_INIT(user_ops)
+{
+ CtdlRegisterProtoHook(cmd_user, "USER", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_pass, "PASS", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_creu, "CREU", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_setp, "SETP", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_getu, "GETU", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_setu, "SETU", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_slrp, "SLRP", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_invt, "INVT", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_kick, "KICK", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_forg, "FORG", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_gnur, "GNUR", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_vali, "VALI", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_list, "LIST", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_chek, "CHEK", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_qusr, "QUSR", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_agup, "AGUP", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_asup, "ASUP", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_seen, "SEEN", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_gtsn, "GTSN", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_view, "VIEW", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_renu, "RENU", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_newu, "NEWU", "Autoconverted. TODO: document me.");
+ /* return our Subversion id for the Log */
+ return "$Id$";
+}