From 7bbf1c5811edba6cce197d8ee5a6585c8f03b093 Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Fri, 10 Apr 2020 14:45:03 -0400 Subject: Use dataCheck in parsing --- concat.c | 6 ++---- export.c | 63 ++++++++++++++++----------------------------------------------- 2 files changed, 18 insertions(+), 51 deletions(-) diff --git a/concat.c b/concat.c index 3417e8a..9ad8537 100644 --- a/concat.c +++ b/concat.c @@ -30,15 +30,13 @@ static uint32_t threadRoot(struct List thread) { thread = thread.ptr[0].list; if (!thread.len) errx(EX_PROTOCOL, "empty subthread"); } - if (thread.ptr[0].type != Number) errx(EX_PROTOCOL, "invalid thread root"); - return thread.ptr[0].number; + return dataCheck(thread.ptr[0], Number).number; } void concatFetch(FILE *imap, enum Atom tag, struct List threads) { fprintf(imap, "%s UID FETCH ", Atoms[tag]); for (size_t i = 0; i < threads.len; ++i) { - if (threads.ptr[i].type != List) errx(EX_PROTOCOL, "invalid thread"); - uint32_t root = threadRoot(threads.ptr[i].list); + uint32_t root = threadRoot(dataCheck(threads.ptr[i], List).list); fprintf(imap, "%s%" PRIu32, (i ? "," : ""), root); } fprintf(imap, " (UID ENVELOPE)\r\n"); diff --git a/export.c b/export.c index c8d742f..6e4c7fd 100644 --- a/export.c +++ b/export.c @@ -54,17 +54,12 @@ bool exportFetch(FILE *imap, enum Atom tag, struct List threads) { struct List uids = {0}; flatten(&uids, threads); for (size_t i = uids.len - 1; i < uids.len; --i) { - if (uids.ptr[i].type != Number) { - errx(EX_PROTOCOL, "invalid thread UID"); - } - uint32_t uid = uids.ptr[i].number; - int error = 0; - if (!error) error = access(uidPath(uid, "atom"), F_OK); - if (!error) error = access(uidPath(uid, "html"), F_OK); - if (!error) error = access(uidPath(uid, "mbox"), F_OK); - if (!error) { - uids.ptr[i] = uids.ptr[--uids.len]; - } + uint32_t uid = dataCheck(uids.ptr[i], Number).number; + int error = 0 + || access(uidPath(uid, "atom"), F_OK) + || access(uidPath(uid, "html"), F_OK) + || access(uidPath(uid, "mbox"), F_OK); + if (!error) uids.ptr[i] = uids.ptr[--uids.len]; } if (!uids.len) { listFree(uids); @@ -77,10 +72,8 @@ bool exportFetch(FILE *imap, enum Atom tag, struct List threads) { } fprintf( imap, - " (" - "UID ENVELOPE " - "BODY[HEADER.FIELDS (" MBOX_HEADERS ")] BODY[TEXT]" - ")\r\n" + " (UID ENVELOPE" + " BODY[HEADER.FIELDS (" MBOX_HEADERS ")] BODY[TEXT])\r\n" ); return true; } @@ -104,10 +97,7 @@ static struct AddressList parseAddressList(struct List list) { struct Address *addrs = calloc(list.len, sizeof(*addrs)); if (!addrs) err(EX_OSERR, "calloc"); for (size_t i = 0; i < list.len; ++i) { - if (list.ptr[i].type != List) { - errx(EX_PROTOCOL, "invalid address field"); - } - addrs[i] = parseAddress(list.ptr[i].list); + addrs[i] = parseAddress(dataCheck(list.ptr[i], List).list); } return (struct AddressList) { list.len, addrs }; } @@ -132,21 +122,15 @@ static struct Envelope parseEnvelope(struct List list) { } struct Envelope envelope = {0}; - if (list.ptr[Date].type != String) { - errx(EX_PROTOCOL, "invalid envelope date field"); - } - const char *date = list.ptr[Date].string; + const char *date = dataCheck(list.ptr[Date], String).string; date = strptime(date, "%a, %e %b %Y %H:%M:%S %z", &envelope.date); if (!date) errx(EX_PROTOCOL, "invalid envelope date format"); envelope.date.tm_isdst = -1; envelope.utc = mktime(&envelope.date); - if (list.ptr[Subject].type != String) { - errx(EX_PROTOCOL, "invalid envelope subject field"); - } // TODO: Decode UTF-8 in subject. - envelope.subject = strdup(list.ptr[Subject].string); + envelope.subject = strdup(dataCheck(list.ptr[Subject], String).string); if (!envelope.subject) err(EX_OSERR, "strdup"); for (size_t i = From; i <= Bcc; ++i) { @@ -173,10 +157,7 @@ static struct Envelope parseEnvelope(struct List list) { if (list.ptr[InReplyTo].type == String) { envelope.inReplyTo = parseID(list.ptr[InReplyTo].string); } - if (list.ptr[MessageID].type != String) { - errx(EX_PROTOCOL, "invalid envelope message-id field"); - } - envelope.messageID = parseID(list.ptr[MessageID].string); + envelope.messageID = parseID(dataCheck(list.ptr[MessageID], String).string); return envelope; } @@ -217,25 +198,13 @@ void exportData(struct List items) { i--; continue; } else if (name == AtomUID) { - if (items.ptr[i + 1].type != Number) { - errx(EX_PROTOCOL, "invalid UID data item value"); - } - uid = items.ptr[i + 1].number; + uid = dataCheck(items.ptr[i + 1], Number).number; } else if (name == AtomEnvelope) { - if (items.ptr[i + 1].type != List) { - errx(EX_PROTOCOL, "invalid ENVELOPE data item value"); - } - envelope = parseEnvelope(items.ptr[i + 1].list); + envelope = parseEnvelope(dataCheck(items.ptr[i + 1], List).list); } else if (name == AtomHeaderFields) { - if (items.ptr[i + 1].type != String) { - errx(EX_PROTOCOL, "invalid BODY[HEADER.FIELDS] data item value"); - } - header = items.ptr[i + 1].string; + header = dataCheck(items.ptr[i + 1], String).string; } else if (name == AtomText) { - if (items.ptr[i + 1].type != String) { - errx(EX_PROTOCOL, "invalid BODY[TEXT] data item value"); - } - body = items.ptr[i + 1].string; + body = dataCheck(items.ptr[i + 1], String).string; } } -- cgit 1.4.1