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 /lang/cpp/src/context.cpp | |
| 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.
Diffstat (limited to 'lang/cpp/src/context.cpp')
| -rw-r--r-- | lang/cpp/src/context.cpp | 71 | 
1 files changed, 33 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);  } | 
