/*
* Server functions which perform operations on room objects.
*
+ * Copyright (c) 1987-2012 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, 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.
*/
#include "sysdep.h"
{
int retval = 0;
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)) {
- retval = (UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED);
+ retval = (UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED | UA_REPLYALLOWED);
+ vbuf.v_view = 0;
+ 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 >= AxAideU) {
- retval = UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED;
+ retval = UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED | UA_REPLYALLOWED;
} else {
retval = 0;
}
}
/* If this is a public room, it's accessible... */
- if ( ((roombuf->QRflags & QR_PRIVATE) == 0)
- && ((roombuf->QRflags & QR_MAILBOX) == 0) ) {
+ if ( ((roombuf->QRflags & QR_PRIVATE) == 0)
+ && ((roombuf->QRflags & QR_MAILBOX) == 0)
+ ) {
retval = retval | UA_KNOWN | UA_GOTOALLOWED;
}
}
/* For private rooms, check the generation number matchups */
- if ( (roombuf->QRflags & QR_PRIVATE)
- && ((roombuf->QRflags & QR_MAILBOX) == 0) ) {
+ if ( (roombuf->QRflags & QR_PRIVATE)
+ && ((roombuf->QRflags & QR_MAILBOX) == 0)
+ ) {
/* An explicit match means the user belongs in this room */
if (vbuf.v_flags & V_ACCESS) {
/* Otherwise, check if this is a guess-name or passworded
* room. If it is, a goto may at least be attempted
*/
- else if ((roombuf->QRflags & QR_PRIVATE)
- || (roombuf->QRflags & QR_PASSWORDED)) {
+ else if ( (roombuf->QRflags & QR_PRIVATE)
+ || (roombuf->QRflags & QR_PASSWORDED)
+ ) {
retval = retval & ~UA_KNOWN;
retval = retval | UA_GOTOALLOWED;
}
/* For mailbox rooms, also check the namespace */
/* Also, mailbox owners can delete their messages */
- if (roombuf->QRflags & QR_MAILBOX) {
+ if ( (roombuf->QRflags & QR_MAILBOX) && (atol(roombuf->QRname) != 0)) {
if (userbuf->usernum == atol(roombuf->QRname)) {
- retval = retval | UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED;
+ retval = retval | UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED | UA_REPLYALLOWED;
}
/* An explicit match means the user belongs in this room */
if (vbuf.v_flags & V_ACCESS) {
- retval = retval | UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED;
+ retval = retval | UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED | UA_REPLYALLOWED;
}
}
* - User is not validated
* - User has no net privileges and it is a shared network room
* - It is a read-only room
+ * - It is a blog room (in which case we only allow replies to existing messages)
*/
int post_allowed = 1;
- if (CC->user.axlevel < AxProbU) post_allowed = 0;
- if ((CC->user.axlevel < AxNetU) && (CC->room.QRflags & QR_NETWORK)) post_allowed = 0;
- if (roombuf->QRflags & QR_READONLY) post_allowed = 0;
+ int reply_allowed = 1;
+ if (userbuf->axlevel < AxProbU) {
+ post_allowed = 0;
+ reply_allowed = 0;
+ }
+ if ((userbuf->axlevel < AxNetU) && (roombuf->QRflags & QR_NETWORK)) {
+ post_allowed = 0;
+ reply_allowed = 0;
+ }
+ if (roombuf->QRflags & QR_READONLY) {
+ post_allowed = 0;
+ reply_allowed = 0;
+ }
+ if (roombuf->QRdefaultview == VIEW_BLOG) {
+ post_allowed = 0;
+ }
if (post_allowed) {
- retval = retval | UA_POSTALLOWED;
+ retval = retval | UA_POSTALLOWED | UA_REPLYALLOWED;
+ }
+ if (reply_allowed) {
+ retval = retval | UA_REPLYALLOWED;
}
/* 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;
}
/* Check to see if the user has forgotten this room */
if (vbuf.v_flags & V_FORGET) {
retval = retval & ~UA_KNOWN;
- if ( ( ((roombuf->QRflags & QR_PRIVATE) == 0)
- && ((roombuf->QRflags & QR_MAILBOX) == 0) )
- || ( (roombuf->QRflags & QR_MAILBOX)
- && (atol(roombuf->QRname) == CC->user.usernum))) {
+ if ( ( ((roombuf->QRflags & QR_PRIVATE) == 0)
+ && ((roombuf->QRflags & QR_MAILBOX) == 0)
+ ) || ( (roombuf->QRflags & QR_MAILBOX)
+ && (atol(roombuf->QRname) == CC->user.usernum))
+ ) {
retval = retval | UA_ZAPPED;
}
}
+
/* If user is explicitly locked out of this room, deny everything */
if (vbuf.v_flags & V_LOCKOUT) {
- retval = retval & ~UA_KNOWN & ~UA_GOTOALLOWED & ~UA_POSTALLOWED;
+ retval = retval & ~UA_KNOWN & ~UA_GOTOALLOWED & ~UA_POSTALLOWED & ~UA_REPLYALLOWED;
}
/* Aides get access to all private rooms */
- if ( (userbuf->axlevel >= AxAideU)
- && ((roombuf->QRflags & QR_MAILBOX) == 0) ) {
+ if ( (userbuf->axlevel >= AxAideU)
+ && ((roombuf->QRflags & QR_MAILBOX) == 0)
+ ) {
if (vbuf.v_flags & V_FORGET) {
- retval = retval | UA_GOTOALLOWED | UA_POSTALLOWED;
+ retval = retval | UA_GOTOALLOWED | UA_POSTALLOWED | UA_REPLYALLOWED;
}
else {
- retval = retval | UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED;
+ retval = retval | UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_REPLYALLOWED;
}
}
/* Aides can gain access to mailboxes as well, but they don't show
* by default.
*/
- if ( (userbuf->axlevel >= AxAideU)
- && (roombuf->QRflags & QR_MAILBOX) ) {
- retval = retval | UA_GOTOALLOWED | UA_POSTALLOWED;
+ if ( (userbuf->axlevel >= AxAideU)
+ && (roombuf->QRflags & QR_MAILBOX)
+ ) {
+ retval = retval | UA_GOTOALLOWED | UA_POSTALLOWED | UA_REPLYALLOWED;
}
/* Aides and Room Aides have admin privileges */
- if ( (userbuf->axlevel >= AxAideU)
- || (userbuf->usernum == roombuf->QRroomaide)
- ) {
- retval = retval | UA_ADMINALLOWED | UA_DELETEALLOWED | UA_POSTALLOWED;
+ if ( (userbuf->axlevel >= AxAideU)
+ || (userbuf->usernum == roombuf->QRroomaide)
+ ) {
+ retval = retval | UA_ADMINALLOWED | UA_DELETEALLOWED | UA_POSTALLOWED | UA_REPLYALLOWED;
}
NEWMSG: /* By the way, we also check for the presence of new messages */
if (view != NULL) *view = vbuf.v_view;
}
+
/*
* Self-checking stuff for a room record read into memory
*/
/*
* CtdlGetRoom() - retrieve room data from disk
*/
-int CtdlGetRoom(struct ctdlroom *qrbuf, char *room_name)
+int CtdlGetRoom(struct ctdlroom *qrbuf, const char *room_name)
{
struct cdbdata *cdbqr;
char lowercase_name[ROOMNAMELEN];
char personal_lowercase_name[ROOMNAMELEN];
- char *dptr, *sptr, *eptr;
+ const char *sptr;
+ char *dptr, *eptr;
dptr = lowercase_name;
sptr = room_name;
len = bptr - lowercase_name;
if (qrbuf == NULL) {
- cdb_delete(CDB_ROOMS,
- lowercase_name, len);
+ cdb_delete(CDB_ROOMS, lowercase_name, len);
} else {
time(&qrbuf->QRmtime);
- cdb_store(CDB_ROOMS,
- lowercase_name, len,
- qrbuf, sizeof(struct ctdlroom));
+ cdb_store(CDB_ROOMS, lowercase_name, len, qrbuf, sizeof(struct ctdlroom));
}
}
}
-
/*
* CtdlPutRoomLock() - same as CtdlPutRoom() but unlocks the record (if supported)
*/
}
-/****************************************************************************/
-
/*
* CtdlGetFloorByName() - retrieve the number of the named floor
}
-
/*
* CtdlGetFloorByNameLock() - retrieve floor number for given floor and lock the floor list.
*/
}
+
/*
* lgetfloor() - same as CtdlGetFloor() but locks the record (if supported)
*/
}
-
/*
* CtdlPutFloor() - store floor data on disk
*/
}
-
/*
* CtdlPutFloorLock() - same as CtdlPutFloor() but unlocks the record (if supported)
*/
}
-
/*
* lputfloor() - same as CtdlPutFloor() but unlocks the record (if supported)
*/
/*
* Traverse the room file...
*/
-void CtdlForEachRoom(void (*CallBack) (struct ctdlroom *EachRoom, void *out_data),
- void *in_data)
+void CtdlForEachRoom(ForEachRoomCallBack CB, void *in_data)
{
struct ctdlroom qrbuf;
struct cdbdata *cdbqr;
memset(&qrbuf, 0, sizeof(struct ctdlroom));
memcpy(&qrbuf, cdbqr->ptr,
((cdbqr->len > sizeof(struct ctdlroom)) ?
- sizeof(struct ctdlroom) : cdbqr->len));
+ sizeof(struct ctdlroom) : cdbqr->len)
+ );
+ cdb_free(cdbqr);
+ room_sanity_check(&qrbuf);
+ if (qrbuf.QRflags & QR_INUSE) {
+ CB(&qrbuf, in_data);
+ }
+ }
+}
+
+/*
+ * Traverse the room file...
+ */
+void CtdlForEachNetCfgRoom(ForEachRoomNetCfgCallBack CB,
+ void *in_data,
+ RoomNetCfg filter)
+{
+ struct ctdlroom qrbuf;
+ struct cdbdata *cdbqr;
+
+ cdb_rewind(CDB_ROOMS);
+
+ while (cdbqr = cdb_next_item(CDB_ROOMS), cdbqr != NULL) {
+ memset(&qrbuf, 0, sizeof(struct ctdlroom));
+ memcpy(&qrbuf, cdbqr->ptr,
+ ((cdbqr->len > sizeof(struct ctdlroom)) ?
+ sizeof(struct ctdlroom) : cdbqr->len)
+ );
cdb_free(cdbqr);
room_sanity_check(&qrbuf);
if (qrbuf.QRflags & QR_INUSE)
- (*CallBack)(&qrbuf, in_data);
+ {
+ OneRoomNetCfg* RNCfg;
+ RNCfg = CtdlGetNetCfgForRoom(qrbuf.QRnumber);
+ if ((RNCfg != NULL) &&
+ ((filter == maxRoomNetCfg) ||
+ (RNCfg->NetConfigs[filter] != NULL)))
+ {
+ CB(&qrbuf, in_data, RNCfg);
+ }
+ }
}
}
struct cdbdata *cdbml;
/* Make sure the msglist we're deleting actually exists, otherwise
- * gdbm will complain when we try to delete an invalid record
+ * libdb will complain when we try to delete an invalid record
*/
cdbml = cdb_fetch(CDB_MSGLISTS, &whichroom->QRnumber, sizeof(long));
if (cdbml != NULL) {
}
-
/*
* Message pointer compare function for sort_msglist()
*/
/* and yank any nulls */
while ((numitems > 0) && (listptrs[0] == 0L)) {
- memmove(&listptrs[0], &listptrs[1],
- (sizeof(long) * (numitems - 1)));
+ memmove(&listptrs[0], &listptrs[1], (sizeof(long) * (numitems - 1)));
--numitems;
}
}
-
/*
* Back-back-end for all room listing commands
*/
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);
- cprintf("%d Publiic rooms:\n", LISTING_FOLLOWS);
+ cprintf("%d Public rooms:\n", LISTING_FOLLOWS);
CtdlForEachRoom(cmd_lprm_backend, &FloorBeingSearched);
cprintf("000\n");
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);
void CtdlUserGoto(char *where, int display_result, int transiently,
int *retmsgs, int *retnew)
{
+ struct CitContext *CCC = CC;
int a;
int new_messages = 0;
int old_messages = 0;
* we can skip the extra database fetch.
*/
if (where != NULL) {
- safestrncpy(CC->room.QRname, where, sizeof CC->room.QRname);
- CtdlGetRoom(&CC->room, where);
+ safestrncpy(CCC->room.QRname, where, sizeof CCC->room.QRname);
+ CtdlGetRoom(&CCC->room, where);
}
/* Take care of all the formalities. */
begin_critical_section(S_USERS);
- CtdlGetRelationship(&vbuf, &CC->user, &CC->room);
+ CtdlGetRelationship(&vbuf, &CCC->user, &CCC->room);
original_v_flags = vbuf.v_flags;
/* Know the room ... but not if it's the page log room, or if the
* caller specified that we're only entering this room transiently.
*/
- if ((strcasecmp(CC->room.QRname, config.c_logpages))
+ if ((strcasecmp(CCC->room.QRname, config.c_logpages))
&& (transiently == 0) ) {
vbuf.v_flags = vbuf.v_flags & ~V_FORGET & ~V_LOCKOUT;
vbuf.v_flags = vbuf.v_flags | V_ACCESS;
/* Only rewrite the database record if we changed something */
if (vbuf.v_flags != original_v_flags) {
- CtdlSetRelationship(&vbuf, &CC->user, &CC->room);
+ CtdlSetRelationship(&vbuf, &CCC->user, &CCC->room);
}
end_critical_section(S_USERS);
newmailcount = NewMailCount();
/* set info to 1 if the user needs to read the room's info file */
- if (CC->room.QRinfo > vbuf.v_lastseen) {
+ if (CCC->room.QRinfo > vbuf.v_lastseen) {
info = 1;
}
- cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long));
+ cdbfr = cdb_fetch(CDB_MSGLISTS, &CCC->room.QRnumber, sizeof(long));
if (cdbfr != NULL) {
msglist = (long *) cdbfr->ptr;
cdbfr->ptr = NULL; /* CtdlUserGoto() now owns this memory */
for (a=0; a<num_msgs; ++a) {
if (msglist[a] > 0L) ++total_messages;
}
- new_messages = num_msgs;
+
num_sets = num_tokens(vbuf.v_seen, ',');
for (s=0; s<num_sets; ++s) {
extract_token(setstr, vbuf.v_seen, s, ',', sizeof setstr);
if (msglist != NULL) free(msglist);
- if (CC->room.QRflags & QR_MAILBOX)
+ if (CCC->room.QRflags & QR_MAILBOX)
rmailflag = 1;
else
rmailflag = 0;
- if ((CC->room.QRroomaide == CC->user.usernum)
- || (CC->user.axlevel >= AxAideU))
+ if ((CCC->room.QRroomaide == CCC->user.usernum)
+ || (CCC->user.axlevel >= AxAideU))
raideflag = 1;
else
raideflag = 0;
- safestrncpy(truncated_roomname, CC->room.QRname, sizeof truncated_roomname);
- if ( (CC->room.QRflags & QR_MAILBOX)
- && (atol(CC->room.QRname) == CC->user.usernum) ) {
+ safestrncpy(truncated_roomname, CCC->room.QRname, sizeof truncated_roomname);
+ if ( (CCC->room.QRflags & QR_MAILBOX)
+ && (atol(CCC->room.QRname) == CCC->user.usernum) ) {
safestrncpy(truncated_roomname, &truncated_roomname[11], sizeof truncated_roomname);
}
if (retmsgs != NULL) *retmsgs = total_messages;
if (retnew != NULL) *retnew = new_messages;
- CtdlLogPrintf(CTDL_DEBUG, "<%s> %d new of %d total messages\n",
- CC->room.QRname,
- new_messages, total_messages
- );
+ MSG_syslog(LOG_INFO, "<%s> %d new of %d total messages\n",
+ CCC->room.QRname,
+ new_messages, total_messages
+ );
- CC->curr_view = (int)vbuf.v_view;
+ CCC->curr_view = (int)vbuf.v_view;
if (display_result) {
- cprintf("%d%c%s|%d|%d|%d|%d|%ld|%ld|%d|%d|%d|%d|%d|%d|%d|%d|\n",
+ cprintf("%d%c%s|%d|%d|%d|%d|%ld|%ld|%d|%d|%d|%d|%d|%d|%d|%d|%ld|\n",
CIT_OK, CtdlCheckExpress(),
truncated_roomname,
(int)new_messages,
(int)total_messages,
(int)info,
- (int)CC->room.QRflags,
- (long)CC->room.QRhighest,
+ (int)CCC->room.QRflags,
+ (long)CCC->room.QRhighest,
(long)vbuf.v_lastseen,
(int)rmailflag,
(int)raideflag,
(int)newmailcount,
- (int)CC->room.QRfloor,
+ (int)CCC->room.QRfloor,
(int)vbuf.v_view,
- (int)CC->room.QRdefaultview,
+ (int)CCC->room.QRdefaultview,
(int)is_trash,
- (int)CC->room.QRflags2
+ (int)CCC->room.QRflags2,
+ (long)CCC->room.QRmtime
);
}
}
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);
((ra & UA_KNOWN) == 0) &&
(CC->user.axlevel < AxAideU)
) {
- CtdlLogPrintf(CTDL_DEBUG, "Failed to acquire private room\n");
+ syslog(LOG_DEBUG, "Failed to acquire private room\n");
} else {
memcpy(&CC->room, &QRscratch,
sizeof(struct ctdlroom));
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");
}
/*
- * get room parameters (aide or room aide command)
+ * get room parameters (admin or room admin command)
*/
void cmd_getr(char *cmdbuf)
{
long owner = 0L;
char actual_old_name[ROOMNAMELEN];
- CtdlLogPrintf(CTDL_DEBUG, "CtdlRenameRoom(%s, %s, %d)\n",
+ syslog(LOG_DEBUG, "CtdlRenameRoom(%s, %s, %d)\n",
old_name, new_name, new_floor);
if (new_floor >= 0) {
lgetfloor(&flbuf, old_floor);
--flbuf.f_ref_count;
lputfloor(&flbuf, old_floor);
- CtdlLogPrintf(CTDL_DEBUG, "Reference count for floor %d is now %d\n", old_floor, flbuf.f_ref_count);
+ syslog(LOG_DEBUG, "Reference count for floor %d is now %d\n", old_floor, flbuf.f_ref_count);
lgetfloor(&flbuf, new_floor);
++flbuf.f_ref_count;
lputfloor(&flbuf, new_floor);
- CtdlLogPrintf(CTDL_DEBUG, "Reference count for floor %d is now %d\n", new_floor, flbuf.f_ref_count);
+ syslog(LOG_DEBUG, "Reference count for floor %d is now %d\n", new_floor, flbuf.f_ref_count);
}
/* ...and everybody say "YATTA!" */
/*
- * set room parameters (aide or room aide command)
+ * set room parameters (admin or room admin command)
*/
void cmd_setr(char *args)
{
mkdir(buf, 0755);
}
snprintf(buf, sizeof buf, "The room \"%s\" has been edited by %s.\n",
- CC->room.QRname, CC->curr_user);
+ CC->room.QRname,
+ (CC->logged_in ? CC->curr_user : "an administrator")
+ );
CtdlAideMessage(buf, "Room modification Message");
cprintf("%d Ok\n", CIT_OK);
}
/*
- * get the name of the room aide for this room
+ * get the name of the room admin for this room
*/
void cmd_geta(char *cmdbuf)
{
/*
- * set the room aide for this room
+ * set the room admin for this room
*/
void cmd_seta(char *new_ra)
{
if (post_notice == 1) {
if (!IsEmptyStr(usbuf.fullname))
snprintf(buf, sizeof buf,
- "%s is now the room aide for \"%s\".\n",
+ "%s is now the room admin for \"%s\".\n",
usbuf.fullname, CC->room.QRname);
else
snprintf(buf, sizeof buf,
- "There is now no room aide for \"%s\".\n",
+ "There is now no room admin for \"%s\".\n",
CC->room.QRname);
- CtdlAideMessage(buf, "Aide Room Modification");
+ CtdlAideMessage(buf, "Admin Room Modification");
}
cprintf("%d Ok\n", CIT_OK);
}
*/
void cmd_rinf(char *gargs)
{
- char filename[128];
+ char filename[PATH_MAX];
char buf[SIZ];
FILE *info_fp;
char old_name[ROOMNAMELEN];
static int seq = 0;
- CtdlLogPrintf(CTDL_NOTICE, "Scheduling room <%s> for deletion\n",
+ syslog(LOG_NOTICE, "Scheduling room <%s> for deletion\n",
qrbuf->QRname);
safestrncpy(old_name, qrbuf->QRname, sizeof old_name);
char filename[100];
/* TODO: filename magic? does this realy work? */
- CtdlLogPrintf(CTDL_NOTICE, "Deleting room <%s>\n", qrbuf->QRname);
+ syslog(LOG_NOTICE, "Deleting room <%s>\n", qrbuf->QRname);
/* Delete the info file */
assoc_file_name(filename, sizeof filename, qrbuf, ctdl_info_dir);
}
/*
- * For normal rooms, just check for aide or room aide status.
+ * For normal rooms, just check for admin or room admin status.
*/
return(is_room_aide());
}
/*
- * aide command: kill the current room
+ * admin command: kill the current room
*/
void cmd_kill(char *argbuf)
{
/* 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);
+ deleted_room_name,
+ (CC->logged_in ? CC->curr_user : "an administrator")
+ );
CtdlAideMessage(msg, "Room Purger Message");
cprintf("%d '%s' deleted.\n", CIT_OK, deleted_room_name);
} else {
struct floor flbuf;
visit vbuf;
- CtdlLogPrintf(CTDL_DEBUG, "CtdlCreateRoom(name=%s, type=%d, view=%d)\n",
+ syslog(LOG_DEBUG, "CtdlCreateRoom(name=%s, type=%d, view=%d)\n",
new_room_name, new_room_type, new_room_view);
if (CtdlGetRoom(&qrbuf, new_room_name) == 0) {
- CtdlLogPrintf(CTDL_DEBUG, "%s already exists.\n", new_room_name);
+ syslog(LOG_DEBUG, "%s already exists.\n", new_room_name);
return(0);
}
}
/* If the room is private, and the system administrator has elected
- * to automatically grant room aide privileges, do so now; otherwise,
- * set the room aide to undefined.
+ * to automatically grant room admin privileges, do so now.
*/
if ((qrbuf.QRflags & QR_PRIVATE) && (CREATAIDE == 1)) {
qrbuf.QRroomaide = CC->user.usernum;
- } else {
+ }
+ /* Blog owners automatically become room admins of their blogs.
+ * (In the future we will offer a site-wide configuration setting to suppress this behavior.)
+ */
+ else if (new_room_view == VIEW_BLOG) {
+ qrbuf.QRroomaide = CC->user.usernum;
+ }
+ /* Otherwise, set the room admin to undefined.
+ */
+ else {
qrbuf.QRroomaide = (-1L);
}
snprintf(notification_message, 1024,
"A new room called \"%s\" has been created by %s%s%s%s%s%s\n",
new_room_name,
- CC->user.fullname,
+ (CC->logged_in ? CC->curr_user : "an administrator"),
((newflags & QR_MAILBOX) ? " [personal]" : ""),
((newflags & QR_PRIVATE) ? " [private]" : ""),
((newflags & QR_GUESSNAME) ? " [hidden]" : ""),
return;
}
assoc_file_name(infofilename, sizeof infofilename, &CC->room, ctdl_info_dir);
- CtdlLogPrintf(CTDL_DEBUG, "opening\n");
+ syslog(LOG_DEBUG, "opening\n");
fp = fopen(infofilename, "w");
- CtdlLogPrintf(CTDL_DEBUG, "checking\n");
+ syslog(LOG_DEBUG, "checking\n");
if (fp == NULL) {
cprintf("%d Cannot open %s: %s\n",
ERROR + INTERNAL_ERROR, infofilename, strerror(errno));
int a;
struct floor flbuf;
- if (CtdlAccessCheck(ac_logged_in)) return;
+ if (CtdlAccessCheck(ac_logged_in_or_guest)) return;
cprintf("%d Known floors:\n", LISTING_FOLLOWS);
}
+
+/*
+ * cmd_stat() - return the modification time of the current room (maybe other things in the future)
+ */
+void cmd_stat(char *gargs)
+{
+ if (CtdlAccessCheck(ac_logged_in_or_guest)) return;
+ CtdlGetRoom(&CC->room, CC->room.QRname);
+ cprintf("%d %s|%ld|\n", CIT_OK, CC->room.QRname, CC->room.QRmtime);
+}
+
+
+
/*****************************************************************************/
/* MODULE INITIALIZATION STUFF */
/*****************************************************************************/
CTDL_MODULE_INIT(room_ops)
{
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.");
+ CtdlRegisterProtoHook(cmd_lrms, "LRMS", "List rooms");
+ CtdlRegisterProtoHook(cmd_lkra, "LKRA", "List all known rooms");
+ CtdlRegisterProtoHook(cmd_lkrn, "LKRN", "List known rooms with new messages");
+ CtdlRegisterProtoHook(cmd_lkro, "LKRO", "List known rooms without new messages");
+ CtdlRegisterProtoHook(cmd_lzrm, "LZRM", "List zapped rooms");
+ CtdlRegisterProtoHook(cmd_lprm, "LPRM", "List public rooms");
+ CtdlRegisterProtoHook(cmd_goto, "GOTO", "Goto a named room");
+ CtdlRegisterProtoHook(cmd_stat, "STAT", "Get mtime of the current room");
+ CtdlRegisterProtoHook(cmd_whok, "WHOK", "List users who know this room");
+ CtdlRegisterProtoHook(cmd_rdir, "RDIR", "List files in room directory");
+ CtdlRegisterProtoHook(cmd_getr, "GETR", "Get room parameters");
+ CtdlRegisterProtoHook(cmd_setr, "SETR", "Set room parameters");
+ CtdlRegisterProtoHook(cmd_geta, "GETA", "Get the room admin name");
+ CtdlRegisterProtoHook(cmd_seta, "SETA", "Set the room admin for this room");
+ CtdlRegisterProtoHook(cmd_rinf, "RINF", "Fetch room info file");
+ CtdlRegisterProtoHook(cmd_kill, "KILL", "Kill (delete) the current room");
+ CtdlRegisterProtoHook(cmd_cre8, "CRE8", "Create a new room");
+ CtdlRegisterProtoHook(cmd_einf, "EINF", "Enter info file for the current room");
+ CtdlRegisterProtoHook(cmd_lflr, "LFLR", "List all known floors");
+ CtdlRegisterProtoHook(cmd_cflr, "CFLR", "Create a new floor");
+ CtdlRegisterProtoHook(cmd_kflr, "KFLR", "Kill a floor");
+ CtdlRegisterProtoHook(cmd_eflr, "EFLR", "Edit a floor");
}
/* return our Subversion id for the Log */
return "room_ops";