diff options
author | Andre Heinecke <[email protected]> | 2016-08-10 12:12:33 +0000 |
---|---|---|
committer | Andre Heinecke <[email protected]> | 2016-08-10 12:12:33 +0000 |
commit | 09667a6006986a782af98ca1de4d6521e1b8f353 (patch) | |
tree | 9a3eb4e0b5717e25ec70a174fa75a33aec4f11fa | |
parent | core: Handle ENCRYPT_SYMMETRIC also for sig & enc (diff) | |
download | gpgme-09667a6006986a782af98ca1de4d6521e1b8f353.tar.gz gpgme-09667a6006986a782af98ca1de4d6521e1b8f353.zip |
Cpp: Handle empty recipients consistently
* lang/cpp/src/context.cpp (Context::getKeysFromRecipients):
New helper.
(Context::encrypt, Context::startEncryption, Context::signAndEncrypt)
(Context::startCombinedSigningAndEncryption): Use new helper.
* lang/cpp/src/context.h (Context::getKeysFromRecipients): Add
as private helper.
--
bf776ce was incomplete as the code to handle recpients
was duplicated four times. This is now unified and constently
uses a nullptr instead of an empty array.
-rw-r--r-- | lang/cpp/src/context.cpp | 71 | ||||
-rw-r--r-- | lang/cpp/src/context.h | 5 |
2 files changed, 38 insertions, 38 deletions
diff --git a/lang/cpp/src/context.cpp b/lang/cpp/src/context.cpp index d63573f0..1a2741eb 100644 --- a/lang/cpp/src/context.cpp +++ b/lang/cpp/src/context.cpp @@ -1109,26 +1109,36 @@ static gpgme_encrypt_flags_t encryptflags2encryptflags(Context::EncryptionFlags return static_cast<gpgme_encrypt_flags_t>(result); } -EncryptionResult Context::encrypt(const std::vector<Key> &recipients, const Data &plainText, Data &cipherText, EncryptionFlags flags) +gpgme_key_t *const Context::getKeysFromRecipients(const std::vector<Key> &recipients) { - d->lastop = Private::Encrypt; - if (flags & NoEncryptTo) { - return EncryptionResult(Error(d->lasterr = make_error(GPG_ERR_NOT_IMPLEMENTED))); + if (recipients.empty()) { + return nullptr; } - const Data::Private *const pdp = plainText.impl(); - Data::Private *const cdp = cipherText.impl(); - gpgme_key_t *const keys = new gpgme_key_t[ recipients.size() + 1 ]; - gpgme_key_t *keys_it = keys; + gpgme_key_t *ret = new gpgme_key_t[ recipients.size() + 1 ]; + gpgme_key_t *keys_it = ret; for (std::vector<Key>::const_iterator it = recipients.begin() ; it != recipients.end() ; ++it) { if (it->impl()) { *keys_it++ = it->impl(); } } *keys_it++ = 0; - d->lasterr = gpgme_op_encrypt(d->ctx, recipients.empty() ? nullptr : keys, - encryptflags2encryptflags(flags), + return ret; +} + +EncryptionResult Context::encrypt(const std::vector<Key> &recipients, const Data &plainText, Data &cipherText, EncryptionFlags flags) +{ + d->lastop = Private::Encrypt; + if (flags & NoEncryptTo) { + return EncryptionResult(Error(d->lasterr = make_error(GPG_ERR_NOT_IMPLEMENTED))); + } + const Data::Private *const pdp = plainText.impl(); + Data::Private *const cdp = cipherText.impl(); + gpgme_key_t *const keys = getKeysFromRecipients(recipients); + d->lasterr = gpgme_op_encrypt(d->ctx, keys, encryptflags2encryptflags(flags), pdp ? pdp->data : 0, cdp ? cdp->data : 0); - delete[] keys; + if (keys) { + delete[] keys; + } return EncryptionResult(d->ctx, Error(d->lasterr)); } @@ -1149,17 +1159,12 @@ Error Context::startEncryption(const std::vector<Key> &recipients, const Data &p } const Data::Private *const pdp = plainText.impl(); Data::Private *const cdp = cipherText.impl(); - gpgme_key_t *const keys = new gpgme_key_t[ recipients.size() + 1 ]; - gpgme_key_t *keys_it = keys; - for (std::vector<Key>::const_iterator it = recipients.begin() ; it != recipients.end() ; ++it) { - if (it->impl()) { - *keys_it++ = it->impl(); - } - } - *keys_it++ = 0; + gpgme_key_t *const keys = getKeysFromRecipients(recipients); d->lasterr = gpgme_op_encrypt_start(d->ctx, keys, encryptflags2encryptflags(flags), pdp ? pdp->data : 0, cdp ? cdp->data : 0); - delete[] keys; + if (keys) { + delete[] keys; + } return Error(d->lasterr); } @@ -1177,17 +1182,12 @@ std::pair<SigningResult, EncryptionResult> Context::signAndEncrypt(const std::ve d->lastop = Private::SignAndEncrypt; const Data::Private *const pdp = plainText.impl(); Data::Private *const cdp = cipherText.impl(); - gpgme_key_t *const keys = new gpgme_key_t[ recipients.size() + 1 ]; - gpgme_key_t *keys_it = keys; - for (std::vector<Key>::const_iterator it = recipients.begin() ; it != recipients.end() ; ++it) { - if (it->impl()) { - *keys_it++ = it->impl(); - } - } - *keys_it++ = 0; + gpgme_key_t *const keys = getKeysFromRecipients(recipients); d->lasterr = gpgme_op_encrypt_sign(d->ctx, keys, encryptflags2encryptflags(flags), pdp ? pdp->data : 0, cdp ? cdp->data : 0); - delete[] keys; + if (keys) { + delete[] keys; + } return std::make_pair(SigningResult(d->ctx, Error(d->lasterr)), EncryptionResult(d->ctx, Error(d->lasterr))); } @@ -1197,17 +1197,12 @@ Error Context::startCombinedSigningAndEncryption(const std::vector<Key> &recipie d->lastop = Private::SignAndEncrypt; const Data::Private *const pdp = plainText.impl(); Data::Private *const cdp = cipherText.impl(); - gpgme_key_t *const keys = new gpgme_key_t[ recipients.size() + 1 ]; - gpgme_key_t *keys_it = keys; - for (std::vector<Key>::const_iterator it = recipients.begin() ; it != recipients.end() ; ++it) { - if (it->impl()) { - *keys_it++ = it->impl(); - } - } - *keys_it++ = 0; + gpgme_key_t *const keys = getKeysFromRecipients(recipients); d->lasterr = gpgme_op_encrypt_sign_start(d->ctx, keys, encryptflags2encryptflags(flags), pdp ? pdp->data : 0, cdp ? cdp->data : 0); - delete[] keys; + if (keys) { + delete[] keys; + } return Error(d->lasterr); } diff --git a/lang/cpp/src/context.h b/lang/cpp/src/context.h index 70ab079f..7d7f53a6 100644 --- a/lang/cpp/src/context.h +++ b/lang/cpp/src/context.h @@ -369,6 +369,11 @@ public: return d; } private: + // Helper functions that need to be context because they rely + // on the "Friendlyness" of context to access the gpgme types. + gpgme_key_t *const getKeysFromRecipients(const std::vector<Key> &recipients); + +private: Private *const d; private: // disable... |