}
-static const gchar *
-sig_status_to_string (GpgmeSigStat status)
-{
- const gchar *result;
-
- switch (status) {
- case GPGME_SIG_STAT_NONE:
- result = _("Oops: Signature not verified");
- break;
- case GPGME_SIG_STAT_NOSIG:
- result = _("No signature found");
- break;
- case GPGME_SIG_STAT_GOOD:
- result = _("Good signature");
- break;
- case GPGME_SIG_STAT_GOOD_EXP:
- result = _("Good signature but it has expired");
- break;
- case GPGME_SIG_STAT_GOOD_EXPKEY:
- result = _("Good signature but the key has expired");
- break;
- case GPGME_SIG_STAT_BAD:
- result = _("BAD signature");
- break;
- case GPGME_SIG_STAT_NOKEY:
- result = _("No public key to verify the signature");
- break;
- case GPGME_SIG_STAT_ERROR:
- result = _("Error verifying the signature");
- break;
- case GPGME_SIG_STAT_DIFF:
- result = _("Different results for signatures");
- break;
- default:
- result = _("Error: Unknown status");
- break;
- }
-
- return result;
-}
-
-static const gchar *
-sig_status_with_name (GpgmeSigStat status)
-{
- const gchar *result;
-
- switch (status) {
- case GPGME_SIG_STAT_NONE:
- result = _("Oops: Signature not verified");
- break;
- case GPGME_SIG_STAT_NOSIG:
- result = _("No signature found");
- break;
- case GPGME_SIG_STAT_GOOD:
- result = _("Good signature from \"%s\"");
- break;
- case GPGME_SIG_STAT_GOOD_EXP:
- result = _("Good signature from \"%s\" but it has expired");
- break;
- case GPGME_SIG_STAT_GOOD_EXPKEY:
- result = _("Good signature from \"%s\" but the key has expired");
- break;
- case GPGME_SIG_STAT_BAD:
- result = _("BAD signature from \"%s\"");
- break;
- case GPGME_SIG_STAT_NOKEY:
- result = _("No public key to verify the signature");
- break;
- case GPGME_SIG_STAT_ERROR:
- result = _("Error verifying the signature");
- break;
- case GPGME_SIG_STAT_DIFF:
- result = _("Different results for signatures");
- break;
- default:
- result = _("Error: Unknown status");
- break;
- }
-
- return result;
-}
-
-static void
-sig_status_for_key(GString *str, GpgmeCtx ctx, GpgmeSigStat status,
- GpgmeKey key, const gchar *fpr)
-{
- gint idx = 0;
- const char *uid;
-
- uid = gpgme_key_get_string_attr (key, GPGME_ATTR_USERID, NULL, idx);
- if (uid == NULL) {
- g_string_sprintfa (str, "%s\n",
- sig_status_to_string (status));
- if ((fpr != NULL) && (*fpr != '\0'))
- g_string_sprintfa (str, "Key fingerprint: %s\n", fpr);
- g_string_append (str, _("Cannot find user ID for this key."));
- sig_expiration_check(str, ctx, key, status, 0);
- return;
- }
- g_string_sprintfa (str, sig_status_with_name (status), uid);
- g_string_append (str, "\n");
-
- while (1) {
- uid = gpgme_key_get_string_attr (key, GPGME_ATTR_USERID,
- NULL, ++idx);
- if (uid == NULL)
- break;
- g_string_sprintfa (str, _(" aka \"%s\"\n"),
- uid);
- }
- sig_expiration_check(str, ctx, key, status, 0);
-}
-
-static void
-sig_expiration_check(GString *str, GpgmeCtx ctx, GpgmeKey key,
- GpgmeSigStat status, int idx)
-{
- if (status == GPGME_SIG_STAT_GOOD_EXP)
- sig_expired(str, ctx, idx);
- else if (status == GPGME_SIG_STAT_GOOD_EXPKEY)
- sig_key_expired(str, key, idx);
-}
-
-static void
-sig_expired(GString *str, GpgmeCtx ctx, int idx)
-{
- unsigned long exp_time;
- exp_time = gpgme_get_sig_ulong_attr(ctx, idx, GPGME_ATTR_EXPIRE, 0);
- g_string_sprintfa(str, _("Signature expired %s"), ctime(&exp_time));
-}
-
-static void
-sig_key_expired(GString *str, GpgmeKey key, int idx)
-{
- unsigned long exp_time;
- exp_time = gpgme_key_get_ulong_attr(key, GPGME_ATTR_EXPIRE, NULL, idx);
- g_string_sprintfa(str, _("Key expired %s"), ctime(&exp_time));
-}
-
-static gchar *
-sig_status_full (GpgmeCtx ctx)
-{
- GString *str;
- gint sig_idx = 0;
- GpgmeError err;
- GpgmeSigStat status;
- GpgmeKey key;
- const char *fpr;
- time_t created;
- struct tm *ctime_val;
- char ctime_str[80];
- gchar *retval;
-
- str = g_string_new ("");
-
- fpr = gpgme_get_sig_status (ctx, sig_idx, &status, &created);
- while (fpr != NULL) {
- if (created != 0) {
- ctime_val = localtime (&created);
- strftime (ctime_str, sizeof (ctime_str), "%c",
- ctime_val);
- g_string_sprintfa (str,
- _("Signature made at %s\n"),
- ctime_str);
- }
- err = gpgme_get_sig_key (ctx, sig_idx, &key);
- if (err != 0) {
- g_string_sprintfa (str, "%s\n",
- sig_status_to_string (status));
- if ((fpr != NULL) && (*fpr != '\0'))
- g_string_sprintfa (str,
- _("Key fingerprint: %s\n"),
- fpr);
- } else {
- const char *key_id_str;
-
- sig_status_for_key (str, ctx, status, key, fpr);
- key_id_str = gpgme_key_get_string_attr(key,
- GPGME_ATTR_KEYID, NULL, 0);
- key_id_str += 8;
- g_string_sprintfa (str, _("Key ID: %s\n"), key_id_str);
- gpgme_key_unref (key);
- }
- g_string_append (str, "\n\n");
-
- fpr = gpgme_get_sig_status (ctx, ++sig_idx, &status, &created);
- }
-
- retval = str->str;
- g_string_free (str, FALSE);
- return retval;
-}
-
-static void check_signature (MimeInfo *mimeinfo, MimeInfo *partinfo, FILE *fp)
-{
-#if 0 /* FIXME */
- GpgmeCtx ctx = NULL;
- GpgmeError err;
- GpgmeData sig = NULL, text = NULL;
- GpgmeSigStat status = GPGME_SIG_STAT_NONE;
- GpgmegtkSigStatus statuswindow = NULL;
- const char *result = NULL;
- gchar *tmp_file;
- gint n_exclude_chars = 0;
-
- if (prefs_common.gpg_signature_popup)
- statuswindow = gpgmegtk_sig_status_create ();
-
- err = gpgme_new (&ctx);
- if (err) {
- debug_print ("gpgme_new failed: %s\n", gpgme_strerror (err));
- goto leave;
- }
-
- /* don't include the last empty line.
- It does not belong to the signed text */
- if (mimeinfo->children->length > 0) {
- if (fseek(fp, mimeinfo->children->offset + mimeinfo->children->length - 1,
- SEEK_SET) < 0) {
- perror("fseek");
- goto leave;
- }
- if (fgetc(fp) == '\n') {
- n_exclude_chars++;
- if (mimeinfo->children->length > 1) {
- if (fseek(fp, mimeinfo->children->offset + mimeinfo->children->length - 2,
- SEEK_SET) < 0) {
- perror("fseek");
- goto leave;
- }
- if (fgetc(fp) == '\r')
- n_exclude_chars++;
- }
- }
- }
-
- /* canonicalize the file part. */
- tmp_file = get_tmp_file();
- if (copy_file_part(fp, mimeinfo->children->offset,
- mimeinfo->children->length - n_exclude_chars,
- tmp_file) < 0) {
- g_free(tmp_file);
- goto leave;
- }
- if (canonicalize_file_replace(tmp_file) < 0) {
- unlink(tmp_file);
- g_free(tmp_file);
- goto leave;
- }
-
- err = gpgme_data_new_from_file(&text, tmp_file, 1);
-
- unlink(tmp_file);
- g_free(tmp_file);
-
- if (!err)
- err = gpgme_data_new_from_filepart (&sig, NULL, fp,
- partinfo->offset, partinfo->length);
- if (err) {
- debug_print ("gpgme_data_new_from_filepart failed: %s\n",
- gpgme_strerror (err));
- goto leave;
- }
-
- err = gpgme_op_verify (ctx, sig, text, &status);
- if (err) {
- debug_print ("gpgme_op_verify failed: %s\n", gpgme_strerror (err));
- goto leave;
- }
-
- /* FIXME: check what the heck this sig_status_full stuff is.
- * it should better go into sigstatus.c */
- g_free (partinfo->sigstatus_full);
- partinfo->sigstatus_full = sig_status_full (ctx);
-
-leave:
- result = gpgmegtk_sig_status_to_string(status);
- debug_print("verification status: %s\n", result);
- if (prefs_common.gpg_signature_popup)
- gpgmegtk_sig_status_update (statuswindow, ctx);
-
- g_free (partinfo->sigstatus);
- partinfo->sigstatus = g_strdup (result);
- partinfo->sig_ok = (status == GPGME_SIG_STAT_GOOD);
- partinfo->sig_unknown = (status == GPGME_SIG_STAT_NOKEY);
- partinfo->sig_expired = (status == GPGME_SIG_STAT_GOOD_EXP);
- partinfo->key_expired = (status == GPGME_SIG_STAT_GOOD_EXPKEY);
-
- gpgme_data_release (sig);
- gpgme_data_release (text);
- gpgme_release (ctx);
- if (prefs_common.gpg_signature_popup)
- gpgmegtk_sig_status_destroy (statuswindow);
-#endif
-}
-
/*
* Copy a gpgme data object to a temporary file and
* return this filename