/*
- * $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;
/****************************************************************************/
+
+/*
+ * CtdlGetFloorByName() - retrieve the number of the named floor
+ * return < 0 if not found else return floor number
+ */
+int CtdlGetFloorByName(const char *floor_name)
+{
+ int a;
+ struct floor *flbuf = NULL;
+
+ for (a = 0; a < MAXFLOORS; ++a) {
+ flbuf = CtdlGetCachedFloor(a);
+
+ /* check to see if it already exists */
+ if ((!strcasecmp(flbuf->f_name, floor_name))
+ && (flbuf->f_flags & F_INUSE)) {
+ return a;
+ }
+ }
+ return -1;
+}
+
+
+
+/*
+ * CtdlGetFloorByNameLock() - retrieve floor number for given floor and lock the floor list.
+ */
+int CtdlGetFloorByNameLock(const char *floor_name)
+{
+ begin_critical_section(S_FLOORTAB);
+ return CtdlGetFloorByName(floor_name);
+}
+
+
+
+/*
+ * CtdlGetAvailableFloor() - Return number of first unused floor
+ * return < 0 if none available
+ */
+int CtdlGetAvailableFloor(void)
+{
+ int a;
+ struct floor *flbuf = NULL;
+
+ for (a = 0; a < MAXFLOORS; a++) {
+ flbuf = CtdlGetCachedFloor(a);
+
+ /* check to see if it already exists */
+ if ((flbuf->f_flags & F_INUSE) == 0) {
+ return a;
+ }
+ }
+ return -1;
+}
+
+
/*
* CtdlGetFloor() - retrieve floor data from disk
*/
}
+
/*
- * lputfloor() - same as CtdlPutFloor() but unlocks the record (if supported)
+ * CtdlPutFloorLock() - same as CtdlPutFloor() but unlocks the record (if supported)
*/
-void lputfloor(struct floor *flbuf, int floor_num)
+void CtdlPutFloorLock(struct floor *flbuf, int floor_num)
{
CtdlPutFloor(flbuf, floor_num);
}
+
+/*
+ * lputfloor() - same as CtdlPutFloor() but unlocks the record (if supported)
+ */
+void lputfloor(struct floor *flbuf, int floor_num)
+{
+ CtdlPutFloorLock(flbuf, floor_num);
+}
+
+
/*
* Traverse the room file...
*/
if (!IsEmptyStr(argbuf))
FloorBeingSearched = extract_int(argbuf, 0);
- if (CtdlAccessCheck(ac_logged_in)) return;
+ if (CtdlAccessCheck(ac_logged_in_or_guest)) return;
- if (getuser(&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 (getuser(&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 (getuser(&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 (getuser(&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 (getuser(&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);
transiently = extract_int(gargs, 2);
- getuser(&CC->user, CC->curr_user);
+ CtdlGetUser(&CC->user, CC->curr_user);
/*
* Handle some of the macro named rooms
/* Then try a mailbox name match */
if (c != 0) {
- MailboxName(augmented_roomname, sizeof augmented_roomname,
+ CtdlMailboxName(augmented_roomname, sizeof augmented_roomname,
&CC->user, towhere);
c = CtdlGetRoom(&QRscratch, augmented_roomname);
if (c == 0)
} 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");
if (CtdlAccessCheck(ac_logged_in)) return;
CtdlGetRoom(&CC->room, CC->room.QRname);
- getuser(&CC->user, CC->curr_user);
+ CtdlGetUser(&CC->user, CC->curr_user);
if ((CC->room.QRflags & QR_DIRECTORY) == 0) {
cprintf("%d not here.\n", ERROR + NOT_HERE);
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;
"\"%s\" appears in the file directory for room \"%s\" but is not a regular file. Directories, named pipes, sockets, etc. are not usable in Citadel room directories.\n",
buf, CC->room.QRname
);
- aide_message(buf2, "Unusable data found in room directory");
+ CtdlAideMessage(buf2, "Unusable data found in room directory");
continue; /* not a useable file type so don't show it */
}
safestrncpy(comment, "", sizeof comment);
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;
}
snprintf(buf, sizeof buf, "The room \"%s\" has been edited by %s.\n",
CC->room.QRname, CC->curr_user);
- aide_message(buf, "Room modification Message");
+ CtdlAideMessage(buf, "Room modification Message");
cprintf("%d Ok\n", CIT_OK);
}
if (CtdlAccessCheck(ac_logged_in)) return;
- if (getuserbynumber(&usbuf, CC->room.QRroomaide) == 0) {
+ if (CtdlGetUserByNumber(&usbuf, CC->room.QRroomaide) == 0) {
cprintf("%d %s\n", CIT_OK, usbuf.fullname);
} else {
cprintf("%d \n", CIT_OK);
if (CtdlAccessCheck(ac_room_aide)) return;
- if (getuser(&usbuf, new_ra) != 0) {
+ if (CtdlGetUser(&usbuf, new_ra) != 0) {
newu = (-1L);
} else {
newu = usbuf.usernum;
snprintf(buf, sizeof buf,
"There is now no room aide for \"%s\".\n",
CC->room.QRname);
- aide_message(buf, "Aide Room Modification");
+ CtdlAideMessage(buf, "Aide Room Modification");
}
cprintf("%d Ok\n", CIT_OK);
}
/* tell the world what we did */
snprintf(msg, sizeof msg, "The room \"%s\" has been deleted by %s.\n",
deleted_room_name, CC->curr_user);
- aide_message(msg, "Room Purger Message");
+ CtdlAideMessage(msg, "Room Purger Message");
cprintf("%d '%s' deleted.\n", CIT_OK, deleted_room_name);
} else {
cprintf("%d ok to delete.\n", CIT_OK);
/*
* 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);
* name accordingly (prepend the user number)
*/
if (new_room_type == 4) {
- MailboxName(qrbuf.QRname, sizeof qrbuf.QRname, &CC->user, new_room_name);
+ CtdlMailboxName(qrbuf.QRname, sizeof qrbuf.QRname, &CC->user, new_room_name);
}
else {
safestrncpy(qrbuf.QRname, new_room_name, sizeof qrbuf.QRname);
}
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;
((newflags & QR_PASSWORDED) ? " Password: " : ""),
((newflags & QR_PASSWORDED) ? new_room_pass : "")
);
- aide_message(notification_message, "Room Creation Message");
+ CtdlAideMessage(notification_message, "Room Creation Message");
free(notification_message);
cprintf("%d '%s' has been created.\n", CIT_OK, new_room_name);
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";
}