/*
* Server functions which perform operations on room 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"
}
/* 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 | 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;
int reply_allowed = 1;
post_allowed = 0;
reply_allowed = 0;
}
+ if (roombuf->QRdefaultview == VIEW_BLOG) {
+ post_allowed = 0;
+ }
if (post_allowed) {
retval = retval | UA_POSTALLOWED | UA_REPLYALLOWED;
}
/* 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 & ~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 | 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) ) {
+ 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)
- ) {
+ if ( (userbuf->axlevel >= AxAideU)
+ || (userbuf->usernum == roombuf->QRroomaide)
+ ) {
retval = retval | UA_ADMINALLOWED | UA_DELETEALLOWED | UA_POSTALLOWED | UA_REPLYALLOWED;
}
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");
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);
}
/* 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 {
}
/* 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 aide privileges, do so now.
*/
if ((qrbuf.QRflags & QR_PRIVATE) && (CREATAIDE == 1)) {
qrbuf.QRroomaide = CC->user.usernum;
- } else {
+ }
+ /* Blog owners automatically become room aides 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 aide 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]" : ""),
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);
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", "Autoconverted. TODO: document me.");
+ CtdlRegisterProtoHook(cmd_lprm, "LPRM", "List public rooms");
CtdlRegisterProtoHook(cmd_goto, "GOTO", "Goto a named room");
CtdlRegisterProtoHook(cmd_whok, "WHOK", "List users who know this room");
CtdlRegisterProtoHook(cmd_rdir, "RDIR", "List files in room directory");
- 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_getr, "GETR", "Get room parameters");
+ CtdlRegisterProtoHook(cmd_setr, "SETR", "Set room parameters");
+ CtdlRegisterProtoHook(cmd_geta, "GETA", "Get the room aide name");
+ CtdlRegisterProtoHook(cmd_seta, "SETA", "Set the room aide 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", "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_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";