aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndre Heinecke <[email protected]>2016-08-10 12:12:33 +0000
committerAndre Heinecke <[email protected]>2016-08-10 12:12:33 +0000
commit09667a6006986a782af98ca1de4d6521e1b8f353 (patch)
tree9a3eb4e0b5717e25ec70a174fa75a33aec4f11fa
parentcore: Handle ENCRYPT_SYMMETRIC also for sig & enc (diff)
downloadgpgme-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.cpp71
-rw-r--r--lang/cpp/src/context.h5
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...