0.9.6claws74
[claws.git] / src / sgpgme.c
index 391f0883bcd4481afba5b85dc8f1752e62facb83..b68d3af4e25d4d115625f7b101d889f57e10751f 100644 (file)
@@ -23,6 +23,7 @@
  
 #ifdef USE_GPGME
 
+#include <time.h>
 #include <gtk/gtk.h>
 #include <gpgme.h>
 
@@ -100,23 +101,20 @@ static const gchar *get_validity_str(unsigned long validity)
 
 gchar *sgpgme_sigstat_info_short(GpgmeCtx ctx, GpgmeSigStat status)
 {
-       GpgmeKey key;
-
        switch (status) {
        case GPGME_SIG_STAT_GOOD:
        {
-               unsigned long validity = 0, val, i;     
+               GpgmeKey key;
+               unsigned long validity = 0;
        
-               if (gpgme_get_sig_key(ctx, 0, &key) != GPGME_No_Error)
-                       return g_strdup(_("Error"));
-               
-               i = 0;
-               while ((val = gpgme_key_get_ulong_attr(key, GPGME_ATTR_VALIDITY, NULL, i++)) > 0)
-                       if (val > validity)
-                               validity = val;
+               if (gpgme_get_sig_key(ctx, 0, &key) != GPGME_No_Error)
+                       return g_strdup(_("Error"));
+
+               validity = gpgme_get_sig_ulong_attr(ctx, 0,
+                       GPGME_ATTR_VALIDITY, 0);
                
                return g_strdup_printf(_("Valid signature by %s (Trust: %s)"),
-                       gpgme_key_get_string_attr(key, GPGME_ATTR_USERID, NULL, 0),
+                       gpgme_key_get_string_attr(key, GPGME_ATTR_NAME, NULL, 0),
                        get_validity_str(validity));
        }
        case GPGME_SIG_STAT_GOOD_EXP:
@@ -139,6 +137,86 @@ gchar *sgpgme_sigstat_info_short(GpgmeCtx ctx, GpgmeSigStat status)
        return g_strdup(_("Error"));
 }
 
+gchar *sgpgme_sigstat_info_full(GpgmeCtx ctx, GpgmeSigStat status)
+{
+       gint i = 0;
+       gchar *ret;
+       GString *siginfo;
+       GpgmeKey key;
+       
+       siginfo = g_string_sized_new(64);
+       while (gpgme_get_sig_key(ctx, i, &key) != GPGME_EOF) {
+               time_t sigtime, expiretime;
+               GpgmeSigStat sigstatus;
+               gchar timestr[64];
+               const gchar *keytype, *keyid, *uid;
+               
+               sigtime = gpgme_get_sig_ulong_attr(ctx, i, GPGME_ATTR_CREATED, 0);
+               strftime(timestr, 64, "%c", gmtime(&sigtime));
+               keytype = gpgme_key_get_string_attr(key, GPGME_ATTR_ALGO, NULL, 0);
+               keyid = gpgme_key_get_string_attr(key, GPGME_ATTR_KEYID, NULL, 0);
+               g_string_sprintfa(siginfo,
+                       _("Signature made %s using %s key ID %s\n"),
+                       timestr, keytype, keyid);
+               
+               sigstatus = gpgme_get_sig_ulong_attr(ctx, i, GPGME_ATTR_SIG_STATUS, 0); 
+               uid = gpgme_key_get_string_attr(key, GPGME_ATTR_USERID, NULL, 0);
+               switch (sigstatus) {
+               case GPGME_SIG_STAT_GOOD:
+               case GPGME_SIG_STAT_GOOD_EXPKEY:
+                       g_string_sprintfa(siginfo,
+                               _("Good signature from \"%s\"\n"),
+                               uid);
+                       break;
+               case GPGME_SIG_STAT_GOOD_EXP:
+                       g_string_sprintfa(siginfo,
+                               _("Expired signature from \"%s\"\n"),
+                               uid);
+                       break;
+               case GPGME_SIG_STAT_BAD:
+                       g_string_sprintfa(siginfo,
+                               _("BAD signature from \"%s\"\n"),
+                               uid);
+                       break;
+               default:
+                       break;
+               }
+               if (sigstatus != GPGME_SIG_STAT_BAD) {
+                       gint j = 1;
+                       
+                       while (uid = gpgme_key_get_string_attr(key, GPGME_ATTR_USERID, NULL, j)) {
+                               g_string_sprintfa(siginfo,
+                                       _("                aka \"%s\"\n"),
+                                       uid);
+                               j++;
+                       }
+                       g_string_sprintfa(siginfo,
+                               _("Primary key fingerprint: %s\n"), 
+                               gpgme_key_get_string_attr(key, GPGME_ATTR_FPR, NULL, 0));
+               }
+
+               
+               expiretime = gpgme_get_sig_ulong_attr(ctx, i, GPGME_ATTR_EXPIRE, 0);
+               if (expiretime > 0) {
+                       const gchar *format;
+
+                       strftime(timestr, 64, "%c", gmtime(&expiretime));
+                       if (time(NULL) < expiretime)
+                               format = _("Signature expires %s\n");
+                       else
+                               format = _("Signature expired %s\n");
+                       g_string_sprintfa(siginfo, format, time);
+               }
+               
+               g_string_append(siginfo, "\n");
+               i++;
+       }
+
+       ret = siginfo->str;
+       g_string_free(siginfo, FALSE);
+       return ret;
+}
+
 void sgpgme_init()
 {
        if (gpgme_engine_check_version(GPGME_PROTOCOL_OpenPGP) !=