My fixes to the patch

See git.disroot.org/gfgit/claws-mail
This commit is contained in:
gfgit 2023-08-31 13:57:29 +02:00
parent 72e49c6443
commit 79d84cc2d4
9 changed files with 145 additions and 102 deletions

View File

@ -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);
}
}
}

View File

@ -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)

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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,

View File

@ -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);
}
}
}

View File

@ -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;
}

View File

@ -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)
{