implement RFE 3314, 'user can't see validity of gpg signatures' [SIC]
[claws.git] / src / plugins / pgpcore / sgpgme.c
index dd26197d1be26d8a826523572e88d23496118a3f..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
@@ -153,6 +153,22 @@ static const gchar *get_validity_str(unsigned long validity)
        }
 }
 
+static const gchar *get_owner_trust_str(unsigned long owner_trust)
+{
+       switch (gpgme_err_code(owner_trust)) {
+       case GPGME_VALIDITY_NEVER:
+               return _("Untrusted");
+       case GPGME_VALIDITY_MARGINAL:
+               return _("Marginal");
+       case GPGME_VALIDITY_FULL:
+               return _("Full");
+       case GPGME_VALIDITY_ULTIMATE:
+               return _("Ultimate");
+       default:
+               return _("Unknown");
+       }
+}
+
 static gchar *extract_name(const char *uid)
 {
        if (uid == NULL)
@@ -174,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;
@@ -203,43 +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:
-               switch (gpg_err_code(sig->validity)) {
-               case GPGME_VALIDITY_FULL:
+               switch (user->validity) {
                case GPGME_VALIDITY_ULTIMATE:
-                       result = g_strdup_printf(_("Good signature from %s."), uname);
+                       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 (untrusted) from %s."), uname);
+                       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(_("Expired key from %s."), 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);
                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)
@@ -301,16 +327,25 @@ gchar *sgpgme_sigstat_info_full(gpgme_ctx_t ctx, gpgme_verify_result_t status)
                
                switch (gpg_err_code(sig->status)) {
                case GPG_ERR_NO_ERROR:
-               case GPG_ERR_KEY_EXPIRED:
                        g_string_append_printf(siginfo,
                                _("Good signature from uid \"%s\" (Validity: %s)\n"),
                                uid, get_validity_str(user?user->validity:GPGME_VALIDITY_UNKNOWN));
                        break;
+               case GPG_ERR_KEY_EXPIRED:
+                       g_string_append_printf(siginfo,
+                               _("Expired key uid \"%s\"\n"),
+                               uid);
+                       break;
                case GPG_ERR_SIG_EXPIRED:
                        g_string_append_printf(siginfo,
                                _("Expired signature from uid \"%s\" (Validity: %s)\n"),
                                uid, get_validity_str(user?user->validity:GPGME_VALIDITY_UNKNOWN));
                        break;
+               case GPG_ERR_CERT_REVOKED:
+                       g_string_append_printf(siginfo,
+                               _("Revoked key uid \"%s\"\n"),
+                               uid);
+                       break;
                case GPG_ERR_BAD_SIGNATURE:
                        g_string_append_printf(siginfo,
                                _("BAD signature from \"%s\"\n"),
@@ -326,10 +361,12 @@ gchar *sgpgme_sigstat_info_full(gpgme_ctx_t ctx, gpgme_verify_result_t status)
                                g_string_append_printf(siginfo,
                                        _("                    uid \"%s\" (Validity: %s)\n"),
                                        user->uid,
-                                       get_validity_str(user->validity));
+                                       user->revoked==TRUE?_("Revoked"):get_validity_str(user->validity));
                                j++;
                                user = user->next;
                        }
+                       g_string_append_printf(siginfo,_("Owner Trust: %s\n"),
+                                              get_owner_trust_str(key->owner_trust));
                        g_string_append(siginfo,
                                _("Primary key fingerprint:"));
                        const char* primary_fpr = NULL;
@@ -378,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) {
@@ -788,9 +817,9 @@ again:
        }
        
        key_parms = g_strdup_printf("<GnupgKeyParms format=\"internal\">\n"
-                                       "Key-Type: DSA\n"
-                                       "Key-Length: 1024\n"
-                                       "Subkey-Type: ELG-E\n"
+                                       "Key-Type: RSA\n"
+                                       "Key-Length: 2048\n"
+                                       "Subkey-Type: RSA\n"
                                        "Subkey-Length: 2048\n"
                                        "Name-Real: %s\n"
                                        "Name-Email: %s\n"