]> code.citadel.org Git - citadel.git/blobdiff - webcit/roomops.c
* Removed the last instance if is_room_aide
[citadel.git] / webcit / roomops.c
index 470b8cca8d4a45ba60f7b68435f628affafd1804..1ab8c8efa93c78d806753c139916f500ac048145 100644 (file)
@@ -16,6 +16,7 @@ char *viewdefs[9];                    /* the different kinds of available views */
  */
 
 void display_whok(void);
+int ConditionalHaveRoomeditRights(StrBuf *Target, WCTemplputParams *TP);
 
 /*
  * Initialize the viewdefs with localized strings
@@ -844,8 +845,9 @@ void ParseGoto(folder *room, StrBuf *Line)
        room->is_inbox = StrBufExtractNext_long(Line, &Pos, '|'); // is_mailbox
 
        flag = StrBufExtractNext_long(Line, &Pos, '|');
-       if (WCC->is_aide || flag)
+       if (WCC->is_aide || flag) {
                room->RAFlags |= UA_ADMINALLOWED;
+       }
 
        room->UsersNewMAilboxMessages = StrBufExtractNext_long(Line, &Pos, '|');
 
@@ -893,7 +895,7 @@ void ParseGoto(folder *room, StrBuf *Line)
        }
        /* get a pointer to the floor we're on: */
        GetHash(WCC->Floors, IKEY(room->floorid), &vFloor);
-       room->Floor = (const floor*) vFloor;
+       room->Floor = (const Floor*) vFloor;
 }
 
 
@@ -902,7 +904,7 @@ void ParseGoto(folder *room, StrBuf *Line)
  */
 void smart_goto(const StrBuf *next_room) {
        gotoroom(next_room);
-       readloop(readnew);
+       readloop(readnew, eUseDefault);
 }
 
 
@@ -1074,7 +1076,7 @@ void display_editroom(void)
        int i, j;
        char *tab;
        char *shared_with;
-       char *not_shared_with;
+       char *not_shared_with = NULL;
        int roompolicy = 0;
        int roomvalue = 0;
        int floorpolicy = 0;
@@ -1114,7 +1116,7 @@ void display_editroom(void)
        wc_printf("</td>\n");
        wc_printf("<td>&nbsp;</td>\n");
 
-       if ( (WC->axlevel >= 6) || (WC->is_room_aide) ) {
+       if ( ConditionalHaveRoomeditRights(NULL, NULL)) {
 
                wc_printf("<td class=\"");
                if (!strcmp(tab, "config")) {
@@ -1254,7 +1256,7 @@ void display_editroom(void)
                
                        wc_printf("<ul><li>");
                        wc_printf(_("Name of room: "));
-                       wc_printf("<input type=\"text\" NAME=\"er_name\" VALUE=\"%s\" MAXLENGTH=\"%d\">\n",
+                       wc_printf("<input type=\"text\" NAME=\"er_name\" VALUE=\"%s\" MAXLENGTH=\""ULONG_FMT"\">\n",
                                er_name,
                                (sizeof(er_name)-1)
                                );
@@ -1619,6 +1621,9 @@ void display_editroom(void)
                wc_printf("</div>");
        }
 
+       if (not_shared_with != NULL)
+               free (not_shared_with);
+
        /* Mailing list management */
        if (!strcmp(tab, "listserv")) {
                room_states RoomFlags;
@@ -2580,6 +2585,7 @@ void entroom(void)
        int er_floor;
        int er_num_type;
        int er_view;
+       wcsession *WCC = WC;
 
        if (!havebstr("ok_button")) {
                strcpy(WC->ImportantMessage,
@@ -2613,16 +2619,25 @@ void entroom(void)
 
        serv_getln(buf, sizeof buf);
        if (buf[0] != '2') {
-               strcpy(WC->ImportantMessage, &buf[4]);
+               strcpy(WCC->ImportantMessage, &buf[4]);
                display_main_menu();
                return;
        }
-       /** TODO: Room created, now udate the left hand icon bar for this user */
+       /** TODO: Room created, now update the left hand icon bar for this user */
        burn_folder_cache(0);   /* burn the old folder cache */
        
-       
        gotoroom(er_name);
-       do_change_view(er_view);                /* Now go there */
+
+       serv_printf("VIEW %d", er_view);
+       serv_getln(buf, sizeof buf);
+       WCC->CurRoom.view = er_view;
+
+       if ( (WCC != NULL) && ( (WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) )  {
+               display_editroom ();
+       } else {
+               do_change_view(er_view);                /* Now go there */
+       }
+
 }
 
 
@@ -3006,19 +3021,22 @@ void knrooms(void)
                set_preference("roomlistview", ListView, 1);
        }
        /** Sanitize the input so its safe */
-       if(!get_preference("roomlistview", &ListView) ||
+       if((get_preference("roomlistview", &ListView) != 0)||
           ((strcasecmp(ChrPtr(ListView), "folders") != 0) &&
            (strcasecmp(ChrPtr(ListView), "table") != 0))) 
        {
                if (ListView == NULL) {
                        ListView = NewStrBufPlain(HKEY("rooms"));
                        set_preference("roomlistview", ListView, 0);
+                       ListView = NULL;
                }
                else {
-                       StrBufPlain(ListView, HKEY("rooms"));
-                       save_preferences();
+                       ListView = NewStrBufPlain(HKEY("rooms"));
+                       set_preference("roomlistview", ListView, 0);
+                       ListView = NULL;
                }
        }
+       FreeStrBuf(&ListView);
        url_do_template();
 }
 
@@ -3063,7 +3081,7 @@ void _display_private(void) {
 
 void dotgoto(void) {
        if (!havebstr("room")) {
-               readloop(readnew);
+               readloop(readnew, eUseDefault);
                return;
        }
        if (WC->CurRoom.view != VIEW_MAILBOX) { /* dotgoto acts like dotskip when we're in a mailbox view */
@@ -3104,14 +3122,15 @@ void tmplput_ungoto(StrBuf *Target, WCTemplputParams *TP)
 int ConditionalRoomAide(StrBuf *Target, WCTemplputParams *TP)
 {
        wcsession *WCC = WC;
-       return (WCC != NULL)? (WCC->is_room_aide == 0) : 0;
+       return (WCC != NULL)? 
+               ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) : 0;
 }
 
 int ConditionalRoomAcessDelete(StrBuf *Target, WCTemplputParams *TP)
 {
        wcsession *WCC = WC;
        return (WCC == NULL)? 0 : 
-               ( (WCC->is_room_aide) || /////TODO!
+               ( ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) ||
                   (WCC->CurRoom.is_inbox) || 
                   (WCC->CurRoom.QRFlags2 & QR2_COLLABDEL) );
 }
@@ -3125,129 +3144,59 @@ int ConditionalHaveUngoto(StrBuf *Target, WCTemplputParams *TP)
                (strcasecmp(WCC->ugname, ChrPtr(WCC->CurRoom.name)) == 0));
 }
 
-int ConditionalRoomHas_QR_PERMANENT(StrBuf *Target, WCTemplputParams *TP)
+int ConditionalCurrentRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP)
 {
+       long QR_CheckFlag;
        wcsession *WCC = WC;
        
-       return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags & QR_PERMANENT) != 0));
-}
+       QR_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
+       if (QR_CheckFlag == 0)
+               LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
+                                "requires one of the #\"QR*\"- defines or an integer flag 0 is invalid!");
 
-int ConditionalRoomHas_QR_INUSE(StrBuf *Target, WCTemplputParams *TP)
-{
-       wcsession *WCC = WC;
-       
        return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags & QR_INUSE) != 0));
+               ((WCC->CurRoom.QRFlags & QR_CheckFlag) != 0));
 }
 
-int ConditionalRoomHas_QR_PRIVATE(StrBuf *Target, WCTemplputParams *TP)
+int ConditionalRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP)
 {
-       wcsession *WCC = WC;
-       
-       return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags & QR_PRIVATE) != 0));
-}
+       long QR_CheckFlag;
+       folder *Folder = (folder *)(TP->Context);
 
-int ConditionalRoomHas_QR_PASSWORDED(StrBuf *Target, WCTemplputParams *TP)
-{
-       wcsession *WCC = WC;
-       
-       return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags & QR_PASSWORDED) != 0));
+       QR_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
+       if (QR_CheckFlag == 0)
+               LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
+                                "requires one of the #\"QR*\"- defines or an integer flag 0 is invalid!");
+       return ((Folder->QRFlags & QR_CheckFlag) != 0);
 }
 
-int ConditionalRoomHas_QR_GUESSNAME(StrBuf *Target, WCTemplputParams *TP)
-{
-       wcsession *WCC = WC;
-       
-       return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags & QR_GUESSNAME) != 0));
-}
 
-int ConditionalRoomHas_QR_DIRECTORY(StrBuf *Target, WCTemplputParams *TP)
+int ConditionalCurrentRoomHas_QRFlag2(StrBuf *Target, WCTemplputParams *TP)
 {
+       long QR2_CheckFlag;
        wcsession *WCC = WC;
        
-       return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags & QR_DIRECTORY) != 0));
-}
+       QR2_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
+       if (QR2_CheckFlag == 0)
+               LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
+                                "requires one of the #\"QR2*\"- defines or an integer flag 0 is invalid!");
 
-int ConditionalRoomHas_QR_UPLOAD(StrBuf *Target, WCTemplputParams *TP)
-{
-       wcsession *WCC = WC;
-       
        return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags & QR_UPLOAD) != 0));
+               ((WCC->CurRoom.QRFlags2 & QR2_CheckFlag) != 0));
 }
 
-int ConditionalRoomHas_QR_DOWNLOAD(StrBuf *Target, WCTemplputParams *TP)
+int ConditionalRoomHas_QRFlag2(StrBuf *Target, WCTemplputParams *TP)
 {
-       wcsession *WCC = WC;
-       
-       return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags & QR_DOWNLOAD) != 0));
-}
+       long QR2_CheckFlag;
+       folder *Folder = (folder *)(TP->Context);
 
-int ConditionalRoomHas_QR_VISDIR(StrBuf *Target, WCTemplputParams *TP)
-{
-       wcsession *WCC = WC;
-       
-       return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags & QR_VISDIR) != 0));
+       QR2_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
+       if (QR2_CheckFlag == 0)
+               LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
+                                "requires one of the #\"QR2*\"- defines or an integer flag 0 is invalid!");
+       return ((Folder->QRFlags2 & QR2_CheckFlag) != 0);
 }
 
-int ConditionalRoomHas_QR_ANONONLY(StrBuf *Target, WCTemplputParams *TP)
-{
-       wcsession *WCC = WC;
-       
-       return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags & QR_ANONONLY) != 0));
-}
-
-int ConditionalRoomHas_QR_ANONOPT(StrBuf *Target, WCTemplputParams *TP)
-{
-       wcsession *WCC = WC;
-       
-       return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags & QR_ANONOPT) != 0));
-}
-
-int ConditionalRoomHas_QR_NETWORK(StrBuf *Target, WCTemplputParams *TP)
-{
-       wcsession *WCC = WC;
-       
-       return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags & QR_NETWORK) != 0));
-}
-
-int ConditionalRoomHas_QR_PREFONLY(StrBuf *Target, WCTemplputParams *TP)
-{
-       wcsession *WCC = WC;
-       
-       return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags & QR_PREFONLY) != 0));
-}
-
-int ConditionalRoomHas_QR_READONLY(StrBuf *Target, WCTemplputParams *TP)
-{
-       wcsession *WCC = WC;
-       
-       return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags & QR_READONLY) != 0));
-}
-
-int ConditionalRoomHas_QR_MAILBOX(StrBuf *Target, WCTemplputParams *TP)
-{
-       wcsession *WCC = WC;
-       
-       return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags & QR_MAILBOX) != 0));
-}
-
-
-
-
 
 int ConditionalHaveRoomeditRights(StrBuf *Target, WCTemplputParams *TP)
 {
@@ -3255,7 +3204,7 @@ int ConditionalHaveRoomeditRights(StrBuf *Target, WCTemplputParams *TP)
 
        return ( (WCC!= NULL) && 
                 ((WCC->axlevel >= 6) || 
-                 (WCC->is_room_aide) || 
+                 ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) ||
                  (WCC->CurRoom.is_inbox) ));
 }
 
@@ -3264,33 +3213,9 @@ int ConditionalIsRoomtype(StrBuf *Target, WCTemplputParams *TP)
        wcsession *WCC = WC;
 
        if ((WCC == NULL) ||
-           (TP->Tokens->nParameters < 3) ||
-           (TP->Tokens->Params[2]->Type != TYPE_STR)||
-           (TP->Tokens->Params[2]->len < 7))
-               return 0;
-
-       switch(WCC->CurRoom.view) {
-       case VIEW_BBS:
-               return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_BBS"));
-       case VIEW_MAILBOX:
-               return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_MAILBOX"));
-       case VIEW_ADDRESSBOOK:
-               return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_ADDRESSBOOK"));
-       case VIEW_TASKS:
-               return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_TASKS"));
-       case VIEW_NOTES:
-               return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_NOTES"));
-       case VIEW_WIKI:
-               return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_WIKI"));
-       case VIEW_JOURNAL:
-               return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_JOURNAL"));
-       case VIEW_CALENDAR:
-               return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_CALENDAR"));
-       case VIEW_CALBRIEF:
-               return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_CALBRIEF"));
-       default:
+           (TP->Tokens->nParameters < 3))
                return 0;
-       }
+       return WCC->CurRoom.view == GetTemplateTokenNumber(Target, TP, 2, VIEW_BBS);
 }
 
 void 
@@ -3327,21 +3252,77 @@ InitModule_ROOMOPS
        RegisterNamespace("ROOMBANNER", 0, 1, tmplput_roombanner, NULL, CTX_NONE);
 
        RegisterConditional(HKEY("COND:ROOM:TYPE_IS"), 0, ConditionalIsRoomtype, CTX_NONE);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_PERMANENT"), 0, ConditionalRoomHas_QR_PERMANENT, CTX_NONE);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_INUSE"), 0, ConditionalRoomHas_QR_INUSE, CTX_NONE);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_PRIVATE"), 0, ConditionalRoomHas_QR_PRIVATE, CTX_NONE);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_PASSWORDED"), 0, ConditionalRoomHas_QR_PASSWORDED, CTX_NONE);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_GUESSNAME"), 0, ConditionalRoomHas_QR_GUESSNAME, CTX_NONE);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_DIRECTORY"), 0, ConditionalRoomHas_QR_DIRECTORY, CTX_NONE);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_UPLOAD"), 0, ConditionalRoomHas_QR_UPLOAD, CTX_NONE);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_DOWNLOAD"), 0, ConditionalRoomHas_QR_DOWNLOAD, CTX_NONE);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_VISIDIR"), 0, ConditionalRoomHas_QR_VISDIR, CTX_NONE);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_ANONONLY"), 0, ConditionalRoomHas_QR_ANONONLY, CTX_NONE);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_ANONOPT"), 0, ConditionalRoomHas_QR_ANONOPT, CTX_NONE);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_NETWORK"), 0, ConditionalRoomHas_QR_NETWORK, CTX_NONE);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_PREFONLY"), 0, ConditionalRoomHas_QR_PREFONLY, CTX_NONE);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_READONLY"), 0, ConditionalRoomHas_QR_READONLY, CTX_NONE);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_MAILBOX"), 0, ConditionalRoomHas_QR_MAILBOX, CTX_NONE);
+       RegisterConditional(HKEY("COND:THISROOM:FLAG:QR"), 0, ConditionalCurrentRoomHas_QRFlag, CTX_NONE);
+       RegisterConditional(HKEY("COND:ROOM:FLAG:QR"), 0, ConditionalRoomHas_QRFlag, CTX_ROOMS);
+
+       RegisterConditional(HKEY("COND:THISROOM:FLAG:QR2"), 0, ConditionalCurrentRoomHas_QRFlag2, CTX_NONE);
+       RegisterConditional(HKEY("COND:ROOM:FLAG:QR2"), 0, ConditionalRoomHas_QRFlag2, CTX_ROOMS);
+
+       REGISTERTokenParamDefine(QR_PERMANENT);
+       REGISTERTokenParamDefine(QR_INUSE);
+       REGISTERTokenParamDefine(QR_PRIVATE);
+       REGISTERTokenParamDefine(QR_PASSWORDED);
+       REGISTERTokenParamDefine(QR_GUESSNAME);
+       REGISTERTokenParamDefine(QR_DIRECTORY);
+       REGISTERTokenParamDefine(QR_UPLOAD);
+       REGISTERTokenParamDefine(QR_DOWNLOAD);
+       REGISTERTokenParamDefine(QR_VISDIR);
+       REGISTERTokenParamDefine(QR_ANONONLY);
+       REGISTERTokenParamDefine(QR_ANONOPT);
+       REGISTERTokenParamDefine(QR_NETWORK);
+       REGISTERTokenParamDefine(QR_PREFONLY);
+       REGISTERTokenParamDefine(QR_READONLY);
+       REGISTERTokenParamDefine(QR_MAILBOX);
+       REGISTERTokenParamDefine(QR2_SYSTEM);
+       REGISTERTokenParamDefine(QR2_SELFLIST);
+       REGISTERTokenParamDefine(QR2_COLLABDEL);
+       REGISTERTokenParamDefine(QR2_SUBJECTREQ);
+       REGISTERTokenParamDefine(QR2_SMTP_PUBLIC);
+       REGISTERTokenParamDefine(QR2_MODERATED);
+
+       REGISTERTokenParamDefine(UA_KNOWN);
+       REGISTERTokenParamDefine(UA_GOTOALLOWED);
+       REGISTERTokenParamDefine(UA_HASNEWMSGS);
+       REGISTERTokenParamDefine(UA_ZAPPED);
+       REGISTERTokenParamDefine(UA_POSTALLOWED);
+       REGISTERTokenParamDefine(UA_ADMINALLOWED);
+       REGISTERTokenParamDefine(UA_DELETEALLOWED);
+       REGISTERTokenParamDefine(UA_ISTRASH);
+
+       REGISTERTokenParamDefine(US_NEEDVALID);
+       REGISTERTokenParamDefine(US_PERM);
+       REGISTERTokenParamDefine(US_LASTOLD);
+       REGISTERTokenParamDefine(US_EXPERT);
+       REGISTERTokenParamDefine(US_UNLISTED);
+       REGISTERTokenParamDefine(US_NOPROMPT);
+       REGISTERTokenParamDefine(US_PROMPTCTL);
+       REGISTERTokenParamDefine(US_DISAPPEAR);
+       REGISTERTokenParamDefine(US_REGIS);
+       REGISTERTokenParamDefine(US_PAGINATOR);
+       REGISTERTokenParamDefine(US_INTERNET);
+       REGISTERTokenParamDefine(US_FLOORS);
+       REGISTERTokenParamDefine(US_COLOR);
+       REGISTERTokenParamDefine(US_USER_SET);
+
+       REGISTERTokenParamDefine(VIEW_BBS);
+       REGISTERTokenParamDefine(VIEW_MAILBOX); 
+       REGISTERTokenParamDefine(VIEW_ADDRESSBOOK);
+       REGISTERTokenParamDefine(VIEW_CALENDAR);        
+       REGISTERTokenParamDefine(VIEW_TASKS);   
+       REGISTERTokenParamDefine(VIEW_NOTES);           
+       REGISTERTokenParamDefine(VIEW_WIKI);            
+       REGISTERTokenParamDefine(VIEW_CALBRIEF);
+       REGISTERTokenParamDefine(VIEW_JOURNAL);
+       REGISTERTokenParamDefine(VIEW_BLOG);
+
+
+       REGISTERTokenParamDefine(ignet_push_share);
+       REGISTERTokenParamDefine(listrecp);
+       REGISTERTokenParamDefine(digestrecp);
+       REGISTERTokenParamDefine(pop3client);
+       REGISTERTokenParamDefine(rssclient);
+       REGISTERTokenParamDefine(participate);
+
        RegisterConditional(HKEY("COND:ROOMAIDE"), 2, ConditionalRoomAide, CTX_NONE);
        RegisterConditional(HKEY("COND:ACCESS:DELETE"), 2, ConditionalRoomAcessDelete, CTX_NONE);