When changes are made via the admin socket, post Aide messages indicating that the...
[citadel.git] / citadel / room_ops.c
index 91fca856b2412078ab020815170d80ba33ceeb52..c9e651b155ab9d2f8a81a9f49caba3e07cdef84a 100644 (file)
@@ -1,6 +1,21 @@
 /* 
  * 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"
@@ -96,8 +111,9 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf,
        }
 
        /* 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;
        }
 
@@ -109,8 +125,9 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf,
        }
 
        /* 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) {
@@ -119,8 +136,9 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf,
                /* 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;
                }
@@ -128,7 +146,7 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf,
 
        /* 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;
                }
@@ -145,6 +163,7 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf,
                 * - 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;
@@ -160,6 +179,9 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf,
                        post_allowed = 0;
                        reply_allowed = 0;
                }
+               if (roombuf->QRdefaultview == VIEW_BLOG) {
+                       post_allowed = 0;
+               }
                if (post_allowed) {
                        retval = retval | UA_POSTALLOWED | UA_REPLYALLOWED;
                }
@@ -181,21 +203,24 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf,
        /* 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;
                }
@@ -207,15 +232,16 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf,
        /* 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;
        }
 
@@ -774,7 +800,7 @@ void cmd_lprm(char *argbuf)
        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");
@@ -1582,7 +1608,9 @@ 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);
 }
@@ -1827,7 +1855,9 @@ 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 {
@@ -1888,12 +1918,20 @@ unsigned CtdlCreateRoom(char *new_room_name,
        }
 
        /* 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);
        }
 
@@ -2037,7 +2075,7 @@ void cmd_cre8(char *args)
        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]" : ""),
@@ -2099,7 +2137,7 @@ void cmd_lflr(char *gargs)
        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);
 
@@ -2265,22 +2303,22 @@ CTDL_MODULE_INIT(room_ops)
                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";