summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2009-12-07 21:44:15 -0800
committerDan Williams <dcbw@redhat.com>2009-12-07 21:54:53 -0800
commit612604ea9e8458433d59656fc056ae6b935d1e2d (patch)
treef600b9b38061687d44fe2c1196286c654ed2adcf
parent5f970b328016e517ecd41c26b1e20062c01a7356 (diff)
downloadnetwork-manager-applet-612604ea9e8458433d59656fc056ae6b935d1e2d.tar.gz
applet: escape notification text
Notification messages are a subset of HTML, and thus have to have characters like '&' escaped, otherwise the notification daemon displays a blank alert. Consolidate the escaping code so that we can use it for both VPN banners and other notifications. Ran into this problem when the applet was trying to display a connect notification on connection to the 'AT&T MEdia Net' connection created by the mobile broadband wizard.
-rw-r--r--src/applet.c70
-rw-r--r--src/utils/utils.c53
-rw-r--r--src/utils/utils.h2
3 files changed, 67 insertions, 58 deletions
diff --git a/src/applet.c b/src/applet.c
index ac216193..810881b8 100644
--- a/src/applet.c
+++ b/src/applet.c
@@ -434,6 +434,7 @@ applet_do_notify (NMApplet *applet,
{
NotifyNotification *notify;
GError *error = NULL;
+ char *escaped;
g_return_if_fail (applet != NULL);
g_return_if_fail (summary != NULL);
@@ -446,8 +447,12 @@ applet_do_notify (NMApplet *applet,
applet_clear_notify (applet);
- notify = notify_notification_new (summary, message,
- icon ? icon : GTK_STOCK_NETWORK, NULL);
+ escaped = utils_escape_notify_message (message);
+ notify = notify_notification_new (summary,
+ escaped,
+ icon ? icon : GTK_STOCK_NETWORK,
+ NULL);
+ g_free (escaped);
applet->notification = notify;
notify_notification_attach_to_status_icon (notify, applet->status_icon);
@@ -460,8 +465,9 @@ applet_do_notify (NMApplet *applet,
}
if (!notify_notification_show (notify, &error)) {
- g_warning ("Failed to show notification: %s", error->message);
- g_error_free (error);
+ g_warning ("Failed to show notification: %s",
+ error && error->message ? error->message : "(unknown)");
+ g_clear_error (&error);
}
}
@@ -662,58 +668,6 @@ make_vpn_disconnection_message (NMVPNConnection *vpn,
return g_strdup_printf (_("\nThe VPN connection '%s' disconnected."), nm_setting_connection_get_id (s_con));
}
-typedef struct {
- const char *tag;
- const char *replacement;
-} Tag;
-
-static Tag banner_tags[] = {
- { "<center>", NULL },
- { "</center>", NULL },
- { "<p>", "\n" },
- { "</p>", NULL },
- { "<B>", "<b>" },
- { "</B>", "</b>" },
- { "<I>", "<i>" },
- { "</I>", "</i>" },
- { "<u>", "<u>" },
- { "</u>", "</u>" },
- { NULL, NULL }
-};
-
-static char *
-construct_vpn_banner (const char *src)
-{
- const char *p = src;
- GString *banner;
-
- /* Filter the banner text and get rid of some HTML tags since the
- * notification spec only allows a subset of HTML.
- */
-
- banner = g_string_sized_new (strlen (src) + 5);
- g_string_append_c (banner, '\n');
- while (*p) {
- Tag *t = &banner_tags[0];
- gboolean found = FALSE;
-
- while (t->tag) {
- if (strncasecmp (p, t->tag, strlen (t->tag)) == 0) {
- p += strlen (t->tag);
- if (t->replacement)
- g_string_append (banner, t->replacement);
- found = TRUE;
- break;
- }
- t++;
- }
- if (!found)
- g_string_append_c (banner, *p++);
- }
-
- return g_string_free (banner, FALSE);
-}
-
static void
vpn_connection_state_changed (NMVPNConnection *vpn,
NMVPNConnectionState state,
@@ -723,7 +677,7 @@ vpn_connection_state_changed (NMVPNConnection *vpn,
NMApplet *applet = NM_APPLET (user_data);
NMConnection *connection;
const char *banner;
- char *title = NULL, *msg = NULL;
+ char *title = NULL, *msg;
gboolean device_activating, vpn_activating;
device_activating = applet_is_any_device_activating (applet);
@@ -743,7 +697,7 @@ vpn_connection_state_changed (NMVPNConnection *vpn,
banner = nm_vpn_connection_get_banner (vpn);
if (banner && strlen (banner)) {
title = _("VPN Login Message");
- msg = construct_vpn_banner (banner);
+ msg = g_strdup_printf ("%s\n", banner);
applet_do_notify (applet, NOTIFY_URGENCY_LOW, title, msg,
"gnome-lockscreen", NULL, NULL, NULL, NULL);
g_free (msg);
diff --git a/src/utils/utils.c b/src/utils/utils.c
index c68c2cd0..26a5ad67 100644
--- a/src/utils/utils.c
+++ b/src/utils/utils.c
@@ -878,3 +878,56 @@ utils_next_available_name (GSList *connections, const char *format)
return cname;
}
+typedef struct {
+ const char *tag;
+ const char *replacement;
+} Tag;
+
+static Tag escaped_tags[] = {
+ { "<center>", NULL },
+ { "</center>", NULL },
+ { "<p>", "\n" },
+ { "</p>", NULL },
+ { "<B>", "<b>" },
+ { "</B>", "</b>" },
+ { "<I>", "<i>" },
+ { "</I>", "</i>" },
+ { "<u>", "<u>" },
+ { "</u>", "</u>" },
+ { "&", "&amp;" },
+ { NULL, NULL }
+};
+
+char *
+utils_escape_notify_message (const char *src)
+{
+ const char *p = src;
+ GString *escaped;
+
+ /* Filter the source text and get rid of some HTML tags since the
+ * notification spec only allows a subset of HTML. Substitute
+ * HTML code for characters like & that are invalid in HTML.
+ */
+
+ escaped = g_string_sized_new (strlen (src) + 5);
+ while (*p) {
+ Tag *t = &escaped_tags[0];
+ gboolean found = FALSE;
+
+ while (t->tag) {
+ if (strncasecmp (p, t->tag, strlen (t->tag)) == 0) {
+ p += strlen (t->tag);
+ if (t->replacement)
+ g_string_append (escaped, t->replacement);
+ found = TRUE;
+ break;
+ }
+ t++;
+ }
+ if (!found)
+ g_string_append_c (escaped, *p++);
+ }
+
+ return g_string_free (escaped, FALSE);
+}
+
diff --git a/src/utils/utils.h b/src/utils/utils.h
index 9e264422..1f3e4340 100644
--- a/src/utils/utils.h
+++ b/src/utils/utils.h
@@ -52,5 +52,7 @@ gboolean utils_mac_valid (const struct ether_addr *addr);
char *utils_next_available_name (GSList *connections, const char *format);
+char *utils_escape_notify_message (const char *src);
+
#endif /* UTILS_H */