|
|
@ -131,8 +131,8 @@ IdentityList_t *IdentityList_from_identity_list( |
|
|
|
{ |
|
|
|
bool allocated = !result; |
|
|
|
|
|
|
|
assert(list); |
|
|
|
if (!list) |
|
|
|
assert(list && list->ident); |
|
|
|
if (!(list && list->ident)) |
|
|
|
return NULL; |
|
|
|
|
|
|
|
if (allocated) { |
|
|
@ -267,8 +267,8 @@ StringPairList_t *StringPairList_from_stringpair_list( |
|
|
|
{ |
|
|
|
bool allocated = !result; |
|
|
|
|
|
|
|
assert(list); |
|
|
|
if (!list) |
|
|
|
assert(list && list->value); |
|
|
|
if (!(list && list->value)) |
|
|
|
return NULL; |
|
|
|
|
|
|
|
if (allocated) { |
|
|
@ -336,8 +336,8 @@ PStringList_t *PStringList_from_stringlist( |
|
|
|
{ |
|
|
|
bool allocated = !result; |
|
|
|
|
|
|
|
assert(list); |
|
|
|
if (!list) |
|
|
|
assert(list && list->value); |
|
|
|
if (!(list && list->value)) |
|
|
|
return NULL; |
|
|
|
|
|
|
|
if (allocated) { |
|
|
@ -410,8 +410,8 @@ BlobList_t *BlobList_from_bloblist( |
|
|
|
{ |
|
|
|
bool allocated = !result; |
|
|
|
|
|
|
|
assert(list); |
|
|
|
if (!list) |
|
|
|
assert(list && list->value); |
|
|
|
if (!(list && list->value)) |
|
|
|
return NULL; |
|
|
|
|
|
|
|
if (allocated) { |
|
|
@ -457,7 +457,11 @@ BlobList_t *BlobList_from_bloblist( |
|
|
|
} |
|
|
|
|
|
|
|
if (!EMPTYSTR(l->mime_type)) { |
|
|
|
PString_t *_mime_type = NULL; |
|
|
|
PString_t *_mime_type = (PString_t *) calloc(1, sizeof(PString_t)); |
|
|
|
assert(_mime_type); |
|
|
|
if (!_mime_type) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
r = OCTET_STRING_fromBuf(_mime_type, l->mime_type, -1); |
|
|
|
if (r) |
|
|
|
goto enomem; |
|
|
@ -465,7 +469,11 @@ BlobList_t *BlobList_from_bloblist( |
|
|
|
} |
|
|
|
|
|
|
|
if (!EMPTYSTR(l->filename)) { |
|
|
|
PString_t *_filename = NULL; |
|
|
|
PString_t *_filename = (PString_t *) calloc(1, sizeof(PString_t)); |
|
|
|
assert(_filename); |
|
|
|
if (!_filename) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
r = OCTET_STRING_fromBuf(_filename, l->filename, -1); |
|
|
|
if (r) |
|
|
|
goto enomem; |
|
|
@ -601,3 +609,273 @@ enomem: |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
PEPMessage_t *PEPMessage_from_message( |
|
|
|
message *msg, |
|
|
|
PEPMessage_t *result, |
|
|
|
bool copy, |
|
|
|
size_t max_blob_size |
|
|
|
) |
|
|
|
{ |
|
|
|
bool allocated = !result; |
|
|
|
|
|
|
|
assert(msg); |
|
|
|
if (!msg) |
|
|
|
return NULL; |
|
|
|
|
|
|
|
if (allocated) { |
|
|
|
result = (PEPMessage_t *) calloc(1, sizeof(PEPMessage_t)); |
|
|
|
assert(result); |
|
|
|
if (!result) |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
else { |
|
|
|
asn_sequence_empty(result); |
|
|
|
} |
|
|
|
|
|
|
|
// direction will be skipped on the line |
|
|
|
|
|
|
|
if (!EMPTYSTR(msg->id)) { |
|
|
|
PString_t *str = (PString_t *) calloc(1, sizeof(PString_t)); |
|
|
|
assert(str); |
|
|
|
if (!str) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
int r = OCTET_STRING_fromBuf(str, msg->id, -1); |
|
|
|
if (r) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->id = str; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->sent) { |
|
|
|
Timestamp_t *ts = asn_time2GT(NULL, msg->sent, 1); |
|
|
|
if (!ts) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->sent = ts; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->recv) { |
|
|
|
Timestamp_t *ts = asn_time2GT(NULL, msg->recv, 1); |
|
|
|
if (!ts) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->recv = ts; |
|
|
|
} |
|
|
|
|
|
|
|
if (!msg->from) // from is not optional |
|
|
|
goto enomem; |
|
|
|
Identity_from_Struct(msg->from, &result->from); |
|
|
|
|
|
|
|
if (msg->to && msg->to->ident) { |
|
|
|
IdentityList_t *l = IdentityList_from_identity_list(msg->to, NULL); |
|
|
|
if (!l) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->to = l; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->cc && msg->cc->ident) { |
|
|
|
IdentityList_t *l = IdentityList_from_identity_list(msg->cc, NULL); |
|
|
|
if (!l) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->cc = l; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->bcc && msg->bcc->ident) { |
|
|
|
IdentityList_t *l = IdentityList_from_identity_list(msg->bcc, NULL); |
|
|
|
if (!l) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->bcc = l; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->recv_by) { |
|
|
|
Identity_t *i = Identity_from_Struct(msg->recv_by, NULL); |
|
|
|
if (!i) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->recv_by = i; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->reply_to && msg->reply_to->ident) { |
|
|
|
IdentityList_t *l = IdentityList_from_identity_list(msg->reply_to, NULL); |
|
|
|
if (!l) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->reply_to = l; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->in_reply_to && msg->in_reply_to->value) { |
|
|
|
PStringList_t *l = PStringList_from_stringlist(msg->in_reply_to, NULL); |
|
|
|
if (!l) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->in_reply_to = l; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->references && msg->references->value) { |
|
|
|
PStringList_t *l = PStringList_from_stringlist(msg->references, NULL); |
|
|
|
if (!l) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->references = l; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->keywords && msg->keywords->value) { |
|
|
|
PStringList_t *l = PStringList_from_stringlist(msg->keywords, NULL); |
|
|
|
if (!l) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->keywords = l; |
|
|
|
} |
|
|
|
|
|
|
|
if (!EMPTYSTR(msg->comments)) { |
|
|
|
PString_t *str = (PString_t *) calloc(1, sizeof(PString_t)); |
|
|
|
assert(str); |
|
|
|
if (!str) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
int r = OCTET_STRING_fromBuf(str, msg->comments, -1); |
|
|
|
if (r) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->comments = str; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->opt_fields && msg->opt_fields->value) { |
|
|
|
StringPairList_t *l = StringPairList_from_stringpair_list(msg->opt_fields, NULL); |
|
|
|
if (!l) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
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); |
|
|
|
if (!str) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
int r = OCTET_STRING_fromBuf(str, msg->_sender_fpr, -1); |
|
|
|
if (r) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->sender_fpr = str; |
|
|
|
} |
|
|
|
|
|
|
|
if (!EMPTYSTR(msg->shortmsg)) { |
|
|
|
PString_t *str = (PString_t *) calloc(1, sizeof(PString_t)); |
|
|
|
assert(str); |
|
|
|
if (!str) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
int r = OCTET_STRING_fromBuf(str, msg->shortmsg, -1); |
|
|
|
if (r) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
result->shortmsg = str; |
|
|
|
} |
|
|
|
|
|
|
|
size_t rest_blob_size = max_blob_size; |
|
|
|
|
|
|
|
if (!EMPTYSTR(msg->longmsg)) { |
|
|
|
PString_t *str = (PString_t *) calloc(1, sizeof(PString_t)); |
|
|
|
assert(str); |
|
|
|
if (!str) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
if (copy) { |
|
|
|
int r = OCTET_STRING_fromBuf(str, msg->longmsg, -1); |
|
|
|
if (r) |
|
|
|
goto enomem; |
|
|
|
if (str->size > rest_blob_size) |
|
|
|
goto enomem; |
|
|
|
} |
|
|
|
else /* move */ { |
|
|
|
str->size = strlen(msg->longmsg); |
|
|
|
if (str->size > rest_blob_size) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
str->buf = (uint8_t *) msg->longmsg; |
|
|
|
msg->longmsg = NULL; |
|
|
|
} |
|
|
|
|
|
|
|
rest_blob_size -= str->size; |
|
|
|
result->longmsg = str; |
|
|
|
} |
|
|
|
|
|
|
|
if (!EMPTYSTR(msg->longmsg_formatted)) { |
|
|
|
PString_t *str = (PString_t *) calloc(1, sizeof(PString_t)); |
|
|
|
assert(str); |
|
|
|
if (!str) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
if (copy) { |
|
|
|
int r = OCTET_STRING_fromBuf(str, msg->longmsg_formatted, -1); |
|
|
|
if (r) |
|
|
|
goto enomem; |
|
|
|
if (str->size > rest_blob_size) |
|
|
|
goto enomem; |
|
|
|
} |
|
|
|
else /* move */ { |
|
|
|
str->size = strlen(msg->longmsg_formatted); |
|
|
|
if (str->size > rest_blob_size) |
|
|
|
goto enomem; |
|
|
|
|
|
|
|
str->buf = (uint8_t *) msg->longmsg_formatted; |
|
|
|
msg->longmsg_formatted = NULL; |
|
|
|
} |
|
|
|
|
|
|
|
rest_blob_size -= str->size; |
|
|
|
result->longmsg_formatted = str; |
|
|
|
} |
|
|
|
|
|
|
|
if (msg->attachments && msg->attachments->value) { |
|
|
|
BlobList_t *bl = BlobList_from_bloblist(msg->attachments, NULL, copy, |
|
|
|
rest_blob_size); |
|
|
|
if (!bl) |
|
|
|
goto enomem; |
|
|
|
result->attachments = bl; |
|
|
|
} |
|
|
|
|
|
|
|
return result; |
|
|
|
|
|
|
|
enomem: |
|
|
|
if (allocated) |
|
|
|
ASN_STRUCT_FREE(asn_DEF_PEPMessage, result); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|