about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorRaphael Graf <r@undefined.ch>2011-07-31 12:46:12 +0000
committerRaphael Graf <r@undefined.ch>2011-07-31 12:46:12 +0000
commit97ee7d57070121bd3047337f2e061578b6718a7b (patch)
treef43cf8e01a8ef74c0755e9ab88b92019910c580e
parentb2e20d52cc49fd44bdfeda5b4864c53e2a69e470 (diff)
downloadxombrero-97ee7d57070121bd3047337f2e061578b6718a7b.tar.gz
Allow ip adresses in whitelists (FS#130). And some window-title/tab-label fixes.
ok marco@
-rw-r--r--xxxterm.c212
1 files changed, 98 insertions, 114 deletions
diff --git a/xxxterm.c b/xxxterm.c
index 6f12386..dda624c 100644
--- a/xxxterm.c
+++ b/xxxterm.c
@@ -218,6 +218,7 @@ struct tab {
 	int			ctrl_click;
 	gchar			*status;
 	int			xtp_meaning; /* identifies dls/favorites */
+	gchar			*tmp_uri;
 
 	/* hints */
 	int			hints_on;
@@ -1617,11 +1618,17 @@ get_uri(struct tab *t)
 {
 	const gchar		*uri = NULL;
 
-	if (t->xtp_meaning == XT_XTP_TAB_MEANING_NORMAL)
+	if (webkit_web_view_get_load_status(t->wv) == WEBKIT_LOAD_FAILED)
+		return t->tmp_uri;
+	if (t->xtp_meaning == XT_XTP_TAB_MEANING_NORMAL) {
 		uri = webkit_web_view_get_uri(t->wv);
-	else
-		uri = g_strdup_printf("%s%s", XT_URI_ABOUT, about_list[t->xtp_meaning].name);
-
+	} else {
+		/* use tmp_uri to make sure it is g_freed */
+		if (t->tmp_uri)
+			g_free(t->tmp_uri);
+		t->tmp_uri = g_strdup_printf("%s%s", XT_URI_ABOUT, about_list[t->xtp_meaning].name);
+		uri = t->tmp_uri;
+	}
 	return uri;
 }
 
@@ -1629,13 +1636,18 @@ const gchar *
 get_title(struct tab *t, bool window)
 {
 	const gchar		*set = NULL, *title = NULL;
+	WebKitLoadStatus	status = webkit_web_view_get_load_status(t->wv);
+
+	if (status == WEBKIT_LOAD_PROVISIONAL || status == WEBKIT_LOAD_FAILED ||
+	    t->xtp_meaning == XT_XTP_TAB_MEANING_BL)
+		goto notitle;
 
 	title = webkit_web_view_get_title(t->wv);
-	set = title ? title : get_uri(t);
+	if ((set = title ? title : get_uri(t)))
+		return set;
 
-	if (!set || t->xtp_meaning == XT_XTP_TAB_MEANING_BL) {
-		set = window ? XT_NAME : "(untitled)";
-	}
+notitle:
+	set = window ? XT_NAME : "(untitled)";	
 
 	return set;
 }
@@ -1921,33 +1933,6 @@ wl_find_uri(const gchar *s, struct domain_list *wl)
 	return (NULL);
 }
 
-char *
-get_toplevel_domain(char *domain)
-{
-	char			*s;
-	int			found = 0;
-
-	if (domain == NULL)
-		return (NULL);
-	if (strlen(domain) < 2)
-		return (NULL);
-
-	s = &domain[strlen(domain) - 1];
-	while (s != domain) {
-		if (*s == '.') {
-			found++;
-			if (found == 2)
-				return (s);
-		}
-		s--;
-	}
-
-	if (found)
-		return (domain);
-
-	return (NULL);
-}
-
 int
 settings_add(char *var, char *val)
 {
@@ -2548,37 +2533,38 @@ done:
 	return (0);
 }
 
-char *
-find_domain(const gchar *s, int add_dot)
+gchar *
+find_domain(const gchar *s, int toplevel)
 {
-	int			i;
-	char			*r = NULL, *ss = NULL;
+	SoupURI			*uri;
+	gchar			*ret, *p;
 
 	if (s == NULL)
 		return (NULL);
 
-	if (!strncmp(s, "http://", strlen("http://")))
-		s = &s[strlen("http://")];
-	else if (!strncmp(s, "https://", strlen("https://")))
-		s = &s[strlen("https://")];
+	uri = soup_uri_new(s);	
 
-	if (strlen(s) < 2)
+	if (uri == NULL || !SOUP_URI_VALID_FOR_HTTP(uri)) {
 		return (NULL);
+	}
 
-	ss = g_strdup(s);
-	for (i = 0; i < strlen(ss) + 1 /* yes er need this */; i++)
-		/* chop string at first slash */
-		if (ss[i] == '/' || ss[i] == '\0') {
-			ss[i] = '\0';
-			if (add_dot)
-				r = g_strdup_printf(".%s", ss);
-			else
-				r = g_strdup(ss);
-			break;
-		}
-	g_free(ss);
+	if (toplevel && !isdigit(uri->host[strlen(uri->host) - 1])) {
+		if ((p = strrchr(uri->host, '.')) != NULL) {
+			while(--p >= uri->host && *p != '.');
+			p++;
+		} else
+			p = uri->host;
+	} else
+		p = uri->host;
 
-	return (r);
+	if (uri->port == 80)
+		ret = g_strdup_printf(".%s", p);
+	else
+		ret = g_strdup_printf(".%s:%d", p, uri->port);
+
+	soup_uri_free(uri);
+
+	return ret;
 }
 
 int
@@ -2586,14 +2572,19 @@ toggle_cwl(struct tab *t, struct karg *args)
 {
 	struct domain		*d;
 	const gchar		*uri;
-	char			*dom = NULL, *dom_toggle = NULL;
+	char			*dom = NULL;
 	int			es;
 
 	if (args == NULL)
 		return (1);
 
 	uri = get_uri(t);
-	dom = find_domain(uri, 1);
+	dom = find_domain(uri, args->i & XT_WL_TOPLEVEL);
+
+	if (uri == NULL || dom == NULL || webkit_web_view_get_load_status(t->wv) == WEBKIT_LOAD_FAILED) {
+		show_oops(t, "Can't toggle domain in cookie white list");
+		goto done;
+	}	
 	d = wl_find(dom, &c_wl);
 
 	if (d == NULL)
@@ -2608,14 +2599,9 @@ toggle_cwl(struct tab *t, struct karg *args)
 	else if ((args->i & XT_WL_DISABLE) && es != 0)
 		es = 0;
 
-	if (args->i & XT_WL_TOPLEVEL)
-		dom_toggle = get_toplevel_domain(dom);
-	else
-		dom_toggle = dom;
-
 	if (es)
 		/* enable cookies for domain */
-		wl_add(dom_toggle, &c_wl, 0);
+		wl_add(dom, &c_wl, 0);
 	else
 		/* disable cookies for domain */
 		RB_REMOVE(domain_list, &c_wl, d);
@@ -2623,6 +2609,7 @@ toggle_cwl(struct tab *t, struct karg *args)
 	if (args->i & XT_WL_RELOAD)
 		webkit_web_view_reload(t->wv);
 
+done:
 	g_free(dom);
 	return (0);
 }
@@ -2633,7 +2620,7 @@ toggle_js(struct tab *t, struct karg *args)
 	int			es;
 	const gchar		*uri;
 	struct domain		*d;
-	char			*dom = NULL, *dom_toggle = NULL;
+	char			*dom = NULL;
 
 	if (args == NULL)
 		return (1);
@@ -2650,23 +2637,18 @@ toggle_js(struct tab *t, struct karg *args)
 		return (1);
 
 	uri = get_uri(t);
-	dom = find_domain(uri, 1);
+	dom = find_domain(uri, args->i & XT_WL_TOPLEVEL);
 
-	if (uri == NULL || dom == NULL) {
+	if (uri == NULL || dom == NULL || webkit_web_view_get_load_status(t->wv) == WEBKIT_LOAD_FAILED) {
 		show_oops(t, "Can't toggle domain in JavaScript white list");
 		goto done;
 	}
 
-	if (args->i & XT_WL_TOPLEVEL)
-		dom_toggle = get_toplevel_domain(dom);
-	else
-		dom_toggle = dom;
-
 	if (es) {
 		button_set_stockid(t->js_toggle, GTK_STOCK_MEDIA_PLAY);
-		wl_add(dom_toggle, &js_wl, 0 /* session */);
+		wl_add(dom, &js_wl, 0 /* session */);
 	} else {
-		d = wl_find(dom_toggle, &js_wl);
+		d = wl_find(dom, &js_wl);
 		if (d)
 			RB_REMOVE(domain_list, &js_wl, d);
 		button_set_stockid(t->js_toggle, GTK_STOCK_MEDIA_PAUSE);
@@ -3483,10 +3465,9 @@ wl_save(struct tab *t, struct karg *args, int js)
 {
 	char			file[PATH_MAX];
 	FILE			*f;
-	char			*line = NULL, *lt = NULL;
+	char			*line = NULL, *lt = NULL, *dom = NULL;
 	size_t			linelen;
 	const gchar		*uri;
-	char			*dom = NULL, *dom_save = NULL;
 	struct karg		a;
 	struct domain		*d;
 	GSList			*cf;
@@ -3503,26 +3484,14 @@ wl_save(struct tab *t, struct karg *args, int js)
 		return (1);
 
 	uri = get_uri(t);
-	dom = find_domain(uri, 1);
-	if (uri == NULL || dom == NULL) {
+	dom = find_domain(uri, args->i & XT_WL_TOPLEVEL);
+	if (uri == NULL || dom == NULL || webkit_web_view_get_load_status(t->wv) == WEBKIT_LOAD_FAILED) {
 		show_oops(t, "Can't add domain to %s white list",
 		  js ? "JavaScript" : "cookie");
 		goto done;
 	}
 
-	if (args->i & XT_WL_TOPLEVEL) {
-		/* save domain */
-		if ((dom_save = get_toplevel_domain(dom)) == NULL) {
-			show_oops(t, "invalid domain: %s", dom);
-			goto done;
-		}
-	} else if (args->i & XT_WL_FQDN) {
-		/* save fqdn */
-		dom_save = dom;
-	} else
-		goto done;
-
-	lt = g_strdup_printf("%s=%s", js ? "js_wl" : "cookie_wl", dom_save);
+	lt = g_strdup_printf("%s=%s", js ? "js_wl" : "cookie_wl", dom);
 
 	while (!feof(f)) {
 		line = fparseln(f, &linelen, NULL, NULL, 0);
@@ -3539,17 +3508,17 @@ wl_save(struct tab *t, struct karg *args, int js)
 	a.i = XT_WL_ENABLE;
 	a.i |= args->i;
 	if (js) {
-		d = wl_find(dom_save, &js_wl);
+		d = wl_find(dom, &js_wl);
 		if (!d) {
-			settings_add("js_wl", dom_save);
-			d = wl_find(dom_save, &js_wl);
+			settings_add("js_wl", dom);
+			d = wl_find(dom, &js_wl);
 		}
 		toggle_js(t, &a);
 	} else {
-		d = wl_find(dom_save, &c_wl);
+		d = wl_find(dom, &c_wl);
 		if (!d) {
-			settings_add("cookie_wl", dom_save);
-			d = wl_find(dom_save, &c_wl);
+			settings_add("cookie_wl", dom);
+			d = wl_find(dom, &c_wl);
 		}
 		toggle_cwl(t, &a);
 
@@ -3557,8 +3526,8 @@ wl_save(struct tab *t, struct karg *args, int js)
 		cf = soup_cookie_jar_all_cookies(s_cookiejar);
 		for (;cf; cf = cf->next) {
 			ci = cf->data;
-			if (!strcmp(dom_save, ci->domain) ||
-			    !strcmp(&dom_save[1], ci->domain)) /* deal with leading . */ {
+			if (!strcmp(dom, ci->domain) ||
+			    !strcmp(&dom[1], ci->domain)) /* deal with leading . */ {
 				c = soup_cookie_copy(ci);
 				_soup_cookie_jar_add_cookie(p_cookiejar, c);
 			}
@@ -3705,6 +3674,8 @@ navaction(struct tab *t, struct karg *args)
 	DNPRINTF(XT_D_NAV, "navaction: tab %d opcode %d\n",
 	    t->tab_id, args->i);
 
+	t->xtp_meaning = XT_XTP_TAB_MEANING_NORMAL;
+
 	if (t->item) {
 		if (args->i == XT_NAV_BACK)
 			item = webkit_web_back_forward_list_get_current_item(t->bfl);
@@ -6096,7 +6067,6 @@ notify_load_status_cb(WebKitWebView* wview, GParamSpec* pspec, struct tab *t)
 {
 	const gchar		*uri = NULL, *title = NULL;
 	struct history		*h, find;
-	const gchar		*s_loading;
 	struct karg		a;
 
 	DNPRINTF(XT_D_URL, "notify_load_status_cb: %d  %s\n",
@@ -6127,19 +6097,19 @@ notify_load_status_cb(WebKitWebView* wview, GParamSpec* pspec, struct tab *t)
 
 	case WEBKIT_LOAD_COMMITTED:
 		/* 1 */
-		if ((uri = get_uri(t)) != NULL) {
-			gtk_entry_set_text(GTK_ENTRY(t->uri_entry), uri);
+		uri = get_uri(t);
+		if (uri == NULL)
+			return;
+		gtk_entry_set_text(GTK_ENTRY(t->uri_entry), uri);
 
-			if (t->status) {
-				g_free(t->status);
-				t->status = NULL;
-			}
-			set_status(t, (char *)uri, XT_STATUS_LOADING);
+		if (t->status) {
+			g_free(t->status);
+			t->status = NULL;
 		}
+		set_status(t, (char *)uri, XT_STATUS_LOADING);
 
 		/* check if js white listing is enabled */
 		if (enable_js_whitelist) {
-			uri = get_uri(t);
 			check_and_set_js(uri, t);
 		}
 
@@ -6190,9 +6160,6 @@ notify_load_status_cb(WebKitWebView* wview, GParamSpec* pspec, struct tab *t)
 		gtk_spinner_stop(GTK_SPINNER(t->spinner));
 		gtk_widget_hide(t->spinner);
 #endif
-		s_loading = gtk_label_get_text(GTK_LABEL(t->label));
-		if (s_loading && !strcmp(s_loading, "Loading"))
-			gtk_label_set_text(GTK_LABEL(t->label), "(untitled)");
 	default:
 		gtk_widget_set_sensitive(GTK_WIDGET(t->stop), FALSE);
 		break;
@@ -6208,6 +6175,20 @@ notify_load_status_cb(WebKitWebView* wview, GParamSpec* pspec, struct tab *t)
 	    webkit_web_view_can_go_forward(wview));
 }
 
+gboolean
+notify_load_error_cb(WebKitWebView* wview, WebKitWebFrame *web_frame, gchar *uri, gpointer web_error,struct tab *t)
+{
+	if (t->tmp_uri)
+		g_free(t->tmp_uri);
+	t->tmp_uri = g_strdup(uri);
+	gtk_entry_set_text(GTK_ENTRY(t->uri_entry), uri);
+	gtk_label_set_text(GTK_LABEL(t->label), "(untitled)");
+	gtk_window_set_title(GTK_WINDOW(main_window), XT_NAME);
+	set_status(t, uri, XT_STATUS_NOTHING);
+
+	return FALSE;
+}
+
 void
 notify_title_cb(WebKitWebView* wview, GParamSpec* pspec, struct tab *t)
 {
@@ -6921,7 +6902,7 @@ cmd_complete(struct tab *t, char *str, int dir)
 		matchcount = 0;
 		for (j = c; j < LENGTH(cmds); j++) {
 			if (cmds[j].level < dep)
-                                break;
+				break;
 			if (cmds[j].level == dep && !strncmp(tok, cmds[j].cmd, strlen(tok))) {
 				matchcount++;
 				c = j + 1;
@@ -7681,6 +7662,7 @@ delete_tab(struct tab *t)
 
 	g_free(t->user_agent);
 	g_free(t->stylesheet);
+	g_free(t->tmp_uri);
 	g_free(t);
 
 	if (TAILQ_EMPTY(&tabs)) {
@@ -7997,6 +7979,8 @@ create_new_tab(char *title, struct undo *u, int focus, int position)
 	g_signal_connect(t->wv,
 	    "notify::load-status", G_CALLBACK(notify_load_status_cb), t);
 	g_signal_connect(t->wv,
+	    "load-error", G_CALLBACK(notify_load_error_cb), t);
+	g_signal_connect(t->wv,
 	    "notify::title", G_CALLBACK(notify_title_cb), t);
 
 	/* hijack the unused keys as if we were the browser */
@@ -8088,7 +8072,7 @@ void
 notebook_pagereordered_cb(GtkNotebook *nb, GtkWidget *nbp, guint pn,
     gpointer *udata)
 {
-	struct tab *t = NULL, *tt; 
+	struct tab		*t = NULL, *tt;
 
 	recalc_tabs();