Support --locate-keys feature of gpg.
This commit is contained in:
parent
14d099181c
commit
b72c001283
4
NEWS
4
NEWS
@ -1,6 +1,10 @@
|
||||
Noteworthy changes in version 1.1.7 (unreleased)
|
||||
------------------------------------------------
|
||||
|
||||
* Using GPGME_KEYLIST_MODE_LOCAL combined with
|
||||
GPGME_KEYLIST_MODE_EXTERN is now supported; it uses the
|
||||
--locate-keys feature of gpg (>= 2.0.10).
|
||||
|
||||
* The encoding of gpgme_data_t objects can affect the output encoding
|
||||
of export, sign and encrypt operations now (the same operations
|
||||
that are also affected by the ASCII mode switch). We believe this
|
||||
|
4
TODO
4
TODO
@ -148,6 +148,10 @@ Hey Emacs, this is -*- outline -*- mode!
|
||||
** Map ASSUAN/GpgSM ERR error values in a better way than is done now. !!
|
||||
** Some error values should identify the source more correctly (mostly error
|
||||
values derived from status messages).
|
||||
** In rungpg.c we need to check the version of the engine
|
||||
This requires a way to get the cached version number from the
|
||||
engine layer.
|
||||
|
||||
|
||||
* Tests
|
||||
** Write a fake gpg-agent so that we can supply known passphrases to
|
||||
|
@ -2180,10 +2180,10 @@ is the default.
|
||||
|
||||
@item GPGME_KEYLIST_MODE_EXTERN
|
||||
The @code{GPGME_KEYLIST_MODE_EXTERN} symbol specifies that an external
|
||||
source should be searched for keys in the keylisting
|
||||
operation. The type of external source is dependant on the crypto
|
||||
engine used. For example, it can be a remote keyserver or LDAP
|
||||
certificate server.
|
||||
source should be searched for keys in the keylisting operation. The
|
||||
type of external source is dependant on the crypto engine used and
|
||||
whether it is combined with @code{GPGME_KEYLIST_MODE_LOCAL}. For
|
||||
example, it can be a remote keyserver or LDAP certificate server.
|
||||
|
||||
@item GPGME_KEYLIST_MODE_SIGS
|
||||
The @code{GPGME_KEYLIST_MODE_SIGS} symbol specifies that the key
|
||||
@ -2208,7 +2208,7 @@ At least one of @code{GPGME_KEYLIST_MODE_LOCAL} and
|
||||
@code{GPGME_KEYLIST_MODE_EXTERN} must be specified. For future binary
|
||||
compatibility, you should get the current mode with
|
||||
@code{gpgme_get_keylist_mode} and modify it by setting or clearing the
|
||||
appropriate bits, and then using that calulcated value in the
|
||||
appropriate bits, and then using that calculated value in the
|
||||
@code{gpgme_set_keylisting_mode} operation. This will leave all other
|
||||
bits in the mode value intact (in particular those that are not used
|
||||
in the current version of the library).
|
||||
|
@ -1,3 +1,14 @@
|
||||
2008-05-07 Werner Koch <wk@g10code.com>
|
||||
|
||||
* engine-gpgconf.c (gpgconf_write): Change argv[0] to a
|
||||
self-explaining string. Needs a proper fix, though.
|
||||
|
||||
* rungpg.c (gpg_keylist, gpg_keylist_ext): Factor common code out
|
||||
to ..
|
||||
(gpg_build_keylist_options): .. new. Allow combination of extern
|
||||
and intern mode.
|
||||
(gpg_new): DFT_TTYNAME is an array, thus check the first character.
|
||||
|
||||
2008-05-06 Werner Koch <wk@g10code.com>
|
||||
|
||||
* version.c (extract_version_string): New.
|
||||
|
@ -628,7 +628,7 @@ gpgconf_write (void *engine, char *arg1, char *arg2, gpgme_data_t conf)
|
||||
|
||||
/* _gpgme_engine_new guarantees that this is not NULL. */
|
||||
argv[0] = gpgconf->file_name;
|
||||
argv[0] = "/home/marcus/g10/install/bin/gpgconf";
|
||||
argv[0] = "/nowhere/path-needs-to-be-fixed/gpgconf";
|
||||
|
||||
if (_gpgme_io_pipe (rp, 0) < 0)
|
||||
return gpg_error_from_syserror ();
|
||||
|
@ -72,7 +72,7 @@ extern "C" {
|
||||
AM_PATH_GPGME macro) check that this header matches the installed
|
||||
library. Warning: Do not edit the next line. configure will do
|
||||
that for you! */
|
||||
#define GPGME_VERSION "1.1.7-svn1307"
|
||||
#define GPGME_VERSION "1.1.7-svn1311"
|
||||
|
||||
|
||||
|
||||
|
@ -486,7 +486,7 @@ gpg_new (void **engine, const char *file_name, const char *home_dir)
|
||||
rc = gpg_error_from_errno (errno);
|
||||
else
|
||||
{
|
||||
if (dft_ttyname)
|
||||
if (*dft_ttyname)
|
||||
{
|
||||
rc = add_arg (gpg, "--ttyname");
|
||||
if (!rc)
|
||||
@ -1872,19 +1872,11 @@ gpg_keylist_preprocess (char *line, char **r_line)
|
||||
}
|
||||
|
||||
|
||||
static gpgme_error_t
|
||||
gpg_keylist (void *engine, const char *pattern, int secret_only,
|
||||
static gpg_error_t
|
||||
gpg_keylist_build_options (engine_gpg_t gpg, int secret_only,
|
||||
gpgme_keylist_mode_t mode)
|
||||
{
|
||||
engine_gpg_t gpg = engine;
|
||||
gpgme_error_t err;
|
||||
|
||||
if (mode & GPGME_KEYLIST_MODE_EXTERN)
|
||||
{
|
||||
if ((mode & GPGME_KEYLIST_MODE_LOCAL)
|
||||
|| secret_only)
|
||||
return gpg_error (GPG_ERR_NOT_SUPPORTED);
|
||||
}
|
||||
gpg_error_t err;
|
||||
|
||||
err = add_arg (gpg, "--with-colons");
|
||||
if (!err)
|
||||
@ -1893,7 +1885,8 @@ gpg_keylist (void *engine, const char *pattern, int secret_only,
|
||||
err = add_arg (gpg, "--with-fingerprint");
|
||||
if (!err)
|
||||
err = add_arg (gpg, "--with-fingerprint");
|
||||
if (!err && (mode & GPGME_KEYLIST_MODE_SIGS)
|
||||
if (!err
|
||||
&& (mode & GPGME_KEYLIST_MODE_SIGS)
|
||||
&& (mode & GPGME_KEYLIST_MODE_SIG_NOTATIONS))
|
||||
{
|
||||
err = add_arg (gpg, "--list-options");
|
||||
@ -1902,11 +1895,28 @@ gpg_keylist (void *engine, const char *pattern, int secret_only,
|
||||
}
|
||||
if (!err)
|
||||
{
|
||||
if (mode & GPGME_KEYLIST_MODE_EXTERN)
|
||||
if ( (mode & GPGME_KEYLIST_MODE_EXTERN) )
|
||||
{
|
||||
if (secret_only)
|
||||
err = gpg_error (GPG_ERR_NOT_SUPPORTED);
|
||||
else if ( (mode & GPGME_KEYLIST_MODE_LOCAL))
|
||||
{
|
||||
/* The local+extern mode is special. It works only with
|
||||
gpg >= 2.0.10. FIXME: We should check that we have
|
||||
such a version to that we can return a proper error
|
||||
code. The problem is that we don't know the context
|
||||
here and thus can't accesses the cached version
|
||||
number for the engine info structure. */
|
||||
err = add_arg (gpg, "--locate-keys");
|
||||
if ((mode & GPGME_KEYLIST_MODE_SIGS))
|
||||
err = add_arg (gpg, "--with-sig-check");
|
||||
}
|
||||
else
|
||||
{
|
||||
err = add_arg (gpg, "--search-keys");
|
||||
gpg->colon.preprocess_fnc = gpg_keylist_preprocess;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
err = add_arg (gpg, secret_only ? "--list-secret-keys"
|
||||
@ -1914,10 +1924,22 @@ gpg_keylist (void *engine, const char *pattern, int secret_only,
|
||||
? "--check-sigs" : "--list-keys"));
|
||||
}
|
||||
}
|
||||
|
||||
/* Tell the gpg object about the data. */
|
||||
if (!err)
|
||||
err = add_arg (gpg, "--");
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
static gpgme_error_t
|
||||
gpg_keylist (void *engine, const char *pattern, int secret_only,
|
||||
gpgme_keylist_mode_t mode)
|
||||
{
|
||||
engine_gpg_t gpg = engine;
|
||||
gpgme_error_t err;
|
||||
|
||||
err = gpg_keylist_build_options (gpg, secret_only, mode);
|
||||
|
||||
if (!err && pattern && *pattern)
|
||||
err = add_arg (gpg, pattern);
|
||||
|
||||
@ -1938,26 +1960,7 @@ gpg_keylist_ext (void *engine, const char *pattern[], int secret_only,
|
||||
if (reserved)
|
||||
return gpg_error (GPG_ERR_INV_VALUE);
|
||||
|
||||
err = add_arg (gpg, "--with-colons");
|
||||
if (!err)
|
||||
err = add_arg (gpg, "--fixed-list-mode");
|
||||
if (!err)
|
||||
err = add_arg (gpg, "--with-fingerprint");
|
||||
if (!err)
|
||||
err = add_arg (gpg, "--with-fingerprint");
|
||||
if (!err && (mode & GPGME_KEYLIST_MODE_SIGS)
|
||||
&& (mode & GPGME_KEYLIST_MODE_SIG_NOTATIONS))
|
||||
{
|
||||
err = add_arg (gpg, "--list-options");
|
||||
if (!err)
|
||||
err = add_arg (gpg, "show-sig-subpackets=\"20,26\"");
|
||||
}
|
||||
if (!err)
|
||||
err = add_arg (gpg, secret_only ? "--list-secret-keys"
|
||||
: ((mode & GPGME_KEYLIST_MODE_SIGS)
|
||||
? "--check-sigs" : "--list-keys"));
|
||||
if (!err)
|
||||
err = add_arg (gpg, "--");
|
||||
err = gpg_keylist_build_options (gpg, secret_only, mode);
|
||||
|
||||
if (pattern)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user