summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-04-15 11:35:51 -0400
committerJune McEnroe <june@causal.agency>2020-04-15 11:35:51 -0400
commit60d1574cc5588f84a8592ca8a76461bf263045e6 (patch)
treeddaf19edf19c29f2af141492ca80e4a7c358ee2e
parentFix bodyParts list building (diff)
downloadbubger-60d1574cc5588f84a8592ca8a76461bf263045e6.tar.gz
bubger-60d1574cc5588f84a8592ca8a76461bf263045e6.zip
Verify that bodyParts is parallel to structure
-rw-r--r--export.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/export.c b/export.c
index 3e1b2dc..3786220 100644
--- a/export.c
+++ b/export.c
@@ -138,6 +138,25 @@ static void exportFetchParts(
 	}
 }
 
+static void checkBodyParts(const struct BodyPart *structure, struct Data body) {
+	if (structure->multipart) {
+		struct List list = dataCheck(body, List).list;
+		if (list.len < structure->parts.len) {
+			errx(EX_PROTOCOL, "missing body parts");
+		}
+		for (size_t i = 0; i < structure->parts.len; ++i) {
+			checkBodyParts(&structure->parts.ptr[i], list.ptr[i]);
+		}
+	} else if (
+		structure->message.structure &&
+		structure->message.structure->multipart
+	) {
+		checkBodyParts(structure->message.structure, body);
+	} else if (body.type != String) {
+		errx(EX_PROTOCOL, "missing body part");
+	}
+}
+
 bool exportData(FILE *imap, enum Atom tag, struct List items) {
 	uint32_t uid = 0;
 	struct Envelope envelope = {0};
@@ -202,6 +221,9 @@ bool exportData(FILE *imap, enum Atom tag, struct List items) {
 	if (!structure.subtype) {
 		errx(EX_PROTOCOL, "missing BODYSTRUCTURE data item");
 	}
+	if (bodyParts.type == List) {
+		checkBodyParts(&structure, bodyParts);
+	}
 
 	if (bodyHeader.type == String && bodyText.type == String) {
 		exportMbox(uid, &envelope, bodyHeader.string, bodyText.string);
@@ -211,7 +233,6 @@ bool exportData(FILE *imap, enum Atom tag, struct List items) {
 	if (!structure.multipart) {
 		exportAtom(uid, &envelope, &structure, bodyText);
 	} else if (bodyParts.type == List) {
-		// TODO: Validate that bodyParts is parallel to structure.
 		exportAtom(uid, &envelope, &structure, bodyParts);
 	} else {
 		fetch = true;
5da7250&follow=1'>Apply consecutive formatting codes at onceJune McEnroe Fixes the failing splits test. 2018-09-14Add tests for formatParseJune McEnroe With one currently failing so you know they're worth it. 2018-09-13Preview with nick in input windowJune McEnroe 2018-09-13Never send PRIVMSG to TagStatus or TagVerboseJune McEnroe 2018-09-13Move color selection to format.cJune McEnroe 2018-09-13Fix len for format->split at end of stringJune McEnroe 2018-09-13Avoid uninitialized x in uiReadJune McEnroe 2018-09-13Add IRCDefault to colors enumJune McEnroe 2018-09-13Return a format->split even at the end of the stringJune McEnroe 2018-09-13Fix weird tab-complete after commaJune McEnroe I have no idea why I did this. 2018-09-13Rewrite UI againJune McEnroe The persistent topic is gone and the status line is now at the top. The status formatting still needs to be reworked. I also want to try showing the nick in the input window so it really looks like your next message. 2018-09-12Add note about C-oJune McEnroe Why are there so few well usable ctrl key bindings? 2018-09-12Use formatParse split to position input cursorJune McEnroe 2018-09-12Factor out IRC formatting parsingJune McEnroe 2018-09-11Add /help equivalent to /manJune McEnroe 2018-09-11Don't render every PM as a pingJune McEnroe 2018-09-11Add urlOpenMatchJune McEnroe 2018-09-10Depend on man.sh for chroot.tar targetJune McEnroe 2018-09-10Set LESSSECURE=1 in man.shJune McEnroe Ridiculous. 2018-09-10Add /man commandJune McEnroe 2018-09-10Install man page in chrootJune McEnroe 2018-09-10Install man pageJune McEnroe 2018-09-10Split keys into subsections and document colorsJune McEnroe 2018-09-10Add "blank" lines to chatte.1June McEnroe 2018-09-10Document key bindings in chatte.1June McEnroe 2018-09-08Document slash commands in chatte.1June McEnroe