core: New GPGME_DATA_ENCODING_MIME.

* src/gpgme.h.in (GPGME_DATA_ENCODING_MIME): New.
* src/data.c (gpgme_data_set_encoding): Adjust check.
* src/engine-gpg.c (have_gpg_version): New.
(gpg_encrypt, gpg_encrypt_sign): Pass flag '--mimemode'.
(gpg_sign): Ditto.

* lang/cpp/src/data.h (GpgME): Add MimeEncoding.
* lang/cpp/src/data.cpp (encoding, setEncoding): Support MimeEncoding.

* src/gpgme-tool.c (server_data_encoding): Add flag --mime.
--

This feature allows an application to declare that the encrypted or
signed data is a valid MIME part.

What is missing is a way to return that information to the application
after decryption/verification.  This can be done by setting the
encoding of the output data object; however this requires some
internal additions to our processing model.

Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
Werner Koch 2016-07-13 14:45:02 +02:00
parent 2095b1573a
commit d8d5f5a167
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
8 changed files with 38 additions and 5 deletions

1
NEWS
View File

@ -20,6 +20,7 @@ Noteworthy changes in version 1.7.0 (unreleased) [C25/A14/R_]
GPGME_STATUS_NOTATION_FLAGS NEW. GPGME_STATUS_NOTATION_FLAGS NEW.
GPGME_DATA_TYPE_PGP_ENCRYPTED NEW. GPGME_DATA_TYPE_PGP_ENCRYPTED NEW.
GPGME_DATA_TYPE_PGP_SIGNATURE NEW. GPGME_DATA_TYPE_PGP_SIGNATURE NEW.
GPGME_DATA_ENCODING_MIME NEW.
Noteworthy changes in version 1.6.0 (2015-08-26) [C25/A14/R0] Noteworthy changes in version 1.6.0 (2015-08-26) [C25/A14/R0]

View File

@ -2130,6 +2130,9 @@ scheme as used by @acronym{MIME} and other protocols.
This specifies that the data is encoded in an armored form as used by This specifies that the data is encoded in an armored form as used by
OpenPGP and PEM. OpenPGP and PEM.
@item GPGME_DATA_ENCODING_MIME
This specifies that the data is encoded as a MIME part.
@item GPGME_DATA_ENCODING_URL @item GPGME_DATA_ENCODING_URL
The data is a list of linefeed delimited URLs. This is only useful with The data is a list of linefeed delimited URLs. This is only useful with
@code{gpgme_op_import}. @code{gpgme_op_import}.

View File

@ -146,6 +146,7 @@ GpgME::Data::Encoding GpgME::Data::encoding() const
case GPGME_DATA_ENCODING_BINARY: return BinaryEncoding; case GPGME_DATA_ENCODING_BINARY: return BinaryEncoding;
case GPGME_DATA_ENCODING_BASE64: return Base64Encoding; case GPGME_DATA_ENCODING_BASE64: return Base64Encoding;
case GPGME_DATA_ENCODING_ARMOR: return ArmorEncoding; case GPGME_DATA_ENCODING_ARMOR: return ArmorEncoding;
case GPGME_DATA_ENCODING_MIME: return MimeEncoding;
} }
return AutoEncoding; return AutoEncoding;
} }
@ -158,6 +159,7 @@ GpgME::Error GpgME::Data::setEncoding(Encoding enc)
case BinaryEncoding: ge = GPGME_DATA_ENCODING_BINARY; break; case BinaryEncoding: ge = GPGME_DATA_ENCODING_BINARY; break;
case Base64Encoding: ge = GPGME_DATA_ENCODING_BASE64; break; case Base64Encoding: ge = GPGME_DATA_ENCODING_BASE64; break;
case ArmorEncoding: ge = GPGME_DATA_ENCODING_ARMOR; break; case ArmorEncoding: ge = GPGME_DATA_ENCODING_ARMOR; break;
case MimeEncoding: ge = GPGME_DATA_ENCODING_MIME; break;
} }
return Error(gpgme_data_set_encoding(d->data, ge)); return Error(gpgme_data_set_encoding(d->data, ge));
} }

View File

@ -77,7 +77,8 @@ public:
AutoEncoding, AutoEncoding,
BinaryEncoding, BinaryEncoding,
Base64Encoding, Base64Encoding,
ArmorEncoding ArmorEncoding,
MimeEncoding
}; };
Encoding encoding() const; Encoding encoding() const;
Error setEncoding(Encoding encoding); Error setEncoding(Encoding encoding);

View File

@ -193,7 +193,7 @@ gpgme_data_set_encoding (gpgme_data_t dh, gpgme_data_encoding_t enc)
"encoding=%i", enc); "encoding=%i", enc);
if (!dh) if (!dh)
return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE)); return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
if (enc < 0 || enc > GPGME_DATA_ENCODING_URL0) if (enc < 0 || enc > GPGME_DATA_ENCODING_MIME)
return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE)); return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
dh->encoding = enc; dh->encoding = enc;
return TRACE_ERR (0); return TRACE_ERR (0);

View File

@ -294,6 +294,15 @@ add_data (engine_gpg_t gpg, gpgme_data_t data, int dup_to, int inbound)
return 0; return 0;
} }
/* Return true if the engine's version is at least VERSION. */
static int
have_gpg_version (engine_gpg_t gpg, const char *version)
{
return _gpgme_compare_versions (gpg->version, version);
}
static char * static char *
gpg_get_version (const char *file_name) gpg_get_version (const char *file_name)
@ -1719,6 +1728,10 @@ gpg_encrypt (void *engine, gpgme_key_t recp[], gpgme_encrypt_flags_t flags,
if (!err && (flags & GPGME_ENCRYPT_NO_COMPRESS)) if (!err && (flags & GPGME_ENCRYPT_NO_COMPRESS))
err = add_arg (gpg, "--compress-algo=none"); err = add_arg (gpg, "--compress-algo=none");
if (gpgme_data_get_encoding (plain) == GPGME_DATA_ENCODING_MIME
&& have_gpg_version (gpg, "2.1.14"))
err = add_arg (gpg, "--mimemode");
if (!symmetric) if (!symmetric)
{ {
/* If we know that all recipients are valid (full or ultimate trust) /* If we know that all recipients are valid (full or ultimate trust)
@ -1779,6 +1792,10 @@ gpg_encrypt_sign (void *engine, gpgme_key_t recp[],
if (!err && (flags & GPGME_ENCRYPT_NO_COMPRESS)) if (!err && (flags & GPGME_ENCRYPT_NO_COMPRESS))
err = add_arg (gpg, "--compress-algo=none"); err = add_arg (gpg, "--compress-algo=none");
if (gpgme_data_get_encoding (plain) == GPGME_DATA_ENCODING_MIME
&& have_gpg_version (gpg, "2.1.14"))
err = add_arg (gpg, "--mimemode");
if (!symmetric) if (!symmetric)
{ {
/* If we know that all recipients are valid (full or ultimate trust) /* If we know that all recipients are valid (full or ultimate trust)
@ -2381,8 +2398,14 @@ gpg_sign (void *engine, gpgme_data_t in, gpgme_data_t out,
err = add_arg (gpg, "--detach"); err = add_arg (gpg, "--detach");
if (!err && use_armor) if (!err && use_armor)
err = add_arg (gpg, "--armor"); err = add_arg (gpg, "--armor");
if (!err && use_textmode) if (!err)
err = add_arg (gpg, "--textmode"); {
if (gpgme_data_get_encoding (in) == GPGME_DATA_ENCODING_MIME
&& have_gpg_version (gpg, "2.1.14"))
err = add_arg (gpg, "--mimemode");
else if (use_textmode)
err = add_arg (gpg, "--textmode");
}
} }
if (!err) if (!err)

View File

@ -1876,6 +1876,8 @@ server_data_encoding (const char *line)
return GPGME_DATA_ENCODING_URLESC; return GPGME_DATA_ENCODING_URLESC;
if (strstr (line, "--url0")) if (strstr (line, "--url0"))
return GPGME_DATA_ENCODING_URL0; return GPGME_DATA_ENCODING_URL0;
if (strstr (line, "--mime"))
return GPGME_DATA_ENCODING_MIME;
return GPGME_DATA_ENCODING_NONE; return GPGME_DATA_ENCODING_NONE;
} }

View File

@ -228,7 +228,8 @@ typedef enum
GPGME_DATA_ENCODING_ARMOR = 3, /* Either PEM or OpenPGP Armor. */ GPGME_DATA_ENCODING_ARMOR = 3, /* Either PEM or OpenPGP Armor. */
GPGME_DATA_ENCODING_URL = 4, /* LF delimited URL list. */ GPGME_DATA_ENCODING_URL = 4, /* LF delimited URL list. */
GPGME_DATA_ENCODING_URLESC = 5, /* Ditto, but percent escaped. */ GPGME_DATA_ENCODING_URLESC = 5, /* Ditto, but percent escaped. */
GPGME_DATA_ENCODING_URL0 = 6 /* Nul delimited URL list. */ GPGME_DATA_ENCODING_URL0 = 6, /* Nul delimited URL list. */
GPGME_DATA_ENCODING_MIME = 7 /* Data is a MIME part. */
} }
gpgme_data_encoding_t; gpgme_data_encoding_t;