|
|
@ -2749,94 +2749,38 @@ DYNAMIC_API PEP_STATUS encrypt_message( |
|
|
|
// Update the identities and gather key and version information |
|
|
|
// for sending |
|
|
|
// |
|
|
|
if (enc_format != PEP_enc_none && (_il = src->bcc) && _il->ident) |
|
|
|
// BCC limited support: |
|
|
|
{ |
|
|
|
// - App splits mails with BCC in multiple mails. |
|
|
|
// - Each email is encrypted separately |
|
|
|
if(_il->next || (src->to && src->to->ident) || (src->cc && src->cc->ident)) |
|
|
|
{ |
|
|
|
// Only one Bcc with no other recipient allowed for now |
|
|
|
return PEP_ILLEGAL_VALUE; |
|
|
|
} |
|
|
|
|
|
|
|
// If you think this call is a beast, try the cut-and-pasted code 3 x |
|
|
|
PEP_STATUS _status = _update_state_for_ident_list( |
|
|
|
session, src->from, _il, |
|
|
|
&_k, |
|
|
|
&max_comm_type, |
|
|
|
&max_version_major, |
|
|
|
&max_version_minor, |
|
|
|
&has_pEp_user, |
|
|
|
&dest_keys_found, |
|
|
|
true); |
|
|
|
|
|
|
|
switch (_status) { |
|
|
|
case PEP_PASSPHRASE_REQUIRED: |
|
|
|
case PEP_PASSPHRASE_FOR_NEW_KEYS_REQUIRED: |
|
|
|
case PEP_WRONG_PASSPHRASE: |
|
|
|
status = _status; |
|
|
|
goto pEp_error; |
|
|
|
case PEP_STATUS_OK: |
|
|
|
break; |
|
|
|
default: |
|
|
|
status = PEP_UNENCRYPTED; |
|
|
|
goto pEp_error; |
|
|
|
} |
|
|
|
} |
|
|
|
else // Non BCC |
|
|
|
{ |
|
|
|
|
|
|
|
// If you think this call is a beast, try the cut-and-pasted code 3 x |
|
|
|
PEP_STATUS _status = PEP_STATUS_OK; |
|
|
|
|
|
|
|
if (src->to) { |
|
|
|
_status = _update_state_for_ident_list( |
|
|
|
session, src->from, src->to, |
|
|
|
&_k, |
|
|
|
&max_comm_type, |
|
|
|
&max_version_major, |
|
|
|
&max_version_minor, |
|
|
|
&has_pEp_user, |
|
|
|
&dest_keys_found, |
|
|
|
false |
|
|
|
); |
|
|
|
switch (_status) { |
|
|
|
case PEP_PASSPHRASE_REQUIRED: |
|
|
|
case PEP_PASSPHRASE_FOR_NEW_KEYS_REQUIRED: |
|
|
|
case PEP_WRONG_PASSPHRASE: |
|
|
|
goto pEp_error; |
|
|
|
case PEP_STATUS_OK: |
|
|
|
break; |
|
|
|
default: |
|
|
|
status = PEP_UNENCRYPTED; |
|
|
|
goto pEp_error; |
|
|
|
} |
|
|
|
} |
|
|
|
if (src->cc) { |
|
|
|
_status = _update_state_for_ident_list( |
|
|
|
session, src->from, src->cc, |
|
|
|
&_k, |
|
|
|
&max_comm_type, |
|
|
|
&max_version_major, |
|
|
|
&max_version_minor, |
|
|
|
&has_pEp_user, |
|
|
|
&dest_keys_found, |
|
|
|
false |
|
|
|
); |
|
|
|
switch (_status) { |
|
|
|
case PEP_PASSPHRASE_REQUIRED: |
|
|
|
case PEP_PASSPHRASE_FOR_NEW_KEYS_REQUIRED: |
|
|
|
case PEP_WRONG_PASSPHRASE: |
|
|
|
goto pEp_error; |
|
|
|
case PEP_STATUS_OK: |
|
|
|
break; |
|
|
|
default: |
|
|
|
status = PEP_UNENCRYPTED; |
|
|
|
goto pEp_error; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
# define UPDATE_STATE_FOR_IDENT_LIST_AND_JUMP_ON_ERROR( \ |
|
|
|
ident_list_actual, \ |
|
|
|
suppress_update_for_bcc) \ |
|
|
|
do { \ |
|
|
|
identity_list *ident_list = (ident_list_actual); \ |
|
|
|
if (ident_list) { \ |
|
|
|
status = _update_state_for_ident_list( \ |
|
|
|
session, src->from, ident_list, \ |
|
|
|
&_k, \ |
|
|
|
&max_comm_type, \ |
|
|
|
&max_version_major, \ |
|
|
|
&max_version_minor, \ |
|
|
|
&has_pEp_user, \ |
|
|
|
&dest_keys_found, \ |
|
|
|
(suppress_update_for_bcc) \ |
|
|
|
); \ |
|
|
|
switch (status) { \ |
|
|
|
case PEP_PASSPHRASE_REQUIRED: \ |
|
|
|
case PEP_PASSPHRASE_FOR_NEW_KEYS_REQUIRED: \ |
|
|
|
case PEP_WRONG_PASSPHRASE: \ |
|
|
|
goto pEp_error; \ |
|
|
|
case PEP_STATUS_OK: \ |
|
|
|
break; \ |
|
|
|
default: \ |
|
|
|
status = PEP_UNENCRYPTED; \ |
|
|
|
goto pEp_error; \ |
|
|
|
} \ |
|
|
|
} \ |
|
|
|
} while (false) |
|
|
|
UPDATE_STATE_FOR_IDENT_LIST_AND_JUMP_ON_ERROR (src->to, false); |
|
|
|
UPDATE_STATE_FOR_IDENT_LIST_AND_JUMP_ON_ERROR (src->cc, false); |
|
|
|
UPDATE_STATE_FOR_IDENT_LIST_AND_JUMP_ON_ERROR (src->bcc, true); |
|
|
|
|
|
|
|
if (max_version_major < 2) |
|
|
|
force_v_1 = true; |
|
|
|