#include "citadel_dirs.h"
#include "genstamp.h"
#include "threads.h"
+#include "citadel_ldap.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 */
purge_user(CCC->user.fullname);
/* Free any output buffers */
- if (CCC->output_buffer != NULL) {
- unbuffer_output();
- }
+ unbuffer_output();
}
/*
}
}
+#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 */
}
+int internal_create_user (char *username, struct ctdluser *usbuf, uid_t uid)
+{
+ if (!getuser(usbuf, username)) {
+ return (ERROR + ALREADY_EXISTS);
+ }
+
+ /* Go ahead and initialize a new user record */
+ memset(usbuf, 0, sizeof(struct ctdluser));
+ safestrncpy(usbuf->fullname, username, sizeof usbuf->fullname);
+ strcpy(usbuf->password, "");
+ usbuf->uid = uid;
+
+ /* These are the default flags on new accounts */
+ usbuf->flags = US_LASTOLD | US_DISAPPEAR | US_PAGINATOR | US_FLOORS;
+
+ usbuf->timescalled = 0;
+ usbuf->posted = 0;
+ usbuf->axlevel = config.c_initax;
+ usbuf->USscreenwidth = 80;
+ usbuf->USscreenheight = 24;
+ usbuf->lastcall = time(NULL);
+
+ /* fetch a new user number */
+ usbuf->usernum = get_new_user_number();
+
+ /* add user to the database */
+ putuser(usbuf);
+ cdb_store(CDB_USERSBYNUMBER, &usbuf->usernum, sizeof(long), usbuf->fullname, strlen(usbuf->fullname)+1);
+
+ return 0;
+}
+
+
+
/*
* create_user() - back end processing to create a new user
*
char username[256];
char mailboxname[ROOMNAMELEN];
char buf[SIZ];
+ int retval;
uid_t uid = (-1);
+
safestrncpy(username, newusername, sizeof username);
strproc(username);
+
if (config.c_auth_mode == AUTHMODE_HOST) {
/* host auth mode */
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 {
}
}
- if (!getuser(&usbuf, username)) {
- return (ERROR + ALREADY_EXISTS);
- }
-
- /* Go ahead and initialize a new user record */
- memset(&usbuf, 0, sizeof(struct ctdluser));
- safestrncpy(usbuf.fullname, username, sizeof usbuf.fullname);
- strcpy(usbuf.password, "");
- usbuf.uid = uid;
-
- /* These are the default flags on new accounts */
- usbuf.flags = US_LASTOLD | US_DISAPPEAR | US_PAGINATOR | US_FLOORS;
-
- usbuf.timescalled = 0;
- usbuf.posted = 0;
- usbuf.axlevel = config.c_initax;
- usbuf.USscreenwidth = 80;
- usbuf.USscreenheight = 24;
- usbuf.lastcall = time(NULL);
-
- /* fetch a new user number */
- usbuf.usernum = get_new_user_number();
-
- /* The very first user created on the system will always be an Aide */
- if (usbuf.usernum == 1L) {
- usbuf.axlevel = 6;
+#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);
+ }
}
-
- /* add user to the database */
- putuser(&usbuf);
- cdb_store(CDB_USERSBYNUMBER, &usbuf.usernum, sizeof(long), usbuf.fullname, strlen(usbuf.fullname)+1);
-
+#endif /* HAVE_LDAP */
+
+ if ((retval = internal_create_user(username, &usbuf, uid)) != 0)
+ return retval;
+
/*
* Give the user a private mailbox and a configuration room.
* Make the latter an invisible system room.
-
/*
* cmd_newu() - create a new user account and log in as that user
*/
*/
void cmd_setp(char *new_pw)
{
+ int generate_random_password = 0;
+
if (CtdlAccessCheck(ac_logged_in)) {
return;
}
ERROR + NOT_HERE);
return;
}
- strproc(new_pw);
- if (IsEmptyStr(new_pw)) {
- cprintf("%d Password unchanged.\n", CIT_OK);
- return;
- }
- CtdlSetPassword(new_pw);
- cprintf("%d Password changed.\n", CIT_OK);
+ if (!strcasecmp(new_pw, "GENERATE_RANDOM_PASSWORD")) {
+ char random_password[17];
+ generate_random_password = 1;
+ snprintf(random_password, sizeof random_password, "%08lx%08lx", random(), random());
+ CtdlSetPassword(random_password);
+ cprintf("%d %s\n", CIT_OK, random_password);
+ }
+ else {
+ strproc(new_pw);
+ if (IsEmptyStr(new_pw)) {
+ cprintf("%d Password unchanged.\n", CIT_OK);
+ return;
+ }
+ CtdlSetPassword(new_pw);
+ cprintf("%d Password changed.\n", CIT_OK);
+ }
}
if ((CC->user.axlevel >= 6)
|| ((usbuf->flags & US_UNLISTED) == 0)
|| ((CC->internal_pgm))) {
- cprintf("%s|%d|%ld|%ld|%ld|%ld|",
+ cprintf("%s|%d|%ld|%ld|%ld|%ld||\n",
usbuf->fullname,
usbuf->axlevel,
usbuf->usernum,
(long)usbuf->lastcall,
usbuf->timescalled,
usbuf->posted);
- if (CC->user.axlevel >= 6)
- cprintf("%s", usbuf->password);
- cprintf("\n");
}
}
}