]> code.citadel.org Git - citadel.git/blobdiff - citadel/room_ops.c
* strlen holy war: loops. in loops it's very evil. the easy ones go away now.
[citadel.git] / citadel / room_ops.c
index 8174dc97833b485950a786a05e1fbf3d99ed2b34..fb3229a347cd08ec265cc8d7569532c0d532bc6a 100644 (file)
@@ -28,7 +28,6 @@
 #include <errno.h>
 #include "citadel.h"
 #include "server.h"
-#include "serv_extensions.h"
 #include "database.h"
 #include "config.h"
 #include "room_ops.h"
@@ -44,7 +43,7 @@
 struct floor *floorcache[MAXFLOORS];
 
 /*
- * Generic routine for determining user access to rooms
+ * Retrieve access control information for any user/room pair
  */
 void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf,
                int *result, int *view)
@@ -131,6 +130,15 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf,
                        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 (retval & UA_POSTALLOWED) {
+                               retval = retval | UA_DELETEALLOWED;
+                       }
+               }
+
        }
 
        /* Check to see if the user has forgotten this room */
@@ -272,19 +280,27 @@ int lgetroom(struct ctdlroom *qrbuf, char *room_name)
 void b_putroom(struct ctdlroom *qrbuf, char *room_name)
 {
        char lowercase_name[ROOMNAMELEN];
-       int a;
+       char *aptr, *bptr;
+       long len;
 
-       for (a = 0; a <= strlen(room_name); ++a) {
-               lowercase_name[a] = tolower(room_name[a]);
+       aptr = room_name;
+       bptr = lowercase_name;
+       while (!IsEmptyStr(aptr))
+       {
+               *bptr = tolower(*aptr);
+               aptr++;
+               bptr++;
        }
+       *bptr='\0';
 
+       len = bptr - lowercase_name;
        if (qrbuf == NULL) {
                cdb_delete(CDB_ROOMS,
-                          lowercase_name, strlen(lowercase_name));
+                          lowercase_name, len);
        } else {
                time(&qrbuf->QRmtime);
                cdb_store(CDB_ROOMS,
-                         lowercase_name, strlen(lowercase_name),
+                         lowercase_name, len,
                          qrbuf, sizeof(struct ctdlroom));
        }
 }
@@ -580,7 +596,7 @@ void cmd_lrms_backend(struct ctdlroom *qrbuf, void *data)
 void cmd_lrms(char *argbuf)
 {
        int FloorBeingSearched = (-1);
-       if (strlen(argbuf) > 0)
+       if (!IsEmptyStr(argbuf))
                FloorBeingSearched = extract_int(argbuf, 0);
 
        if (CtdlAccessCheck(ac_logged_in)) return;
@@ -618,7 +634,7 @@ void cmd_lkra_backend(struct ctdlroom *qrbuf, void *data)
 void cmd_lkra(char *argbuf)
 {
        int FloorBeingSearched = (-1);
-       if (strlen(argbuf) > 0)
+       if (!IsEmptyStr(argbuf))
                FloorBeingSearched = extract_int(argbuf, 0);
 
        if (CtdlAccessCheck(ac_logged_in)) return;
@@ -654,7 +670,7 @@ void cmd_lprm_backend(struct ctdlroom *qrbuf, void *data)
 void cmd_lprm(char *argbuf)
 {
        int FloorBeingSearched = (-1);
-       if (strlen(argbuf) > 0)
+       if (!IsEmptyStr(argbuf))
                FloorBeingSearched = extract_int(argbuf, 0);
 
        cprintf("%d Publiic rooms:\n", LISTING_FOLLOWS);
@@ -687,7 +703,7 @@ void cmd_lkrn_backend(struct ctdlroom *qrbuf, void *data)
 void cmd_lkrn(char *argbuf)
 {
        int FloorBeingSearched = (-1);
-       if (strlen(argbuf) > 0)
+       if (!IsEmptyStr(argbuf))
                FloorBeingSearched = extract_int(argbuf, 0);
 
        if (CtdlAccessCheck(ac_logged_in)) return;
@@ -726,7 +742,7 @@ void cmd_lkro_backend(struct ctdlroom *qrbuf, void *data)
 void cmd_lkro(char *argbuf)
 {
        int FloorBeingSearched = (-1);
-       if (strlen(argbuf) > 0)
+       if (!IsEmptyStr(argbuf))
                FloorBeingSearched = extract_int(argbuf, 0);
 
        if (CtdlAccessCheck(ac_logged_in)) return;
@@ -765,7 +781,7 @@ void cmd_lzrm_backend(struct ctdlroom *qrbuf, void *data)
 void cmd_lzrm(char *argbuf)
 {
        int FloorBeingSearched = (-1);
-       if (strlen(argbuf) > 0)
+       if (!IsEmptyStr(argbuf))
                FloorBeingSearched = extract_int(argbuf, 0);
 
        if (CtdlAccessCheck(ac_logged_in)) return;
@@ -919,7 +935,7 @@ void usergoto(char *where, int display_result, int transiently,
        CC->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|\n",
+               cprintf("%d%c%s|%d|%d|%d|%d|%ld|%ld|%d|%d|%d|%d|%d|%d|%d|%d|\n",
                        CIT_OK, CtdlCheckExpress(),
                        truncated_roomname,
                        (int)new_messages,
@@ -934,7 +950,8 @@ void usergoto(char *where, int display_result, int transiently,
                        (int)CC->room.QRfloor,
                        (int)vbuf.v_view,
                        (int)CC->room.QRdefaultview,
-                       (int)is_trash
+                       (int)is_trash,
+                       (int)CC->room.QRflags2
                );
        }
 }
@@ -1149,7 +1166,7 @@ void cmd_rdir(void)
                        safestrncpy(comment, "", sizeof comment);
                        fseek(fd, 0L, 0);
                        while ((fgets(buf, sizeof buf, fd) != NULL)
-                              && (strlen(comment) == 0)) {
+                              && (IsEmptyStr(comment))) {
                                buf[strlen(buf) - 1] = 0;
                                if ((!strncasecmp(buf, flnm, strlen(flnm)))
                                    && (buf[strlen(flnm)] == ' '))
@@ -1511,7 +1528,7 @@ void cmd_seta(char *new_ra)
         * the room table, otherwise it would deadlock!
         */
        if (post_notice == 1) {
-               if (strlen(usbuf.fullname) > 0)
+               if (!IsEmptyStr(usbuf.fullname))
                        snprintf(buf, sizeof buf,
                                "%s is now the room aide for \"%s\".\n",
                                usbuf.fullname, CC->room.QRname);
@@ -1542,7 +1559,7 @@ void cmd_rinf(void)
        }
        cprintf("%d Info:\n", LISTING_FOLLOWS);
        while (fgets(buf, sizeof buf, info_fp) != NULL) {
-               if (strlen(buf) > 0)
+               if (!IsEmptyStr(buf))
                        buf[strlen(buf) - 1] = 0;
                cprintf("%s\n", buf);
        }
@@ -1746,8 +1763,10 @@ unsigned create_room(char *new_room_name,
                qrbuf.QRflags = (qrbuf.QRflags | QR_GUESSNAME);
        if (new_room_type == 2)
                qrbuf.QRflags = (qrbuf.QRflags | QR_PASSWORDED);
-       if ( (new_room_type == 4) || (new_room_type == 5) )
+       if ( (new_room_type == 4) || (new_room_type == 5) ) {
                qrbuf.QRflags = (qrbuf.QRflags | QR_MAILBOX);
+               /* qrbuf.QRflags2 |= QR2_SUBJECTREQ; */
+       }
 
        /* If the user is requesting a personal room, set up the room
         * name accordingly (prepend the user number)
@@ -1830,7 +1849,7 @@ void cmd_cre8(char *args)
        new_room_pass[9] = 0;
        new_room_floor = 0;
 
-       if ((strlen(new_room_name) == 0) && (cre8_ok == 1)) {
+       if ((IsEmptyStr(new_room_name)) && (cre8_ok == 1)) {
                cprintf("%d Invalid room name.\n", ERROR + ILLEGAL_VALUE);
                return;
        }
@@ -1865,7 +1884,7 @@ void cmd_cre8(char *args)
                return;
        }
 
-       if ((strlen(new_room_name) == 0) && (cre8_ok == 0)) {
+       if ((IsEmptyStr(new_room_name)) && (cre8_ok == 0)) {
                cprintf("%d Ok to create rooms.\n", CIT_OK);
                return;
        }
@@ -2005,7 +2024,7 @@ void cmd_cflr(char *argbuf)
 
        if (CtdlAccessCheck(ac_aide)) return;
 
-       if (strlen(new_floor_name) == 0) {
+       if (IsEmptyStr(new_floor_name)) {
                cprintf("%d Blank floor name not allowed.\n",
                        ERROR + ILLEGAL_VALUE);
                return;