/*
- * $Id$
- *
* Server functions which perform operations on room objects.
*
*/
#include "room_ops.h"
#include "sysdep_decls.h"
#include "support.h"
-#include "user_ops.h"
#include "msgbase.h"
#include "citserver.h"
#include "control.h"
#include "threads.h"
#include "ctdl_module.h"
+#include "user_ops.h"
struct floor *floorcache[MAXFLOORS];
int *result, int *view)
{
int retval = 0;
- struct visit vbuf;
+ visit vbuf;
+ int is_me = 0;
+ int is_guest = 0;
+
+ if (userbuf == &CC->user) {
+ is_me = 1;
+ }
+
+ if ((is_me) && (config.c_guest_logins) && (!CC->logged_in)) {
+ is_guest = 1;
+ }
/* for internal programs, always do everything */
if (((CC->internal_pgm)) && (roombuf->QRflags & QR_INUSE)) {
goto SKIP_EVERYTHING;
}
+ /* If guest mode is enabled, always grant access to the Lobby */
+ if ((is_guest) && (!strcasecmp(roombuf->QRname, BASEROOM))) {
+ retval = (UA_KNOWN | UA_GOTOALLOWED);
+ vbuf.v_view = 0;
+ goto SKIP_EVERYTHING;
+ }
+
/* Locate any applicable user/room relationships */
- CtdlGetRelationship(&vbuf, userbuf, roombuf);
+ if (is_guest) {
+ memset(&vbuf, 0, sizeof vbuf);
+ }
+ else {
+ CtdlGetRelationship(&vbuf, userbuf, roombuf);
+ }
/* Force the properties of the Aide room */
if (!strcasecmp(roombuf->QRname, config.c_aideroom)) {
- if (userbuf->axlevel >= 6) {
+ if (userbuf->axlevel >= AxAideU) {
retval = UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED;
} else {
retval = 0;
/* If this is a preferred users only room, check access level */
if (roombuf->QRflags & QR_PREFONLY) {
- if (userbuf->axlevel < 5) {
+ if (userbuf->axlevel < AxPrefU) {
retval = retval & ~UA_KNOWN & ~UA_GOTOALLOWED;
}
}
* - It is a read-only room
*/
int post_allowed = 1;
- if (CC->user.axlevel < 2) post_allowed = 0;
- if ((CC->user.axlevel < 4) && (CC->room.QRflags & QR_NETWORK)) post_allowed = 0;
+ if (userbuf->axlevel < AxProbU) post_allowed = 0;
+ if ((userbuf->axlevel < AxNetU) && (roombuf->QRflags & QR_NETWORK)) post_allowed = 0;
if (roombuf->QRflags & QR_READONLY) post_allowed = 0;
if (post_allowed) {
retval = retval | UA_POSTALLOWED;
/* If "collaborative deletion" is active for this room, any user who can post
* is also allowed to delete
*/
- if (CC->room.QRflags2 & QR2_COLLABDEL) {
+ if (roombuf->QRflags2 & QR2_COLLABDEL) {
if (retval & UA_POSTALLOWED) {
retval = retval | UA_DELETEALLOWED;
}
}
/* Aides get access to all private rooms */
- if ( (userbuf->axlevel >= 6)
+ if ( (userbuf->axlevel >= AxAideU)
&& ((roombuf->QRflags & QR_MAILBOX) == 0) ) {
if (vbuf.v_flags & V_FORGET) {
retval = retval | UA_GOTOALLOWED | UA_POSTALLOWED;
/* Aides can gain access to mailboxes as well, but they don't show
* by default.
*/
- if ( (userbuf->axlevel >= 6)
+ if ( (userbuf->axlevel >= AxAideU)
&& (roombuf->QRflags & QR_MAILBOX) ) {
retval = retval | UA_GOTOALLOWED | UA_POSTALLOWED;
}
/* Aides and Room Aides have admin privileges */
- if ( (userbuf->axlevel >= 6)
+ if ( (userbuf->axlevel >= AxAideU)
|| (userbuf->usernum == roombuf->QRroomaide)
) {
retval = retval | UA_ADMINALLOWED | UA_DELETEALLOWED | UA_POSTALLOWED;
if (!IsEmptyStr(argbuf))
FloorBeingSearched = extract_int(argbuf, 0);
- if (CtdlAccessCheck(ac_logged_in)) return;
+ if (CtdlAccessCheck(ac_logged_in_or_guest)) return;
- if (CtdlGetUser(&CC->user, CC->curr_user)) {
- cprintf("%d Can't locate user!\n", ERROR + INTERNAL_ERROR);
- return;
- }
+ CtdlGetUser(&CC->user, CC->curr_user);
cprintf("%d Accessible rooms:\n", LISTING_FOLLOWS);
CtdlForEachRoom(cmd_lrms_backend, &FloorBeingSearched);
if (!IsEmptyStr(argbuf))
FloorBeingSearched = extract_int(argbuf, 0);
- if (CtdlAccessCheck(ac_logged_in)) return;
+ if (CtdlAccessCheck(ac_logged_in_or_guest)) return;
- if (CtdlGetUser(&CC->user, CC->curr_user)) {
- cprintf("%d Can't locate user!\n", ERROR + INTERNAL_ERROR);
- return;
- }
+ CtdlGetUser(&CC->user, CC->curr_user);
cprintf("%d Known rooms:\n", LISTING_FOLLOWS);
CtdlForEachRoom(cmd_lkra_backend, &FloorBeingSearched);
if (!IsEmptyStr(argbuf))
FloorBeingSearched = extract_int(argbuf, 0);
- if (CtdlAccessCheck(ac_logged_in)) return;
+ if (CtdlAccessCheck(ac_logged_in_or_guest)) return;
- if (CtdlGetUser(&CC->user, CC->curr_user)) {
- cprintf("%d Can't locate user!\n", ERROR + INTERNAL_ERROR);
- return;
- }
+ CtdlGetUser(&CC->user, CC->curr_user);
cprintf("%d Rooms w/ new msgs:\n", LISTING_FOLLOWS);
CtdlForEachRoom(cmd_lkrn_backend, &FloorBeingSearched);
if (!IsEmptyStr(argbuf))
FloorBeingSearched = extract_int(argbuf, 0);
- if (CtdlAccessCheck(ac_logged_in)) return;
+ if (CtdlAccessCheck(ac_logged_in_or_guest)) return;
- if (CtdlGetUser(&CC->user, CC->curr_user)) {
- cprintf("%d Can't locate user!\n", ERROR + INTERNAL_ERROR);
- return;
- }
+ CtdlGetUser(&CC->user, CC->curr_user);
cprintf("%d Rooms w/o new msgs:\n", LISTING_FOLLOWS);
CtdlForEachRoom(cmd_lkro_backend, &FloorBeingSearched);
if (!IsEmptyStr(argbuf))
FloorBeingSearched = extract_int(argbuf, 0);
- if (CtdlAccessCheck(ac_logged_in)) return;
+ if (CtdlAccessCheck(ac_logged_in_or_guest)) return;
- if (CtdlGetUser(&CC->user, CC->curr_user)) {
- cprintf("%d Can't locate user!\n", ERROR + INTERNAL_ERROR);
- return;
- }
+ CtdlGetUser(&CC->user, CC->curr_user);
cprintf("%d Zapped rooms:\n", LISTING_FOLLOWS);
CtdlForEachRoom(cmd_lzrm_backend, &FloorBeingSearched);
int rmailflag;
int raideflag;
int newmailcount = 0;
- struct visit vbuf;
+ visit vbuf;
char truncated_roomname[ROOMNAMELEN];
struct cdbdata *cdbfr;
long *msglist = NULL;
rmailflag = 0;
if ((CC->room.QRroomaide == CC->user.usernum)
- || (CC->user.axlevel >= 6))
+ || (CC->user.axlevel >= AxAideU))
raideflag = 1;
else
raideflag = 0;
char password[32];
int transiently = 0;
- if (CtdlAccessCheck(ac_logged_in)) return;
+ if (CtdlAccessCheck(ac_logged_in_or_guest)) return;
extract_token(towhere, gargs, 0, '|', sizeof towhere);
extract_token(password, gargs, 1, '|', sizeof password);
} else if ((QRscratch.QRflags & QR_PASSWORDED) &&
((ra & UA_KNOWN) == 0) &&
(strcasecmp(QRscratch.QRpasswd, password)) &&
- (CC->user.axlevel < 6)
+ (CC->user.axlevel < AxAideU)
) {
cprintf("%d wrong or missing passwd\n",
ERROR + PASSWORD_REQUIRED);
((QRscratch.QRflags & QR_PASSWORDED) == 0) &&
((QRscratch.QRflags & QR_GUESSNAME) == 0) &&
((ra & UA_KNOWN) == 0) &&
- (CC->user.axlevel < 6)
+ (CC->user.axlevel < AxAideU)
) {
CtdlLogPrintf(CTDL_DEBUG, "Failed to acquire private room\n");
} else {
cdb_free(cdbus);
CtdlRoomAccess(&CC->room, &temp, &ra, NULL);
- if ((CC->room.QRflags & QR_INUSE)
- && (ra & UA_KNOWN)
- )
+ if ((!IsEmptyStr(temp.fullname)) &&
+ (CC->room.QRflags & QR_INUSE) &&
+ (ra & UA_KNOWN)
+ )
cprintf("%s\n", temp.fullname);
}
cprintf("000\n");
return;
}
if (((CC->room.QRflags & QR_VISDIR) == 0)
- && (CC->user.axlevel < 6)
+ && (CC->user.axlevel < AxAideU)
&& (CC->user.usernum != CC->room.QRroomaide)) {
cprintf("%d not here.\n", ERROR + HIGHER_ACCESS_REQUIRED);
return;
ret = crr_room_not_found;
}
- else if ( (CC->user.axlevel < 6) && (!CC->internal_pgm)
+ else if ( (CC->user.axlevel < AxAideU) && (!CC->internal_pgm)
&& (CC->user.usernum != qrbuf.QRroomaide)
&& ( (((qrbuf.QRflags & QR_MAILBOX) == 0) || (atol(qrbuf.QRname) != CC->user.usernum))) ) {
ret = crr_access_denied;
/*
* Internal code to create a new room (returns room flags)
*
- * Room types: 0=public, 1=guessname, 2=passworded, 3=inv-only,
+ * Room types: 0=public, 1=hidden, 2=passworded, 3=invitation-only,
* 4=mailbox, 5=mailbox, but caller supplies namespace
*/
unsigned CtdlCreateRoom(char *new_room_name,
struct ctdlroom qrbuf;
struct floor flbuf;
- struct visit vbuf;
+ visit vbuf;
CtdlLogPrintf(CTDL_DEBUG, "CtdlCreateRoom(name=%s, type=%d, view=%d)\n",
new_room_name, new_room_type, new_room_view);
}
if (new_room_type == 5) {
- if (CC->user.axlevel < 6) {
+ if (CC->user.axlevel < AxAideU) {
cprintf("%d Higher access required\n",
ERROR + HIGHER_ACCESS_REQUIRED);
return;
CTDL_MODULE_INIT(room_ops)
{
- CtdlRegisterProtoHook(cmd_lrms, "LRMS", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_lkra, "LKRA", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_lkrn, "LKRN", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_lkro, "LKRO", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_lzrm, "LZRM", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_lprm, "LPRM", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_goto, "GOTO", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_whok, "WHOK", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_rdir, "RDIR", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_getr, "GETR", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_setr, "SETR", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_geta, "GETA", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_seta, "SETA", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_rinf, "RINF", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_kill, "KILL", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_cre8, "CRE8", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_einf, "EINF", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_lflr, "LFLR", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_cflr, "CFLR", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_kflr, "KFLR", "Autoconverted. TODO: document me.");
- CtdlRegisterProtoHook(cmd_eflr, "EFLR", "Autoconverted. TODO: document me.");
+ if (!threading) {
+ CtdlRegisterProtoHook(cmd_lrms, "LRMS", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_lkra, "LKRA", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_lkrn, "LKRN", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_lkro, "LKRO", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_lzrm, "LZRM", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_lprm, "LPRM", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_goto, "GOTO", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_whok, "WHOK", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_rdir, "RDIR", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_getr, "GETR", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_setr, "SETR", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_geta, "GETA", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_seta, "SETA", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_rinf, "RINF", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_kill, "KILL", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_cre8, "CRE8", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_einf, "EINF", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_lflr, "LFLR", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_cflr, "CFLR", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_kflr, "KFLR", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_eflr, "EFLR", "Autoconverted. TODO: document me.");
+ }
/* return our Subversion id for the Log */
- return "$Id$";
+ return "room_ops";
}