My fixes to the patch
See git.disroot.org/gfgit/claws-mail
This commit is contained in:
parent
72e49c6443
commit
79d84cc2d4
|
@ -1416,8 +1416,14 @@ gint messageview_show(MessageView *messageview, MsgInfo *msginfo,
|
|||
g_free(text);
|
||||
break;
|
||||
}
|
||||
if (encinfo->extra_headers){
|
||||
if (mimeinfo->extra_headers){
|
||||
g_message("messageview_show: found extra headers after encryption");
|
||||
|
||||
for(int i = 0; i < mimeinfo->extra_headers->len; i++) {
|
||||
Header *hp = g_ptr_array_index(mimeinfo->extra_headers, i);
|
||||
g_message("Extra Header %d - %s %s", i, hp->name, hp->body);
|
||||
msginfo_add_protected_header(msginfo, hp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1690,7 +1690,7 @@ static void mimeview_drag_data_get(GtkWidget *widget,
|
|||
subst_for_filename(name);
|
||||
}
|
||||
}
|
||||
procheader_header_array_destroy(headers);
|
||||
g_ptr_array_free(headers, TRUE);
|
||||
}
|
||||
}
|
||||
if (fp != NULL)
|
||||
|
|
|
@ -328,6 +328,12 @@ static MimeInfo *pgpmime_decrypt(MimeInfo *mimeinfo)
|
|||
|
||||
if (parseinfo->extra_headers != NULL) {
|
||||
g_message("PGP Plugin: decrypted message has protected headers");
|
||||
|
||||
for(int i = 0; i < parseinfo->extra_headers->len; i++) {
|
||||
Header *hp = g_ptr_array_index(parseinfo->extra_headers, i);
|
||||
g_message("Extra Header %d - %s %s", i, hp->name, hp->body);
|
||||
}
|
||||
|
||||
decinfo->extra_headers = parseinfo->extra_headers;
|
||||
parseinfo->extra_headers = NULL;
|
||||
}
|
||||
|
@ -716,41 +722,43 @@ static PrivacySystem pgpmime_system = {
|
|||
|
||||
static MimeParser *protected_headers_parser = NULL;
|
||||
|
||||
static void pgpmime_add_header_no_content(void *header, void *data) {
|
||||
Header *hdr = (Header *)header;
|
||||
MimeInfo *mimeinfo = (MimeInfo *)data;
|
||||
|
||||
if (!procheader_headername_equal(hdr->name,"Content-Type")) {
|
||||
if ( g_hash_table_lookup(mimeinfo->typeparameters,"protected-headers"))
|
||||
g_message("Parser Found protected header: %s %s",hdr->name, hdr->body);
|
||||
else
|
||||
g_message("Parser Found rfc822-header: %s %s",hdr->name, hdr->body);
|
||||
procmime_mimeinfo_add_extra_header(mimeinfo, hdr);
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean protected_headers_parse (MimeParser *parser, MimeInfo *mimeinfo) {
|
||||
FILE *fp;
|
||||
g_message("Parsing rfc822-header mime part");
|
||||
|
||||
fp = claws_fopen(mimeinfo->data.filename, "rb");
|
||||
if (!fp) {
|
||||
FILE_OP_ERROR(mimeinfo->data.filename, "claws_fopen");
|
||||
return FALSE;
|
||||
FILE_OP_ERROR(mimeinfo->data.filename, "claws_fopen");
|
||||
return FALSE;
|
||||
}
|
||||
if (fseek(fp, mimeinfo->offset, SEEK_SET) < 0) {
|
||||
FILE_OP_ERROR(mimeinfo->data.filename, "fseek");
|
||||
claws_fclose(fp);
|
||||
return FALSE;
|
||||
FILE_OP_ERROR(mimeinfo->data.filename, "fseek");
|
||||
claws_fclose(fp);
|
||||
return FALSE;
|
||||
}
|
||||
GPtrArray *protected_headers = procheader_get_header_array_asis(fp);
|
||||
if (protected_headers == NULL) {
|
||||
claws_fclose(fp);
|
||||
return FALSE;
|
||||
|
||||
GPtrArray *protected_headers = procheader_get_header_array(fp);
|
||||
if (protected_headers != NULL) {
|
||||
g_ptr_array_foreach(protected_headers,
|
||||
pgpmime_add_header_no_content, mimeinfo);
|
||||
g_ptr_array_free(protected_headers, TRUE);
|
||||
/*TODO: We never return false??? */
|
||||
}
|
||||
|
||||
claws_fclose(fp);
|
||||
|
||||
for (size_t i = 0; i < protected_headers->len; i++) {
|
||||
Header *header = g_ptr_array_index(protected_headers, i);
|
||||
if (!g_ascii_strcasecmp(header->name,"Content-Type:")) {
|
||||
g_ptr_array_remove_index(protected_headers,i);
|
||||
continue;
|
||||
}
|
||||
if ( g_hash_table_lookup(mimeinfo->typeparameters,"protected-headers"))
|
||||
g_message("Parser Found protected header: %s %s",header->name, header->body);
|
||||
else
|
||||
g_message("Parser Found rfc822-header: %s %s",header->name, header->body);
|
||||
procmime_mimeinfo_add_extra_header(mimeinfo, header);
|
||||
}
|
||||
|
||||
g_ptr_array_unref(protected_headers);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -767,9 +775,12 @@ void pgpmime_init()
|
|||
|
||||
void pgpmime_done()
|
||||
{
|
||||
procmime_mimeparser_unregister(protected_headers_parser);
|
||||
g_free(protected_headers_parser);
|
||||
protected_headers_parser = NULL;
|
||||
if (protected_headers_parser != NULL) {
|
||||
procmime_mimeparser_unregister(protected_headers_parser);
|
||||
g_free(protected_headers_parser);
|
||||
protected_headers_parser = NULL;
|
||||
} else
|
||||
g_warning("%s:%d protected_headers_parser not initialized",__FUNCTION__,__LINE__);
|
||||
|
||||
privacy_unregister_system(&pgpmime_system);
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include "privacy.h"
|
||||
#include "procmime.h"
|
||||
#include "procmsg.h"
|
||||
#include "procheader.h"
|
||||
|
||||
static GSList *systems = NULL;
|
||||
static gchar *privacy_last_error = NULL;
|
||||
|
@ -326,15 +327,21 @@ static gint decrypt(MimeInfo *mimeinfo, PrivacySystem *system)
|
|||
|
||||
procmime_mimeinfo_free_all(&mimeinfo);
|
||||
|
||||
g_node_insert(parentinfo->node, childnumber, decryptedinfo->node);
|
||||
if ( decryptedinfo->extra_headers) {
|
||||
if ( parentinfo) {
|
||||
if (decryptedinfo->extra_headers) {
|
||||
if (parentinfo) {
|
||||
g_message("Propagating extra headers up after decrpyt()");
|
||||
parentinfo->extra_headers = decryptedinfo->extra_headers;
|
||||
decryptedinfo->extra_headers = NULL;
|
||||
|
||||
for(int i = 0; i < parentinfo->extra_headers->len; i++) {
|
||||
Header *hp = g_ptr_array_index(parentinfo->extra_headers, i);
|
||||
g_message("Extra Header %d - %s %s", i, hp->name, hp->body);
|
||||
}
|
||||
} else
|
||||
g_message("Identified extra headers up after decrpyt()");
|
||||
}
|
||||
g_node_insert(parentinfo->node, childnumber, decryptedinfo->node);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
101
src/procheader.c
101
src/procheader.c
|
@ -168,28 +168,47 @@ static gint generic_get_one_field(gchar **bufptr, void *data,
|
|||
len = BUFFSIZE;
|
||||
buf = g_malloc(len);
|
||||
|
||||
do {
|
||||
if (hentry != NULL) {
|
||||
/* skip non-required headers */
|
||||
/* and get hentry header line */
|
||||
do {
|
||||
if (getline(buf, len, data) == NULL) {
|
||||
debug_print("generic_get_one_field: getline\n");
|
||||
g_free(buf);
|
||||
*bufptr = NULL;
|
||||
return -1;
|
||||
}
|
||||
if (buf[0] == '\r' || buf[0] == '\n') {
|
||||
debug_print("generic_get_one_field: empty line\n");
|
||||
g_free(buf);
|
||||
*bufptr = NULL;
|
||||
return -1;
|
||||
}
|
||||
} while (buf[0] == ' ' || buf[0] == '\t');
|
||||
for (hp = hentry, hnum = 0; hp != NULL && hp->name != NULL;
|
||||
hp++, hnum++) {
|
||||
if (!g_ascii_strncasecmp(hp->name, buf, strlen(hp->name)))
|
||||
break;
|
||||
}
|
||||
} while ( hentry != NULL && allfields == FALSE && hp->name == NULL);
|
||||
do {
|
||||
if (getline(buf, len, data) == NULL) {
|
||||
debug_print("generic_get_one_field: getline\n");
|
||||
g_free(buf);
|
||||
*bufptr = NULL;
|
||||
return -1;
|
||||
}
|
||||
if (buf[0] == '\r' || buf[0] == '\n') {
|
||||
debug_print("generic_get_one_field: empty line\n");
|
||||
g_free(buf);
|
||||
*bufptr = NULL;
|
||||
return -1;
|
||||
}
|
||||
} while (buf[0] == ' ' || buf[0] == '\t');
|
||||
|
||||
for (hp = hentry, hnum = 0; hp->name != NULL;
|
||||
hp++, hnum++) {
|
||||
if (!g_ascii_strncasecmp(hp->name, buf,
|
||||
strlen(hp->name)))
|
||||
break;
|
||||
}
|
||||
} while (allfields == FALSE && hp->name == NULL);
|
||||
} else {
|
||||
/* read first line */
|
||||
if (getline(buf, len, data) == NULL) {
|
||||
debug_print("generic_get_one_field: getline\n");
|
||||
g_free(buf);
|
||||
*bufptr = NULL;
|
||||
return -1;
|
||||
}
|
||||
if (buf[0] == '\r' || buf[0] == '\n') {
|
||||
debug_print("generic_get_one_field: empty line\n");
|
||||
g_free(buf);
|
||||
*bufptr = NULL;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
/* reduce initial buffer to its useful part */
|
||||
len = strlen(buf)+1;
|
||||
buf = g_realloc(buf, len);
|
||||
|
@ -263,6 +282,18 @@ gint procheader_get_one_field_asis(gchar **buf, FILE *fp)
|
|||
FALSE, TRUE);
|
||||
}
|
||||
|
||||
inline
|
||||
void procheader_header_free(gpointer ptr)
|
||||
{
|
||||
Header *header = (Header*) ptr;
|
||||
|
||||
if (!header) return;
|
||||
|
||||
g_free(header->name);
|
||||
g_free(header->body);
|
||||
g_free(header);
|
||||
}
|
||||
|
||||
GPtrArray *procheader_get_header_array(FILE *fp)
|
||||
{
|
||||
gchar *buf = NULL;
|
||||
|
@ -271,7 +302,7 @@ GPtrArray *procheader_get_header_array(FILE *fp)
|
|||
|
||||
cm_return_val_if_fail(fp != NULL, NULL);
|
||||
|
||||
headers = g_ptr_array_new();
|
||||
headers = g_ptr_array_new_with_free_func(procheader_header_free);
|
||||
|
||||
while (procheader_get_one_field(&buf, fp, NULL) != -1) {
|
||||
if ((header = procheader_parse_header(buf)) != NULL)
|
||||
|
@ -283,30 +314,6 @@ GPtrArray *procheader_get_header_array(FILE *fp)
|
|||
return headers;
|
||||
}
|
||||
|
||||
void procheader_header_array_destroy(GPtrArray *harray)
|
||||
{
|
||||
gint i;
|
||||
Header *header;
|
||||
|
||||
cm_return_if_fail(harray != NULL);
|
||||
|
||||
for (i = 0; i < harray->len; i++) {
|
||||
header = g_ptr_array_index(harray, i);
|
||||
procheader_header_free(header);
|
||||
}
|
||||
|
||||
g_ptr_array_free(harray, TRUE);
|
||||
}
|
||||
|
||||
void procheader_header_free(Header *header)
|
||||
{
|
||||
if (!header) return;
|
||||
|
||||
g_free(header->name);
|
||||
g_free(header->body);
|
||||
g_free(header);
|
||||
}
|
||||
|
||||
/*
|
||||
tests whether two headers' names are equal
|
||||
remove the trailing ':' or ' ' before comparing
|
||||
|
@ -402,7 +409,7 @@ GPtrArray * procheader_get_all_header_fields(FILE *fp, HeaderEntry hentry[])
|
|||
|
||||
if (hentry == NULL) return NULL;
|
||||
|
||||
extra_headers = g_ptr_array_new();
|
||||
extra_headers = g_ptr_array_new_with_free_func(procheader_header_free);
|
||||
if (extra_headers == NULL) return NULL;
|
||||
|
||||
while ((hnum = procheader_get_one_field_extra(&buf, fp, hentry)) != -1) {
|
||||
|
@ -422,7 +429,7 @@ GPtrArray * procheader_get_all_header_fields(FILE *fp, HeaderEntry hentry[])
|
|||
g_free(tp);
|
||||
}
|
||||
} else if (extra_headers != NULL) {
|
||||
g_ptr_array_add(extra_headers, g_strdup(buf));
|
||||
g_ptr_array_add(extra_headers, procheader_parse_header(buf));
|
||||
}
|
||||
g_free(buf);
|
||||
buf = NULL;
|
||||
|
|
|
@ -48,8 +48,7 @@ gint procheader_get_one_field_asis (gchar **buf,
|
|||
FILE *fp);
|
||||
|
||||
GPtrArray *procheader_get_header_array (FILE *fp);
|
||||
void procheader_header_array_destroy (GPtrArray *harray);
|
||||
void procheader_header_free (Header *header);
|
||||
void procheader_header_free (gpointer header);
|
||||
|
||||
gboolean procheader_skip_headers(FILE *fp);
|
||||
|
||||
|
@ -85,7 +84,6 @@ void procheader_date_get_localtime (gchar *dest,
|
|||
Header * procheader_parse_header (gchar * buf);
|
||||
|
||||
gboolean procheader_headername_equal (char * hdr1, char * hdr2);
|
||||
void procheader_header_free (Header * header);
|
||||
|
||||
gint procheader_get_header_from_msginfo (MsgInfo *msginfo,
|
||||
gchar **buf,
|
||||
|
|
|
@ -149,6 +149,11 @@ static gboolean free_func(GNode *node, gpointer data)
|
|||
if (mimeinfo->sig_data)
|
||||
privacy_free_signature_data(mimeinfo->sig_data);
|
||||
|
||||
if (mimeinfo->extra_headers) {
|
||||
g_warning("Extra Header gets FREED!");
|
||||
g_ptr_array_free(mimeinfo->extra_headers, TRUE);
|
||||
}
|
||||
|
||||
g_free(mimeinfo);
|
||||
|
||||
return FALSE;
|
||||
|
@ -1532,7 +1537,9 @@ static void procmime_parse_message_rfc822(MimeInfo *mimeinfo, gboolean short_sca
|
|||
claws_fclose(fp);
|
||||
return;
|
||||
}
|
||||
|
||||
headers = procheader_get_all_header_fields(fp, hentry);
|
||||
|
||||
if (hentry[0].body != NULL) {
|
||||
tmp = conv_unmime_header(hentry[0].body, NULL, FALSE);
|
||||
g_free(hentry[0].body);
|
||||
|
@ -1569,27 +1576,31 @@ static void procmime_parse_message_rfc822(MimeInfo *mimeinfo, gboolean short_sca
|
|||
if ( g_hash_table_lookup(thispart->typeparameters, "protected-headers") != NULL ) {
|
||||
HeaderEntry *hp;
|
||||
g_message("Found protected headers attribute %s",(gchar *)g_hash_table_lookup(thispart->typeparameters, "protected-headers"));
|
||||
for (guint ii = 0; ii < headers->len; ii ++) {
|
||||
gchar *headbuf = (gchar *)g_ptr_array_index(headers, ii);
|
||||
|
||||
/* TODO: g_ptr_array_steal_index() is costly.
|
||||
* We can replace item witn NULL to state it should not be freed and we take ownership
|
||||
* instead of stealing it which forces array to resize and move items around.
|
||||
*/
|
||||
while(headers->len) {
|
||||
/* Take ownership because header is passed to mimeinfo struct without copy */
|
||||
Header *header = (Header *)g_ptr_array_steal_index(headers, 0);
|
||||
/* TODO: Sanity check, remove for prod!*/
|
||||
// g_message("testing Header: %s", headbuf);
|
||||
hp = &hentry[0];
|
||||
while (hp->name != NULL) {
|
||||
if (strncmp(hp->name, headbuf,strlen(hp->name)) == 0) {
|
||||
if (strcmp(hp->name, header->name) == 0) {
|
||||
g_warning("Removing Header: %s", hp->name);
|
||||
g_ptr_array_remove_index(headers,ii);
|
||||
procheader_header_free(header);
|
||||
break;
|
||||
}
|
||||
hp++;
|
||||
}
|
||||
if (hp->name == NULL)
|
||||
|
||||
/* TODO: End sanity check */
|
||||
g_message("Preamble: Found extra (protected) Header: %s",headbuf);
|
||||
Header *header = procheader_parse_header(headbuf);
|
||||
if ( header != NULL )
|
||||
procmime_mimeinfo_add_extra_header(mimeinfo, header);
|
||||
else
|
||||
g_warning("Found header line which cannot be parsed: %s",headbuf);
|
||||
if (hp->name == NULL)
|
||||
g_message("Preamble: Found extra (protected) Header: %s", header->name);
|
||||
|
||||
procmime_mimeinfo_add_extra_header(mimeinfo, header);
|
||||
}
|
||||
}
|
||||
g_ptr_array_unref(headers);
|
||||
|
@ -2279,6 +2290,11 @@ static int procmime_parse_mimepart(MimeInfo *parent,
|
|||
if (parent != NULL) {
|
||||
parent->extra_headers = mimeinfo->extra_headers;
|
||||
mimeinfo->extra_headers = NULL;
|
||||
|
||||
for(int i = 0; i < parent->extra_headers->len; i++) {
|
||||
Header *hp = g_ptr_array_index(parent->extra_headers, i);
|
||||
g_message("Extra Header %d - %s %s", i, hp->name, hp->body);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1578,8 +1578,6 @@ guint procmsg_msginfo_memusage(MsgInfo *msginfo)
|
|||
memusage += strlen(msginfo->extradata->list_owner);
|
||||
if (msginfo->extradata->protected_headers)
|
||||
memusage += 0; // TODO: determine correct size of extradata
|
||||
if (msginfo->extradata->protected_headers)
|
||||
memusage += 0; // TODO: determine correct size of extradata
|
||||
}
|
||||
return memusage;
|
||||
}
|
||||
|
|
|
@ -1952,7 +1952,7 @@ static GPtrArray *textview_scan_header(TextView *textview, FILE *fp)
|
|||
headers = procheader_get_header_array(fp);
|
||||
sorted_headers = g_ptr_array_new();
|
||||
for (i = 0; i < headers->len; i++) {
|
||||
header = g_ptr_array_index(headers, i);
|
||||
header = g_ptr_array_steal_index(headers, i);
|
||||
if (!procheader_header_is_internal(header->name))
|
||||
g_ptr_array_add(sorted_headers, header);
|
||||
else
|
||||
|
@ -1970,7 +1970,7 @@ static GPtrArray *textview_scan_header(TextView *textview, FILE *fp)
|
|||
|
||||
headers = procheader_get_header_array(fp);
|
||||
|
||||
sorted_headers = g_ptr_array_new();
|
||||
sorted_headers = g_ptr_array_new_with_free_func(procheader_header_free);
|
||||
|
||||
for (disphdr_list = prefs_common.disphdr_list; disphdr_list != NULL;
|
||||
disphdr_list = disphdr_list->next) {
|
||||
|
@ -1981,12 +1981,12 @@ static GPtrArray *textview_scan_header(TextView *textview, FILE *fp)
|
|||
header = g_ptr_array_index(headers, i);
|
||||
if (procheader_headername_equal(header->name,
|
||||
dp->name)) {
|
||||
/* Take ownership of item */
|
||||
g_ptr_array_steal_index(headers, i);
|
||||
if (dp->hidden)
|
||||
procheader_header_free(header);
|
||||
else
|
||||
g_ptr_array_add(sorted_headers, header);
|
||||
|
||||
g_ptr_array_remove_index(headers, i);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
@ -1994,7 +1994,8 @@ static GPtrArray *textview_scan_header(TextView *textview, FILE *fp)
|
|||
|
||||
if (prefs_common.show_other_header) {
|
||||
for (i = 0; i < headers->len; i++) {
|
||||
header = g_ptr_array_index(headers, i);
|
||||
/* Take ownership of item */
|
||||
header = g_ptr_array_steal_index(headers, i);
|
||||
unfold_line(header->body);
|
||||
if (!procheader_header_is_internal(header->name)) {
|
||||
g_ptr_array_add(sorted_headers, header);
|
||||
|
@ -2004,7 +2005,7 @@ static GPtrArray *textview_scan_header(TextView *textview, FILE *fp)
|
|||
}
|
||||
g_ptr_array_free(headers, TRUE);
|
||||
} else
|
||||
procheader_header_array_destroy(headers);
|
||||
g_ptr_array_free(headers, TRUE);
|
||||
|
||||
|
||||
return sorted_headers;
|
||||
|
@ -2417,7 +2418,6 @@ static void textview_show_headers(TextView *textview) {
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
gboolean textview_search_string(TextView *textview, const gchar *str,
|
||||
gboolean case_sens)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue