dbox-attachment.c revision fc45e0ed5178181de36c5efbf8a0698891e10726
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen#include "lib.h"
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen#include "istream.h"
acba68a69cdd6f3f00faa18cccef356d95048e46Timo Sirainen#include "istream-concat.h"
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen#include "str.h"
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen#include "istream-attachment.h"
acba68a69cdd6f3f00faa18cccef356d95048e46Timo Sirainen#include "istream-base64-encoder.h"
acba68a69cdd6f3f00faa18cccef356d95048e46Timo Sirainen#include "dbox-file.h"
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen#include "dbox-save.h"
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen#include "dbox-attachment.h"
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainenenum dbox_attachment_decode_option {
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen DBOX_ATTACHMENT_DECODE_OPTION_NONE = '-',
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen DBOX_ATTACHMENT_DECODE_OPTION_BASE64 = 'B',
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen DBOX_ATTACHMENT_DECODE_OPTION_CRLF = 'C'
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen};
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainenvoid dbox_attachment_save_write_metadata(struct mail_save_context *ctx,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen string_t *str)
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen{
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen const ARRAY_TYPE(mail_attachment_extref) *extrefs;
acba68a69cdd6f3f00faa18cccef356d95048e46Timo Sirainen const struct mail_attachment_extref *extref;
acba68a69cdd6f3f00faa18cccef356d95048e46Timo Sirainen bool add_space = FALSE;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen unsigned int startpos;
8f0c238dcbbfa3b984b102260a2440adac667ae8Timo Sirainen
8f0c238dcbbfa3b984b102260a2440adac667ae8Timo Sirainen extrefs = index_attachment_save_get_extrefs(ctx);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if (extrefs == NULL || array_count(extrefs) == 0)
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen return;
2303ad68175883aaebd1f3b18e69593c2422c7bbTimo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen str_append_c(str, DBOX_METADATA_EXT_REF);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen array_foreach(extrefs, extref) {
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if (!add_space)
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen add_space = TRUE;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen else
2303ad68175883aaebd1f3b18e69593c2422c7bbTimo Sirainen str_append_c(str, ' ');
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen str_printfa(str, "%"PRIuUOFF_T" %"PRIuUOFF_T" ",
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen extref->start_offset, extref->size);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
67d86acc16b837a01d0967b65fc9a81ccf54ef0bTimo Sirainen startpos = str_len(str);
67d86acc16b837a01d0967b65fc9a81ccf54ef0bTimo Sirainen if (extref->base64_have_crlf)
2303ad68175883aaebd1f3b18e69593c2422c7bbTimo Sirainen str_append_c(str, DBOX_ATTACHMENT_DECODE_OPTION_CRLF);
2303ad68175883aaebd1f3b18e69593c2422c7bbTimo Sirainen if (extref->base64_blocks_per_line > 0) {
67d86acc16b837a01d0967b65fc9a81ccf54ef0bTimo Sirainen str_printfa(str, "%c%u",
67d86acc16b837a01d0967b65fc9a81ccf54ef0bTimo Sirainen DBOX_ATTACHMENT_DECODE_OPTION_BASE64,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen extref->base64_blocks_per_line * 4);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen }
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if (startpos == str_len(str)) {
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen /* make it clear there are no options */
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen str_append_c(str, DBOX_ATTACHMENT_DECODE_OPTION_NONE);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen }
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen str_append_c(str, ' ');
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen str_append(str, extref->path);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen }
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen str_append_c(str, '\n');
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen}
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainenstatic bool
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainenparse_extref_decode_options(const char *str,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen struct mail_attachment_extref *extref)
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen{
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen unsigned int num;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if (*str == DBOX_ATTACHMENT_DECODE_OPTION_NONE)
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen return str[1] == '\0';
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen while (*str != '\0') {
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen switch (*str) {
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen case DBOX_ATTACHMENT_DECODE_OPTION_BASE64:
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen str++; num = 0;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen while (*str >= '0' && *str <= '9') {
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen num = num*10 + (*str-'0');
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen str++;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen }
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if (num == 0 || num % 4 != 0)
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen return FALSE;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen extref->base64_blocks_per_line = num/4;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen break;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen case DBOX_ATTACHMENT_DECODE_OPTION_CRLF:
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen extref->base64_have_crlf = TRUE;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen str++;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen break;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen default:
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen return FALSE;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen }
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen }
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen return TRUE;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen}
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainenstatic bool
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainendbox_attachment_parse_extref_real(const char *line, pool_t pool,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen ARRAY_TYPE(mail_attachment_extref) *extrefs)
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen{
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen struct mail_attachment_extref extref;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen const char *const *args;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen unsigned int i, len;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen uoff_t last_voffset;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen args = t_strsplit(line, " ");
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen len = str_array_length(args);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if ((len % 4) != 0)
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen return FALSE;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen last_voffset = 0;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen for (i = 0; args[i] != NULL; i += 4) {
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen const char *start_offset_str = args[i+0];
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen const char *size_str = args[i+1];
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen const char *decode_options = args[i+2];
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen const char *path = args[i+3];
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen memset(&extref, 0, sizeof(extref));
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if (str_to_uoff(start_offset_str, &extref.start_offset) < 0 ||
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen str_to_uoff(size_str, &extref.size) < 0 ||
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen extref.start_offset < last_voffset ||
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen !parse_extref_decode_options(decode_options, &extref))
67d86acc16b837a01d0967b65fc9a81ccf54ef0bTimo Sirainen return FALSE;
67d86acc16b837a01d0967b65fc9a81ccf54ef0bTimo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen last_voffset += extref.size +
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen (extref.start_offset - last_voffset);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen extref.path = p_strdup(pool, path);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen array_append(extrefs, &extref, 1);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen }
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen return TRUE;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen}
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainenbool dbox_attachment_parse_extref(const char *line, pool_t pool,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen ARRAY_TYPE(mail_attachment_extref) *extrefs)
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen{
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen bool ret;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen T_BEGIN {
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen ret = dbox_attachment_parse_extref_real(line, pool, extrefs);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen } T_END;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen return ret;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen}
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainenstatic int
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainendbox_attachment_file_get_stream_from(struct dbox_file *file,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen const char *ext_refs,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen struct istream **stream)
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen{
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen ARRAY_TYPE(mail_attachment_extref) extrefs_arr;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen ARRAY_DEFINE(streams, struct istream *);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen const struct mail_attachment_extref *extref;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen struct istream **inputs, *input, *input2;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen const char *path, *path_suffix;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen uoff_t psize, last_voffset = 0;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen unsigned int i;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen t_array_init(&extrefs_arr, 16);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if (!dbox_attachment_parse_extref_real(ext_refs, pool_datastack_create(),
67d86acc16b837a01d0967b65fc9a81ccf54ef0bTimo Sirainen &extrefs_arr))
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen return 0;
67d86acc16b837a01d0967b65fc9a81ccf54ef0bTimo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen t_array_init(&streams, 8);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen array_foreach(&extrefs_arr, extref) {
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 extref->path, path_suffix);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if (extref->start_offset != last_voffset) {
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen uoff_t part_size = extref->start_offset - last_voffset;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen input = i_stream_create_limit(*stream, part_size);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen array_append(&streams, &input, 1);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen i_stream_seek(*stream, (*stream)->v_offset + part_size);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen last_voffset += part_size;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen }
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen last_voffset += extref->size;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen input2 = i_stream_create_file(path, IO_BLOCK_SIZE);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if (extref->base64_blocks_per_line > 0) {
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen input = i_stream_create_base64_encoder(input2,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen extref->base64_blocks_per_line*4,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen extref->base64_have_crlf);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen i_stream_unref(&input2);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen input2 = input;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen }
67d86acc16b837a01d0967b65fc9a81ccf54ef0bTimo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen input = i_stream_create_attachment(input2, extref->size);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen i_stream_unref(&input2);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen array_append(&streams, &input, 1);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen }
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen psize = dbox_file_get_plaintext_size(file);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if (psize != (*stream)->v_offset) {
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen uoff_t trailer_size = psize - (*stream)->v_offset;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen input = i_stream_create_limit(*stream, trailer_size);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen array_append(&streams, &input, 1);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen (void)array_append_space(&streams);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen }
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen inputs = array_idx_modifiable(&streams, 0);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen i_stream_unref(stream);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen *stream = i_stream_create_concat(inputs);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen for (i = 0; inputs[i] != NULL; i++)
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen i_stream_unref(&inputs[i]);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen return 1;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen}
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainenint dbox_attachment_file_get_stream(struct dbox_file *file,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen struct istream **stream)
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen{
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen const char *ext_refs;
0beef9bf818accfb629a92ef53ff0f6a15005941Timo Sirainen int ret;
0beef9bf818accfb629a92ef53ff0f6a15005941Timo Sirainen
0beef9bf818accfb629a92ef53ff0f6a15005941Timo Sirainen /* need to read metadata in case there are external references */
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if ((ret = dbox_file_metadata_read(file)) <= 0)
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen return ret;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen i_stream_seek(file->input, file->cur_offset + file->msg_header_size);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen ext_refs = dbox_file_metadata_get(file, DBOX_METADATA_EXT_REF);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if (ext_refs == NULL)
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen return 1;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen /* we have external references. */
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen T_BEGIN {
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen ret = dbox_attachment_file_get_stream_from(file, ext_refs,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen stream);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen } T_END;
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen if (ret == 0) {
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen dbox_file_set_corrupted(file, "Ext refs metadata corrupted: %s",
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen ext_refs);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen }
4338c7b02e15779efaee5cedd4a355c946d9d4c2Timo Sirainen return ret;
4338c7b02e15779efaee5cedd4a355c946d9d4c2Timo Sirainen}
4338c7b02e15779efaee5cedd4a355c946d9d4c2Timo Sirainen