Logging: log the number of messages in room with the message-syslog domain
[citadel.git] / citadel / room_ops.c
index 30b14ae3caa84eb6b73cecbe672fb9dd6036cb59..408196c91873395d01406c872690d910b44a31df 100644 (file)
@@ -111,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;
        }
 
@@ -124,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) {
@@ -134,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;
                }
@@ -160,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;
@@ -175,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;
                }
@@ -196,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;
                }
@@ -222,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;
        }
 
@@ -912,6 +923,7 @@ void cmd_lzrm(char *argbuf)
 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;
@@ -937,20 +949,20 @@ void CtdlUserGoto(char *where, int display_result, int transiently,
         * 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;
@@ -958,7 +970,7 @@ void CtdlUserGoto(char *where, int display_result, int transiently,
        
        /* 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);
 
@@ -966,11 +978,11 @@ void CtdlUserGoto(char *where, int display_result, int transiently,
        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 */
@@ -1011,20 +1023,20 @@ void CtdlUserGoto(char *where, int display_result, int transiently,
 
        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);
        }
 
@@ -1034,12 +1046,12 @@ void CtdlUserGoto(char *where, int display_result, int transiently,
 
        if (retmsgs != NULL) *retmsgs = total_messages;
        if (retnew != NULL) *retnew = new_messages;
-       syslog(LOG_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",
@@ -1048,17 +1060,17 @@ void CtdlUserGoto(char *where, int display_result, int transiently,
                        (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
                );
        }
 }
@@ -1597,7 +1609,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);
 }
@@ -1842,7 +1856,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 {
@@ -1903,12 +1919,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);
        }
 
@@ -2052,7 +2076,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]" : ""),