summaryrefslogtreecommitdiffstats
path: root/imap
diff options
context:
space:
mode:
Diffstat (limited to 'imap')
-rw-r--r--imap/ChangeLog4
-rw-r--r--imap/imapd.c41
-rw-r--r--imap/search.c48
-rw-r--r--imap/smap.c11
-rw-r--r--imap/thread.c9
5 files changed, 65 insertions, 48 deletions
diff --git a/imap/ChangeLog b/imap/ChangeLog
index 66063b3..f773664 100644
--- a/imap/ChangeLog
+++ b/imap/ChangeLog
@@ -1,3 +1,7 @@
+2015-03-04 Sam Varshavchik <mrsam@courier-mta.com>
+
+ * Handle 01-Jan-1970 for date-based searches.
+
2015-02-28 Sam Varshavchik <mrsam@courier-mta.com>
* Update to courier-unicode 1.2.
diff --git a/imap/imapd.c b/imap/imapd.c
index 1396429..0b00b3c 100644
--- a/imap/imapd.c
+++ b/imap/imapd.c
@@ -84,6 +84,7 @@
#include "maildir/maildirkeywords.h"
#include "maildir/maildirinfo.h"
#include "maildir/loginexec.h"
+#include "rfc822/rfc822.h"
#include <courier-unicode.h>
#include "maildir/maildirkeywords.h"
@@ -92,7 +93,6 @@
#define KEYWORD_IMAPVERBOTTEN " (){%*\"\\]"
#define KEYWORD_SMAPVERBOTTEN ","
-extern time_t rfc822_parsedt(const char *);
extern void fetchflags(unsigned long);
extern unsigned long header_count, body_count;
extern time_t start_time;
@@ -175,7 +175,7 @@ void quotainfo_out(const char* qroot)
char quotabuf[QUOTABUFSIZE];
char qresult[200]="";
char qbuf[200];
-
+
if ((maildir_getquota(".", quotabuf) == 0) && (strcmp(qroot,"ROOT") == 0))
{
struct maildirsize quotainfo;
@@ -186,7 +186,7 @@ void quotainfo_out(const char* qroot)
quotainfo.quota.nbytes=quotainfo.size.nbytes=
quotainfo.quota.nmessages=
quotainfo.size.nmessages=0;
-
+
if (quotainfo.quota.nbytes > 0)
{
sprintf(qbuf,"STORAGE %ld %ld",
@@ -403,7 +403,7 @@ char *decode_valid_mailbox(const char *p, int autosubscribe)
return (NULL);
}
-static time_t decode_date_time(char *p)
+static int decode_date_time(char *p, time_t *tret)
{
unsigned i;
@@ -414,7 +414,7 @@ unsigned i;
if (!p[i]) return (0);
if (p[i] == '-') p[i]=' ';
}
- return (rfc822_parsedt(p));
+ return (rfc822_parsedate_chk(p, tret));
}
int get_flagname(const char *p, struct imapflags *flags)
@@ -716,7 +716,7 @@ int rb;
nbytes -= n;
if (p[n-1] == '\n') lastnl = 1;
else lastnl = 0;
-
+
while (n)
{
e = memchr(p, '\r', n);
@@ -729,7 +729,7 @@ int rb;
rb = fwrite(p, 1, e-p, fp);
}
else
- {
+ {
rb = fwrite(p, 1, n, fp);
}
n -= rb;
@@ -759,7 +759,7 @@ int rb;
nbytes=ftell(fp);
if (nbytes == (unsigned long)-1 ||
(p=maildir_requota(newname, nbytes)) == 0)
-
+
{
fclose(fp);
unlink(tmpname);
@@ -1162,7 +1162,7 @@ void doNoop(int real_noop)
#endif
struct noopKeywordUpdateInfo kui;
- imapscan_init(&new_maildir_info);
+ imapscan_init(&new_maildir_info);
if (imapscan_maildir(&new_maildir_info, current_mailbox, 0,
current_mailbox_ro, NULL))
@@ -1484,7 +1484,7 @@ static int doId()
writes("\" \"os-version\" \"");
writeqs(uts.release);
}
-
+
}
}
#endif
@@ -2782,7 +2782,7 @@ static void writeacl(const char *aclstr)
writeqs(p);
free(p);
}
-
+
static int list_acl_cb(const char *ident,
const maildir_aclt *acl,
void *cb_arg)
@@ -3273,7 +3273,7 @@ void aclminimum(const char *identifier)
writes(*identifier == '-' ? "\"\"":ACL_ADMINISTER ACL_LOOKUP);
writes(" " ACL_CREATE
- " " ACL_EXPUNGE
+ " " ACL_EXPUNGE
" " ACL_INSERT
" " ACL_POST
" " ACL_READ
@@ -3886,8 +3886,7 @@ static int append(const char *tag, const char *mailbox, const char *path)
if (curtoken->tokentype == IT_QUOTED_STRING)
{
- timestamp=decode_date_time(curtoken->tokenbuf);
- if (timestamp == 0)
+ if (decode_date_time(curtoken->tokenbuf, &timestamp))
{
libmail_kwmDestroy(keywords);
return (-1);
@@ -4270,7 +4269,7 @@ int uid=0;
rc=mailbox_scan(reference, name,
list_flags,
list_callback, cmdbuf);
-
+
free(reference);
free(name);
if (rc == 0)
@@ -4324,7 +4323,7 @@ int uid=0;
ACL_INSERT);
return 0;
}
-
+
rc=append(tag, tok->tokenbuf, p);
free(p);
maildir_info_destroy(&mi);
@@ -6122,7 +6121,7 @@ int uid=0;
append_rights,
ACL_INSERT ACL_DELETEMSGS
ACL_SEEN ACL_WRITE);
-
+
if (strchr(append_rights, ACL_INSERT[0]) == NULL)
{
writes(tag);
@@ -6334,7 +6333,7 @@ char *p, *q;
*p=0;
p=strrchr(q, '/');
}
-
+
if (p)
p[1]=0;
else *q=0;
@@ -6568,14 +6567,14 @@ int main(int argc, char **argv)
if (!p)
dogethostname();
- if ((p=getenv("IMAP_TRASHFOLDERNAME")) != 0 && *p)
+ if ((p=getenv("IMAP_TRASHFOLDERNAME")) != 0 && *p)
{
trash = strdup(p);
dot_trash = malloc(strlen(trash) + 2);
dot_trash[0] = '.';
- strcpy(&dot_trash[1], trash);
+ strcpy(&dot_trash[1], trash);
}
-
+
#if 0
mdcreate("." DRAFTS);
#endif
diff --git a/imap/search.c b/imap/search.c
index 1aa0007..cc64bbf 100644
--- a/imap/search.c
+++ b/imap/search.c
@@ -215,12 +215,12 @@ int rc;
{
/* No, search the headers then */
/* struct rfc2045 *rfcp=rfc2045_fromfp(fp); */
- struct rfc2045 *rfcp=rfc2045header_fromfp(fp);
+ struct rfc2045 *rfcp=rfc2045header_fromfp(fp);
fill_search_header(sihead, charset, rfcp, fp,
current_maildir_info.msgs+i);
rc=search_evaluate(si);
- rfc2045_free(rfcp);
+ rfc2045_free(rfcp);
if (rc < 0)
{
@@ -302,16 +302,16 @@ unsigned long i, j;
** Use convenient RFC822 functions for that purpose.
*/
-static time_t decode_date(char *p)
+static int decode_date(char *p, time_t *tret)
{
-char *s=malloc(strlen(p)+sizeof(" 00:00:00"));
-unsigned i;
-time_t t;
+ char *s=malloc(strlen(p)+sizeof(" 00:00:00"));
+ unsigned i;
+ int ret;
if (!s) write_error_exit(0);
/* Convert to format rfc822_parsedt likes */
-
+
for (i=1; p[i] != ' '; i++)
{
if (!p[i]) break;
@@ -324,9 +324,9 @@ time_t t;
s[i]=' ';
}
- t=rfc822_parsedt(s);
+ ret=rfc822_parsedate_chk(s, tret);
free(s);
- return (t);
+ return (ret);
}
/* Given a time_t that falls on, say, 3-Aug-1999 9:50:43 local time,
@@ -345,7 +345,10 @@ char buf1[60], buf2[80];
strcat(buf2, " ");
strcat(buf2, strtok(0, " "));
strcat(buf2, " 00:00:00");
- return (rfc822_parsedt(buf2));
+
+ rfc822_parsedate_chk(buf2, &t);
+
+ return t;
}
static char *timestamp_for_sorting(time_t t)
@@ -474,27 +477,30 @@ static void fill_search_quick(struct searchinfo *p,
case search_before:
p->value=0;
{
- time_t t=decode_date(p->as);
+ time_t t;
- if (t && timestamp_to_day(stat_buf->st_mtime) < t)
+ if (decode_date(p->as, &t) == 0 &&
+ timestamp_to_day(stat_buf->st_mtime) < t)
p->value=1;
}
break;
case search_since:
p->value=0;
{
- time_t t=decode_date(p->as);
+ time_t t;
- if (t && timestamp_to_day(stat_buf->st_mtime) >= t)
+ if (decode_date(p->as, &t) == 0 &&
+ timestamp_to_day(stat_buf->st_mtime) >= t)
p->value=1;
}
break;
case search_on:
p->value=0;
{
- time_t t=decode_date(p->as);
+ time_t t;
- if (t && timestamp_to_day(stat_buf->st_mtime) == t)
+ if (decode_date(p->as, &t) == 0 &&
+ timestamp_to_day(stat_buf->st_mtime) == t)
p->value=1;
}
break;
@@ -787,8 +793,9 @@ static int headerfilter_func(const char *name, const char *value, void *arg)
if (isdate == 0 && sip->as == 0)
{
- time_t msg_time=rfc822_parsedt(value);
+ time_t msg_time;
+ rfc822_parsedate_chk(value, &msg_time);
sip->as=timestamp_for_sorting(msg_time);
}
break;
@@ -802,10 +809,11 @@ static int headerfilter_func(const char *name, const char *value, void *arg)
if (isdate == 0)
{
- time_t given_time=decode_date(sip->as);
- time_t msg_time=rfc822_parsedt(value);
+ time_t given_time;
+ time_t msg_time;
- if (given_time == 0 || msg_time == 0)
+ if (decode_date(sip->as, &given_time)
+ || rfc822_parsedate_chk(value, &msg_time))
break;
msg_time=timestamp_to_day(msg_time);
diff --git a/imap/smap.c b/imap/smap.c
index b7669cf..2b528a9 100644
--- a/imap/smap.c
+++ b/imap/smap.c
@@ -3376,9 +3376,9 @@ void smap()
if (strcmp(p, "INTERNALDATE") == 0 && q)
{
- add_internaldate=rfc822_parsedt(q);
-
- if (add_internaldate)
+ if (rfc822_parsedate_chk(q,
+ &add_internaldate)
+ == 0)
okmsg="INTERNALDATE set";
}
@@ -4359,9 +4359,8 @@ void smap()
up(p);
- t=rfc822_parsedt(p+13);
-
- if (t &&
+ if (rfc822_parsedate_chk(p+13, &t)
+ == 0 &&
(dummy=applymsgset(&setdate, &t))
!= 0)
break;
diff --git a/imap/thread.c b/imap/thread.c
index 791a7a8..883ae59 100644
--- a/imap/thread.c
+++ b/imap/thread.c
@@ -198,11 +198,18 @@ static void thread_os_callback(struct searchinfo *si,
void *voidarg)
{
if (sihead->type == search_orderedsubj)
+ {
/* SHOULD BE ALWAYS TRUE */
+ time_t t=0;
+
+ if (sihead->bs)
+ rfc822_parsedate_chk(sihead->bs, &t);
+
os_add( (struct os_struct *)voidarg,
isuid ? current_maildir_info.msgs[i].uid:i+1,
sihead->as ? sihead->as:"",
- sihead->bs ? rfc822_parsedt(sihead->bs):0);
+ t);
+ }
}
static void printthread(struct imap_refmsg *, int);