#endif
#include <string.h>
-#include <syslog.h>
#include <limits.h>
#ifndef ENABLE_CHKPWD
#include "auth.h"
* makeuserkey() - convert a username into the format used as a database key
* (it's just the username converted into lower case)
*/
-static inline void makeuserkey(char *key, char *username) {
+static INLINE void makeuserkey(char *key, char *username) {
int i, len;
len = strlen(username);
{
char username[SIZ];
int found_user;
+ struct recptypes *valid = NULL;
if (trythisname == NULL) return login_not_found;
safestrncpy(username, trythisname, sizeof username);
return login_already_logged_in;
}
+ /* First, try to log in as if the supplied name is a display name */
found_user = getuser(&CC->user, username);
+ /* If that didn't work, try to log in as if the supplied name
+ * is an e-mail address
+ */
+ if (found_user != 0) {
+ valid = validate_recipients(trythisname);
+ if (valid != NULL) {
+ if (valid->num_local == 1) {
+ found_user = getuser(&CC->user,
+ valid->recp_local);
+ }
+ phree(valid);
+ }
+ }
+
+ /* Did we find something? */
if (found_user == 0) {
if (((CC->nologin)) && (CC->user.axlevel < 6)) {
return login_too_many_users;
int a;
extract(username, cmdbuf, 0);
- username[25] = 0;
- strproc(username);
+ striplt(username);
a = CtdlLoginExistingUser(username);
switch (a) {
case login_already_logged_in:
- cprintf("%d Already logged in.\n", ERROR);
+ cprintf("%d Already logged in.\n", ERROR + ALREADY_LOGGED_IN);
return;
case login_too_many_users:
cprintf("%d %s: "
MORE_DATA, CC->curr_user);
return;
case login_not_found:
- cprintf("%d %s not found.\n", ERROR, username);
+ cprintf("%d %s not found.\n", ERROR + NO_SUCH_USER, username);
return;
- cprintf("%d Internal error\n", ERROR);
+ cprintf("%d Internal error\n", ERROR + INTERNAL_ERROR);
}
}
{
int i;
- syslog(LOG_NOTICE, "session %d: user <%s> logged in",
+ lprintf(3, "Session %d: %s logged in",
CC->cs_pid, CC->curr_user);
lgetuser(&CC->user, CC->curr_user);
*/
void logout(struct CitContext *who)
{
+ /*
+ * Clear out some session data. Most likely, the CitContext for this
+ * session is about to get nuked when the session disconnects, but
+ * since it's possible to log in again without reconnecting, we cannot
+ * make that assumption.
+ */
+ strcpy(who->fake_username, "");
+ strcpy(who->fake_postname, "");
+ strcpy(who->fake_hostname, "");
+ strcpy(who->fake_roomname, "");
who->logged_in = 0;
/*
/* Do modular stuff... */
PerformSessionHooks(EVT_LOGOUT);
+
+ /* Free any output buffers */
+ if (who->output_buffer != NULL) {
+ unbuffer_output();
+ }
}
#ifdef ENABLE_CHKPWD
switch (a) {
case pass_already_logged_in:
- cprintf("%d Already logged in.\n", ERROR);
+ cprintf("%d Already logged in.\n", ERROR + ALREADY_LOGGED_IN);
return;
case pass_no_user:
cprintf("%d You must send a name with USER first.\n",
- ERROR);
+ ERROR + USERNAME_REQUIRED);
return;
case pass_wrong_password:
- cprintf("%d Wrong password.\n", ERROR);
+ cprintf("%d Wrong password.\n", ERROR + PASSWORD_REQUIRED);
return;
case pass_ok:
logged_in_response();
if (config.c_disable_newu) {
cprintf("%d Self-service user account creation "
- "is disabled on this system.\n", ERROR);
+ "is disabled on this system.\n", ERROR + NOT_HERE);
return;
}
if (CC->logged_in) {
- cprintf("%d Already logged in.\n", ERROR);
+ cprintf("%d Already logged in.\n", ERROR + ALREADY_LOGGED_IN);
return;
}
if (CC->nologin) {
strproc(username);
if (strlen(username) == 0) {
- cprintf("%d You must supply a user name.\n", ERROR);
+ cprintf("%d You must supply a user name.\n", ERROR + USERNAME_REQUIRED);
return;
}
if ((!strcasecmp(username, "bbs")) ||
(!strcasecmp(username, "new")) ||
(!strcasecmp(username, "."))) {
- cprintf("%d '%s' is an invalid login name.\n", ERROR, username);
+ cprintf("%d '%s' is an invalid login name.\n", ERROR + ILLEGAL_VALUE, username);
return;
}
ERROR + INTERNAL_ERROR);
return;
} else {
- cprintf("%d unknown error\n", ERROR);
+ cprintf("%d unknown error\n", ERROR + INTERNAL_ERROR);
}
}
return;
}
if ( (CC->user.uid != BBSUID) && (CC->user.uid != (-1)) ) {
- cprintf("%d Not allowed. Use the 'passwd' command.\n", ERROR);
+ cprintf("%d Not allowed. Use the 'passwd' command.\n", ERROR + NOT_HERE);
return;
}
strproc(new_pw);
/*
- * cmd_creu() - administratively create a new user account (do not log in to it)
+ * cmd_creu() - administratively create a new user account (do not log in to it)
*/
void cmd_creu(char *cmdbuf)
{
int a;
char username[SIZ];
+ char password[SIZ];
+ struct ctdluser tmp;
if (CtdlAccessCheck(ac_aide)) {
return;
}
extract(username, cmdbuf, 0);
+ extract(password, cmdbuf, 1);
username[25] = 0;
+ password[31] = 0;
strproc(username);
+ strproc(password);
if (strlen(username) == 0) {
- cprintf("%d You must supply a user name.\n", ERROR);
+ cprintf("%d You must supply a user name.\n", ERROR + USERNAME_REQUIRED);
return;
}
a = create_user(username, 0);
if (a == 0) {
- cprintf("%d ok\n", CIT_OK);
+ if (strlen(password) > 0) {
+ lgetuser(&tmp, username);
+ safestrncpy(tmp.password, password, sizeof(tmp.password));
+ lputuser(&tmp);
+ }
+ cprintf("%d User '%s' created %s.\n", CIT_OK, username,
+ (strlen(password) > 0) ? "and password set" :
+ "with no password");
return;
} else if (a == ERROR + ALREADY_EXISTS) {
cprintf("%d '%s' already exists.\n",
ERROR + ALREADY_EXISTS, username);
return;
} else {
- cprintf("%d An error occured creating the user account.\n", ERROR);
+ cprintf("%d An error occured creating the user account.\n", ERROR + INTERNAL_ERROR);
}
}
return;
if (num_parms(new_parms) < 3) {
- cprintf("%d Usage error.\n", ERROR);
+ cprintf("%d Usage error.\n", ERROR + ILLEGAL_VALUE);
return;
}
lgetuser(&CC->user, CC->curr_user);
}
if (num_parms(argbuf) != 2) {
- cprintf("%d Invalid parameters\n", ERROR);
+ cprintf("%d Invalid parameters\n", ERROR + ILLEGAL_VALUE);
return;
}
target_msgnum = extract_long(argbuf, 0);
target_setting = extract_int(argbuf, 1);
- CtdlSetSeen(target_msgnum, target_setting);
+ CtdlSetSeen(target_msgnum, target_setting, ctdlsetseen_seen);
cprintf("%d OK\n", CIT_OK);
}
return;
}
- CtdlGetSeen(buf);
+ CtdlGetSeen(buf, ctdlsetseen_seen);
cprintf("%d %s\n", CIT_OK, buf);
}
}
if (lgetuser(&USscratch, iuser) != 0) {
- cprintf("%d No such user.\n", ERROR);
+ cprintf("%d No such user.\n", ERROR + NO_SUCH_USER);
return;
}
CtdlGetRelationship(&vbuf, &USscratch, &CC->room);
cprintf("%d Ok\n", CIT_OK);
}
else {
- cprintf("%d You may not forget this room.\n", ERROR);
+ cprintf("%d You may not forget this room.\n", ERROR + NOT_HERE);
}
}