implement RFE 3314, 'user can't see validity of gpg signatures' [SIC]
[claws.git] / src / plugins / pgpcore / sgpgme.c
index ede5f83223430b613e48b276089f01cbca2c7266..66628784dcbaa0ce80e43ddadea2f4a364fe7178 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2012 the Claws Mail team
+ * Copyright (C) 1999-2014 the Claws Mail team
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -190,6 +190,7 @@ static gchar *extract_name(const char *uid)
 gchar *sgpgme_sigstat_info_short(gpgme_ctx_t ctx, gpgme_verify_result_t status)
 {
        gpgme_signature_t sig = NULL;
+       gpgme_user_id_t user = NULL;
        gchar *uname = NULL;
        gpgme_key_t key;
        gchar *result = NULL;
@@ -219,34 +220,52 @@ gchar *sgpgme_sigstat_info_short(gpgme_ctx_t ctx, gpgme_verify_result_t status)
                return g_strdup_printf(_("The signature can't be checked - %s"), 
                        gpgme_strerror(err));
        }
-       if (key)
+       if (key) {
+               user = key->uids;
                uname = extract_name(key->uids->uid);
-       else
+       else
                uname = g_strdup("<?>");
+
        switch (gpg_err_code(sig->status)) {
        case GPG_ERR_NO_ERROR:
-               result = g_strdup_printf(_("Good signature from %s."), uname);
+               switch (user->validity) {
+               case GPGME_VALIDITY_ULTIMATE:
+                       result = g_strdup_printf(_("Good signature from \"%s\" [ultimate]"), uname);
+                       break;
+               case GPGME_VALIDITY_FULL:
+                       result = g_strdup_printf(_("Good signature from \"%s\" [full]"), uname);
+                       break;
+               case GPGME_VALIDITY_MARGINAL:
+                       result = g_strdup_printf(_("Good signature from \"%s\" [marginal]"), uname);
+                       break;
+               case GPGME_VALIDITY_UNKNOWN:
+               case GPGME_VALIDITY_UNDEFINED:
+               case GPGME_VALIDITY_NEVER:
+               default:
+                       result = g_strdup_printf(_("Good signature from \"%s\""), uname);
+                       break;
+               }
                break;
        case GPG_ERR_SIG_EXPIRED:
-               result = g_strdup_printf(_("Expired signature from %s."), uname);
+               result = g_strdup_printf(_("Expired signature from \"%s\""), uname);
                break;
        case GPG_ERR_KEY_EXPIRED:
-               result = g_strdup_printf(_("Good signature from %s, but the key has expired."), uname);
+               result = g_strdup_printf(_("Good signature from \"%s\", but the key has expired"), uname);
                break;
        case GPG_ERR_CERT_REVOKED:
-               result = g_strdup_printf(_("Good signature from %s, but the key has been revoked."), uname);
+               result = g_strdup_printf(_("Good signature from \"%s\", but the key has been revoked"), uname);
                break;
        case GPG_ERR_BAD_SIGNATURE:
-               result = g_strdup_printf(_("Bad signature from %s."), uname);
+               result = g_strdup_printf(_("Bad signature from \"%s\""), uname);
                break;
        case GPG_ERR_NO_PUBKEY: {
                gchar *id = g_strdup(sig->fpr + strlen(sig->fpr)-8);
-               result = g_strdup_printf(_("Key 0x%s not available to verify this signature."), id);
+               result = g_strdup_printf(_("Key 0x%s not available to verify this signature"), id);
                g_free(id);
                break;
                }
        default:
-               result = g_strdup(_("The signature has not been checked."));
+               result = g_strdup(_("The signature has not been checked"));
                break;
        }
        if (result == NULL)
@@ -396,20 +415,12 @@ gpgme_data_t sgpgme_data_from_mimeinfo(MimeInfo *mimeinfo)
        gpgme_data_t data = NULL;
        gpgme_error_t err;
        FILE *fp = g_fopen(mimeinfo->data.filename, "rb");
-       gchar *tmp_file = NULL;
 
        if (!fp) 
                return NULL;
 
-       tmp_file = get_tmp_file();
-       copy_file_part(fp, mimeinfo->offset, mimeinfo->length, tmp_file);
+       err = gpgme_data_new_from_filepart(&data, NULL, fp, mimeinfo->offset, mimeinfo->length);
        fclose(fp);
-       fp = NULL;
-       debug_print("tmp file %s\n", tmp_file);
-       
-       err = gpgme_data_new_from_file(&data, tmp_file, 1);
-       claws_unlink(tmp_file);
-       g_free(tmp_file);
 
        debug_print("data %p (%d %d)\n", (void *)&data, mimeinfo->offset, mimeinfo->length);
        if (err) {