X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=blobdiff_plain;f=src%2Fplugins%2Fpgpmime%2Fpgpmime.c;h=b9a3d7dfef5ebda13768ee662e833214da36d350;hp=8013a2b1fdf12a5b9cdf942f9d648ed2a544bcba;hb=81b0679965b506fce98bedb70f74f8df70e81312;hpb=2bdb69e51f15176b1534ebb86be76ceb1f1a8322 diff --git a/src/plugins/pgpmime/pgpmime.c b/src/plugins/pgpmime/pgpmime.c index 8013a2b1f..b9a3d7dfe 100644 --- a/src/plugins/pgpmime/pgpmime.c +++ b/src/plugins/pgpmime/pgpmime.c @@ -1,6 +1,6 @@ /* * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 1999-2011 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 @@ -19,6 +19,7 @@ #ifdef HAVE_CONFIG_H # include "config.h" +#include "claws-features.h" #endif #ifdef USE_GPGME @@ -39,6 +40,7 @@ #include #include #include +#include #include "prefs_common.h" @@ -126,9 +128,10 @@ static gboolean pgpmime_is_signed(MimeInfo *mimeinfo) data = pgpmime_new_privacydata(); mimeinfo->privacy = (PrivacyData *) data; } - - data->done_sigtest = TRUE; - data->is_signed = TRUE; + if (data != NULL) { + data->done_sigtest = TRUE; + data->is_signed = TRUE; + } return TRUE; } @@ -239,10 +242,6 @@ static SignatureStatus pgpmime_get_sig_status(MimeInfo *mimeinfo) cm_return_val_if_fail(data != NULL, SIGNATURE_INVALID); - if (data->sigstatus == NULL && - prefs_gpg_get_config()->auto_check_signatures) - pgpmime_check_signature(mimeinfo); - return sgpgme_sigstat_gpgme_to_privacy(data->ctx, data->sigstatus); } @@ -252,23 +251,15 @@ static gchar *pgpmime_get_sig_info_short(MimeInfo *mimeinfo) cm_return_val_if_fail(data != NULL, g_strdup("Error")); - if (data->sigstatus == NULL && - prefs_gpg_get_config()->auto_check_signatures) - pgpmime_check_signature(mimeinfo); - return sgpgme_sigstat_info_short(data->ctx, data->sigstatus); } static gchar *pgpmime_get_sig_info_full(MimeInfo *mimeinfo) { PrivacyDataPGP *data = (PrivacyDataPGP *) mimeinfo->privacy; - + cm_return_val_if_fail(data != NULL, g_strdup("Error")); - if (data->sigstatus == NULL && - prefs_gpg_get_config()->auto_check_signatures) - pgpmime_check_signature(mimeinfo); - return sgpgme_sigstat_info_full(data->ctx, data->sigstatus); } @@ -276,7 +267,10 @@ static gboolean pgpmime_is_encrypted(MimeInfo *mimeinfo) { MimeInfo *tmpinfo; const gchar *tmpstr; - + const gchar *begin_indicator = "-----BEGIN PGP MESSAGE-----"; + const gchar *end_indicator = "-----END PGP MESSAGE-----"; + gchar *textdata; + if (mimeinfo->type != MIMETYPE_MULTIPART) return FALSE; if (g_ascii_strcasecmp(mimeinfo->subtype, "encrypted")) @@ -299,6 +293,21 @@ static gboolean pgpmime_is_encrypted(MimeInfo *mimeinfo) if (g_ascii_strcasecmp(tmpinfo->subtype, "octet-stream")) return FALSE; + textdata = get_part_as_string(tmpinfo); + if (!textdata) + return FALSE; + + if (!pgp_locate_armor_header(textdata, begin_indicator)) { + g_free(textdata); + return FALSE; + } + if (!pgp_locate_armor_header(textdata, end_indicator)) { + g_free(textdata); + return FALSE; + } + + g_free(textdata); + return TRUE; } @@ -364,6 +373,7 @@ static MimeInfo *pgpmime_decrypt(MimeInfo *mimeinfo) if (len > 0) { if (fwrite(chars, 1, len, dstfp) < len) { FILE_OP_ERROR(fname, "fwrite"); + g_free(chars); fclose(dstfp); privacy_set_error(_("Couldn't write to decrypted file %s"), fname); g_free(fname); @@ -373,6 +383,8 @@ static MimeInfo *pgpmime_decrypt(MimeInfo *mimeinfo) return NULL; } } + g_free(chars); + if (fclose(dstfp) == EOF) { FILE_OP_ERROR(fname, "fclose"); privacy_set_error(_("Couldn't close decrypted file %s"), fname); @@ -410,12 +422,14 @@ static MimeInfo *pgpmime_decrypt(MimeInfo *mimeinfo) data = pgpmime_new_privacydata(); decinfo->privacy = (PrivacyData *) data; } - data->done_sigtest = TRUE; - data->is_signed = TRUE; - data->sigstatus = sigstat; - if (data->ctx) - gpgme_release(data->ctx); - data->ctx = ctx; + if (data != NULL) { + data->done_sigtest = TRUE; + data->is_signed = TRUE; + data->sigstatus = sigstat; + if (data->ctx) + gpgme_release(data->ctx); + data->ctx = ctx; + } } else gpgme_release(ctx); @@ -530,8 +544,8 @@ gboolean pgpmime_sign(MimeInfo *mimeinfo, PrefsAccount *account, const gchar *fr if (result && result->signatures) { gpgme_new_signature_t sig = result->signatures; if (gpgme_get_protocol(ctx) == GPGME_PROTOCOL_OpenPGP) { - micalg = g_strdup_printf("PGP-%s", gpgme_hash_algo_name( - result->signatures->hash_algo)); + micalg = g_strdup_printf("pgp-%s", g_ascii_strdown(gpgme_hash_algo_name( + result->signatures->hash_algo),-1)); } else { micalg = g_strdup(gpgme_hash_algo_name( result->signatures->hash_algo)); @@ -567,6 +581,7 @@ gboolean pgpmime_sign(MimeInfo *mimeinfo, PrefsAccount *account, const gchar *fr g_warning("sgpgme_data_release_and_get_mem failed"); privacy_set_error(_("Data signing failed, no contents.")); g_free(micalg); + g_free(sigcontent); return FALSE; } @@ -577,12 +592,8 @@ gboolean pgpmime_sign(MimeInfo *mimeinfo, PrefsAccount *account, const gchar *fr newinfo = procmime_mimeinfo_new(); newinfo->type = MIMETYPE_APPLICATION; newinfo->subtype = g_strdup("pgp-signature"); - g_hash_table_insert(newinfo->typeparameters, g_strdup("name"), - g_strdup("signature.asc")); + newinfo->description = g_strdup(_("OpenPGP digital signature")); newinfo->content = MIMECONTENT_MEM; - newinfo->disposition = DISPOSITIONTYPE_ATTACHMENT; - g_hash_table_insert(newinfo->dispositionparameters, g_strdup("filename"), - g_strdup("signature.asc")); newinfo->data.mem = g_malloc(len + 1); g_memmove(newinfo->data.mem, sigcontent, len); newinfo->data.mem[len] = '\0'; @@ -705,6 +716,7 @@ gboolean pgpmime_encrypt(MimeInfo *mimeinfo, const gchar *encrypt_data) g_warning("sgpgme_data_release_and_get_mem failed"); privacy_set_error(_("Encryption failed, %s"), gpgme_strerror(err)); gpgme_release(ctx); + g_free(enccontent); return FALSE; } @@ -758,6 +770,7 @@ static PrivacySystem pgpmime_system = { pgpmime_encrypt, pgpmime_get_encrypt_warning, pgpmime_inhibit_encrypt_warning, + prefs_gpg_auto_check_signatures, }; void pgpmime_init()