mbox-sync-full.c revision 99b621cc5076398c5d780d2ea33dd7391341d630
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (C) 2002 Timo Sirainen */
8372fc7efb6d64dff2e5f55fb4a3822c56869cfeTimo Sirainen const unsigned char *msg;
8372fc7efb6d64dff2e5f55fb4a3822c56869cfeTimo Sirainen while (i_stream_read_data(input, &msg, &size, 0) > 0) {
8372fc7efb6d64dff2e5f55fb4a3822c56869cfeTimo Sirainen for (i = 0; i < size; i++) {
01cd9d4a8050a1dbf1da2c830f9755a45d6d004aTimo Sirainenstatic int verify_header(struct mail_index *index,
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen unsigned int uid, unsigned char current_digest[16])
01cd9d4a8050a1dbf1da2c830f9755a45d6d004aTimo Sirainen const unsigned char *old_digest;
ddbdc644a15f56f4b43596f1b8c0fc196c101445Timo Sirainen /* MD5 sums must match */
ab45534d66792946b5794ab99a843d2f2b1d556fTimo Sirainen old_digest = index->lookup_field_raw(index, rec, DATA_FIELD_MD5, &size);
01cd9d4a8050a1dbf1da2c830f9755a45d6d004aTimo Sirainen return size >= 16 && memcmp(old_digest, current_digest, 16) == 0 &&
e95dba8921087afebb8a92c592af3b8ca22ae796Timo Sirainenstatic int mail_update_header_size(struct mail_index *index,
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen /* update FIELD_HDR_HEADER_SIZE */
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen index->update_field_raw(update, DATA_HDR_HEADER_SIZE,
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen /* reset FIELD_HDR_VIRTUAL_SIZE - we don't know it anymore */
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen index->update_field_raw(update, DATA_HDR_VIRTUAL_SIZE,
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen /* update DATA_FIELD_MESSAGEPART */
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen if ((rec->data_fields & DATA_FIELD_MESSAGEPART) == 0)
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen part_data = index->lookup_field_raw(index, rec, DATA_FIELD_MESSAGEPART,
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen /* well, this wasn't expected but don't bother failing */
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen /* copy & update the part data */
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen if (!message_part_serialize_update_header(part_data_copy, size,
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen "Corrupted cached message_part data (%s)",
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen index->update_field_raw(update, DATA_FIELD_MESSAGEPART,
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainenstatic int mbox_check_uidvalidity(struct mail_index *index,
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen if (uid_validity == index->header->uid_validity)
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen index->header->flags |= MAIL_INDEX_FLAG_DIRTY_MESSAGES |
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen /* X-IMAPbase header isn't written yet */
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen /* UID validity has changed - rebuild whole index */
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic int match_next_record(struct mail_index *index,
e95dba8921087afebb8a92c592af3b8ca22ae796Timo Sirainen struct mail_index_record **next_rec, int *dirty)
45155bb1250cf5a120278f349465aded513a100fTimo Sirainen /* skip the From-line */
01cd9d4a8050a1dbf1da2c830f9755a45d6d004aTimo Sirainen hdr_size = 0; body_offset = 0; hdr_size_fixed = FALSE;
f30577ff7cf29858f1878abe963b4f40a436434fTimo Sirainen if (!mbox_mail_get_location(index, rec, NULL, NULL, &body_size))
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen /* possibly broken message, find the next From-line
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen and make sure header parser won't pass it. */
3612ee5c737954d5fb88fd1775aad80f7bf1dc4eTimo Sirainen i_stream_set_read_limit(input, input->v_offset);
e95dba8921087afebb8a92c592af3b8ca22ae796Timo Sirainen /* get the MD5 sum of fixed headers and the current
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen message flags in Status and X-Status fields */
e95dba8921087afebb8a92c592af3b8ca22ae796Timo Sirainen message_parse_header(NULL, input, &hdr_parsed_size,
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen /* uidvalidity changed, abort */
e95dba8921087afebb8a92c592af3b8ca22ae796Timo Sirainen if (ctx.uid_last >= index->header->next_uid) {
ab45534d66792946b5794ab99a843d2f2b1d556fTimo Sirainen /* last_uid larger than ours */
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen if (verify_header(index, rec, ctx.uid, current_digest) &&
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen mbox_verify_end_of_body(input, body_offset + body_size)) {
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen /* valid message */
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen /* update flags, unless we've changed them */
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen if ((rec->index_flags & INDEX_MAIL_FLAG_DIRTY) == 0) {
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen /* update_flags() sets dirty flag, remove it */
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen /* update location */
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen if (!mbox_mail_get_location(index, rec, &offset,
f8a78c816b4dbfda42f13d8ee152e0cdb28c6a4aTimo Sirainen /* update size */
ab1236617440e654d5c5a043b677512714b788ddTimo Sirainen if (hdr_size != hdr_parsed_size.physical_size ) {
ab1236617440e654d5c5a043b677512714b788ddTimo Sirainen if (!mail_update_header_size(index, rec, update,
e3a838c80f54f024115fade93c6c87a0998f1fabTimo Sirainen /* try next message */
00fa8dcbc66f56daa737487c9dec7166c37de79eTimo Sirainenstatic int mbox_sync_from_stream(struct mail_index *index,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen const unsigned char *data;
6e8ad595d0603295f57bef576da8a3a00b55c5e2Timo Sirainen unsigned int seq;
8372fc7efb6d64dff2e5f55fb4a3822c56869cfeTimo Sirainen /* first make sure we start with a "From " line. If file is too
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen small, we'll just treat it as empty mbox file. */
8372fc7efb6d64dff2e5f55fb4a3822c56869cfeTimo Sirainen if (i_stream_read_data(input, &data, &size, 5) > 0 &&
ba90e657bc68a72ab3b3021e2f4a874fac9965baTimo Sirainen index_set_error(index, "File isn't in mbox format: %s",
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen /* we'll go through the mailbox and index in order matching the
return FALSE;
return FALSE;
seq++;
return TRUE;
int failed;
return FALSE;
return FALSE;
return FALSE;
return !failed;