diff options
Diffstat (limited to 'src/engine-gpgsm.c')
-rw-r--r-- | src/engine-gpgsm.c | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c index 396f19c..ae5d8ef 100644 --- a/src/engine-gpgsm.c +++ b/src/engine-gpgsm.c @@ -549,8 +549,6 @@ gpgsm_new (void **engine, const char *file_name, const char *home_dir, || _gpgme_io_set_close_notify (gpgsm->output_cb.fd, close_notify_handler, gpgsm) || _gpgme_io_set_close_notify (gpgsm->message_cb.fd, - close_notify_handler, gpgsm) - || _gpgme_io_set_close_notify (gpgsm->diag_cb.fd, close_notify_handler, gpgsm))) { err = gpg_error (GPG_ERR_GENERAL); @@ -1129,7 +1127,7 @@ add_io_cb (engine_gpgsm_t gpgsm, iocb_data_t *iocbd, gpgme_io_cb_t handler) gpgme_error_t err; TRACE_BEG (DEBUG_ENGINE, "engine-gpgsm:add_io_cb", gpgsm, - "fd %d, dir %d", iocbd->fd, iocbd->dir); + "fd=%d, dir %d", iocbd->fd, iocbd->dir); err = (*gpgsm->io_cbs.add) (gpgsm->io_cbs.add_priv, iocbd->fd, iocbd->dir, handler, iocbd->data, &iocbd->tag); @@ -1409,11 +1407,12 @@ set_recipients_from_string (engine_gpgsm_t gpgsm, const char *string) { gpg_error_t err = 0; char *line = NULL; - int no_pubkey = 0; + int ignore = 0; + int any = 0; const char *s; int n; - for (;;) + do { while (*string == ' ' || *string == '\t') string++; @@ -1428,25 +1427,32 @@ set_recipients_from_string (engine_gpgsm_t gpgsm, const char *string) while (n && (string[n-1] == ' ' || string[n-1] == '\t')) n--; - gpgrt_free (line); - if (gpgrt_asprintf (&line, "RECIPIENT %.*s", n, string) < 0) + if (!ignore && n == 2 && !memcmp (string, "--", 2)) + ignore = 1; + else if (!ignore && n > 2 && !memcmp (string, "--", 2)) + err = gpg_error (GPG_ERR_UNKNOWN_OPTION); + else if (n) /* Not empty - use it. */ { - err = gpg_error_from_syserror (); - break; + gpgrt_free (line); + if (gpgrt_asprintf (&line, "RECIPIENT %.*s", n, string) < 0) + err = gpg_error_from_syserror (); + else + { + err = gpgsm_assuan_simple_command (gpgsm, line, gpgsm->status.fnc, + gpgsm->status.fnc_value); + if (!err) + any = 1; + } } - string += n + !!s; - - err = gpgsm_assuan_simple_command (gpgsm, line, gpgsm->status.fnc, - gpgsm->status.fnc_value); - /* Fixme: Improve error reporting. */ - if (gpg_err_code (err) == GPG_ERR_NO_PUBKEY) - no_pubkey++; - else if (err) - break; + string += n + !!s; } + while (!err); + + if (!err && !any) + err = gpg_error (GPG_ERR_MISSING_KEY); gpgrt_free (line); - return err? err : no_pubkey? gpg_error (GPG_ERR_NO_PUBKEY) : 0; + return err; } @@ -1460,7 +1466,7 @@ gpgsm_encrypt (void *engine, gpgme_key_t recp[], const char *recpstring, if (!gpgsm) return gpg_error (GPG_ERR_INV_VALUE); - if (!recp) + if (!recp && !recpstring) /* Symmetric only */ return gpg_error (GPG_ERR_NOT_IMPLEMENTED); if ((flags & GPGME_ENCRYPT_NO_ENCRYPT_TO)) |