]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
* Decode all html entitles in html parts
authorVsevolod Stakhov <vsevolod@rambler-co.ru>
Wed, 16 Sep 2009 11:53:18 +0000 (15:53 +0400)
committerVsevolod Stakhov <vsevolod@rambler-co.ru>
Wed, 16 Sep 2009 11:53:18 +0000 (15:53 +0400)
src/html.c
src/html.h
src/message.c

index 5560f920a4d17a728ddf30eef062b7118be0075b..1381fdd4fa5f5a4402b70212827665c71d6c0c2c 100644 (file)
@@ -260,16 +260,24 @@ get_tag_by_name (const char *name)
 }
 
 /* Decode HTML entitles in text */
-static void
-decode_entitles (char *s)
+void
+decode_entitles (char *s, guint *len)
 {
+       guint l;
        char *t = s;                    /* t - tortoise */
        char *h = s;                    /* h - hare     */
        char *e = s;
        char *end_ptr;
        int state = 0, val, base;
+
+       if (len == NULL || *len == 0) {
+               l = strlen (s); 
+       }
+       else {
+               l = *len;       
+       }
        
-       while (*h) {
+       while (h - s < l) {
                switch (state) {
                        /* Out of entitle */
                        case 0:
@@ -319,7 +327,10 @@ decode_entitles (char *s)
                }
        }
        *t = '\0';
-
+       
+       if (len != NULL) {
+               *len = t - s;
+       }
 }
 
 static void
@@ -394,7 +405,7 @@ parse_tag_url (struct worker_task *task, struct mime_text_part *part, tag_id_t i
                
                url_text = memory_pool_alloc (task->task_pool, len + 1);
                g_strlcpy (url_text, c, len + 1);
-               decode_entitles (url_text);
+               decode_entitles (url_text, NULL);
 
         if (g_ascii_strncasecmp (url_text, "http://", sizeof ("http://") - 1) != 0) {
             return;
index 1a7924e08c3b5088466e9bf0934999815587c7e4..e81a9d11c89366c63e51955b00dde6d7f5bf6e3d 100644 (file)
@@ -209,5 +209,6 @@ struct worker_task;
 
 gboolean add_html_node (struct worker_task *task, memory_pool_t *pool, struct mime_text_part *part, char *tag_text, GNode **cur_level);
 struct html_tag * get_tag_by_name (const char *name);
+void decode_entitles (char *s, guint *len);
 
 #endif
index c84aaf6bbaf6cc882e80af3af33f77195de7ab62..1416f22ab7d4b22cbbbc3715a8575ab86edaa30c 100644 (file)
@@ -533,6 +533,7 @@ process_text_part (struct worker_task *task, GByteArray *part_content, GMimeCont
                        url_parse_text (task->task_pool, task, text_part, FALSE);
                }
                else {
+                       decode_entitles (text_part->content->data, &text_part->content->len);
                        url_parse_text (task->task_pool, task, text_part, FALSE);
 #if 0
                        url_parse_text (task->task_pool, task, text_part, TRUE);