|
|
@ -752,37 +752,6 @@ PEPMessage_t *PEPMessage_from_message( |
|
|
|
result->opt_fields = l; |
|
|
|
} |
|
|
|
|
|
|
|
switch (msg->enc_format) { |
|
|
|
case PEP_enc_none: |
|
|
|
result->enc_format = EncFormat_none; |
|
|
|
break; |
|
|
|
// case PEP_enc_pieces: |
|
|
|
case PEP_enc_inline: |
|
|
|
result->enc_format = EncFormat_inline; |
|
|
|
break; |
|
|
|
case PEP_enc_S_MIME: |
|
|
|
result->enc_format = EncFormat_s_mime; |
|
|
|
break; |
|
|
|
case PEP_enc_PGP_MIME: |
|
|
|
result->enc_format = EncFormat_pgp_mime; |
|
|
|
break; |
|
|
|
case PEP_enc_PEP: |
|
|
|
result->enc_format = EncFormat_pEp; |
|
|
|
break; |
|
|
|
case PEP_enc_PGP_MIME_Outlook1: |
|
|
|
result->enc_format = EncFormat_pgp_mime_outlook1; |
|
|
|
break; |
|
|
|
case PEP_enc_inline_EA: |
|
|
|
result->enc_format = EncFormat_inline_ea; |
|
|
|
break; |
|
|
|
case PEP_enc_auto: |
|
|
|
result->enc_format = EncFormat_pEp; |
|
|
|
break; |
|
|
|
default: |
|
|
|
assert(0); |
|
|
|
result->enc_format = EncFormat_pEp; |
|
|
|
} |
|
|
|
|
|
|
|
if (!EMPTYSTR(msg->_sender_fpr)) { |
|
|
|
Hash_t *str = (Hash_t *) calloc(1, sizeof(Hash_t)); |
|
|
|
assert(str); |
|
|
@ -879,3 +848,231 @@ enomem: |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
message *PEPMessage_to_message( |
|
|
|
PEPMessage_t *msg, |
|
|
|
message *result, |
|
|
|
bool copy, |
|
|
|
size_t max_blob_size |
|
|
|
) |
|
|
|
{ |
|
|
|
bool allocated = !result; |
|
|
|
|
|
|
|
assert(msg); |
|
|
|
if (!msg) |
|
|
|
return NULL; |
|
|
|
|
|
|
|
if (allocated) { |
|
|
|
result = new_message(PEP_dir_incoming); |
|
|
|
if (!result) |
|
|
|
goto enomem; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->direction) { |
|
|
|
switch (*msg->direction) { |
|
|
|
case MessageDirection_incoming: |
|
|
|
result->dir = PEP_dir_incoming; |
|
|
|
break; |
|
|
|
case MessageDirection_outgoing: |
|
|
|
result->dir = PEP_dir_outgoing; |
|
|
|
break; |
|
|
|
default: |
|
|
|
assert(0); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->id) { |
|
|
|
result->id = strndup((char *) msg->id->buf, msg->id->size); |
|
|
|
assert(result->id); |
|
|
|
if (!result->id) |
|
|
|
goto enomem; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->sent) { |
|
|
|
timestamp *_sent = new_timestamp(0); |
|
|
|
if (!_sent) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
if (asn_GT2time(msg->sent, _sent, 1) == -1) |
|
|
|
goto enomem; |
|
|
|
result->sent = _sent; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->recv) { |
|
|
|
timestamp *_recv = new_timestamp(0); |
|
|
|
if (!_recv) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
if (asn_GT2time(msg->recv, _recv, 1) == -1) |
|
|
|
goto enomem; |
|
|
|
result->recv = _recv; |
|
|
|
} |
|
|
|
|
|
|
|
// from is mandatory |
|
|
|
result->from = Identity_to_Struct(&msg->from, NULL); |
|
|
|
if (!result->from) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
if (msg->to) { |
|
|
|
identity_list *il = IdentityList_to_identity_list(msg->to, NULL); |
|
|
|
if (!il) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->to = il; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->cc) { |
|
|
|
identity_list *il = IdentityList_to_identity_list(msg->cc, NULL); |
|
|
|
if (!il) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->cc = il; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->bcc) { |
|
|
|
identity_list *il = IdentityList_to_identity_list(msg->bcc, NULL); |
|
|
|
if (!il) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->bcc = il; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->recv_by) { |
|
|
|
pEp_identity *i = Identity_to_Struct(msg->recv_by, NULL); |
|
|
|
if (!i) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->recv_by = i; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->reply_to) { |
|
|
|
identity_list *il = IdentityList_to_identity_list(msg->reply_to, NULL); |
|
|
|
if (!il) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->reply_to = il; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->in_reply_to) { |
|
|
|
stringlist_t *l = PStringList_to_stringlist(msg->in_reply_to, NULL); |
|
|
|
if (!l) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->in_reply_to = l; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->references) { |
|
|
|
stringlist_t *l = PStringList_to_stringlist(msg->references, NULL); |
|
|
|
if (!l) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->references = l; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->keywords) { |
|
|
|
stringlist_t *l = PStringList_to_stringlist(msg->keywords, NULL); |
|
|
|
if (!l) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->keywords = l; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->comments) { |
|
|
|
char *s = strndup((char *) msg->comments->buf, msg->comments->size); |
|
|
|
assert(s); |
|
|
|
if (!s) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->comments = s; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->opt_fields) { |
|
|
|
stringpair_list_t *l = |
|
|
|
StringPairList_to_stringpair_list(msg->opt_fields, NULL); |
|
|
|
if (!l) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->opt_fields = l; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->sender_fpr) { |
|
|
|
char *_sender_fpr = strndup((char *) msg->sender_fpr->buf, |
|
|
|
msg->sender_fpr->size); |
|
|
|
if (_sender_fpr) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->_sender_fpr = _sender_fpr; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->shortmsg) { |
|
|
|
char *s = strndup((char *) msg->shortmsg->buf, msg->shortmsg->size); |
|
|
|
assert(s); |
|
|
|
if (!s) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->shortmsg = s; |
|
|
|
} |
|
|
|
|
|
|
|
size_t rest_blob_size = max_blob_size; |
|
|
|
|
|
|
|
if (msg->longmsg) { |
|
|
|
if (msg->longmsg->size > rest_blob_size) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
char *s = NULL; |
|
|
|
|
|
|
|
if (copy) { |
|
|
|
s = strndup((char *) msg->longmsg->buf, msg->longmsg->size); |
|
|
|
if (!s) |
|
|
|
goto enomem; |
|
|
|
rest_blob_size -= msg->longmsg->size; |
|
|
|
} |
|
|
|
else /* move */ { |
|
|
|
s = (char *) msg->longmsg->buf; |
|
|
|
msg->longmsg->buf = NULL; |
|
|
|
rest_blob_size -= msg->longmsg->size; |
|
|
|
msg->longmsg->size = 0; |
|
|
|
} |
|
|
|
|
|
|
|
result->longmsg = s; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->longmsg_formatted) { |
|
|
|
if (msg->longmsg_formatted->size > rest_blob_size) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
char *s = NULL; |
|
|
|
|
|
|
|
if (copy) { |
|
|
|
s = strndup((char *) msg->longmsg_formatted->buf, |
|
|
|
msg->longmsg_formatted->size); |
|
|
|
if (!s) |
|
|
|
goto enomem; |
|
|
|
rest_blob_size -= msg->longmsg_formatted->size; |
|
|
|
} |
|
|
|
else /* move */ { |
|
|
|
s = (char *) msg->longmsg_formatted->buf; |
|
|
|
msg->longmsg_formatted->buf = NULL; |
|
|
|
rest_blob_size -= msg->longmsg_formatted->size; |
|
|
|
msg->longmsg_formatted->size = 0; |
|
|
|
} |
|
|
|
|
|
|
|
result->longmsg_formatted = s; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->attachments) { |
|
|
|
bloblist_t *a = BlobList_to_bloblist(msg->attachments, NULL, copy, |
|
|
|
rest_blob_size); |
|
|
|
if (!a) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->attachments = a; |
|
|
|
} |
|
|
|
|
|
|
|
return result; |
|
|
|
|
|
|
|
enomem: |
|
|
|
if (allocated) |
|
|
|
free_message(result); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|