aboutsummaryrefslogtreecommitdiffstats
path: root/gpgme/rungpg.c
diff options
context:
space:
mode:
Diffstat (limited to 'gpgme/rungpg.c')
-rw-r--r--gpgme/rungpg.c86
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)