/*
- * $Id$
- *
* Server functions which perform operations on user objects.
*
+ * 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.
+ *
+ * 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"
#include <ctype.h>
#include <sys/types.h>
#include <sys/wait.h>
+#include <syslog.h>
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif
#include "citadel.h"
#include "server.h"
#include "database.h"
-#include "user_ops.h"
#include "sysdep_decls.h"
#include "support.h"
#include "room_ops.h"
#include "threads.h"
#include "citadel_ldap.h"
#include "context.h"
-
#include "ctdl_module.h"
+#include "user_ops.h"
/* These pipes are used to talk to the chkpwd daemon, which is forked during startup */
int chkpwd_write_pipe[2];
int chkpwd_read_pipe[2];
-INLINE long cutuserkey(char *username) {
- long len;
- len = strlen(username);
- if (len >= USERNAME_SIZE)
- {
- CtdlLogPrintf (CTDL_EMERG, "Username to long: %s", username);
- cit_backtrace ();
- len = USERNAME_SIZE - 1;
- ((char*)username)[USERNAME_SIZE - 1]='\0';
- }
- return len;
-}
-
-/*
- * makeuserkey() - convert a username into the format used as a database key
- * (it's just the username converted into lower case)
- */
-INLINE void makeuserkey(char *key, const char *username, long len) {
- int i;
-
- if (len >= USERNAME_SIZE)
- {
- CtdlLogPrintf (CTDL_EMERG, "Username to long: %s", username);
- cit_backtrace ();
- len = USERNAME_SIZE - 1;
- }
- for (i=0; i<=len; ++i) {
- key[i] = tolower(username[i]);
- }
-}
-
/*
* getuser() - retrieve named user into supplied buffer.
else { /* Sanity checks succeeded. Now rename the user. */
if (usbuf.usernum == 0)
{
- CtdlLogPrintf (CTDL_DEBUG, "Can not rename user \"Citadel\".\n");
+ CONM_syslog(LOG_DEBUG, "Can not rename user \"Citadel\".\n");
retcode = RENAMEUSER_NOT_FOUND;
} else {
- CtdlLogPrintf(CTDL_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);
/*
* Back end for CtdlSetRelationship()
*/
-void put_visit(struct visit *newvisit)
+void put_visit(visit *newvisit)
{
char IndexBuf[32];
int IndexLen = 0;
/* Store the record */
cdb_store(CDB_VISIT, IndexBuf, IndexLen,
- newvisit, sizeof(struct visit)
+ newvisit, sizeof(visit)
);
}
/*
* Define a relationship between a user and a room
*/
-void CtdlSetRelationship(struct visit *newvisit,
+void CtdlSetRelationship(visit *newvisit,
struct ctdluser *rel_user,
struct ctdlroom *rel_room)
{
/*
* Locate a relationship between a user and a room
*/
-void CtdlGetRelationship(struct visit *vbuf,
+void CtdlGetRelationship(visit *vbuf,
struct ctdluser *rel_user,
struct ctdlroom *rel_room)
{
rel_user->usernum);
/* Clear out the buffer */
- memset(vbuf, 0, sizeof(struct visit));
+ memset(vbuf, 0, sizeof(visit));
cdbvisit = cdb_fetch(CDB_VISIT, IndexBuf, IndexLen);
if (cdbvisit != NULL) {
memcpy(vbuf, cdbvisit->ptr,
- ((cdbvisit->len > sizeof(struct visit)) ?
- sizeof(struct visit) : cdbvisit->len));
+ ((cdbvisit->len > sizeof(visit)) ?
+ sizeof(visit) : cdbvisit->len));
cdb_free(cdbvisit);
}
else {
cdbun = cdb_fetch(CDB_USERSBYNUMBER, &number, sizeof(long));
if (cdbun == NULL) {
- CtdlLogPrintf(CTDL_INFO, "User %ld not found\n", number);
+ CON_syslog(LOG_INFO, "User %ld not found\n", number);
return(-1);
}
- CtdlLogPrintf(CTDL_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) {
- CtdlLogPrintf(CTDL_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;
- CtdlLogPrintf(9, "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))
{
- CtdlLogPrintf(CTDL_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];
- CtdlLogPrintf(CTDL_DEBUG, "asking host about <%s>\n", username);
+ CON_syslog(LOG_DEBUG, "asking host about <%s>\n", username);
#ifdef HAVE_GETPWNAM_R
#ifdef SOLARIS_GETPWUID
- CtdlLogPrintf(CTDL_DEBUG, "Calling getpwnam_r()\n");
+ CON_syslog(LOG_DEBUG, "Calling getpwnam_r()\n");
tempPwdPtr = getpwnam_r(username, &pd, pwdbuffer, sizeof pwdbuffer);
#else // SOLARIS_GETPWUID
- CtdlLogPrintf(CTDL_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
- CtdlLogPrintf(CTDL_DEBUG, "SHOULD NEVER GET HERE!!!\n");
+ CON_syslog(LOG_DEBUG, "SHOULD NEVER GET HERE!!!\n");
tempPwdPtr = NULL;
#endif // HAVE_GETPWNAM_R
if (tempPwdPtr == NULL) {
- CtdlLogPrintf(CTDL_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);
- CtdlLogPrintf(CTDL_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;
- CtdlLogPrintf(CTDL_DEBUG, "cmd_user(%s)\n", cmdbuf);
+ CON_syslog(LOG_DEBUG, "cmd_user(%s)\n", cmdbuf);
extract_token(username, cmdbuf, 0, '|', sizeof username);
- CtdlLogPrintf(CTDL_DEBUG, "username: %s\n", username);
+ CON_syslog(LOG_DEBUG, "username: %s\n", username);
striplt(username);
- CtdlLogPrintf(CTDL_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;
- CtdlLogPrintf(CTDL_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...)
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 */
+ CtdlCreateRoom(USERDRAFTROOM, 4, "", 0, 1, 0, VIEW_MAILBOX);
/* Run any startup routines registered by loadable modules */
PerformSessionHooks(EVT_LOGIN);
-/*
- * misc things to be taken care of when a user is logged out
- */
-void logout(void)
+void CtdlUserLogout(void)
{
- CtdlUserLogout();
-}
+ CitContext *CCC = MyContext();
+ CON_syslog(LOG_DEBUG, "CtdlUserLogout() logging out <%s> from session %d",
+ CCC->curr_user, CCC->cs_pid
+ );
-void CtdlUserLogout(void)
-{
- CitContext *CCC = CC; /* CachedCitContext - performance boost */
/*
* If there is a download in progress, abort it.
*/
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);
if ((CCC->user.axlevel == AxDeleted) && (CCC->user.usernum))
purge_user(CCC->user.fullname);
+ /* Clear out the user record in memory so we don't behave like a ghost */
+ memset(&CCC->user, 0, sizeof(struct ctdluser));
+ CCC->curr_user[0] = 0;
+ CCC->is_master = 0;
+ CCC->cs_inet_email[0] = 0;
+ CCC->cs_inet_other_emails[0] = 0;
+ CCC->cs_inet_fn[0] = 0;
+ CCC->fake_username[0] = 0;
+ CCC->fake_hostname[0] = 0;
+ CCC->fake_roomname[0] = 0;
+
+
/* Free any output buffers */
unbuffer_output();
}
+
/*
* Validate a password on the host unix system by talking to the chkpwd daemon
*/
int rv = 0;
if (IsEmptyStr(pass)) {
- CtdlLogPrintf(CTDL_DEBUG, "refusing to check empty password for uid=%d using chkpwd...\n", uid);
+ CON_syslog(LOG_DEBUG, "Refusing to chkpwd for uid=%d with empty password.\n", uid);
return 0;
}
- CtdlLogPrintf(CTDL_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) {
+ 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) {
+ 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) {
+ 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)) {
- CtdlLogPrintf(CTDL_DEBUG, "...pass\n");
+ CONM_syslog(LOG_DEBUG, "...pass\n");
return(1);
}
- CtdlLogPrintf(CTDL_DEBUG, "...fail\n");
+ CONM_syslog(LOG_DEBUG, "...fail\n");
return 0;
}
struct stat filestats;
int i;
- CtdlLogPrintf(CTDL_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) {
- CtdlLogPrintf(CTDL_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) {
- CtdlLogPrintf(CTDL_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) {
- CtdlLogPrintf(CTDL_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) {
- CtdlLogPrintf(CTDL_DEBUG, "Now calling dup2() write\n");
+ CONM_syslog(LOG_DEBUG, "Now calling dup2() write\n");
dup2(chkpwd_write_pipe[0], 0);
- CtdlLogPrintf(CTDL_DEBUG, "Now calling dup2() write\n");
+ CONM_syslog(LOG_DEBUG, "Now calling dup2() write\n");
dup2(chkpwd_read_pipe[1], 1);
- CtdlLogPrintf(CTDL_DEBUG, "Now closing stuff\n");
+ CONM_syslog(LOG_DEBUG, "Now closing stuff\n");
for (i=2; i<256; ++i) close(i);
- CtdlLogPrintf(CTDL_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);
- CtdlLogPrintf(CTDL_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)) {
- CtdlLogPrintf(CTDL_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)) {
- CtdlLogPrintf(CTDL_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)) {
- CtdlLogPrintf(CTDL_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) {
- CtdlLogPrintf(CTDL_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(CCC->user.password);
+ code = strcasecmp(CCC->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);
+ free (pw);
}
if (!code) {
do_login();
return pass_ok;
} else {
- CtdlLogPrintf(CTDL_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) {
- CtdlLogPrintf(CTDL_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)) {
- CtdlLogPrintf(CTDL_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);
}
- CtdlLogPrintf(CTDL_NOTICE, "Deleting user <%s>\n", pname);
+ CON_syslog(LOG_NOTICE, "Deleting user <%s>\n", pname);
/*
* FIXME:
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 */
CC->cs_addr
);
CtdlAideMessage(buf, "User Creation Notice");
- CtdlLogPrintf(CTDL_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);
- CtdlLogPrintf(CTDL_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);
}
*/
void cmd_setp(char *new_pw)
{
- int generate_random_password = 0;
-
if (CtdlAccessCheck(ac_logged_in)) {
return;
}
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);
}
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 = 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);
return;
CtdlGetUser(&CC->user, CC->curr_user);
- cprintf("%d %d|%d|%d|\n",
+ cprintf("%d 80|24|%d|\n",
CIT_OK,
- CC->user.USscreenwidth,
- CC->user.USscreenheight,
(CC->user.flags & US_USER_SET)
- );
+ );
}
/*
return;
}
CtdlGetUserLock(&CC->user, CC->curr_user);
- CC->user.USscreenwidth = extract_int(new_parms, 0);
- CC->user.USscreenheight = extract_int(new_parms, 1);
CC->user.flags = CC->user.flags & (~US_USER_SET);
- CC->user.flags = CC->user.flags |
- (extract_int(new_parms, 2) & US_USER_SET);
-
+ CC->user.flags = CC->user.flags | (extract_int(new_parms, 2) & US_USER_SET);
CtdlPutUserLock(&CC->user);
cprintf("%d Ok\n", CIT_OK);
}
void cmd_slrp(char *new_ptr)
{
long newlr;
- struct visit vbuf;
- struct visit original_vbuf;
+ visit vbuf;
+ visit original_vbuf;
if (CtdlAccessCheck(ac_logged_in)) {
return;
CtdlGetUserLock(&CC->user, CC->curr_user);
CtdlGetRelationship(&vbuf, &CC->user, &CC->room);
- memcpy(&original_vbuf, &vbuf, sizeof(struct visit));
+ memcpy(&original_vbuf, &vbuf, sizeof(visit));
vbuf.v_lastseen = newlr;
snprintf(vbuf.v_seen, sizeof vbuf.v_seen, "*:%ld", newlr);
void cmd_gtsn(char *argbuf) {
- char buf[SIZ];
+ visit vbuf;
if (CtdlAccessCheck(ac_logged_in)) {
return;
}
- CtdlGetSeen(buf, ctdlsetseen_seen);
- cprintf("%d %s\n", CIT_OK, buf);
+ /* Learn about the user and room in question */
+ CtdlGetRelationship(&vbuf, &CC->user, &CC->room);
+
+ cprintf("%d ", CIT_OK);
+ client_write(vbuf.v_seen, strlen(vbuf.v_seen));
+ client_write(HKEY("\n"));
}
*/
int CtdlInvtKick(char *iuser, int op) {
struct ctdluser USscratch;
- struct visit vbuf;
+ visit vbuf;
char bbb[SIZ];
if (CtdlGetUser(&USscratch, iuser) != 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);
* These commands are only allowed by aides, room aides,
* and room namespace owners
*/
- if (is_room_aide()
- || (atol(CC->room.QRname) == CC->user.usernum) ) {
+ if (is_room_aide()) {
+ /* access granted */
+ } else if ( ((atol(CC->room.QRname) == CC->user.usernum) ) && (CC->user.usernum != 0) ) {
/* access granted */
} else {
/* access denied */
* Returns 0 on success
*/
int CtdlForgetThisRoom(void) {
- struct visit vbuf;
+ visit vbuf;
/* On some systems, Aides are not allowed to forget rooms */
if (is_aide() && (config.c_aide_zap == 0)
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");
}
int a;
char mailboxname[ROOMNAMELEN];
struct ctdlroom mailbox;
- struct visit vbuf;
+ visit vbuf;
struct cdbdata *cdbfr;
long *msglist = NULL;
int num_msgs = 0;
*/
void cmd_view(char *cmdbuf) {
int requested_view;
- struct visit vbuf;
+ visit vbuf;
if (CtdlAccessCheck(ac_logged_in)) {
return;
CTDL_MODULE_INIT(user_ops)
{
if (!threading) {
- 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.");
+ CtdlRegisterProtoHook(cmd_user, "USER", "Submit username for login");
+ CtdlRegisterProtoHook(cmd_pass, "PASS", "Complete login by submitting a password");
+ CtdlRegisterProtoHook(cmd_creu, "CREU", "Create User");
+ CtdlRegisterProtoHook(cmd_setp, "SETP", "Set the password for an account");
+ CtdlRegisterProtoHook(cmd_getu, "GETU", "Get User parameters");
+ CtdlRegisterProtoHook(cmd_setu, "SETU", "Set User parameters");
+ CtdlRegisterProtoHook(cmd_slrp, "SLRP", "Set Last Read Pointer");
+ 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", "Get Next Unregistered User");
+ CtdlRegisterProtoHook(cmd_vali, "VALI", "Validate new users");
+ CtdlRegisterProtoHook(cmd_list, "LIST", "List users");
+ 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 "$Id$";
+ return "user_ops";
}