summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrbuj <[email protected]>2020-03-17 20:23:08 +0100
committerraveit65 <[email protected]>2020-04-16 14:37:16 +0200
commit51bb1b6a708971e74833b2efff14f399e307c697 (patch)
tree6d3f6fb27f791a7caf191d70a2e19fb8bd8f7962
parentc835ece90b74fd31d8c6d60652861e43305c0c2d (diff)
downloadmate-notification-daemon-51bb1b6a708971e74833b2efff14f399e307c697.tar.bz2
mate-notification-daemon-51bb1b6a708971e74833b2efff14f399e307c697.tar.xz
Filter-out img elements from notification body
-rw-r--r--.build.yml1
-rw-r--r--configure.ac2
-rw-r--r--src/themes/coco/coco-theme.c64
-rw-r--r--src/themes/nodoka/nodoka-theme.c61
-rw-r--r--src/themes/slider/theme.c59
-rw-r--r--src/themes/standard/Makefile.am4
-rw-r--r--src/themes/standard/theme.c59
7 files changed, 225 insertions, 25 deletions
diff --git a/.build.yml b/.build.yml
index 3b69357..de370d5 100644
--- a/.build.yml
+++ b/.build.yml
@@ -58,6 +58,7 @@ requires:
- libcanberra-devel
- libnotify-devel
- libwnck3-devel
+ - libxml2-devel
- make
- mate-common
- mate-desktop-devel
diff --git a/configure.ac b/configure.ac
index 0b27f93..d5b66f6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -106,9 +106,11 @@ dnl Requirements for the themes
dnl ---------------------------------------------------------------------------
GTK_REQUIRED=3.22.0
+XML_REQUIRED=2.9.0
PKG_CHECK_MODULES(THEME,
gtk+-3.0 >= $GTK_REQUIRED
+ libxml-2.0 >= $XML_REQUIRED
)
AC_SUBST(THEME_CFLAGS)
AC_SUBST(THEME_LIBS)
diff --git a/src/themes/coco/coco-theme.c b/src/themes/coco/coco-theme.c
index 6cfa677..856eebd 100644
--- a/src/themes/coco/coco-theme.c
+++ b/src/themes/coco/coco-theme.c
@@ -27,6 +27,8 @@
#include <glib/gi18n.h>
#include <gtk/gtk.h>
+#include <libxml/xpath.h>
+
/* Define basic coco types */
typedef void (*ActionInvokedCb)(GtkWindow *nw, const char *key);
typedef void (*UrlClickedCb)(GtkWindow *nw, const char *url);
@@ -488,11 +490,11 @@ void
set_notification_text(GtkWindow *nw, const char *summary, const char *body)
{
char *str;
- char* quoted;
- const char *body_label_text;
+ char *quoted;
WindowData *windata = g_object_get_data(G_OBJECT(nw), "windata");
g_assert(windata != NULL);
+ /* title */
quoted = g_markup_escape_text(summary, -1);
str = g_strdup_printf(
"<span color=\"#FFFFFF\"><big><b>%s</b></big></span>", quoted);
@@ -500,12 +502,60 @@ set_notification_text(GtkWindow *nw, const char *summary, const char *body)
gtk_label_set_markup(GTK_LABEL(windata->summary_label), str);
g_free(str);
- str = g_strdup_printf("<span color=\"#EAEAEA\">%s</span>", body);
+ /* body */
+ xmlDocPtr doc;
+ xmlInitParser();
+ str = g_strconcat ("<markup>", "<span color=\"#EAEAEA\">", body, "</span>", "</markup>", NULL);
+ /* parse notification body */
+ doc = xmlReadMemory(str, strlen (str), "noname.xml", NULL, 0);
+ g_free (str);
+ if (doc != NULL) {
+ xmlXPathContextPtr xpathCtx;
+ xmlXPathObjectPtr xpathObj;
+ xmlNodeSetPtr nodes;
+ const char *body_label_text;
+ int i, size;
+
+ /* filterout img nodes */
+ xpathCtx = xmlXPathNewContext(doc);
+ xpathObj = xmlXPathEvalExpression((unsigned char *)"//img", xpathCtx);
+ nodes = xpathObj->nodesetval;
+ size = (nodes) ? nodes->nodeNr : 0;
+ for(i = size - 1; i >= 0; i--) {
+ xmlUnlinkNode (nodes->nodeTab[i]);
+ xmlFreeNode (nodes->nodeTab[i]);
+ }
+
+ /* write doc to string */
+ xmlBufferPtr buf = xmlBufferCreate();
+ (void) xmlNodeDump(buf, doc, xmlDocGetRootElement (doc), 0, 0);
+ str = (char *)buf->content;
+ gtk_label_set_markup (GTK_LABEL (windata->body_label), str);
+
+ /* cleanup */
+ xmlBufferFree (buf);
+ xmlXPathFreeObject (xpathObj);
+ xmlXPathFreeContext (xpathCtx);
+ xmlFreeDoc (doc);
+
+ /* Does it render properly? */
+ body_label_text = gtk_label_get_text (GTK_LABEL (windata->body_label));
+ if ((body_label_text == NULL) || (strlen (body_label_text) == 0)) {
+ goto render_fail;
+ }
+ goto renrer_ok;
+ }
+
+render_fail:
+ /* could not parse notification body */
+ quoted = g_markup_escape_text(body, -1);
+ str = g_strconcat ("<span color=\"#EAEAEA\">", quoted, "</span>", NULL);
gtk_label_set_markup (GTK_LABEL (windata->body_label), str);
- g_free(str);
- body_label_text = gtk_label_get_text (GTK_LABEL (windata->body_label));
- if ((body_label_text == NULL) || (strlen (body_label_text) == 0))
- gtk_label_set_text (GTK_LABEL (windata->body_label), body);
+ g_free (quoted);
+ g_free (str);
+
+renrer_ok:
+ xmlCleanupParser ();
if (body == NULL || *body == '\0')
gtk_widget_hide(windata->body_label);
diff --git a/src/themes/nodoka/nodoka-theme.c b/src/themes/nodoka/nodoka-theme.c
index 12dea08..65fd67f 100644
--- a/src/themes/nodoka/nodoka-theme.c
+++ b/src/themes/nodoka/nodoka-theme.c
@@ -29,6 +29,8 @@
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
+#include <libxml/xpath.h>
+
/* Define basic nodoka types */
typedef void (*ActionInvokedCb)(GtkWindow *nw, const char *key);
typedef void (*UrlClickedCb)(GtkWindow *nw, const char *url);
@@ -875,7 +877,6 @@ set_notification_text(GtkWindow *nw, const char *summary, const char *body)
{
char *str;
char* quoted;
- const char *body_label_text;
WindowData *windata = g_object_get_data(G_OBJECT(nw), "windata");
g_assert(windata != NULL);
@@ -886,12 +887,60 @@ set_notification_text(GtkWindow *nw, const char *summary, const char *body)
gtk_label_set_markup(GTK_LABEL(windata->summary_label), str);
g_free(str);
- str = g_strdup_printf("<span color=\"#000000\">%s</span>", body);
+ /* body */
+ xmlDocPtr doc;
+ xmlInitParser();
+ str = g_strconcat ("<markup>", "<span color=\"#000000\">", body, "</span>", "</markup>", NULL);
+ /* parse notification body */
+ doc = xmlReadMemory(str, strlen (str), "noname.xml", NULL, 0);
+ g_free (str);
+ if (doc != NULL) {
+ xmlXPathContextPtr xpathCtx;
+ xmlXPathObjectPtr xpathObj;
+ xmlNodeSetPtr nodes;
+ const char *body_label_text;
+ int i, size;
+
+ /* filterout img nodes */
+ xpathCtx = xmlXPathNewContext(doc);
+ xpathObj = xmlXPathEvalExpression((unsigned char *)"//img", xpathCtx);
+ nodes = xpathObj->nodesetval;
+ size = (nodes) ? nodes->nodeNr : 0;
+ for(i = size - 1; i >= 0; i--) {
+ xmlUnlinkNode (nodes->nodeTab[i]);
+ xmlFreeNode (nodes->nodeTab[i]);
+ }
+
+ /* write doc to string */
+ xmlBufferPtr buf = xmlBufferCreate();
+ (void) xmlNodeDump(buf, doc, xmlDocGetRootElement (doc), 0, 0);
+ str = (char *)buf->content;
+ gtk_label_set_markup (GTK_LABEL (windata->body_label), str);
+
+ /* cleanup */
+ xmlBufferFree (buf);
+ xmlXPathFreeObject (xpathObj);
+ xmlXPathFreeContext (xpathCtx);
+ xmlFreeDoc (doc);
+
+ /* Does it render properly? */
+ body_label_text = gtk_label_get_text (GTK_LABEL (windata->body_label));
+ if ((body_label_text == NULL) || (strlen (body_label_text) == 0)) {
+ goto render_fail;
+ }
+ goto renrer_ok;
+ }
+
+render_fail:
+ /* could not parse notification body */
+ quoted = g_markup_escape_text(body, -1);
+ str = g_strconcat ("<span color=\"#000000\">", quoted, "</span>", NULL);
gtk_label_set_markup (GTK_LABEL (windata->body_label), str);
- g_free(str);
- body_label_text = gtk_label_get_text (GTK_LABEL (windata->body_label));
- if ((body_label_text == NULL) || (strlen (body_label_text) == 0))
- gtk_label_set_text (GTK_LABEL (windata->body_label), body);
+ g_free (quoted);
+ g_free (str);
+
+renrer_ok:
+ xmlCleanupParser ();
if (body == NULL || *body == '\0')
gtk_widget_hide(windata->body_label);
diff --git a/src/themes/slider/theme.c b/src/themes/slider/theme.c
index 9edb1d7..438049b 100644
--- a/src/themes/slider/theme.c
+++ b/src/themes/slider/theme.c
@@ -25,6 +25,8 @@
#include <glib/gi18n.h>
#include <gtk/gtk.h>
+#include <libxml/xpath.h>
+
typedef void (*ActionInvokedCb) (GtkWindow* nw, const char* key);
typedef void (*UrlClickedCb) (GtkWindow* nw, const char* url);
@@ -494,7 +496,6 @@ void set_notification_text(GtkWindow* nw, const char* summary, const char* body)
{
char* str;
char* quoted;
- const char *body_label_text;
GtkRequisition req;
WindowData* windata;
int summary_width;
@@ -510,10 +511,58 @@ void set_notification_text(GtkWindow* nw, const char* summary, const char* body)
gtk_label_set_markup(GTK_LABEL(windata->summary_label), str);
g_free(str);
- gtk_label_set_markup (GTK_LABEL (windata->body_label), body);
- body_label_text = gtk_label_get_text (GTK_LABEL (windata->body_label));
- if ((body_label_text == NULL) || (strlen (body_label_text) == 0))
- gtk_label_set_text (GTK_LABEL (windata->body_label), body);
+ /* body */
+ xmlDocPtr doc;
+ xmlInitParser();
+ str = g_strconcat ("<markup>", body, "</markup>", NULL);
+ /* parse notification body */
+ doc = xmlReadMemory(str, strlen (str), "noname.xml", NULL, 0);
+ g_free (str);
+ if (doc != NULL) {
+ xmlXPathContextPtr xpathCtx;
+ xmlXPathObjectPtr xpathObj;
+ xmlNodeSetPtr nodes;
+ const char *body_label_text;
+ int i, size;
+
+ /* filterout img nodes */
+ xpathCtx = xmlXPathNewContext(doc);
+ xpathObj = xmlXPathEvalExpression((unsigned char *)"//img", xpathCtx);
+ nodes = xpathObj->nodesetval;
+ size = (nodes) ? nodes->nodeNr : 0;
+ for(i = size - 1; i >= 0; i--) {
+ xmlUnlinkNode (nodes->nodeTab[i]);
+ xmlFreeNode (nodes->nodeTab[i]);
+ }
+
+ /* write doc to string */
+ xmlBufferPtr buf = xmlBufferCreate();
+ (void) xmlNodeDump(buf, doc, xmlDocGetRootElement (doc), 0, 0);
+ str = (char *)buf->content;
+ gtk_label_set_markup (GTK_LABEL (windata->body_label), str);
+
+ /* cleanup */
+ xmlBufferFree (buf);
+ xmlXPathFreeObject (xpathObj);
+ xmlXPathFreeContext (xpathCtx);
+ xmlFreeDoc (doc);
+
+ /* Does it render properly? */
+ body_label_text = gtk_label_get_text (GTK_LABEL (windata->body_label));
+ if ((body_label_text == NULL) || (strlen (body_label_text) == 0)) {
+ goto render_fail;
+ }
+ goto renrer_ok;
+ }
+
+render_fail:
+ /* could not parse notification body */
+ quoted = g_markup_escape_text(body, -1);
+ gtk_label_set_markup (GTK_LABEL (windata->body_label), quoted);
+ g_free (quoted);
+
+renrer_ok:
+ xmlCleanupParser ();
if (body == NULL || *body == '\0')
gtk_widget_hide(windata->body_label);
diff --git a/src/themes/standard/Makefile.am b/src/themes/standard/Makefile.am
index 7f82f54..42476a4 100644
--- a/src/themes/standard/Makefile.am
+++ b/src/themes/standard/Makefile.am
@@ -5,8 +5,8 @@ engine_LTLIBRARIES = libstandard.la
libstandard_la_SOURCES = theme.c
libstandard_la_CFLAGS = $(WARN_CFLAGS)
libstandard_la_LDFLAGS = -module -avoid-version -no-undefined
-libstandard_la_LIBADD = $(NOTIFICATION_DAEMON_LIBS)
+libstandard_la_LIBADD = $(NOTIFICATION_DAEMON_LIBS) $(THEME_LIBS)
-AM_CPPFLAGS = $(NOTIFICATION_DAEMON_CFLAGS)
+AM_CPPFLAGS = $(NOTIFICATION_DAEMON_CFLAGS) $(THEME_CFLAGS)
-include $(top_srcdir)/git.mk
diff --git a/src/themes/standard/theme.c b/src/themes/standard/theme.c
index c81ac34..4ab72de 100644
--- a/src/themes/standard/theme.c
+++ b/src/themes/standard/theme.c
@@ -24,6 +24,8 @@
#include <glib/gi18n.h>
#include <gtk/gtk.h>
+#include <libxml/xpath.h>
+
typedef void (*ActionInvokedCb) (GtkWindow* nw, const char* key);
typedef void (*UrlClickedCb) (GtkWindow* nw, const char* url);
@@ -844,7 +846,6 @@ void set_notification_text(GtkWindow* nw, const char* summary, const char* body)
{
char* str;
char* quoted;
- const char *body_label_text;
GtkRequisition req;
WindowData* windata;
@@ -858,10 +859,58 @@ void set_notification_text(GtkWindow* nw, const char* summary, const char* body)
gtk_label_set_markup(GTK_LABEL(windata->summary_label), str);
g_free(str);
- gtk_label_set_markup (GTK_LABEL (windata->body_label), body);
- body_label_text = gtk_label_get_text (GTK_LABEL (windata->body_label));
- if ((body_label_text == NULL) || (strlen (body_label_text) == 0))
- gtk_label_set_text (GTK_LABEL (windata->body_label), body);
+ /* body */
+ xmlDocPtr doc;
+ xmlInitParser();
+ str = g_strconcat ("<markup>", body, "</markup>", NULL);
+ /* parse notification body */
+ doc = xmlReadMemory(str, strlen (str), "noname.xml", NULL, 0);
+ g_free (str);
+ if (doc != NULL) {
+ xmlXPathContextPtr xpathCtx;
+ xmlXPathObjectPtr xpathObj;
+ xmlNodeSetPtr nodes;
+ const char *body_label_text;
+ int i, size;
+
+ /* filterout img nodes */
+ xpathCtx = xmlXPathNewContext(doc);
+ xpathObj = xmlXPathEvalExpression((unsigned char *)"//img", xpathCtx);
+ nodes = xpathObj->nodesetval;
+ size = (nodes) ? nodes->nodeNr : 0;
+ for(i = size - 1; i >= 0; i--) {
+ xmlUnlinkNode (nodes->nodeTab[i]);
+ xmlFreeNode (nodes->nodeTab[i]);
+ }
+
+ /* write doc to string */
+ xmlBufferPtr buf = xmlBufferCreate();
+ (void) xmlNodeDump(buf, doc, xmlDocGetRootElement (doc), 0, 0);
+ str = (char *)buf->content;
+ gtk_label_set_markup (GTK_LABEL (windata->body_label), str);
+
+ /* cleanup */
+ xmlBufferFree (buf);
+ xmlXPathFreeObject (xpathObj);
+ xmlXPathFreeContext (xpathCtx);
+ xmlFreeDoc (doc);
+
+ /* Does it render properly? */
+ body_label_text = gtk_label_get_text (GTK_LABEL (windata->body_label));
+ if ((body_label_text == NULL) || (strlen (body_label_text) == 0)) {
+ goto render_fail;
+ }
+ goto renrer_ok;
+ }
+
+render_fail:
+ /* could not parse notification body */
+ quoted = g_markup_escape_text(body, -1);
+ gtk_label_set_markup (GTK_LABEL (windata->body_label), quoted);
+ g_free (quoted);
+
+renrer_ok:
+ xmlCleanupParser ();
if (body == NULL || *body == '\0')
gtk_widget_hide(windata->body_label);