|
|
|
@ -31,6 +31,7 @@
|
|
|
|
|
#include <limits.h> |
|
|
|
|
#include <string.h> |
|
|
|
|
#include <ctype.h> |
|
|
|
|
#include <time.h> |
|
|
|
|
#include <sys/wait.h> |
|
|
|
|
|
|
|
|
|
typedef struct imap_server_conf { |
|
|
|
@ -710,6 +711,8 @@ parse_fetch_rsp( imap_store_t *ctx, list_t *list, char *s ATTR_UNUSED )
|
|
|
|
|
struct imap_cmd *cmdp; |
|
|
|
|
int uid = 0, mask = 0, status = 0, size = 0; |
|
|
|
|
unsigned i; |
|
|
|
|
time_t date = 0; |
|
|
|
|
struct tm datetime; |
|
|
|
|
|
|
|
|
|
if (!is_list( list )) { |
|
|
|
|
error( "IMAP error: bogus FETCH response\n" ); |
|
|
|
@ -751,6 +754,15 @@ parse_fetch_rsp( imap_store_t *ctx, list_t *list, char *s ATTR_UNUSED )
|
|
|
|
|
status |= M_FLAGS; |
|
|
|
|
} else |
|
|
|
|
error( "IMAP error: unable to parse FLAGS\n" ); |
|
|
|
|
} else if (!strcmp( "INTERNALDATE", tmp->val )) { |
|
|
|
|
tmp = tmp->next; |
|
|
|
|
if (is_atom( tmp )) { |
|
|
|
|
if (strptime( tmp->val, "%d-%b-%Y %H:%M:%S %z", &datetime )) |
|
|
|
|
date = mktime( &datetime ); |
|
|
|
|
else |
|
|
|
|
error( "IMAP error: unable to parse INTERNALDATE format\n" ); |
|
|
|
|
} else |
|
|
|
|
error( "IMAP error: unable to parse INTERNALDATE\n" ); |
|
|
|
|
} else if (!strcmp( "RFC822.SIZE", tmp->val )) { |
|
|
|
|
tmp = tmp->next; |
|
|
|
|
if (is_atom( tmp )) |
|
|
|
@ -794,6 +806,7 @@ parse_fetch_rsp( imap_store_t *ctx, list_t *list, char *s ATTR_UNUSED )
|
|
|
|
|
msgdata = ((struct imap_cmd_fetch_msg *)cmdp)->msg_data; |
|
|
|
|
msgdata->data = body; |
|
|
|
|
msgdata->len = size; |
|
|
|
|
msgdata->date = date; |
|
|
|
|
if (status & M_FLAGS) |
|
|
|
|
msgdata->flags = mask; |
|
|
|
|
} else if (uid) { /* ignore async flag updates for now */ |
|
|
|
@ -1738,8 +1751,9 @@ imap_fetch_msg( store_t *ctx, message_t *msg, msg_data_t *data,
|
|
|
|
|
cmd->gen.gen.param.uid = msg->uid; |
|
|
|
|
cmd->msg_data = data; |
|
|
|
|
imap_exec( (imap_store_t *)ctx, &cmd->gen.gen, imap_done_simple_msg, |
|
|
|
|
"UID FETCH %d (%sBODY.PEEK[])", |
|
|
|
|
msg->uid, (msg->status & M_FLAGS) ? "" : "FLAGS " ); |
|
|
|
|
"UID FETCH %d (%s%sBODY.PEEK[])", msg->uid, |
|
|
|
|
!(msg->status & M_FLAGS) ? "FLAGS " : "", |
|
|
|
|
(data->date== -1) ? "INTERNALDATE " : "" ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/******************* imap_set_flags *******************/ |
|
|
|
@ -1888,7 +1902,7 @@ imap_store_msg( store_t *gctx, msg_data_t *data, int to_trash,
|
|
|
|
|
imap_store_t *ctx = (imap_store_t *)gctx; |
|
|
|
|
struct imap_cmd_out_uid *cmd; |
|
|
|
|
int d; |
|
|
|
|
char flagstr[128], buf[1024]; |
|
|
|
|
char flagstr[128], datestr[64], buf[1024]; |
|
|
|
|
|
|
|
|
|
d = 0; |
|
|
|
|
if (data->flags) { |
|
|
|
@ -1915,9 +1929,23 @@ imap_store_msg( store_t *gctx, msg_data_t *data, int to_trash,
|
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (data->date) { |
|
|
|
|
#ifdef __GNUC__ |
|
|
|
|
# pragma GCC diagnostic push |
|
|
|
|
# pragma GCC diagnostic ignored "-Wformat" |
|
|
|
|
/* configure ensures that %z actually works. */ |
|
|
|
|
#endif |
|
|
|
|
strftime( datestr, sizeof(datestr), "%d-%b-%Y %H:%M:%S %z", localtime( &data->date ) ); |
|
|
|
|
#ifdef __GNUC__ |
|
|
|
|
# pragma GCC diagnostic pop |
|
|
|
|
#endif |
|
|
|
|
imap_exec( ctx, &cmd->gen, imap_store_msg_p2, |
|
|
|
|
"APPEND \"%s\" %s\"%s\" ", buf, flagstr, datestr ); |
|
|
|
|
} else { |
|
|
|
|
imap_exec( ctx, &cmd->gen, imap_store_msg_p2, |
|
|
|
|
"APPEND \"%s\" %s", buf, flagstr ); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
imap_store_msg_p2( imap_store_t *ctx ATTR_UNUSED, struct imap_cmd *cmd, int response ) |
|
|
|
|