diff options
Diffstat (limited to 'camel')
-rw-r--r-- | camel/ChangeLog | 12 | ||||
-rw-r--r-- | camel/camel-gpg-context.c | 90 |
2 files changed, 82 insertions, 20 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index bf05be0b7c..c8c04ef5c4 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,15 @@ +2002-06-25 Jeffrey Stedfast <fejj@ximian.com> + + * camel-gpg-context.c (gpg_hash_str): Return the option as + --digest-algo=<micalg> + (gpg_ctx_parse_status): Decode more status information and keep + track of trust and such. + (gpg_ctx_op_complete): Make sure we aren't waiting for gpg to + write data to stdout (such as encrypted/decrypted data or a + signature). + (gpg_encrypt): Remove the fejj@stampede.org hard-coded value + (which had only meant to be for testing). + 2002-06-24 Jeffrey Stedfast <fejj@ximian.com> * camel-gpg-context.c (gpg_ctx_get_argv): Use --command-fd rather diff --git a/camel/camel-gpg-context.c b/camel/camel-gpg-context.c index 608bb42dc8..1cea8fbe37 100644 --- a/camel/camel-gpg-context.c +++ b/camel/camel-gpg-context.c @@ -213,6 +213,14 @@ enum _GpgCtxMode { GPG_CTX_MODE_DECRYPT, }; +enum _GpgTrustMetric { + GPG_TRUST_UNKNOWN, + GPG_TRUST_NEVER, + GPG_TRUST_MARGINAL, + GPG_TRUST_FULLY, + GPG_TRUST_ULTIMATE +}; + struct _GpgCtx { enum _GpgCtxMode mode; CamelSession *session; @@ -244,6 +252,7 @@ struct _GpgCtx { GByteArray *diagnostics; unsigned int complete:1; + unsigned int await_read:1; unsigned int reading:1; unsigned int always_trust:1; unsigned int armor:1; @@ -252,7 +261,10 @@ struct _GpgCtx { unsigned int bad_passwds:2; - unsigned int padding:24; + unsigned int validsig:1; + unsigned int trust:3; + + unsigned int padding:19; }; static struct _GpgCtx * @@ -266,6 +278,7 @@ gpg_ctx_new (CamelSession *session, const char *path) camel_object_ref (CAMEL_OBJECT (session)); gpg->userid_hint = g_hash_table_new (g_str_hash, g_str_equal); gpg->complete = FALSE; + gpg->await_read = FALSE; gpg->reading = FALSE; gpg->pid = (pid_t) -1; @@ -292,6 +305,9 @@ gpg_ctx_new (CamelSession *session, const char *path) gpg->send_passwd = FALSE; gpg->passwd = NULL; + gpg->validsig = FALSE; + gpg->trust = GPG_TRUST_UNKNOWN; + gpg->istream = NULL; gpg->ostream = NULL; @@ -438,13 +454,13 @@ gpg_hash_str (CamelCipherHash hash) { switch (hash) { case CAMEL_CIPHER_HASH_MD2: - return "MD2"; + return "--digest-algo=MD2"; case CAMEL_CIPHER_HASH_MD5: - return "MD5"; + return "--digest-algo=MD5"; case CAMEL_CIPHER_HASH_SHA1: - return "SHA1"; + return "--digest-algo=SHA1"; case CAMEL_CIPHER_HASH_RIPEMD160: - return "RIPEMD160"; + return "--digest-algo=RIPEMD160"; default: return NULL; } @@ -487,10 +503,8 @@ gpg_ctx_get_argv (struct _GpgCtx *gpg, int status_fd, char **sfd, int passwd_fd, if (gpg->armor) g_ptr_array_add (argv, "--armor"); hash_str = gpg_hash_str (gpg->hash); - if (hash_str) { - g_ptr_array_add (argv, "--digest-algo"); + if (hash_str) g_ptr_array_add (argv, (char *) hash_str); - } if (gpg->userid) { g_ptr_array_add (argv, "-u"); g_ptr_array_add (argv, (char *) gpg->userid); @@ -532,6 +546,10 @@ gpg_ctx_get_argv (struct _GpgCtx *gpg, int status_fd, char **sfd, int passwd_fd, break; } + for (i = 0; i < argv->len; i++) + printf ("%s ", argv->pdata[i]); + printf ("\n"); + g_ptr_array_add (argv, NULL); return argv; @@ -742,9 +760,9 @@ gpg_ctx_parse_status (struct _GpgCtx *gpg, CamelException *ex) g_free (passwd); gpg->send_passwd = TRUE; - } else if (!strncmp (status, "GOOD_PASSPHRASE ", 16)) { + } else if (!strncmp (status, "GOOD_PASSPHRASE", 15)) { gpg->bad_passwds = 0; - } else if (!strncmp (status, "BAD_PASSPHRASE ", 15)) { + } else if (!strncmp (status, "BAD_PASSPHRASE", 14)) { gpg->bad_passwds++; camel_session_forget_password (gpg->session, NULL, gpg->userid, ex); @@ -764,24 +782,54 @@ gpg_ctx_parse_status (struct _GpgCtx *gpg, CamelException *ex) /* check to see if we are complete */ switch (gpg->mode) { case GPG_CTX_MODE_SIGN: - if (!strncmp (status, "SIG_CREATED ", 12)) + if (!strncmp (status, "SIG_CREATED ", 12)) { gpg->complete = TRUE; + gpg->await_read = TRUE; + } break; case GPG_CTX_MODE_VERIFY: - /* FIXME: we should save this so we can present it to the user? */ - /* Note: NO_PUBKEY often comes after an ERRSIG, but do we really care? */ - if (!strncmp (status, "TRUST_", 6) || - !strncmp (status, "BADSIG", 6) || - !strncmp (status, "ERRSIG", 6)) + if (!strncmp (status, "TRUST_", 6)) { + status += 6; + if (!strncmp (status, "NEVER", 5)) { + gpg->trust = GPG_TRUST_NEVER; + } else if (!strncmp (status, "MARGINAL", 8)) { + gpg->trust = GPG_TRUST_MARGINAL; + } else if (!strncmp (status, "FULLY", 5)) { + gpg->trust = GPG_TRUST_FULLY; + } else if (!strncmp (status, "ULTIMATE", 8)) { + gpg->trust = GPG_TRUST_ULTIMATE; + } + + gpg->complete = TRUE; + } else if (!strncmp (status, "VALIDSIG", 8)) { + gpg->validsig = TRUE; gpg->complete = TRUE; + } else if (!strncmp (status, "BADSIG", 6)) { + gpg->validsig = FALSE; + gpg->complete = TRUE; + } else if (!strncmp (status, "ERRSIG", 6)) { + /* Note: NO_PUBKEY often comes after an ERRSIG, but do we really care? */ + gpg->validsig = FALSE; + gpg->complete = TRUE; + } break; case GPG_CTX_MODE_ENCRYPT: - if (!strncmp (status, "END_ENCRYPTION", 14)) + if (!strncmp (status, "BEGIN_ENCRYPTION", 16)) { + gpg->await_read = TRUE; + } else if (!strncmp (status, "END_ENCRYPTION", 14)) { gpg->complete = TRUE; + } else if (!strncmp (status, "NO_RECP", 7)) { + camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM, + _("Failed to encrypt: No valid recipients specified.")); + return -1; + } break; case GPG_CTX_MODE_DECRYPT: - if (!strncmp (status, "END_DECRYPTION", 14)) + if (!strncmp (status, "BEGIN_DECRYPTION", 16)) { + gpg->await_read = TRUE; + } else if (!strncmp (status, "END_DECRYPTION", 14)) { gpg->complete = TRUE; + } break; } @@ -913,6 +961,8 @@ gpg_ctx_op_step (struct _GpgCtx *gpg, CamelException *ex) if (camel_stream_write (gpg->ostream, buffer, (size_t) nread) == -1) goto exception; + gpg->await_read = FALSE; + /* make sure we don't exit before reading all the data... */ gpg->reading = TRUE; } @@ -1030,7 +1080,7 @@ gpg_ctx_op_step (struct _GpgCtx *gpg, CamelException *ex) static gboolean gpg_ctx_op_complete (struct _GpgCtx *gpg) { - return gpg->complete && !gpg->reading; + return gpg->complete && !gpg->await_read && !gpg->reading; } static void @@ -1282,7 +1332,7 @@ gpg_encrypt (CamelCipherContext *context, gboolean sign, const char *userid, gpg = gpg_ctx_new (context->session, ctx->path); gpg_ctx_set_mode (gpg, GPG_CTX_MODE_ENCRYPT); gpg_ctx_set_armor (gpg, TRUE); - gpg_ctx_set_userid (gpg, "fejj@stampede.org"); + gpg_ctx_set_userid (gpg, userid); gpg_ctx_set_istream (gpg, istream); gpg_ctx_set_ostream (gpg, ostream); gpg_ctx_set_always_trust (gpg, ctx->always_trust); |