]> code.citadel.org Git - citadel.git/blobdiff - citadel/serv_expire.c
* The size constant "256" which shows up everywhere as a buffer size has now
[citadel.git] / citadel / serv_expire.c
index 272e73f9474fe1da7ecee8331ed1faef8c5db644..2019d58613ced93ea6f0542cb7ee63407dea0d73 100644 (file)
@@ -1,9 +1,8 @@
 /*
- * serv_expire.c
+ * $Id$
  *
  * This module handles the expiry of old messages and the purging of old users.
  *
- * $Id$
  */
 
 
@@ -113,7 +112,7 @@ void DoPurgeMessages(struct quickroom *qrbuf, void *data) {
 
        time(&now);
        GetExpirePolicy(&epbuf, qrbuf);
-       
+
        /* If the room is set to never expire messages ... do nothing */
        if (epbuf.expire_mode == EXPIRE_NEXTLEVEL) return;
        if (epbuf.expire_mode == EXPIRE_MANUAL) return;
@@ -127,7 +126,7 @@ void DoPurgeMessages(struct quickroom *qrbuf, void *data) {
                num_msgs = cdbfr->len / sizeof(long);
                cdb_free(cdbfr);
        }
-       
+
        /* Nothing to do if there aren't any messages */
        if (num_msgs == 0) {
                end_critical_section(S_QUICKROOM);
@@ -173,7 +172,7 @@ void DoPurgeMessages(struct quickroom *qrbuf, void *data) {
        if (num_msgs > 0) {
                num_msgs = sort_msglist(msglist, num_msgs);
        }
-       
+
        cdb_store(CDB_MSGLISTS, &qrbuf->QRnumber, sizeof(long),
                msglist, (num_msgs * sizeof(long)) );
 
@@ -219,37 +218,37 @@ void DoPurgeRooms(struct quickroom *qrbuf, void *data) {
         * it.  Bypass any other rules.
         */
        if (qrbuf->QRflags & QR_MAILBOX) {
+               /* if user not found, do_purge will be 1 */
+               do_purge = 1;
                for (vuptr=ValidUserList; vuptr!=NULL; vuptr=vuptr->next) {
                        if (vuptr->vu_usernum == atol(qrbuf->QRname)) {
                                do_purge = 0;
-                               goto BYPASS;
                        }
                }
-               /* user not found */
-               do_purge = 1;
-               goto BYPASS;
        }
-
-       /* Any of these attributes render a room non-purgable */
-       if (qrbuf->QRflags & QR_PERMANENT) return;
-       if (qrbuf->QRflags & QR_DIRECTORY) return;
-       if (qrbuf->QRflags & QR_NETWORK) return;
-       if (is_noneditable(qrbuf)) return;
-
-       /* If we don't know the modification date, be safe and don't purge */
-       if (qrbuf->QRmtime <= (time_t)0) return;
-
-       /* If no room purge time is set, be safe and don't purge */
-       if (config.c_roompurge < 0) return;
-
-       /* Otherwise, check the date of last modification */
-       age = time(NULL) - (qrbuf->QRmtime);
-       purge_secs = (time_t)config.c_roompurge * (time_t)86400;
-       if (purge_secs <= (time_t)0) return;
-       lprintf(9, "<%s> is <%ld> seconds old\n", qrbuf->QRname, age);
-       if (age > purge_secs) do_purge = 1;
-
-BYPASS:        if (do_purge) {
+       else {
+               /* Any of these attributes render a room non-purgable */
+               if (qrbuf->QRflags & QR_PERMANENT) return;
+               if (qrbuf->QRflags & QR_DIRECTORY) return;
+               if (qrbuf->QRflags & QR_NETWORK) return;
+               if (!strcasecmp(qrbuf->QRname, SYSCONFIGROOM)) return;
+               if (is_noneditable(qrbuf)) return;
+
+               /* If we don't know the modification date, be safe and don't purge */
+               if (qrbuf->QRmtime <= (time_t)0) return;
+
+               /* If no room purge time is set, be safe and don't purge */
+               if (config.c_roompurge < 0) return;
+
+               /* Otherwise, check the date of last modification */
+               age = time(NULL) - (qrbuf->QRmtime);
+               purge_secs = (time_t)config.c_roompurge * (time_t)86400;
+               if (purge_secs <= (time_t)0) return;
+               lprintf(9, "<%s> is <%ld> seconds old\n", qrbuf->QRname, age);
+               if (age > purge_secs) do_purge = 1;
+       } /* !QR_MAILBOX */
+
+       if (do_purge) {
                pptr = (struct PurgeList *) mallok(sizeof(struct PurgeList));
                pptr->next = RoomPurgeList;
                strcpy(pptr->name, qrbuf->QRname);
@@ -257,7 +256,7 @@ BYPASS:     if (do_purge) {
        }
 
 }
-       
+
 
 
 int PurgeRooms(void) {
@@ -285,12 +284,12 @@ int PurgeRooms(void) {
        }
 
 
-       transcript = mallok(256);
+       transcript = mallok(SIZ);
        strcpy(transcript, "The following rooms have been auto-purged:\n");
 
        while (RoomPurgeList != NULL) {
                if (getroom(&qrbuf, RoomPurgeList->name) == 0) {
-                       transcript=reallok(transcript, strlen(transcript)+256);
+                       transcript=reallok(transcript, strlen(transcript)+SIZ);
                        sprintf(&transcript[strlen(transcript)], " %s\n",
                                qrbuf.QRname);
                        delete_room(&qrbuf);
@@ -315,6 +314,17 @@ void do_user_purge(struct usersupp *us, void *data) {
        time_t purge_time;
        struct PurgeList *pptr;
 
+       /* stupid recovery routine to re-create missing mailboxen.
+        * don't enable this.
+       struct quickroom qrbuf;
+       char mailboxname[ROOMNAMELEN];
+       MailboxName(mailboxname, us, MAILROOM);
+       create_room(mailboxname, 4, "", 0);
+       if (getroom(&qrbuf, mailboxname) != 0) return;
+       lprintf(9, "Got %s\n", qrbuf.QRname);
+        */
+
+
        /* Set purge time; if the user overrides the system default, use it */
        if (us->USuserpurge > 0) {
                purge_time = ((time_t)us->USuserpurge) * 86400L;
@@ -373,11 +383,11 @@ int PurgeUsers(void) {
                ForEachUser(do_user_purge, NULL);
        }
 
-       transcript = mallok(256);
+       transcript = mallok(SIZ);
        strcpy(transcript, "The following users have been auto-purged:\n");
 
        while (UserPurgeList != NULL) {
-               transcript=reallok(transcript, strlen(transcript)+256);
+               transcript=reallok(transcript, strlen(transcript)+SIZ);
                sprintf(&transcript[strlen(transcript)], " %s\n",
                        UserPurgeList->name);
                purge_user(UserPurgeList->name);
@@ -489,26 +499,16 @@ int PurgeVisits(void) {
                VisitPurgeList = vptr;
                ++purged;
        }
-       
+
        return(purged);
 }
 
 
 void cmd_expi(char *argbuf) {
-       char cmd[256];
+       char cmd[SIZ];
        int retval;
 
-
-       if ((!(CC->logged_in))&&(!(CC->internal_pgm))) {
-               cprintf("%d Not logged in.\n",ERROR+NOT_LOGGED_IN);
-               return;
-       }
-
-       if ((!is_room_aide()) && (!(CC->internal_pgm)) ) {
-               cprintf("%d Higher access required.\n",
-                       ERROR+HIGHER_ACCESS_REQUIRED);
-               return;
-       }
+       if (CtdlAccessCheck(ac_aide)) return;
 
        extract(cmd, argbuf, 0);
        if (!strcasecmp(cmd, "users")) {
@@ -543,7 +543,7 @@ void cmd_expi(char *argbuf) {
 /*****************************************************************************/
 
 
-void do_fsck_msg(long msgnum) {
+void do_fsck_msg(long msgnum, void *userdata) {
        struct roomref *ptr;
 
        ptr = (struct roomref *)mallok(sizeof(struct roomref));
@@ -555,7 +555,8 @@ void do_fsck_msg(long msgnum) {
 void do_fsck_room(struct quickroom *qrbuf, void *data)
 {
        getroom(&CC->quickroom, qrbuf->QRname);
-       CtdlForEachMessage(MSGS_ALL, 0L, NULL, NULL, do_fsck_msg);
+       CtdlForEachMessage(MSGS_ALL, 0L, (-127), NULL, NULL,
+               do_fsck_msg, NULL);
 }
 
 /*
@@ -568,11 +569,7 @@ void cmd_fsck(char *argbuf) {
        struct roomref *ptr;
        int realcount;
 
-       if ( (!CC->logged_in) || (CC->usersupp.axlevel < 6) ) {
-               cprintf("%d Higher access required\n",
-                       ERROR+HIGHER_ACCESS_REQUIRED);
-               return;
-       }
+       if (CtdlAccessCheck(ac_aide)) return;
 
        /* Lame way of checking whether anyone else is doing this now */
        if (rr != NULL) {