core: Use offline mode for all operations of gpgsm engine
* src/engine-backend.h (keylist, keylist_ext): Remove engine_flags. * src/engine-gpg.c (gpg_keylist, gpg_keylist_ext): Ditto. * src/engine.c, src/engine.h (_gpgme_engine_op_keylist): Ditto. (_gpgme_engine_op_keylist_ext): Ditto. * src/engine.h (GPGME_ENGINE_FLAG_OFFLINE): Remove. * src/engine-gpgsm.c (struct engine_gpgsm): New field flags with offline flag. (have_gpgsm_version): New. (gpg_set_engine_flags): Set the offline flag. (start): Send OPTION "offline". (gpgsm_keylist, gpgsm_keylist_ext): Remove engine_flags. Remove sending of OPTION "offline". * src/keylist.c (gpgme_op_keylist_start, gpgme_op_keylist_ext_start): Remove setting of offline flag. -- GnuPG-bug-id: 6648
This commit is contained in:
parent
d72811a2c0
commit
bc98f01c85
@ -2694,8 +2694,9 @@ for example completely disable the use of Dirmngr for any engine.
|
|||||||
|
|
||||||
For the CMS protocol the offline mode specifies whether Dirmngr shall
|
For the CMS protocol the offline mode specifies whether Dirmngr shall
|
||||||
be used to do additional validation that might require connecting
|
be used to do additional validation that might require connecting
|
||||||
external services (e.g. CRL / OCSP checks). Here the offline mode
|
external services (e.g. CRL / OCSP checks). The offline mode is used
|
||||||
only affects the keylist mode @code{GPGME_KEYLIST_MODE_VALIDATE}.
|
for all operations on this context. It has only an effect with
|
||||||
|
GnuPG versions 2.1.6 or later.
|
||||||
|
|
||||||
For the OpenPGP protocol offline mode entirely disables the use of the
|
For the OpenPGP protocol offline mode entirely disables the use of the
|
||||||
Dirmngr and will thus guarantee that no network connections are done
|
Dirmngr and will thus guarantee that no network connections are done
|
||||||
|
@ -100,12 +100,10 @@ struct engine_ops
|
|||||||
const char *import_filter,
|
const char *import_filter,
|
||||||
const char *key_origin);
|
const char *key_origin);
|
||||||
gpgme_error_t (*keylist) (void *engine, const char *pattern,
|
gpgme_error_t (*keylist) (void *engine, const char *pattern,
|
||||||
int secret_only, gpgme_keylist_mode_t mode,
|
int secret_only, gpgme_keylist_mode_t mode);
|
||||||
int engine_flags);
|
|
||||||
gpgme_error_t (*keylist_ext) (void *engine, const char *pattern[],
|
gpgme_error_t (*keylist_ext) (void *engine, const char *pattern[],
|
||||||
int secret_only, int reserved,
|
int secret_only, int reserved,
|
||||||
gpgme_keylist_mode_t mode,
|
gpgme_keylist_mode_t mode);
|
||||||
int engine_flags);
|
|
||||||
gpgme_error_t (*keylist_data) (void *engine, gpgme_keylist_mode_t mode,
|
gpgme_error_t (*keylist_data) (void *engine, gpgme_keylist_mode_t mode,
|
||||||
gpgme_data_t data);
|
gpgme_data_t data);
|
||||||
gpgme_error_t (*keysign) (void *engine,
|
gpgme_error_t (*keysign) (void *engine,
|
||||||
|
@ -3341,13 +3341,11 @@ gpg_keylist_build_options (engine_gpg_t gpg, int secret_only,
|
|||||||
|
|
||||||
static gpgme_error_t
|
static gpgme_error_t
|
||||||
gpg_keylist (void *engine, const char *pattern, int secret_only,
|
gpg_keylist (void *engine, const char *pattern, int secret_only,
|
||||||
gpgme_keylist_mode_t mode, int engine_flags)
|
gpgme_keylist_mode_t mode)
|
||||||
{
|
{
|
||||||
engine_gpg_t gpg = engine;
|
engine_gpg_t gpg = engine;
|
||||||
gpgme_error_t err;
|
gpgme_error_t err;
|
||||||
|
|
||||||
(void)engine_flags;
|
|
||||||
|
|
||||||
err = gpg_keylist_build_options (gpg, secret_only, mode);
|
err = gpg_keylist_build_options (gpg, secret_only, mode);
|
||||||
|
|
||||||
if (!err && pattern && *pattern)
|
if (!err && pattern && *pattern)
|
||||||
@ -3362,13 +3360,11 @@ gpg_keylist (void *engine, const char *pattern, int secret_only,
|
|||||||
|
|
||||||
static gpgme_error_t
|
static gpgme_error_t
|
||||||
gpg_keylist_ext (void *engine, const char *pattern[], int secret_only,
|
gpg_keylist_ext (void *engine, const char *pattern[], int secret_only,
|
||||||
int reserved, gpgme_keylist_mode_t mode, int engine_flags)
|
int reserved, gpgme_keylist_mode_t mode)
|
||||||
{
|
{
|
||||||
engine_gpg_t gpg = engine;
|
engine_gpg_t gpg = engine;
|
||||||
gpgme_error_t err;
|
gpgme_error_t err;
|
||||||
|
|
||||||
(void)engine_flags;
|
|
||||||
|
|
||||||
if (reserved)
|
if (reserved)
|
||||||
return gpg_error (GPG_ERR_INV_VALUE);
|
return gpg_error (GPG_ERR_INV_VALUE);
|
||||||
|
|
||||||
|
@ -114,6 +114,10 @@ struct engine_gpgsm
|
|||||||
|
|
||||||
/* Memory data containing diagnostics (--logger-fd) of gpgsm */
|
/* Memory data containing diagnostics (--logger-fd) of gpgsm */
|
||||||
gpgme_data_t diagnostics;
|
gpgme_data_t diagnostics;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
unsigned int offline : 1;
|
||||||
|
} flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct engine_gpgsm *engine_gpgsm_t;
|
typedef struct engine_gpgsm *engine_gpgsm_t;
|
||||||
@ -123,6 +127,13 @@ static void gpgsm_io_event (void *engine,
|
|||||||
gpgme_event_io_t type, void *type_data);
|
gpgme_event_io_t type, void *type_data);
|
||||||
|
|
||||||
|
|
||||||
|
/* Return true if the engine's version is at least VERSION. */
|
||||||
|
static int
|
||||||
|
have_gpgsm_version (engine_gpgsm_t gpgsm, const char *version)
|
||||||
|
{
|
||||||
|
return _gpgme_compare_versions (gpgsm->version, version);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
gpgsm_get_version (const char *file_name)
|
gpgsm_get_version (const char *file_name)
|
||||||
@ -613,6 +624,8 @@ gpgsm_set_engine_flags (void *engine, const gpgme_ctx_t ctx)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
*gpgsm->request_origin = 0;
|
*gpgsm->request_origin = 0;
|
||||||
|
|
||||||
|
gpgsm->flags.offline = (ctx->offline && have_gpgsm_version (gpgsm, "2.1.6"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1175,6 +1188,12 @@ start (engine_gpgsm_t gpgsm, const char *command)
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gpgsm_assuan_simple_command (gpgsm,
|
||||||
|
gpgsm->flags.offline ?
|
||||||
|
"OPTION offline=1":
|
||||||
|
"OPTION offline=0" ,
|
||||||
|
NULL, NULL);
|
||||||
|
|
||||||
/* We need to know the fd used by assuan for reads. We do this by
|
/* We need to know the fd used by assuan for reads. We do this by
|
||||||
using the assumption that the first returned fd from
|
using the assumption that the first returned fd from
|
||||||
assuan_get_active_fds() is always this one. */
|
assuan_get_active_fds() is always this one. */
|
||||||
@ -1872,7 +1891,7 @@ gpgsm_import (void *engine, gpgme_data_t keydata, gpgme_key_t *keyarray,
|
|||||||
|
|
||||||
static gpgme_error_t
|
static gpgme_error_t
|
||||||
gpgsm_keylist (void *engine, const char *pattern, int secret_only,
|
gpgsm_keylist (void *engine, const char *pattern, int secret_only,
|
||||||
gpgme_keylist_mode_t mode, int engine_flags)
|
gpgme_keylist_mode_t mode)
|
||||||
{
|
{
|
||||||
engine_gpgsm_t gpgsm = engine;
|
engine_gpgsm_t gpgsm = engine;
|
||||||
char *line;
|
char *line;
|
||||||
@ -1928,12 +1947,6 @@ gpgsm_keylist (void *engine, const char *pattern, int secret_only,
|
|||||||
"OPTION with-secret=1":
|
"OPTION with-secret=1":
|
||||||
"OPTION with-secret=0" ,
|
"OPTION with-secret=0" ,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
gpgsm_assuan_simple_command (gpgsm,
|
|
||||||
(engine_flags & GPGME_ENGINE_FLAG_OFFLINE)?
|
|
||||||
"OPTION offline=1":
|
|
||||||
"OPTION offline=0" ,
|
|
||||||
NULL, NULL);
|
|
||||||
|
|
||||||
|
|
||||||
/* Length is "LISTSECRETKEYS " + p + '\0'. */
|
/* Length is "LISTSECRETKEYS " + p + '\0'. */
|
||||||
line = malloc (15 + strlen (pattern) + 1);
|
line = malloc (15 + strlen (pattern) + 1);
|
||||||
@ -1963,7 +1976,7 @@ gpgsm_keylist (void *engine, const char *pattern, int secret_only,
|
|||||||
|
|
||||||
static gpgme_error_t
|
static gpgme_error_t
|
||||||
gpgsm_keylist_ext (void *engine, const char *pattern[], int secret_only,
|
gpgsm_keylist_ext (void *engine, const char *pattern[], int secret_only,
|
||||||
int reserved, gpgme_keylist_mode_t mode, int engine_flags)
|
int reserved, gpgme_keylist_mode_t mode)
|
||||||
{
|
{
|
||||||
engine_gpgsm_t gpgsm = engine;
|
engine_gpgsm_t gpgsm = engine;
|
||||||
char *line;
|
char *line;
|
||||||
@ -2003,11 +2016,6 @@ gpgsm_keylist_ext (void *engine, const char *pattern[], int secret_only,
|
|||||||
"OPTION with-secret=1":
|
"OPTION with-secret=1":
|
||||||
"OPTION with-secret=0" ,
|
"OPTION with-secret=0" ,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
gpgsm_assuan_simple_command (gpgsm,
|
|
||||||
(engine_flags & GPGME_ENGINE_FLAG_OFFLINE)?
|
|
||||||
"OPTION offline=1":
|
|
||||||
"OPTION offline=0" ,
|
|
||||||
NULL, NULL);
|
|
||||||
|
|
||||||
if (pattern && *pattern)
|
if (pattern && *pattern)
|
||||||
{
|
{
|
||||||
|
10
src/engine.c
10
src/engine.c
@ -866,8 +866,7 @@ _gpgme_engine_op_import (engine_t engine, gpgme_data_t keydata,
|
|||||||
|
|
||||||
gpgme_error_t
|
gpgme_error_t
|
||||||
_gpgme_engine_op_keylist (engine_t engine, const char *pattern,
|
_gpgme_engine_op_keylist (engine_t engine, const char *pattern,
|
||||||
int secret_only, gpgme_keylist_mode_t mode,
|
int secret_only, gpgme_keylist_mode_t mode)
|
||||||
int engine_flags)
|
|
||||||
{
|
{
|
||||||
if (!engine)
|
if (!engine)
|
||||||
return gpg_error (GPG_ERR_INV_VALUE);
|
return gpg_error (GPG_ERR_INV_VALUE);
|
||||||
@ -875,15 +874,14 @@ _gpgme_engine_op_keylist (engine_t engine, const char *pattern,
|
|||||||
if (!engine->ops->keylist)
|
if (!engine->ops->keylist)
|
||||||
return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
|
return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
|
||||||
|
|
||||||
return (*engine->ops->keylist) (engine->engine, pattern, secret_only, mode,
|
return (*engine->ops->keylist) (engine->engine, pattern, secret_only, mode);
|
||||||
engine_flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
gpgme_error_t
|
gpgme_error_t
|
||||||
_gpgme_engine_op_keylist_ext (engine_t engine, const char *pattern[],
|
_gpgme_engine_op_keylist_ext (engine_t engine, const char *pattern[],
|
||||||
int secret_only, int reserved,
|
int secret_only, int reserved,
|
||||||
gpgme_keylist_mode_t mode, int engine_flags)
|
gpgme_keylist_mode_t mode)
|
||||||
{
|
{
|
||||||
if (!engine)
|
if (!engine)
|
||||||
return gpg_error (GPG_ERR_INV_VALUE);
|
return gpg_error (GPG_ERR_INV_VALUE);
|
||||||
@ -892,7 +890,7 @@ _gpgme_engine_op_keylist_ext (engine_t engine, const char *pattern[],
|
|||||||
return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
|
return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
|
||||||
|
|
||||||
return (*engine->ops->keylist_ext) (engine->engine, pattern, secret_only,
|
return (*engine->ops->keylist_ext) (engine->engine, pattern, secret_only,
|
||||||
reserved, mode, engine_flags);
|
reserved, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -148,14 +148,12 @@ gpgme_error_t _gpgme_engine_op_import (engine_t engine,
|
|||||||
gpgme_error_t _gpgme_engine_op_keylist (engine_t engine,
|
gpgme_error_t _gpgme_engine_op_keylist (engine_t engine,
|
||||||
const char *pattern,
|
const char *pattern,
|
||||||
int secret_only,
|
int secret_only,
|
||||||
gpgme_keylist_mode_t mode,
|
gpgme_keylist_mode_t mode);
|
||||||
int engine_flags);
|
|
||||||
gpgme_error_t _gpgme_engine_op_keylist_ext (engine_t engine,
|
gpgme_error_t _gpgme_engine_op_keylist_ext (engine_t engine,
|
||||||
const char *pattern[],
|
const char *pattern[],
|
||||||
int secret_only,
|
int secret_only,
|
||||||
int reserved,
|
int reserved,
|
||||||
gpgme_keylist_mode_t mode,
|
gpgme_keylist_mode_t mode);
|
||||||
int engine_flags);
|
|
||||||
gpgme_error_t _gpgme_engine_op_keylist_data (engine_t engine,
|
gpgme_error_t _gpgme_engine_op_keylist_data (engine_t engine,
|
||||||
gpgme_keylist_mode_t mode,
|
gpgme_keylist_mode_t mode,
|
||||||
gpgme_data_t data);
|
gpgme_data_t data);
|
||||||
@ -227,8 +225,5 @@ gpgme_error_t _gpgme_engine_op_setexpire (engine_t engine,
|
|||||||
const char *subfprs,
|
const char *subfprs,
|
||||||
unsigned int reserved);
|
unsigned int reserved);
|
||||||
|
|
||||||
/* The available engine option flags. */
|
|
||||||
#define GPGME_ENGINE_FLAG_OFFLINE 1
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* ENGINE_H */
|
#endif /* ENGINE_H */
|
||||||
|
@ -1126,7 +1126,6 @@ gpgme_op_keylist_start (gpgme_ctx_t ctx, const char *pattern, int secret_only)
|
|||||||
gpgme_error_t err;
|
gpgme_error_t err;
|
||||||
void *hook;
|
void *hook;
|
||||||
op_data_t opd;
|
op_data_t opd;
|
||||||
int flags = 0;
|
|
||||||
|
|
||||||
TRACE_BEG (DEBUG_CTX, "gpgme_op_keylist_start", ctx,
|
TRACE_BEG (DEBUG_CTX, "gpgme_op_keylist_start", ctx,
|
||||||
"pattern=%s, secret_only=%i", pattern, secret_only);
|
"pattern=%s, secret_only=%i", pattern, secret_only);
|
||||||
@ -1155,11 +1154,8 @@ gpgme_op_keylist_start (gpgme_ctx_t ctx, const char *pattern, int secret_only)
|
|||||||
if (err)
|
if (err)
|
||||||
return TRACE_ERR (err);
|
return TRACE_ERR (err);
|
||||||
|
|
||||||
if (ctx->offline)
|
|
||||||
flags |= GPGME_ENGINE_FLAG_OFFLINE;
|
|
||||||
|
|
||||||
err = _gpgme_engine_op_keylist (ctx->engine, pattern, secret_only,
|
err = _gpgme_engine_op_keylist (ctx->engine, pattern, secret_only,
|
||||||
ctx->keylist_mode, flags);
|
ctx->keylist_mode);
|
||||||
return TRACE_ERR (err);
|
return TRACE_ERR (err);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1174,7 +1170,6 @@ gpgme_op_keylist_ext_start (gpgme_ctx_t ctx, const char *pattern[],
|
|||||||
gpgme_error_t err;
|
gpgme_error_t err;
|
||||||
void *hook;
|
void *hook;
|
||||||
op_data_t opd;
|
op_data_t opd;
|
||||||
int flags = 0;
|
|
||||||
|
|
||||||
TRACE_BEG (DEBUG_CTX, "gpgme_op_keylist_ext_start", ctx,
|
TRACE_BEG (DEBUG_CTX, "gpgme_op_keylist_ext_start", ctx,
|
||||||
"secret_only=%i, reserved=0x%x", secret_only, reserved);
|
"secret_only=%i, reserved=0x%x", secret_only, reserved);
|
||||||
@ -1202,12 +1197,8 @@ gpgme_op_keylist_ext_start (gpgme_ctx_t ctx, const char *pattern[],
|
|||||||
if (err)
|
if (err)
|
||||||
return TRACE_ERR (err);
|
return TRACE_ERR (err);
|
||||||
|
|
||||||
if (ctx->offline)
|
|
||||||
flags |= GPGME_ENGINE_FLAG_OFFLINE;
|
|
||||||
|
|
||||||
err = _gpgme_engine_op_keylist_ext (ctx->engine, pattern, secret_only,
|
err = _gpgme_engine_op_keylist_ext (ctx->engine, pattern, secret_only,
|
||||||
reserved, ctx->keylist_mode,
|
reserved, ctx->keylist_mode);
|
||||||
flags);
|
|
||||||
return TRACE_ERR (err);
|
return TRACE_ERR (err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user