]> code.citadel.org Git - citadel.git/blobdiff - citadel/imap_misc.c
* Use syslog-compatible logging levels in lprintf(); the loglevel chosen
[citadel.git] / citadel / imap_misc.c
index b5b42d60c6a9d0f624a8dd628dea3f3a463e7b58..f1b9771841faa61545edab2c42bf4bcb716ebf58 100644 (file)
@@ -36,7 +36,7 @@
 #include "citserver.h"
 #include "support.h"
 #include "config.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
@@ -68,7 +68,7 @@ int imap_do_copy(char *destination_folder) {
 
        if (IMAP->num_msgs > 0) {
                for (i = 0; i < IMAP->num_msgs; ++i) {
-                       if (IMAP->flags[i] && IMAP_SELECTED) {
+                       if (IMAP->flags[i] & IMAP_SELECTED) {
                                CtdlCopyMsgToRoom(
                                        IMAP->msgids[i], roomname);
                        }
@@ -140,8 +140,10 @@ void imap_uidcopy(int num_parms, char *parms[]) {
 void imap_print_express_messages(void) {
        struct ExpressMessage *ptr, *holdptr;
        char *dumpomatic = NULL;
+       char tmp[SIZ];
        int i;
        size_t size, size2;
+       struct tm *stamp;
 
        if (CC->FirstExpressMessage == NULL) {
                return;
@@ -152,6 +154,7 @@ void imap_print_express_messages(void) {
        end_critical_section(S_SESSION_TABLE);
 
        while (ptr != NULL) {
+               stamp = localtime(&(ptr->timestamp));
                size = strlen(ptr->text) + SIZ;
                dumpomatic = mallok(size);
                strcpy(dumpomatic, "");
@@ -164,9 +167,23 @@ void imap_print_express_messages(void) {
                else
                        strcat(dumpomatic, "Message ");
 
+               /* Timestamp.  Can this be improved? */
+               if (stamp->tm_hour == 0 || stamp->tm_hour == 12)
+                       sprintf(tmp, "at 12:%02d%cm",
+                               stamp->tm_min, 
+                               stamp->tm_hour ? 'p' : 'a');
+               else if (stamp->tm_hour > 12)           /* pm */
+                       sprintf(tmp, "at %d:%02dpm",
+                               stamp->tm_hour - 12,
+                               stamp->tm_min);
+               else                                    /* am */
+                       sprintf(tmp, "at %d:%02dam",
+                               stamp->tm_hour, stamp->tm_min);
+               strcat(dumpomatic, tmp);
+
                size2 = strlen(dumpomatic);
                snprintf(&dumpomatic[size2], size - size2,
-                       "from %s:\n", ptr->sender);
+                       " from %s:\n", ptr->sender);
                if (ptr->text != NULL)
                        strcat(dumpomatic, ptr->text);
 
@@ -200,6 +217,7 @@ void imap_append(int num_parms, char *parms[]) {
        char buf[SIZ];
        char savedroom[ROOMNAMELEN];
        int msgs, new;
+       int i;
 
 
        if (num_parms < 4) {
@@ -236,24 +254,21 @@ void imap_append(int num_parms, char *parms[]) {
                return;
        }
 
-       lprintf(9, "Converting message...\n");
+       /* Convert RFC822 newlines (CRLF) to Unix newlines (LF) */
+       lprintf(CTDL_DEBUG, "Converting newline format\n");
+       for (i=0; i<literal_length; ++i) {
+               if (!strncmp(&IMAP->transmitted_message[i], "\r\n", 2)) {
+                       strcpy(&IMAP->transmitted_message[i],
+                               &IMAP->transmitted_message[i+1]);
+                       --literal_length;
+               }
+       }
+
+       lprintf(CTDL_DEBUG, "Converting message format\n");
         msg = convert_internet_message(IMAP->transmitted_message);
        IMAP->transmitted_message = NULL;
        IMAP->transmitted_length = 0;
 
-        /* If the user is locally authenticated, FORCE the From: header to
-         * show up as the real sender.  FIXME do we really want to do this?
-        * Probably should make it site-definable or even room-definable.
-         */
-        if (CC->logged_in) {
-                if (msg->cm_fields['A'] != NULL) phree(msg->cm_fields['A']);
-                if (msg->cm_fields['N'] != NULL) phree(msg->cm_fields['N']);
-                if (msg->cm_fields['H'] != NULL) phree(msg->cm_fields['H']);
-                msg->cm_fields['A'] = strdoop(CC->usersupp.fullname);
-                msg->cm_fields['N'] = strdoop(config.c_nodename);
-                msg->cm_fields['H'] = strdoop(config.c_humannode);
-        }
-
        ret = imap_grabroom(roomname, parms[2]);
        if (ret != 0) {
                cprintf("%s NO Invalid mailbox name or location, or access denied\r\n",
@@ -266,14 +281,32 @@ void imap_append(int num_parms, char *parms[]) {
         * folder is selected, save its name so we can return there!!!!!)
         */
        if (IMAP->selected) {
-               strcpy(savedroom, CC->quickroom.QRname);
+               strcpy(savedroom, CC->room.QRname);
        }
-       usergoto(roomname, 0, &msgs, &new);
+       usergoto(roomname, 0, 0, &msgs, &new);
+
+        /* If the user is locally authenticated, FORCE the From: header to
+         * show up as the real sender.  FIXME do we really want to do this?
+        * Probably should make it site-definable or even room-definable.
+        *
+        * For now, we allow "forgeries" if the room is one of the user's
+        * private mailboxes.
+         */
+        if (CC->logged_in) {
+          if ( (CC->room.QRflags & QR_MAILBOX) == 0) {
+                if (msg->cm_fields['A'] != NULL) phree(msg->cm_fields['A']);
+                if (msg->cm_fields['N'] != NULL) phree(msg->cm_fields['N']);
+                if (msg->cm_fields['H'] != NULL) phree(msg->cm_fields['H']);
+                msg->cm_fields['A'] = strdoop(CC->user.fullname);
+                msg->cm_fields['N'] = strdoop(config.c_nodename);
+                msg->cm_fields['H'] = strdoop(config.c_humannode);
+           }
+        }
 
        /* 
         * Can we post here?
         */
-       ret = CtdlDoIHavePermissionToPostInThisRoom(buf);
+       ret = CtdlDoIHavePermissionToPostInThisRoom(buf, sizeof buf);
 
        if (ret) {
                /* Nope ... print an error message */
@@ -295,7 +328,7 @@ void imap_append(int num_parms, char *parms[]) {
         * our happy day without violent explosions.
         */
        if (IMAP->selected) {
-               usergoto(savedroom, 0, &msgs, &new);
+               usergoto(savedroom, 0, 0, &msgs, &new);
        }
 
        /* We don't need this buffer anymore */