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
Diffstat (limited to '')
-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;
Error on invalid ISUPPORT values 1.2June McEnroe 2020-04-05Only set RCS on FreeBSDJune McEnroe 2020-04-05Log bans and unbansJune McEnroe 2020-04-05Parse mode types from ISUPPORTJune McEnroe 2020-04-05Add unscoop matchers for ban/unban eventsJune McEnroe The IRC and Textual matchers miss bans mixed with other mode changes, but those are rare. 2020-04-05Check unscoop regexps with make testJune McEnroe 2020-04-05Add unscoop -n flag for checking regexpsJune McEnroe 2020-04-05Add Ban and Unban event typesJune McEnroe 2020-04-02Update styleJune McEnroe Replacing declarations followed by while loops with for loops and generating the short option string from the long options. 2020-03-31Update unscoop catgirl matchersJune McEnroe I'm not concerned about keeping the old matchers since I'm almost entirely certain I was the only one who ever used the old version of catgirl, and I already imported those logs. 2020-03-31Fix writing verbose to stderrJune McEnroe 2020-03-02Include <>/-/* around nicks in scoop coloring 1.1June McEnroe 2020-03-02Replace .mk files with configure scriptJune McEnroe 2020-02-28Implement the causal.agency/consumer capabilityJune McEnroe 2020-02-22Include <>/-/* around nicks in coloringJune McEnroe 2020-02-22Use (almost) the full range of IRC colors for nicksJune McEnroe