/*
* Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2012 Colin Leroy <colin@colino.net> and
- * the Claws Mail team
+ * Copyright (C) 1999-2016 Colin Leroy and 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
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
*/
#ifdef HAVE_CONFIG_H
#include <glib/gi18n.h>
#include <errno.h>
#include <gpgme.h>
+#include <file-utils.h>
#include "utils.h"
#include "privacy.h"
#include <plugins/pgpcore/sgpgme.h>
#include <plugins/pgpcore/prefs_gpg.h>
#include <plugins/pgpcore/passphrase.h>
+#include <plugins/pgpcore/pgp_utils.h>
#include "quoted-printable.h"
-#include "base64.h"
#include "codeconv.h"
#include "plugin.h"
data->is_signed = FALSE;
data->sigstatus = NULL;
if ((err = gpgme_new(&data->ctx)) != GPG_ERR_NO_ERROR) {
- debug_print(("Couldn't initialize GPG context, %s"), gpgme_strerror(err));
+ debug_print(("Couldn't initialize GPG context, %s\n"), gpgme_strerror(err));
return NULL;
}
g_free(data);
}
-static gchar *fp_read_noconv(FILE *fp)
-{
- GByteArray *array;
- guchar buf[BUFSIZ];
- gint n_read;
- gchar *result = NULL;
-
- if (!fp)
- return NULL;
- array = g_byte_array_new();
-
- while ((n_read = fread(buf, sizeof(gchar), sizeof(buf), fp)) > 0) {
- if (n_read < sizeof(buf) && ferror(fp))
- break;
- g_byte_array_append(array, buf, n_read);
- }
-
- if (ferror(fp)) {
- FILE_OP_ERROR("file stream", "fread");
- g_byte_array_free(array, TRUE);
- return NULL;
- }
-
- buf[0] = '\0';
- g_byte_array_append(array, buf, 1);
- result = (gchar *)array->data;
- g_byte_array_free(array, FALSE);
-
- return result;
-}
-
-static gchar *get_part_as_string(MimeInfo *mimeinfo)
-{
- gchar *textdata = NULL;
- gchar *filename = NULL;
- FILE *fp;
-
- cm_return_val_if_fail(mimeinfo != NULL, 0);
- procmime_decode_content(mimeinfo);
-
- if (mimeinfo->content == MIMECONTENT_MEM)
- textdata = g_strdup(mimeinfo->data.mem);
- else {
- filename = procmime_get_tmp_file_name(mimeinfo);
- if (procmime_get_part(filename, mimeinfo) < 0) {
- printf("error dumping file\n");
- return NULL;
- }
- fp = g_fopen(filename,"rb");
- if (!fp) {
- printf("error reading file\n");
- return NULL;
- }
- textdata = fp_read_noconv(fp);
- fclose(fp);
- g_unlink(filename);
- g_free(filename);
- }
-
- if (!g_utf8_validate(textdata, -1, NULL)) {
- gchar *tmp = NULL;
- codeconv_set_strict(TRUE);
- if (procmime_mimeinfo_get_parameter(mimeinfo, "charset")) {
- tmp = conv_codeset_strdup(textdata,
- procmime_mimeinfo_get_parameter(mimeinfo, "charset"),
- CS_UTF_8);
- }
- if (!tmp) {
- tmp = conv_codeset_strdup(textdata,
- conv_get_locale_charset_str_no_utf8(),
- CS_UTF_8);
- }
- codeconv_set_strict(FALSE);
- if (!tmp) {
- tmp = conv_codeset_strdup(textdata,
- conv_get_locale_charset_str_no_utf8(),
- CS_UTF_8);
- }
- if (tmp) {
- g_free(textdata);
- textdata = tmp;
- }
- }
-
- return textdata;
-}
-
static gboolean pgpinline_is_signed(MimeInfo *mimeinfo)
{
PrivacyDataPGP *data = NULL;
return data->is_signed;
}
- textdata = get_part_as_string(mimeinfo);
+ textdata = procmime_get_part_as_string(mimeinfo, TRUE);
if (!textdata)
return FALSE;
data = pgpinline_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;
}
cm_return_val_if_fail(mimeinfo->privacy != NULL, 0);
data = (PrivacyDataPGP *) mimeinfo->privacy;
- textdata = get_part_as_string(mimeinfo);
+ textdata = procmime_get_part_as_string(mimeinfo, TRUE);
if (!textdata) {
g_free(textdata);
conv_get_locale_charset_str_no_utf8());
}
if (!tmp) {
- g_warning("Can't convert charset to anything sane\n");
+ g_warning("Can't convert charset to anything sane");
tmp = conv_codeset_strdup(textdata, CS_UTF_8, CS_US_ASCII);
}
g_free(textdata);
g_free(tmp);
if ((err = gpgme_new(&data->ctx)) != GPG_ERR_NO_ERROR) {
- debug_print(("Couldn't initialize GPG context, %s"), gpgme_strerror(err));
+ debug_print(("Couldn't initialize GPG context, %s\n"), gpgme_strerror(err));
privacy_set_error(_("Couldn't initialize GPG context, %s"), gpgme_strerror(err));
g_free(textdata);
return 0;
static SignatureStatus pgpinline_get_sig_status(MimeInfo *mimeinfo)
{
PrivacyDataPGP *data = (PrivacyDataPGP *) mimeinfo->privacy;
-
- cm_return_val_if_fail(data != NULL, SIGNATURE_INVALID);
- if (data->sigstatus == NULL &&
- prefs_gpg_get_config()->auto_check_signatures)
- pgpinline_check_signature(mimeinfo);
+ cm_return_val_if_fail(data != NULL, SIGNATURE_INVALID);
return sgpgme_sigstat_gpgme_to_privacy(data->ctx, data->sigstatus);
}
static gchar *pgpinline_get_sig_info_short(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)
- pgpinline_check_signature(mimeinfo);
-
return sgpgme_sigstat_info_short(data->ctx, data->sigstatus);
}
return sgpgme_sigstat_info_full(data->ctx, data->sigstatus);
}
-
-
static gboolean pgpinline_is_encrypted(MimeInfo *mimeinfo)
{
- const gchar *enc_indicator = "-----BEGIN PGP MESSAGE-----";
+ const gchar *begin_indicator = "-----BEGIN PGP MESSAGE-----";
+ const gchar *end_indicator = "-----END PGP MESSAGE-----";
gchar *textdata;
cm_return_val_if_fail(mimeinfo != NULL, FALSE);
g_free(mimeinfo->subtype);
mimeinfo->subtype = g_strdup("plain");
}
-
- textdata = get_part_as_string(mimeinfo);
+
+ textdata = procmime_get_part_as_string(mimeinfo, TRUE);
if (!textdata)
return FALSE;
-
- if (!strstr(textdata, enc_indicator)) {
+
+ 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;
}
return NULL;
}
- textdata = get_part_as_string(mimeinfo);
+ textdata = procmime_get_part_as_string(mimeinfo, TRUE);
if (!textdata) {
gpgme_release(ctx);
privacy_set_error(_("Couldn't get text data."));
fname = g_strdup_printf("%s%cplaintext.%08x",
get_mime_tmp_dir(), G_DIR_SEPARATOR, ++id);
- if ((dstfp = g_fopen(fname, "wb")) == NULL) {
- FILE_OP_ERROR(fname, "fopen");
+ if ((dstfp = claws_fopen(fname, "wb")) == NULL) {
+ FILE_OP_ERROR(fname, "claws_fopen");
privacy_set_error(_("Couldn't open decrypted file %s"), fname);
g_free(fname);
gpgme_data_release(plain);
}
/* Store any part before encrypted text */
- pos = strstr(textdata, begin_indicator);
+ pos = pgp_locate_armor_header(textdata, begin_indicator);
if (pos != NULL && (pos - textdata) > 0) {
- if (fwrite(textdata, 1, pos - textdata, dstfp) < pos - textdata) {
- FILE_OP_ERROR(fname, "fwrite");
+ if (claws_fwrite(textdata, 1, pos - textdata, dstfp) < pos - textdata) {
+ FILE_OP_ERROR(fname, "claws_fwrite");
privacy_set_error(_("Couldn't write to decrypted file %s"), fname);
goto FILE_ERROR;
}
}
- if (fwrite(_("\n--- Start of PGP/Inline encrypted data ---\n"), 1,
+ if (claws_fwrite(_("\n--- Start of PGP/Inline encrypted data ---\n"), 1,
strlen(_("\n--- Start of PGP/Inline encrypted data ---\n")),
dstfp) < strlen(_("\n--- Start of PGP/Inline encrypted data ---\n"))) {
- FILE_OP_ERROR(fname, "fwrite");
+ FILE_OP_ERROR(fname, "claws_fwrite");
privacy_set_error(_("Couldn't write to decrypted file %s"), fname);
goto FILE_ERROR;
}
chars = sgpgme_data_release_and_get_mem(plain, &len);
if (len > 0) {
- if (fwrite(chars, 1, len, dstfp) < len) {
- FILE_OP_ERROR(fname, "fwrite");
+ if (claws_fwrite(chars, 1, len, dstfp) < len) {
+ FILE_OP_ERROR(fname, "claws_fwrite");
g_free(chars);
privacy_set_error(_("Couldn't write to decrypted file %s"), fname);
goto FILE_ERROR;
}
g_free(chars);
/* Store any part after encrypted text */
- if (fwrite(_("--- End of PGP/Inline encrypted data ---\n"), 1,
+ if (claws_fwrite(_("--- End of PGP/Inline encrypted data ---\n"), 1,
strlen(_("--- End of PGP/Inline encrypted data ---\n")),
dstfp) < strlen(_("--- End of PGP/Inline encrypted data ---\n"))) {
- FILE_OP_ERROR(fname, "fwrite");
+ FILE_OP_ERROR(fname, "claws_fwrite");
privacy_set_error(_("Couldn't write to decrypted file %s"), fname);
goto FILE_ERROR;
}
if (pos != NULL) {
- pos = strstr(pos, end_indicator);
+ pos = pgp_locate_armor_header(pos, end_indicator);
if (pos != NULL && *pos != '\0') {
pos += strlen(end_indicator);
- if (fwrite(pos, 1, strlen(pos), dstfp) < strlen(pos)) {
- FILE_OP_ERROR(fname, "fwrite");
+ if (claws_fwrite(pos, 1, strlen(pos), dstfp) < strlen(pos)) {
+ FILE_OP_ERROR(fname, "claws_fwrite");
privacy_set_error(_("Couldn't write to decrypted file %s"), fname);
goto FILE_ERROR;
}
}
}
- if (fclose(dstfp) == EOF) {
- FILE_OP_ERROR(fname, "fclose");
+ if (claws_safe_fclose(dstfp) == EOF) {
+ FILE_OP_ERROR(fname, "claws_fclose");
privacy_set_error(_("Couldn't close decrypted file %s"), fname);
g_free(fname);
gpgme_data_release(plain);
}
g_node_unlink(decinfo->node);
- procmime_mimeinfo_free_all(parseinfo);
+ procmime_mimeinfo_free_all(&parseinfo);
decinfo->tmp = TRUE;
data = pgpinline_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);
return decinfo;
FILE_ERROR:
- fclose(dstfp);
+ claws_fclose(dstfp);
g_free(fname);
gpgme_data_release(plain);
gpgme_release(ctx);
fp = my_tmpfile();
if (fp == NULL) {
perror("my_tmpfile");
- privacy_set_error(_("Couldn't create temporary file."));
+ privacy_set_error(_("Couldn't create temporary file, %s"), g_strerror(errno));
return FALSE;
}
procmime_write_mimeinfo(msgcontent, fp);
rewind(fp);
/* read temporary file into memory */
- textstr = fp_read_noconv(fp);
+ textstr = file_read_stream_to_str_no_recode(fp);
- fclose(fp);
+ claws_fclose(fp);
gpgme_data_new_from_mem(&gpgtext, textstr, (size_t)strlen(textstr), 0);
gpgme_data_new(&gpgsig);
if ((err = gpgme_new(&ctx)) != GPG_ERR_NO_ERROR) {
- debug_print(("Couldn't initialize GPG context, %s"), gpgme_strerror(err));
+ debug_print(("Couldn't initialize GPG context, %s\n"), gpgme_strerror(err));
privacy_set_error(_("Couldn't initialize GPG context, %s"), gpgme_strerror(err));
return FALSE;
}
}
prefs_gpg_enable_agent(prefs_gpg_get_config()->use_gpg_agent);
- if (!getenv("GPG_AGENT_INFO") || !prefs_gpg_get_config()->use_gpg_agent) {
+ if (!g_getenv("GPG_AGENT_INFO") || !prefs_gpg_get_config()->use_gpg_agent) {
info.c = ctx;
gpgme_set_passphrase_cb (ctx, gpgmegtk_passphrase_cb, &info);
}
}
tmp = g_malloc(len+1);
- g_memmove(tmp, sigcontent, len+1);
+ memmove(tmp, sigcontent, len+1);
tmp[len] = '\0';
gpgme_data_release(gpgtext);
g_free(textstr);
kset = g_malloc(sizeof(gpgme_key_t)*(i+1));
memset(kset, 0, sizeof(gpgme_key_t)*(i+1));
if ((err = gpgme_new(&ctx)) != GPG_ERR_NO_ERROR) {
- debug_print(("Couldn't initialize GPG context, %s"), gpgme_strerror(err));
+ debug_print(("Couldn't initialize GPG context, %s\n"), gpgme_strerror(err));
privacy_set_error(_("Couldn't initialize GPG context, %s"), gpgme_strerror(err));
g_free(kset);
return FALSE;
fp = my_tmpfile();
if (fp == NULL) {
- privacy_set_error(_("Couldn't create temporary file, %s"), strerror(errno));
+ privacy_set_error(_("Couldn't create temporary file, %s"), g_strerror(errno));
perror("my_tmpfile");
g_free(kset);
return FALSE;
rewind(fp);
/* read temporary file into memory */
- textstr = fp_read_noconv(fp);
+ textstr = file_read_stream_to_str_no_recode(fp);
- fclose(fp);
+ claws_fclose(fp);
/* encrypt data */
gpgme_data_new_from_mem(&gpgtext, textstr, (size_t)strlen(textstr), 0);
gpgme_data_new(&gpgenc);
if ((err = gpgme_new(&ctx)) != GPG_ERR_NO_ERROR) {
- debug_print(("Couldn't initialize GPG context, %s"), gpgme_strerror(err));
+ debug_print(("Couldn't initialize GPG context, %s\n"), gpgme_strerror(err));
privacy_set_error(_("Couldn't initialize GPG context, %s"), gpgme_strerror(err));
g_free(kset);
return FALSE;
gpgme_data_release(gpgtext);
g_free(textstr);
gpgme_release(ctx);
+ g_free(enccontent);
return FALSE;
}
tmp = g_malloc(len+1);
- g_memmove(tmp, enccontent, len+1);
+ memmove(tmp, enccontent, len+1);
tmp[len] = '\0';
g_free(enccontent);
pgpinline_encrypt,
pgpinline_get_encrypt_warning,
pgpinline_inhibit_encrypt_warning,
+ prefs_gpg_auto_check_signatures,
};
void pgpinline_init()