diff options
| author | Werner Koch <[email protected]> | 2010-01-05 17:36:53 +0000 | 
|---|---|---|
| committer | Werner Koch <[email protected]> | 2010-01-05 17:36:53 +0000 | 
| commit | 97c5d4d312dbb6d6f70d1d8ea88ab6a03f4e2f2a (patch) | |
| tree | c2152eeed6bd99594e4208c1d1e8b73cc38ecb68 /src/engine-gpgsm.c | |
| parent | 2009-12-22 Marcus Brinkmann <[email protected]> (diff) | |
| download | gpgme-97c5d4d312dbb6d6f70d1d8ea88ab6a03f4e2f2a.tar.gz gpgme-97c5d4d312dbb6d6f70d1d8ea88ab6a03f4e2f2a.zip  | |
Add an API to change passphrases.  Currently only implemented for
GPGSM.  Requires GnuPG 2.1
Diffstat (limited to 'src/engine-gpgsm.c')
| -rw-r--r-- | src/engine-gpgsm.c | 43 | 
1 files changed, 38 insertions, 5 deletions
diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c index 32294b0b..2dda7339 100644 --- a/src/engine-gpgsm.c +++ b/src/engine-gpgsm.c @@ -1,6 +1,7 @@  /* engine-gpgsm.c - GpgSM engine.     Copyright (C) 2000 Werner Koch (dd9jn) -   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2009 g10 Code GmbH +   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2009, +                 2010 g10 Code GmbH     This file is part of GPGME. @@ -1053,13 +1054,18 @@ gpgsm_reset (void *engine)  {    engine_gpgsm_t gpgsm = engine; -  /* We must send a reset because we need to reset the list of -     signers.  Note that RESET does not reset OPTION commands. */ -  return gpgsm_assuan_simple_command (gpgsm->assuan_ctx, "RESET", NULL, NULL); +  /* IF we have an active connection we must send a reset because we +     need to reset the list of signers.  Note that RESET does not +     reset OPTION commands. */ +  return (gpgsm->assuan_ctx +          ? gpgsm_assuan_simple_command (gpgsm->assuan_ctx, "RESET", +                                         NULL, NULL) +          : 0);  }  #endif +  static gpgme_error_t  gpgsm_decrypt (void *engine, gpgme_data_t ciph, gpgme_data_t plain)  { @@ -1894,6 +1900,32 @@ gpgsm_io_event (void *engine, gpgme_event_io_t type, void *type_data)  } +static gpgme_error_t +gpgsm_passwd (void *engine, gpgme_key_t key, unsigned int flags) +{ +  engine_gpgsm_t gpgsm = engine; +  gpgme_error_t err; +  char *line; + +  if (!key || !key->subkeys || !key->subkeys->fpr) +    return gpg_error (GPG_ERR_INV_VALUE); + +  if (asprintf (&line, "PASSWD -- %s", key->subkeys->fpr) < 0) +    return gpg_error_from_syserror (); +   +  gpgsm_clear_fd (gpgsm, OUTPUT_FD); +  gpgsm_clear_fd (gpgsm, INPUT_FD); +  gpgsm_clear_fd (gpgsm, MESSAGE_FD); +  gpgsm->inline_data = NULL; + +  err = start (gpgsm, line); +  free (line); + +  return err; +} + + +  struct engine_ops _gpgme_engine_ops_gpgsm =    {      /* Static functions.  */ @@ -1937,5 +1969,6 @@ struct engine_ops _gpgme_engine_ops_gpgsm =      gpgsm_set_io_cbs,      gpgsm_io_event,      gpgsm_cancel, -    NULL		/* cancel_op */ +    NULL,		/* cancel_op */ +    gpgsm_passwd    };  | 
