@@ -237,10 +237,18 @@ static uint64_t me_get_digest(sqlite3 *psqlite, const char *mid_string,
237237{
238238 auto dir = cu_get_maildir ();
239239 std::string slurp_data;
240- if (exmdb_client->imapfile_read (dir, " ext" , mid_string, &slurp_data)) {
241- if (!json_from_str (slurp_data.c_str (), digest))
242- return 0 ;
243- } else {
240+ bool have_ext = false ;
241+
242+ /* ext files may be absent (only midb generates them) */
243+ if (exmdb_client->imapfile_read (dir, " ext" , mid_string, &slurp_data))
244+ if (json_from_str (slurp_data.c_str (), digest) &&
245+ digest.isMember (" structure" ) && digest.isMember (" mimes" ))
246+ have_ext = true ;
247+ if (!have_ext) {
248+ /*
249+ * eml files are generally present, either because http wrote
250+ * it, or midb's me_insert_message wrote it.
251+ */
244252 if (!exmdb_client->imapfile_read (dir, " eml" , mid_string, &slurp_data))
245253 return 0 ;
246254 MAIL imail;
@@ -1334,7 +1342,15 @@ static void me_insert_message(xstmt &stm_insert, uint32_t *puidnext,
13341342 if (e.midstr .size () > 0 &&
13351343 !exmdb_client->imapfile_read (dir, " ext" , e.midstr , &djson))
13361344 e.midstr .clear ();
1337- if (e.midstr .empty ()) {
1345+ Json::Value digest;
1346+ if (djson.size () > 0 ) {
1347+ if (!json_from_str (djson.c_str (), digest) ||
1348+ !digest.isMember (" structure" ) || !digest.isMember (" mimes" )) {
1349+ djson.clear ();
1350+ digest = {};
1351+ }
1352+ }
1353+ if (digest.empty ()) {
13381354 if (!cu_switch_allocator ())
13391355 return ;
13401356 if (!exmdb_client->read_message (dir, nullptr , CP_ACP,
@@ -1360,10 +1376,9 @@ static void me_insert_message(xstmt &stm_insert, uint32_t *puidnext,
13601376 return ;
13611377 }
13621378 cu_switch_allocator ();
1363- Json::Value digest;
13641379 if (imail.make_digest (digest) <= 0 )
13651380 return ;
1366- digest[ " file" ] = " " ;
1381+ digest. removeMember ( " file" ) ;
13671382 djson = json_to_str (digest);
13681383 char guidtxt[GUIDSTR_SIZE]{};
13691384 GUID::random_new ().to_str (guidtxt, std::size (guidtxt), 32 );
@@ -1386,9 +1401,6 @@ static void me_insert_message(xstmt &stm_insert, uint32_t *puidnext,
13861401 (*puidnext) ++;
13871402 bool b_unsent = e.msg_flags & MSGFLAG_UNSENT;
13881403 bool b_read = e.msg_flags & MSGFLAG_READ;
1389- Json::Value digest;
1390- if (!json_from_str (djson.c_str (), digest))
1391- return ;
13921404 djson.clear ();
13931405 size_t size = 0 ;
13941406 me_extract_digest_fields (digest, subject,
0 commit comments