#include "ioloop.h"
#include "array.h"
#include "hex-dec.h"
+#include "hex-binary.h"
#include "hostpid.h"
#include "istream.h"
#include "ostream.h"
#include "mkdir-parents.h"
#include "fdatasync-path.h"
#include "eacces-error.h"
+#include "sha1.h"
#include "str.h"
#include "dbox-storage.h"
#include "dbox-file.h"
sizeof(dbox_msg_hdr->message_size_hex));
dbox_msg_hdr->save_lf = '\n';
}
+
+void dbox_get_guid_128(const char *input, buffer_t *output)
+{
+ unsigned char sha1_sum[SHA1_RESULTLEN];
+
+ buffer_set_used_size(output, 0);
+ if (strlen(input) != DBOX_GUID_BIN_LEN*2 ||
+ hex_to_binary(input, output) < 0 ||
+ output->used != DBOX_GUID_BIN_LEN) {
+ /* not 128bit hex. use a hash of it instead. */
+ buffer_set_used_size(output, 0);
+ sha1_get_digest(input, strlen(input), sha1_sum);
+#if SHA1_RESULTLEN < DBOX_GUID_BIN_LEN
+# error not possible
+#endif
+ buffer_append(output,
+ sha1_sum + SHA1_RESULTLEN - DBOX_GUID_BIN_LEN,
+ DBOX_GUID_BIN_LEN);
+ }
+}
int dbox_file_header_write(struct dbox_file *file, struct ostream *output);
int dbox_file_read_mail_header(struct dbox_file *file, uoff_t *physical_size_r);
int dbox_file_metadata_skip_header(struct dbox_file *file);
+void dbox_get_guid_128(const char *input, buffer_t *output);
#endif
if (ctx->ctx.guid != NULL && ctx->cur_file->single_mbox == NULL) {
guid_buf = buffer_create_dynamic(pool_datastack_create(),
sizeof(guid_128));
- if (strlen(guid) != sizeof(guid_128)*2 ||
- hex_to_binary(guid, guid_buf) < 0 ||
- guid_buf->used != sizeof(guid_128))
- guid = NULL;
- else
- memcpy(guid_128, guid_buf->data, sizeof(guid_128));
- }
-
- if (guid == NULL) {
+ dbox_get_guid_128(guid, guid_buf);
+ memcpy(guid_128, guid_buf->data, sizeof(guid_128));
+ } else {
mail_generate_guid_128(guid_128);
guid = binary_to_hex(guid_128, sizeof(guid_128));
}
#include "ioloop.h"
#include "istream.h"
#include "hash.h"
-#include "hex-binary.h"
#include "str.h"
#include "dbox-storage.h"
#include "dbox-file.h"
ret = 0;
break;
}
- buffer_set_used_size(guid_buf, 0);
- if (hex_to_binary(guid, guid_buf) < 0 ||
- guid_buf->used != sizeof(rec->guid_128)) {
- dbox_file_set_corrupted(file,
- "Message GUID is not 128 bit hex: %s", guid);
- ret = 0;
- break;
- }
+ dbox_get_guid_128(guid, guid_buf);
rec = p_new(ctx->pool, struct dbox_rebuild_msg, 1);
rec->file_id = file_id;