dbox-attachment.c revision fc45e0ed5178181de36c5efbf8a0698891e10726
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainenvoid dbox_attachment_save_write_metadata(struct mail_save_context *ctx,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen const ARRAY_TYPE(mail_attachment_extref) *extrefs;
8f0c238dcbbfa3b984b102260a2440adac667ae8Timo Sirainen extrefs = index_attachment_save_get_extrefs(ctx);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if (extrefs == NULL || array_count(extrefs) == 0)
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen str_printfa(str, "%"PRIuUOFF_T" %"PRIuUOFF_T" ",
2303ad68175883aaebd1f3b18e69593c2422c7bbTimo Sirainen str_append_c(str, DBOX_ATTACHMENT_DECODE_OPTION_CRLF);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen /* make it clear there are no options */
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen str_append_c(str, DBOX_ATTACHMENT_DECODE_OPTION_NONE);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen unsigned int num;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if (*str == DBOX_ATTACHMENT_DECODE_OPTION_NONE)
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainendbox_attachment_parse_extref_real(const char *line, pool_t pool,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen const char *const *args;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen unsigned int i, len;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if (str_to_uoff(start_offset_str, &extref.start_offset) < 0 ||
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen !parse_extref_decode_options(decode_options, &extref))
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainenbool dbox_attachment_parse_extref(const char *line, pool_t pool,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen ret = dbox_attachment_parse_extref_real(line, pool, extrefs);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainendbox_attachment_file_get_stream_from(struct dbox_file *file,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen ARRAY_TYPE(mail_attachment_extref) extrefs_arr;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen unsigned int i;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if (!dbox_attachment_parse_extref_real(ext_refs, pool_datastack_create(),
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen path_suffix = file->storage->v.get_attachment_path_suffix(file);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen path = t_strdup_printf("%s/%s%s", file->storage->attachment_dir,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen uoff_t part_size = extref->start_offset - last_voffset;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen input = i_stream_create_limit(*stream, part_size);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen i_stream_seek(*stream, (*stream)->v_offset + part_size);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen input2 = i_stream_create_file(path, IO_BLOCK_SIZE);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen input = i_stream_create_base64_encoder(input2,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen input = i_stream_create_attachment(input2, extref->size);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen uoff_t trailer_size = psize - (*stream)->v_offset;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen input = i_stream_create_limit(*stream, trailer_size);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainenint dbox_attachment_file_get_stream(struct dbox_file *file,
0beef9bf818accfb629a92ef53ff0f6a15005941Timo Sirainen /* need to read metadata in case there are external references */
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if ((ret = dbox_file_metadata_read(file)) <= 0)
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen i_stream_seek(file->input, file->cur_offset + file->msg_header_size);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen ext_refs = dbox_file_metadata_get(file, DBOX_METADATA_EXT_REF);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen /* we have external references. */
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen ret = dbox_attachment_file_get_stream_from(file, ext_refs,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen dbox_file_set_corrupted(file, "Ext refs metadata corrupted: %s",