* Copyright (c) 1987-2011 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as published
- * by the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
+ * modify it under the terms of the GNU General Public License, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "sysdep.h"
else { /* Sanity checks succeeded. Now rename the user. */
if (usbuf.usernum == 0)
{
- syslog(LOG_DEBUG, "Can not rename user \"Citadel\".\n");
+ CONM_syslog(LOG_DEBUG, "Can not rename user \"Citadel\".\n");
retcode = RENAMEUSER_NOT_FOUND;
} else {
- syslog(LOG_DEBUG, "Renaming <%s> to <%s>\n", oldname, newname);
+ CON_syslog(LOG_DEBUG, "Renaming <%s> to <%s>\n", oldname, newname);
cdb_delete(CDB_USERS, oldnamekey, strlen(oldnamekey));
safestrncpy(usbuf.fullname, newname, sizeof usbuf.fullname);
CtdlPutUser(&usbuf);
/*
- * Is the user currently logged in an Aide?
+ * Is the user currently logged in an Admin?
*/
int is_aide(void)
{
/*
- * Is the user currently logged in an Aide *or* the room aide for this room?
+ * Is the user currently logged in an Admin *or* the room Admin for this room?
*/
int is_room_aide(void)
{
cdbun = cdb_fetch(CDB_USERSBYNUMBER, &number, sizeof(long));
if (cdbun == NULL) {
- syslog(LOG_INFO, "User %ld not found\n", number);
+ CON_syslog(LOG_INFO, "User %ld not found\n", number);
return(-1);
}
- syslog(LOG_INFO, "User %ld maps to %s\n", number, cdbun->ptr);
+ CON_syslog(LOG_INFO, "User %ld maps to %s\n", number, cdbun->ptr);
r = CtdlGetUser(usbuf, cdbun->ptr);
cdb_free(cdbun);
return(r);
}
while (u != NULL) {
- syslog(LOG_DEBUG, "Rebuilding usersbynumber index %10ld : %s\n",
+ CON_syslog(LOG_DEBUG, "Rebuilding usersbynumber index %10ld : %s\n",
u->usernum, u->username);
cdb_store(CDB_USERSBYNUMBER, &u->usernum, sizeof(long), u->username, strlen(u->username)+1);
int found_user;
long len;
- syslog(LOG_DEBUG, "CtdlLoginExistingUser(%s, %s)\n", authname, trythisname);
+ CON_syslog(LOG_DEBUG, "CtdlLoginExistingUser(%s, %s)\n", authname, trythisname);
if ((CC->logged_in)) {
return login_already_logged_in;
if (!strncasecmp(trythisname, "SYS_", 4))
{
- syslog(LOG_DEBUG, "System user \"%s\" is not allowed to log in.\n", trythisname);
+ CON_syslog(LOG_DEBUG, "System user \"%s\" is not allowed to log in.\n", trythisname);
return login_not_found;
}
struct passwd *tempPwdPtr;
char pwdbuffer[256];
- syslog(LOG_DEBUG, "asking host about <%s>\n", username);
+ CON_syslog(LOG_DEBUG, "asking host about <%s>\n", username);
#ifdef HAVE_GETPWNAM_R
#ifdef SOLARIS_GETPWUID
- syslog(LOG_DEBUG, "Calling getpwnam_r()\n");
+ CON_syslog(LOG_DEBUG, "Calling getpwnam_r()\n");
tempPwdPtr = getpwnam_r(username, &pd, pwdbuffer, sizeof pwdbuffer);
#else // SOLARIS_GETPWUID
- syslog(LOG_DEBUG, "Calling getpwnam_r()\n");
+ CONM_syslog(LOG_DEBUG, "Calling getpwnam_r()\n");
getpwnam_r(username, &pd, pwdbuffer, sizeof pwdbuffer, &tempPwdPtr);
#endif // SOLARIS_GETPWUID
#else // HAVE_GETPWNAM_R
- syslog(LOG_DEBUG, "SHOULD NEVER GET HERE!!!\n");
+ CON_syslog(LOG_DEBUG, "SHOULD NEVER GET HERE!!!\n");
tempPwdPtr = NULL;
#endif // HAVE_GETPWNAM_R
if (tempPwdPtr == NULL) {
- syslog(LOG_DEBUG, "no such user <%s>\n", username);
+ CON_syslog(LOG_DEBUG, "no such user <%s>\n", username);
return login_not_found;
}
* If not found, make one attempt to create it.
*/
found_user = getuserbyuid(&CC->user, pd.pw_uid);
- syslog(LOG_DEBUG, "found it: uid=%ld, gecos=%s here: %d\n",
+ CON_syslog(LOG_DEBUG, "found it: uid=%ld, gecos=%s here: %d\n",
(long)pd.pw_uid, pd.pw_gecos, found_user);
if (found_user != 0) {
len = cutuserkey(username);
char username[256];
int a;
- syslog(LOG_DEBUG, "cmd_user(%s)\n", cmdbuf);
+ CON_syslog(LOG_DEBUG, "cmd_user(%s)\n", cmdbuf);
extract_token(username, cmdbuf, 0, '|', sizeof username);
- syslog(LOG_DEBUG, "username: %s\n", username);
+ CON_syslog(LOG_DEBUG, "username: %s\n", username);
striplt(username);
- syslog(LOG_DEBUG, "username: %s\n", username);
+ CON_syslog(LOG_DEBUG, "username: %s\n", username);
a = CtdlLoginExistingUser(NULL, username);
switch (a) {
*/
void do_login(void)
{
- CC->logged_in = 1;
- syslog(LOG_NOTICE, "<%s> logged in\n", CC->curr_user);
+ struct CitContext *CCC = CC;
- CtdlGetUserLock(&CC->user, CC->curr_user);
- ++(CC->user.timescalled);
- CC->previous_login = CC->user.lastcall;
- time(&CC->user.lastcall);
+ CCC->logged_in = 1;
+ CON_syslog(LOG_NOTICE, "<%s> logged in\n", CCC->curr_user);
+
+ CtdlGetUserLock(&CCC->user, CCC->curr_user);
+ ++(CCC->user.timescalled);
+ CCC->previous_login = CCC->user.lastcall;
+ time(&CCC->user.lastcall);
/* If this user's name is the name of the system administrator
* (as specified in setup), automatically assign access level 6.
*/
- if (!strcasecmp(CC->user.fullname, config.c_sysadm)) {
- CC->user.axlevel = AxAideU;
+ if (!strcasecmp(CCC->user.fullname, config.c_sysadm)) {
+ CCC->user.axlevel = AxAideU;
}
/* If we're authenticating off the host system, automatically give
* root the highest level of access.
*/
if (config.c_auth_mode == AUTHMODE_HOST) {
- if (CC->user.uid == 0) {
- CC->user.axlevel = AxAideU;
+ if (CCC->user.uid == 0) {
+ CCC->user.axlevel = AxAideU;
}
}
- CtdlPutUserLock(&CC->user);
+ CtdlPutUserLock(&CCC->user);
/*
- * Populate CC->cs_inet_email with a default address. This will be
+ * Populate CCC->cs_inet_email with a default address. This will be
* overwritten with the user's directory address, if one exists, when
* the vCard module's login hook runs.
*/
- snprintf(CC->cs_inet_email, sizeof CC->cs_inet_email, "%s@%s",
- CC->user.fullname, config.c_fqdn);
- convert_spaces_to_underscores(CC->cs_inet_email);
+ snprintf(CCC->cs_inet_email, sizeof CCC->cs_inet_email, "%s@%s",
+ CCC->user.fullname, config.c_fqdn);
+ convert_spaces_to_underscores(CCC->cs_inet_email);
/* Create any personal rooms required by the system.
* (Technically, MAILROOM should be there already, but just in case...)
{
CitContext *CCC = MyContext();
- syslog(LOG_DEBUG, "CtdlUserLogout() logging out <%s> from session %d",
- CCC->curr_user, CCC->cs_pid
+ CON_syslog(LOG_DEBUG, "CtdlUserLogout() logging out <%s> from session %d",
+ CCC->curr_user, CCC->cs_pid
);
/*
abort_upl(CCC);
}
- /*
- * If we were talking to a network node, we're not anymore...
- */
- if (!IsEmptyStr(CCC->net_node)) {
- network_talking_to(CCC->net_node, NTT_REMOVE);
- }
-
/* Run any hooks registered by modules... */
PerformSessionHooks(EVT_LOGOUT);
int rv = 0;
if (IsEmptyStr(pass)) {
- syslog(LOG_DEBUG, "Refusing to chkpwd for uid=%d with empty password.\n", uid);
+ CON_syslog(LOG_DEBUG, "Refusing to chkpwd for uid=%d with empty password.\n", uid);
return 0;
}
- syslog(LOG_DEBUG, "Validating password for uid=%d using chkpwd...\n", uid);
+ CON_syslog(LOG_DEBUG, "Validating password for uid=%d using chkpwd...\n", uid);
begin_critical_section(S_CHKPWD);
rv = write(chkpwd_write_pipe[1], &uid, sizeof(uid_t));
if (rv == -1) {
- syslog(LOG_EMERG, "Communicatino with chkpwd broken: %s\n", strerror(errno));
+ CON_syslog(LOG_EMERG, "Communicatino with chkpwd broken: %s\n", strerror(errno));
end_critical_section(S_CHKPWD);
return 0;
}
rv = write(chkpwd_write_pipe[1], pass, 256);
if (rv == -1) {
- syslog(LOG_EMERG, "Communicatino with chkpwd broken: %s\n", strerror(errno));
+ CON_syslog(LOG_EMERG, "Communicatino with chkpwd broken: %s\n", strerror(errno));
end_critical_section(S_CHKPWD);
return 0;
}
rv = read(chkpwd_read_pipe[0], buf, 4);
if (rv == -1) {
- syslog(LOG_EMERG, "Communicatino with chkpwd broken: %s\n", strerror(errno));
+ CON_syslog(LOG_EMERG, "Communicatino with chkpwd broken: %s\n", strerror(errno));
end_critical_section(S_CHKPWD);
return 0;
}
end_critical_section(S_CHKPWD);
if (!strncmp(buf, "PASS", 4)) {
- syslog(LOG_DEBUG, "...pass\n");
+ CONM_syslog(LOG_DEBUG, "...pass\n");
return(1);
}
- syslog(LOG_DEBUG, "...fail\n");
+ CONM_syslog(LOG_DEBUG, "...fail\n");
return 0;
}
struct stat filestats;
int i;
- syslog(LOG_DEBUG, "Starting chkpwd daemon for host authentication mode\n");
+ CONM_syslog(LOG_DEBUG, "Starting chkpwd daemon for host authentication mode\n");
if ((stat(file_chkpwd, &filestats)==-1) ||
(filestats.st_size==0)){
abort();
}
if (pipe(chkpwd_write_pipe) != 0) {
- syslog(LOG_EMERG, "Unable to create pipe for chkpwd daemon: %s\n", strerror(errno));
+ CON_syslog(LOG_EMERG, "Unable to create pipe for chkpwd daemon: %s\n", strerror(errno));
abort();
}
if (pipe(chkpwd_read_pipe) != 0) {
- syslog(LOG_EMERG, "Unable to create pipe for chkpwd daemon: %s\n", strerror(errno));
+ CON_syslog(LOG_EMERG, "Unable to create pipe for chkpwd daemon: %s\n", strerror(errno));
abort();
}
chkpwd_pid = fork();
if (chkpwd_pid < 0) {
- syslog(LOG_EMERG, "Unable to fork chkpwd daemon: %s\n", strerror(errno));
+ CON_syslog(LOG_EMERG, "Unable to fork chkpwd daemon: %s\n", strerror(errno));
abort();
}
if (chkpwd_pid == 0) {
- syslog(LOG_DEBUG, "Now calling dup2() write\n");
+ CONM_syslog(LOG_DEBUG, "Now calling dup2() write\n");
dup2(chkpwd_write_pipe[0], 0);
- syslog(LOG_DEBUG, "Now calling dup2() write\n");
+ CONM_syslog(LOG_DEBUG, "Now calling dup2() write\n");
dup2(chkpwd_read_pipe[1], 1);
- syslog(LOG_DEBUG, "Now closing stuff\n");
+ CONM_syslog(LOG_DEBUG, "Now closing stuff\n");
for (i=2; i<256; ++i) close(i);
- syslog(LOG_DEBUG, "Now calling execl(%s)\n", file_chkpwd);
+ CON_syslog(LOG_DEBUG, "Now calling execl(%s)\n", file_chkpwd);
execl(file_chkpwd, file_chkpwd, NULL);
- syslog(LOG_EMERG, "Unable to exec chkpwd daemon: %s\n", strerror(errno));
+ CON_syslog(LOG_EMERG, "Unable to exec chkpwd daemon: %s\n", strerror(errno));
abort();
exit(errno);
}
int CtdlTryPassword(const char *password, long len)
{
int code;
+ CitContext *CCC = CC;
- if ((CC->logged_in)) {
- syslog(LOG_WARNING, "CtdlTryPassword: already logged in\n");
+ if ((CCC->logged_in)) {
+ CONM_syslog(LOG_WARNING, "CtdlTryPassword: already logged in\n");
return pass_already_logged_in;
}
- if (!strcmp(CC->curr_user, NLI)) {
- syslog(LOG_WARNING, "CtdlTryPassword: no user selected\n");
+ if (!strcmp(CCC->curr_user, NLI)) {
+ CONM_syslog(LOG_WARNING, "CtdlTryPassword: no user selected\n");
return pass_no_user;
}
- if (CtdlGetUser(&CC->user, CC->curr_user)) {
- syslog(LOG_ERR, "CtdlTryPassword: internal error\n");
+ if (CtdlGetUser(&CCC->user, CCC->curr_user)) {
+ CONM_syslog(LOG_ERR, "CtdlTryPassword: internal error\n");
return pass_internal_error;
}
if (password == NULL) {
- syslog(LOG_INFO, "CtdlTryPassword: NULL password string supplied\n");
+ CONM_syslog(LOG_INFO, "CtdlTryPassword: NULL password string supplied\n");
return pass_wrong_password;
}
- code = (-1);
- if (CC->is_master) {
+ if (CCC->is_master) {
code = strcmp(password, config.c_master_pass);
}
/* host auth mode */
- if (validpw(CC->user.uid, password)) {
+ if (validpw(CCC->user.uid, password)) {
code = 0;
/*
* this is a security hazard, comment it out.
*/
- CtdlGetUserLock(&CC->user, CC->curr_user);
- safestrncpy(CC->user.password, password, sizeof CC->user.password);
- CtdlPutUserLock(&CC->user);
+ CtdlGetUserLock(&CCC->user, CCC->curr_user);
+ safestrncpy(CCC->user.password, password, sizeof CCC->user.password);
+ CtdlPutUserLock(&CCC->user);
/*
* (sooper-seekrit hack ends here)
/* LDAP auth mode */
- if ((CC->ldap_dn) && (!CtdlTryPasswordLDAP(CC->ldap_dn, password))) {
+ if ((CCC->ldap_dn) && (!CtdlTryPasswordLDAP(CCC->ldap_dn, password))) {
code = 0;
}
else {
pw = (char*) malloc(len + 1);
memcpy(pw, password, len + 1);
strproc(pw);
- strproc(CC->user.password);
- code = strcasecmp(CC->user.password, pw);
- strproc(pw);
- strproc(CC->user.password);
- code = strcasecmp(CC->user.password, pw);
+ strproc(CCC->user.password);
+ code = strcasecmp(CCC->user.password, pw);
+ if (code != 0) {
+ strproc(pw);
+ strproc(CCC->user.password);
+ code = strcasecmp(CCC->user.password, pw);
+ }
free (pw);
}
do_login();
return pass_ok;
} else {
- syslog(LOG_WARNING, "Bad password specified for <%s>\n", CC->curr_user);
+ CON_syslog(LOG_WARNING, "Bad password specified for <%s> Service <%s> Port <%ld> Remote <%s / %s>\n",
+ CCC->curr_user,
+ CCC->ServiceName,
+ CCC->tcp_port,
+ CCC->cs_host,
+ CCC->cs_addr);
+
+
+//citserver[5610]: Bad password specified for <willi> Service <citadel-TCP> Remote <PotzBlitz / >
+
return pass_wrong_password;
}
}
return (ERROR + NO_SUCH_USER);
if (CtdlGetUser(&usbuf, pname) != 0) {
- syslog(LOG_ERR, "Cannot purge user <%s> - not found\n", pname);
+ CON_syslog(LOG_ERR, "Cannot purge user <%s> - not found\n", pname);
return (ERROR + NO_SUCH_USER);
}
/* Don't delete a user who is currently logged in. Instead, just
* during the next purge.
*/
if (CtdlIsUserLoggedInByNum(usbuf.usernum)) {
- syslog(LOG_WARNING, "User <%s> is logged in; not deleting.\n", pname);
+ CON_syslog(LOG_WARNING, "User <%s> is logged in; not deleting.\n", pname);
usbuf.axlevel = AxDeleted;
CtdlPutUser(&usbuf);
return (1);
}
- syslog(LOG_NOTICE, "Deleting user <%s>\n", pname);
+ CON_syslog(LOG_NOTICE, "Deleting user <%s>\n", pname);
/*
* FIXME:
CC->cs_addr
);
CtdlAideMessage(buf, "User Creation Notice");
- syslog(LOG_NOTICE, "New user <%s> created\n", username);
+ CON_syslog(LOG_NOTICE, "New user <%s> created\n", username);
return (0);
}
{
int a;
long len;
- char username[26];
+ char username[SIZ];
if (config.c_auth_mode != AUTHMODE_NATIVE) {
cprintf("%d This system does not use native mode authentication.\n",
CtdlGetUserLock(&CC->user, CC->curr_user);
safestrncpy(CC->user.password, new_pw, sizeof(CC->user.password));
CtdlPutUserLock(&CC->user);
- syslog(LOG_INFO, "Password changed for user <%s>\n", CC->curr_user);
+ CON_syslog(LOG_INFO, "Password changed for user <%s>\n", CC->curr_user);
PerformSessionHooks(EVT_SETPASS);
}
}
extract_token(username, cmdbuf, 0, '|', sizeof username);
- extract_token(password, cmdbuf, 1, '|', sizeof password);
- ////username[25] = 0;
- //password[31] = 0;
strproc(username);
strproc(password);
- len = strlen(username);
- if (len >= USERNAME_SIZE)
- {
- syslog(LOG_EMERG, "Username to long: %s", username);
- cit_backtrace ();
- len = USERNAME_SIZE - 1;
- username[63]='\0';
- }
-
- len = cutuserkey(username);
-
if (IsEmptyStr(username)) {
cprintf("%d You must supply a user name.\n", ERROR + USERNAME_REQUIRED);
return;
}
+ len = cutuserkey(username);
+
+
+ extract_token(password, cmdbuf, 1, '|', sizeof password);
a = create_user(username, len, 0);
iuser,
((op == 1) ? "invited to" : "kicked out of"),
CC->room.QRname,
- CC->user.fullname);
+ (CC->logged_in ? CC->user.fullname : "an administrator")
+ );
CtdlAideMessage(bbb,"User Admin Message");
return(0);
void cmd_invt_kick(char *iuser, int op) {
/*
- * These commands are only allowed by aides, room aides,
+ * These commands are only allowed by admins, room admins,
* and room namespace owners
*/
if (is_room_aide()) {
int CtdlForgetThisRoom(void) {
visit vbuf;
- /* On some systems, Aides are not allowed to forget rooms */
+ /* On some systems, Admins are not allowed to forget rooms */
if (is_aide() && (config.c_aide_zap == 0)
&& ((CC->room.QRflags & QR_MAILBOX) == 0) ) {
return(1);
if (deleted) {
snprintf(notify, SIZ,
"User \"%s\" has been deleted by %s.\n",
- usbuf.fullname, CC->user.fullname);
+ usbuf.fullname,
+ (CC->logged_in ? CC->user.fullname : "an administrator")
+ );
CtdlAideMessage(notify, "User Deletion Message");
}
CtdlRegisterProtoHook(cmd_invt, "INVT", "Invite a user to a room");
CtdlRegisterProtoHook(cmd_kick, "KICK", "Kick a user out of a room");
CtdlRegisterProtoHook(cmd_forg, "FORG", "Forget a room");
- CtdlRegisterProtoHook(cmd_gnur, "GNUR", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_gnur, "GNUR", "Get Next Unregistered User");
CtdlRegisterProtoHook(cmd_vali, "VALI", "Validate new users");
CtdlRegisterProtoHook(cmd_list, "LIST", "List users");
- 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.");
+ CtdlRegisterProtoHook(cmd_chek, "CHEK", "assorted info we need to check at login");
+ CtdlRegisterProtoHook(cmd_qusr, "QUSR", "check to see if a user exists");
+ CtdlRegisterProtoHook(cmd_agup, "AGUP", "Administratively Get User Parameters");
+ CtdlRegisterProtoHook(cmd_asup, "ASUP", "Administratively Set User Parameters");
+ CtdlRegisterProtoHook(cmd_seen, "SEEN", "Manipulate seen/unread message flags");
+ CtdlRegisterProtoHook(cmd_gtsn, "GTSN", "Fetch seen/unread message flags");
+ CtdlRegisterProtoHook(cmd_view, "VIEW", "Set preferred view for user/room combination");
+ CtdlRegisterProtoHook(cmd_renu, "RENU", "Rename a user");
+ CtdlRegisterProtoHook(cmd_newu, "NEWU", "Log in as a new user");
}
/* return our Subversion id for the Log */
return "user_ops";