diff options
Diffstat (limited to 'gpgme/rungpg.c')
-rw-r--r-- | gpgme/rungpg.c | 86 |
1 files changed, 70 insertions, 16 deletions
diff --git a/gpgme/rungpg.c b/gpgme/rungpg.c index b30bb04c..8738fc38 100644 --- a/gpgme/rungpg.c +++ b/gpgme/rungpg.c @@ -1256,6 +1256,7 @@ _gpgme_gpg_op_delete (GpgObject gpg, GpgmeKey key, int allow_secret) return err; } + static GpgmeError _gpgme_append_gpg_args_from_recipients (GpgObject gpg, const GpgmeRecipients rset) @@ -1275,6 +1276,33 @@ _gpgme_append_gpg_args_from_recipients (GpgObject gpg, return err; } + +static GpgmeError +_gpgme_append_gpg_args_from_signers (GpgObject gpg, + GpgmeCtx ctx /* FIXME */) +{ + GpgmeError err = 0; + int i; + GpgmeKey key; + + for (i = 0; (key = gpgme_signers_enum (ctx, i)); i++) + { + const char *s = gpgme_key_get_string_attr (key, GPGME_ATTR_KEYID, + NULL, 0); + if (s) + { + if (!err) + err = _gpgme_gpg_add_arg (gpg, "-u"); + if (!err) + err = _gpgme_gpg_add_arg (gpg, s); + } + gpgme_key_unref (key); + if (err) break; + } + return err; +} + + GpgmeError _gpgme_gpg_op_encrypt (GpgObject gpg, GpgmeRecipients recp, GpgmeData plain, GpgmeData ciph, int use_armor) @@ -1309,6 +1337,45 @@ _gpgme_gpg_op_encrypt (GpgObject gpg, GpgmeRecipients recp, } GpgmeError +_gpgme_gpg_op_encrypt_sign (GpgObject gpg, GpgmeRecipients recp, + GpgmeData plain, GpgmeData ciph, int use_armor, + GpgmeCtx ctx /* FIXME */) +{ + GpgmeError err; + + err = _gpgme_gpg_add_arg (gpg, "--encrypt"); + if (!err) + err = _gpgme_gpg_add_arg (gpg, "--sign"); + if (!err && use_armor) + err = _gpgme_gpg_add_arg (gpg, "--armor"); + + /* If we know that all recipients are valid (full or ultimate trust) + * we can suppress further checks */ + if (!err && _gpgme_recipients_all_valid (recp)) + err = _gpgme_gpg_add_arg (gpg, "--always-trust"); + + if (!err) + err = _gpgme_append_gpg_args_from_recipients (gpg, recp); + + if (!err) + err = _gpgme_append_gpg_args_from_signers (gpg, ctx); + + /* Tell the gpg object about the data. */ + if (!err) + err = _gpgme_gpg_add_arg (gpg, "--output"); + if (!err) + err = _gpgme_gpg_add_arg (gpg, "-"); + if (!err) + err = _gpgme_gpg_add_data (gpg, ciph, 1); + if (!err) + err = _gpgme_gpg_add_arg (gpg, "--"); + if (!err) + err = _gpgme_gpg_add_data (gpg, plain, 0); + + return err; +} + +GpgmeError _gpgme_gpg_op_export (GpgObject gpg, GpgmeRecipients recp, GpgmeData keydata, int use_armor) { @@ -1404,8 +1471,6 @@ _gpgme_gpg_op_sign (GpgObject gpg, GpgmeData in, GpgmeData out, int use_textmode, GpgmeCtx ctx /* FIXME */) { GpgmeError err; - GpgmeKey key; - int i; if (mode == GPGME_SIG_MODE_CLEAR) err = _gpgme_gpg_add_arg (gpg, "--clearsign"); @@ -1419,20 +1484,9 @@ _gpgme_gpg_op_sign (GpgObject gpg, GpgmeData in, GpgmeData out, if (!err && use_textmode) _gpgme_gpg_add_arg (gpg, "--textmode"); } - for (i = 0; (key = gpgme_signers_enum (ctx, i)); i++) - { - const char *s = gpgme_key_get_string_attr (key, GPGME_ATTR_KEYID, - NULL, 0); - if (s) - { - if (!err) - err = _gpgme_gpg_add_arg (gpg, "-u"); - if (!err) - err = _gpgme_gpg_add_arg (gpg, s); - } - gpgme_key_unref (key); - if (err) break; - } + + if (!err) + err = _gpgme_append_gpg_args_from_signers (gpg, ctx); /* Tell the gpg object about the data. */ if (!err) |