about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorMarco Peereboom <marco@conformal.com>2011-12-28 15:42:52 -0600
committerMarco Peereboom <marco@conformal.com>2011-12-28 15:42:52 -0600
commit2cf22fd10091dadcfc8209f4ca58d15d458e90dd (patch)
treeadfd6e972d038edcd552ff07c5106f2ae3ea4235
parent6e798a18c65df1340037a6881088990e1fa30d14 (diff)
downloadxombrero-2cf22fd10091dadcfc8209f4ca58d15d458e90dd.tar.gz
Add round robin user agents
Fixes FS#65
from Elias Norberg xyzzy@kudzu.se
-rw-r--r--settings.c56
-rw-r--r--xxxterm.14
-rw-r--r--xxxterm.c24
-rw-r--r--xxxterm.h10
4 files changed, 89 insertions, 5 deletions
diff --git a/settings.c b/settings.c
index 79e4830..6cd208e 100644
--- a/settings.c
+++ b/settings.c
@@ -70,7 +70,8 @@ char		runtime_settings[PATH_MAX]; /* override of settings */
 int		allow_volatile_cookies = 0;
 int		color_visited_uris = 1;
 int		save_global_history = 0; /* save global history to disk */
-char		*user_agent = NULL;
+struct user_agent	*user_agent = NULL;
+int		user_agent_roundrobin = 0; /* change user-agent after each request */
 int		save_rejected_cookies = 0;
 int		session_autosave = 0;
 int		guess_search = 0;
@@ -108,6 +109,7 @@ int		add_pl_wl(struct settings *, char *);
 int		add_mime_type(struct settings *, char *);
 int		add_alias(struct settings *, char *);
 int		add_kb(struct settings *, char *);
+int		add_ua(struct settings *, char *);
 
 int		set_download_dir(struct settings *, char *);
 int		set_default_script(struct settings *, char *);
@@ -115,6 +117,7 @@ int		set_runtime_dir(struct settings *, char *);
 int		set_tab_style(struct settings *, char *);
 int		set_edit_mode(struct settings *, char *);
 int		set_work_dir(struct settings *, char *);
+int		set_ua_roundrobin(char *);
 
 void		walk_mime_type(struct settings *, void (*)(struct settings *,
 		    char *, void *), void *);
@@ -128,6 +131,8 @@ void		walk_pl_wl(struct settings *, void (*)(struct settings *,
 		    char *, void *), void *);
 void		walk_kb(struct settings *, void (*)(struct settings *, char *,
 		    void *), void *);
+void		walk_ua(struct settings *, void (*)(struct settings *, char *,
+		    void *), void *);
 
 int
 set_http_proxy(char *proxy)
@@ -240,6 +245,12 @@ struct special		s_edit_mode = {
 	NULL
 };
 
+struct special		s_ua = {
+	add_ua,
+	NULL,
+	walk_ua
+};
+
 struct settings		rs[] = {
 	{ "allow_volatile_cookies",	XT_S_INT, 0,		&allow_volatile_cookies, NULL, NULL },
 	{ "append_next",		XT_S_INT, 0,		&append_next, NULL, NULL },
@@ -289,11 +300,11 @@ struct settings		rs[] = {
 	{ "statusbar_elems",		XT_S_STR, 0, NULL,	&statusbar_elems, NULL },
 	{ "tab_style",			XT_S_STR, 0, NULL, NULL,&s_tab_style },
 	{ "url_regex",			XT_S_STR, 0, NULL,	&url_regex, NULL },
-	{ "user_agent",			XT_S_STR, 0, NULL,	&user_agent, NULL },
 	{ "window_height",		XT_S_INT, 0,		&window_height, NULL, NULL },
 	{ "window_width",		XT_S_INT, 0,		&window_width, NULL, NULL },
 	{ "work_dir",			XT_S_STR, 0, NULL, NULL,&s_work_dir },
 	{ "xterm_workaround",		XT_S_INT, 0,		&xterm_workaround, NULL, NULL },
+	{ "user_agent_roundrobin",	XT_S_INT, 0,	&user_agent_roundrobin, NULL, NULL, NULL, set_ua_roundrobin },
 
 	/* font settings */
 	{ "cmd_font",			XT_S_STR, 0, NULL, &cmd_font_name, NULL },
@@ -308,6 +319,7 @@ struct settings		rs[] = {
 	{ "keybinding",			XT_S_STR, XT_SF_RUNTIME, NULL, NULL, &s_kb },
 	{ "mime_type",			XT_S_STR, XT_SF_RUNTIME, NULL, NULL, &s_mime },
 	{ "pl_wl",			XT_S_STR, XT_SF_RUNTIME, NULL, NULL, &s_pl },
+	{ "user_agent",			XT_S_STR, XT_SF_RUNTIME, NULL,	NULL, &s_ua },
 };
 
 size_t
@@ -924,6 +936,46 @@ add_kb(struct settings *s, char *entry)
 	return (keybinding_add(entry, key, key[0] == '!'));
 }
 
+int
+add_ua(struct settings *s, char *value)
+{
+	struct user_agent *ua;
+
+	ua = g_malloc0(sizeof *ua);
+	ua->value = g_strdup(value);
+
+	TAILQ_INSERT_HEAD(&ua_list, ua, entry);
+
+	/* use the last added user agent */
+	user_agent = TAILQ_FIRST(&ua_list);
+
+	return (0);
+}
+
+
+void
+walk_ua(struct settings *s,
+    void (*cb)(struct settings *, char *, void *), void *cb_args)
+{
+	struct user_agent		*ua;
+
+	if (s == NULL || cb == NULL) {
+		show_oops(NULL, "walk_ua invalid parameters");
+		return;
+	}
+
+	TAILQ_FOREACH(ua, &ua_list, entry) {
+		cb(s, ua->value, cb_args);
+	}
+}
+
+int
+set_ua_roundrobin(char *value)
+{
+	user_agent_roundrobin = atoi(value);
+	return (0);
+}
+
 void
 setup_proxy(char *uri)
 {
diff --git a/xxxterm.1 b/xxxterm.1
index 28fddc1..04d3ea2 100644
--- a/xxxterm.1
+++ b/xxxterm.1
@@ -1213,7 +1213,9 @@ URL when using
 .It Cm user_agent
 Set to override the default
 .Nm
-user-agent string.
+user-agent string. May be specified several times for switching between user-agents.
+.It Cm user_agent_roundrobin
+If enabled, switches between specified user-agents for each new request.
 .It Cm window_height
 Set the default height of the browser window.
 .It Cm window_width
diff --git a/xxxterm.c b/xxxterm.c
index 09fe44d..61254e8 100644
--- a/xxxterm.c
+++ b/xxxterm.c
@@ -241,6 +241,7 @@ struct domain_list	pl_wl;
 struct undo_tailq	undos;
 struct keybinding_list	kbl;
 struct sp_list		spl;
+struct user_agent_list	ua_list;
 struct command_list	chl;
 struct command_list	shl;
 struct command_entry	*history_at;
@@ -4266,6 +4267,26 @@ webview_npd_cb(WebKitWebView *wv, WebKitWebFrame *wf,
 		return (TRUE); /* we made the decission */
 	}
 
+	/* change user agent */
+	if (user_agent_roundrobin ) {
+		struct user_agent *ua;
+
+		if ((ua = TAILQ_NEXT(user_agent, entry)) == NULL)
+			user_agent = TAILQ_FIRST(&ua_list);
+		else
+			user_agent = ua;
+
+		free(t->user_agent);
+		t->user_agent = g_strdup(user_agent->value);
+
+		DNPRINTF(XT_D_NAV, "user-agent: %s\n", t->user_agent);
+
+		g_object_set(G_OBJECT(t->settings),
+			"user-agent", t->user_agent, (char *)NULL);
+
+		webkit_web_view_set_settings(wv, t->settings);
+	}
+
 	/*
 	 * This is a little hairy but it comes down to this:
 	 * when we run in whitelist mode we have to assist the browser in
@@ -5945,7 +5966,7 @@ create_browser(struct tab *t)
 		t->user_agent = g_strdup_printf("%s %s+", strval, version);
 		g_free(strval);
 	} else
-		t->user_agent = g_strdup(user_agent);
+		t->user_agent = g_strdup(user_agent->value);
 
 	t->stylesheet = g_strdup_printf("file://%s/style.css", resource_dir);
 
@@ -7335,6 +7356,7 @@ main(int argc, char *argv[])
 	TAILQ_INIT(&spl);
 	TAILQ_INIT(&chl);
 	TAILQ_INIT(&shl);
+	TAILQ_INIT(&ua_list);
 
 	/* fiddle with ulimits */
 	if (getrlimit(RLIMIT_NOFILE, &rlp) == -1)
diff --git a/xxxterm.h b/xxxterm.h
index dee5f6d..5e9f0ec 100644
--- a/xxxterm.h
+++ b/xxxterm.h
@@ -447,6 +447,12 @@ struct key_binding {
 };
 TAILQ_HEAD(keybinding_list, key_binding);
 
+struct user_agent {
+	char *value;
+	TAILQ_ENTRY(user_agent)	entry;
+};
+TAILQ_HEAD(user_agent_list, user_agent);
+
 struct settings {
 	char		*name;
 	int		type;
@@ -516,7 +522,8 @@ extern char	runtime_settings[PATH_MAX];
 extern int	allow_volatile_cookies;
 extern int	color_visited_uris;
 extern int	save_global_history;
-extern char	*user_agent;
+extern struct user_agent	*user_agent;
+extern int	user_agent_roundrobin;
 extern int	save_rejected_cookies;
 extern int	session_autosave;
 extern int	guess_search;
@@ -565,6 +572,7 @@ extern struct alias_list	aliases;
 extern struct mime_type_list	mtl;
 extern struct keybinding_list	kbl;
 extern struct sp_list		spl;
+extern struct user_agent_list	ua_list;
 
 extern PangoFontDescription	*cmd_font;
 extern PangoFontDescription	*oops_font;
b02'>702ad43 ^
f77d7c2 ^





577248f ^
687f1d8 ^
577248f ^




f77d7c2 ^



887ff65 ^
52b3181 ^
8b2abcb ^
f77d7c2 ^
04d9ab3 ^

687f1d8 ^
04d9ab3 ^


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99