#include "sysdep_decls.h"
#include "support.h"
#include "room_ops.h"
-#include "logging.h"
#include "file_ops.h"
#include "control.h"
#include "msgbase.h"
{
char lowercase_name[USERNAME_SIZE];
+ char sysuser_name[USERNAME_SIZE];
int a;
struct cdbdata *cdbus;
+ int using_sysuser = 0;
memset(usbuf, 0, sizeof(struct usersupp));
- for (a = 0; a <= strlen(name); ++a) {
- if (a < sizeof(lowercase_name))
- lowercase_name[a] = tolower(name[a]);
+
+#ifdef ENABLE_AUTOLOGIN
+ if (CtdlAssociateSystemUser(sysuser_name, name) == 0) {
+ ++using_sysuser;
+ }
+#endif
+
+ if (using_sysuser) {
+ for (a = 0; a <= strlen(sysuser_name); ++a) {
+ lowercase_name[a] = tolower(sysuser_name[a]);
+ }
+ }
+ else {
+ for (a = 0; a <= strlen(name); ++a) {
+ if (a < sizeof(lowercase_name))
+ lowercase_name[a] = tolower(name[a]);
+ }
}
lowercase_name[sizeof(lowercase_name) - 1] = 0;
cdbus = cdb_fetch(CDB_USERSUPP, lowercase_name, strlen(lowercase_name));
- if (cdbus == NULL) {
- return (1); /* user not found */
+ if (cdbus == NULL) { /* user not found */
+ return(1);
}
memcpy(usbuf, cdbus->ptr,
((cdbus->len > sizeof(struct usersupp)) ?
}
+/*
+ * See if we can translate a system login name (i.e. from /etc/passwd)
+ * to a Citadel screen name. Returns 0 if one is found.
+ */
+int CtdlAssociateSystemUser(char *screenname, char *loginname) {
+ struct passwd *p;
+ int a;
+
+ p = (struct passwd *) getpwnam(loginname);
+ if (p != NULL) {
+ strcpy(screenname, p->pw_gecos);
+ for (a = 0; a < strlen(screenname); ++a) {
+ if (screenname[a] == ',') {
+ screenname[a] = 0;
+ }
+ }
+ return(0);
+ }
+ return(1);
+}
+
+
+
/*
* Back end for cmd_user() and its ilk
*/
int CtdlLoginExistingUser(char *trythisname)
{
char username[SIZ];
- char autoname[SIZ];
- int found_user = 0;
- struct passwd *p;
- int a;
+ int found_user;
if (trythisname == NULL) return login_not_found;
safestrncpy(username, trythisname, sizeof username);
if ((CC->logged_in)) {
return login_already_logged_in;
}
+
found_user = getuser(&CC->usersupp, username);
- if (found_user != 0) {
- p = (struct passwd *) getpwnam(username);
- if (p != NULL) {
- strcpy(autoname, p->pw_gecos);
- for (a = 0; a < strlen(autoname); ++a)
- if (autoname[a] == ',')
- autoname[a] = 0;
- found_user = getuser(&CC->usersupp, autoname);
- }
- }
+
if (found_user == 0) {
if (((CC->nologin)) && (CC->usersupp.axlevel < 6)) {
return login_too_many_users;
lgetuser(&CC->usersupp, CC->curr_user);
++(CC->usersupp.timescalled);
+ CC->previous_login = CC->usersupp.lastcall;
time(&CC->usersupp.lastcall);
/* If this user's name is the name of the system administrator
/* Enter the lobby */
usergoto(config.c_baseroom, 0, 0, NULL, NULL);
-
- /* Record this login in the Citadel log */
- rec_log(CL_LOGIN, CC->curr_user);
}
CIT_OK, CC->usersupp.fullname, CC->usersupp.axlevel,
CC->usersupp.timescalled, CC->usersupp.posted,
CC->usersupp.flags, CC->usersupp.usernum,
- CC->usersupp.lastcall);
+ CC->previous_login);
}
return pass_wrong_password;
}
code = (-1);
- if (CC->usersupp.uid == BBSUID) {
+
+
+#ifdef ENABLE_AUTOLOGIN
+ /* A uid of BBSUID or -1 indicates that this user exists only in
+ * Citadel, not in the underlying operating system.
+ */
+ if ( (CC->usersupp.uid == BBSUID) || (CC->usersupp.uid == (-1)) ) {
strproc(password);
strproc(CC->usersupp.password);
code = strcasecmp(CC->usersupp.password, password);
}
-#ifdef ENABLE_AUTOLOGIN
+ /* Any other uid means we have to check the system password database */
else {
if (validpw(CC->usersupp.uid, password)) {
code = 0;
lputuser(&CC->usersupp);
}
}
-#endif
+
+#else /* ENABLE_AUTOLOGIN */
+ strproc(password);
+ strproc(CC->usersupp.password);
+ code = strcasecmp(CC->usersupp.password, password);
+
+#endif /* ENABLE_AUTOLOGIN */
if (!code) {
do_login();
return pass_ok;
} else {
- rec_log(CL_BADPW, CC->curr_user);
+ lprintf(3, "Bad password specified for <%s>\n", CC->curr_user);
return pass_wrong_password;
}
}
#ifdef ENABLE_AUTOLOGIN
p = (struct passwd *) getpwnam(username);
-#endif
if (p != NULL) {
extract_token(username, p->pw_gecos, 0, ',');
uid = p->pw_uid;
} else {
- uid = BBSUID;
+ uid = (-1);
}
+#else
+ uid = (-1);
+#endif
if (!getuser(&usbuf, username)) {
return (ERROR + ALREADY_EXISTS);
MailboxName(mailboxname, sizeof mailboxname, &usbuf, USERCONFIGROOM);
create_room(mailboxname, 5, "", 0, 1, 1);
- if (lgetroom(&qrbuf, USERCONFIGROOM) == 0) {
+ if (lgetroom(&qrbuf, mailboxname) == 0) {
qrbuf.QRflags2 |= QR2_SYSTEM;
lputroom(&qrbuf);
}
if (getuser(&CC->usersupp, CC->curr_user)) {
return (ERROR + INTERNAL_ERROR);
}
-
- rec_log(CL_NEWUSER, CC->curr_user);
}
+ lprintf(3, "New user <%s> created\n", username);
return (0);
}
} else {
cprintf("%d unknown error\n", ERROR);
}
- rec_log(CL_NEWUSER, CC->curr_user);
}
if (CtdlAccessCheck(ac_logged_in)) {
return;
}
-
- if (CC->usersupp.uid != BBSUID) {
+ if ( (CC->usersupp.uid != BBSUID) && (CC->usersupp.uid != (-1)) ) {
cprintf("%d Not allowed. Use the 'passwd' command.\n", ERROR);
return;
}
strcpy(CC->usersupp.password, new_pw);
lputuser(&CC->usersupp);
cprintf("%d Password changed.\n", CIT_OK);
- rec_log(CL_PWCHANGE, CC->curr_user);
+ lprintf(3, "Password changed for user <%s>\n", CC->curr_user);
PerformSessionHooks(EVT_SETPASS);
}
} else {
cprintf("%d An error occured creating the user account.\n", ERROR);
}
- rec_log(CL_NEWUSER, username);
}