|
|
@ -214,3 +214,60 @@ the_end: |
|
|
|
free_stringlist(keylist); |
|
|
|
return status; |
|
|
|
} |
|
|
|
|
|
|
|
PEP_STATUS try_base_prepare_message( |
|
|
|
PEP_SESSION session, |
|
|
|
const pEp_identity *me, |
|
|
|
const pEp_identity *partner, |
|
|
|
base_protocol_type type, |
|
|
|
char *payload, |
|
|
|
size_t size, |
|
|
|
const char *fpr, |
|
|
|
message **result |
|
|
|
) |
|
|
|
{ |
|
|
|
PEP_STATUS status = PEP_STATUS_OK; |
|
|
|
|
|
|
|
assert(me); |
|
|
|
assert(partner); |
|
|
|
assert(payload); |
|
|
|
assert(size); |
|
|
|
assert(result); |
|
|
|
assert(type == BASE_SYNC || type == BASE_KEYRESET); |
|
|
|
|
|
|
|
if (!(me && partner && payload && size && result && type)) |
|
|
|
return PEP_ILLEGAL_VALUE; |
|
|
|
|
|
|
|
// https://dev.pep.foundation/Engine/MessageToSendPassphrase |
|
|
|
|
|
|
|
if (session->curr_passphrase) { |
|
|
|
// first try with empty passphrase |
|
|
|
char *passphrase = session->curr_passphrase; |
|
|
|
session->curr_passphrase = NULL; |
|
|
|
status = base_prepare_message(session, me, partner, type, payload, size, fpr, result); |
|
|
|
session->curr_passphrase = passphrase; |
|
|
|
if (!(status == PEP_PASSPHRASE_REQUIRED || status == PEP_WRONG_PASSPHRASE)) |
|
|
|
return status; |
|
|
|
} |
|
|
|
|
|
|
|
do { |
|
|
|
// then try passphrases |
|
|
|
status = base_prepare_message(session, me, partner, type, payload, size, fpr, result); |
|
|
|
if (status == PEP_PASSPHRASE_REQUIRED || status == PEP_WRONG_PASSPHRASE) { |
|
|
|
status = session->messageToSend(NULL); |
|
|
|
if (status == PEP_PASSPHRASE_REQUIRED || status == PEP_WRONG_PASSPHRASE) { |
|
|
|
pEp_identity *_me = identity_dup(me); |
|
|
|
if (!_me) |
|
|
|
return PEP_OUT_OF_MEMORY; |
|
|
|
session->notifyHandshake(_me, NULL, SYNC_PASSPHRASE_REQUIRED); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
break; |
|
|
|
} |
|
|
|
} while (!status); |
|
|
|
|
|
|
|
return status; |
|
|
|
} |
|
|
|
|