1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
3
* Copyright (C) 2011-2012 Richard Hughes <richard@hughsie.com>
5
* Licensed under the GNU General Public License Version 2
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; either version 2 of the License, or
10
* (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24
#include <glib-object.h>
25
#include <glib/gi18n.h>
30
#include <gdesktop-enums.h>
32
#include "net-proxy.h"
36
#define NET_PROXY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NET_TYPE_PROXY, NetProxyPrivate))
38
struct _NetProxyPrivate
44
G_DEFINE_TYPE (NetProxy, net_proxy, NET_TYPE_OBJECT)
47
check_wpad_warning (NetProxy *proxy)
50
gchar *autoconfig_url = NULL;
51
GString *string = NULL;
55
string = g_string_new ("");
57
/* check we're using 'Automatic' */
58
mode = g_settings_get_enum (proxy->priv->settings, "mode");
62
/* see if the PAC is blank */
63
autoconfig_url = g_settings_get_string (proxy->priv->settings,
65
ret = autoconfig_url == NULL ||
66
autoconfig_url[0] == '\0';
70
g_string_append (string, "<small>");
72
/* TRANSLATORS: this is when the use leaves the PAC textbox blank */
73
g_string_append (string, _("Web Proxy Autodiscovery is used when a Configuration URL is not provided."));
75
g_string_append (string, "\n");
77
/* TRANSLATORS: WPAD is bad: if you enable it on an untrusted
78
* network, then anyone else on that network can tell your
79
* machine that it should proxy all of your web traffic
81
g_string_append (string, _("This is not recommended for untrusted public networks."));
82
g_string_append (string, "</small>");
84
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
85
"label_proxy_warning"));
86
gtk_label_set_markup (GTK_LABEL (widget), string->str);
87
g_free (autoconfig_url);
88
g_string_free (string, TRUE);
92
settings_changed_cb (GSettings *settings,
96
check_wpad_warning (proxy);
100
panel_proxy_mode_combo_setup_widgets (NetProxy *proxy, guint value)
104
/* hide or show the PAC text box */
105
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
106
"heading_proxy_url"));
107
gtk_widget_set_visible (widget, value == 2);
108
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
110
gtk_widget_set_visible (widget, value == 2);
112
/* hide or show the manual entry text boxes */
113
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
114
"heading_proxy_http"));
115
gtk_widget_set_visible (widget, value == 1);
116
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
117
"entry_proxy_http"));
118
gtk_widget_set_visible (widget, value == 1);
119
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
120
"spinbutton_proxy_http"));
121
gtk_widget_set_visible (widget, value == 1);
123
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
124
"heading_proxy_https"));
125
gtk_widget_set_visible (widget, value == 1);
126
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
127
"entry_proxy_https"));
128
gtk_widget_set_visible (widget, value == 1);
129
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
130
"spinbutton_proxy_https"));
131
gtk_widget_set_visible (widget, value == 1);
132
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
133
"heading_proxy_ftp"));
134
gtk_widget_set_visible (widget, value == 1);
135
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
137
gtk_widget_set_visible (widget, value == 1);
138
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
139
"spinbutton_proxy_ftp"));
140
gtk_widget_set_visible (widget, value == 1);
141
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
142
"heading_proxy_socks"));
143
gtk_widget_set_visible (widget, value == 1);
144
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
145
"entry_proxy_socks"));
146
gtk_widget_set_visible (widget, value == 1);
147
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
148
"spinbutton_proxy_socks"));
149
gtk_widget_set_visible (widget, value == 1);
151
/* perhaps show the wpad warning */
152
check_wpad_warning (proxy);
156
panel_set_value_for_combo (NetProxy *proxy, GtkComboBox *combo_box, gint value)
164
model = gtk_combo_box_get_model (combo_box);
165
ret = gtk_tree_model_get_iter_first (model, &iter);
169
/* try to make the UI match the setting */
171
gtk_tree_model_get (model, &iter,
174
if (value == value_tmp) {
175
gtk_combo_box_set_active_iter (combo_box, &iter);
178
} while (gtk_tree_model_iter_next (model, &iter));
180
/* hide or show the correct widgets */
181
panel_proxy_mode_combo_setup_widgets (proxy, value);
185
panel_proxy_mode_combo_changed_cb (GtkWidget *widget, NetProxy *proxy)
193
ret = gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter);
198
model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
199
gtk_tree_model_get (model, &iter,
204
g_settings_set_enum (proxy->priv->settings, "mode", value);
206
/* hide or show the correct widgets */
207
panel_proxy_mode_combo_setup_widgets (proxy, value);
211
net_proxy_add_to_notebook (NetObject *object,
212
GtkNotebook *notebook,
213
GtkSizeGroup *heading_size_group)
217
NetProxy *proxy = NET_PROXY (object);
219
/* add widgets to size group */
220
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
221
"heading_proxy_method"));
222
gtk_size_group_add_widget (heading_size_group, widget);
225
window = GTK_WINDOW (gtk_builder_get_object (proxy->priv->builder,
227
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
229
g_object_ref (widget);
230
gtk_container_remove (GTK_CONTAINER (window), widget);
231
gtk_notebook_append_page (notebook, widget, NULL);
232
g_object_unref (widget);
237
net_proxy_finalize (GObject *object)
239
NetProxy *proxy = NET_PROXY (object);
240
NetProxyPrivate *priv = proxy->priv;
242
g_clear_object (&priv->settings);
243
g_clear_object (&priv->builder);
245
G_OBJECT_CLASS (net_proxy_parent_class)->finalize (object);
249
net_proxy_class_init (NetProxyClass *klass)
251
GObjectClass *object_class = G_OBJECT_CLASS (klass);
252
NetObjectClass *parent_class = NET_OBJECT_CLASS (klass);
254
object_class->finalize = net_proxy_finalize;
255
parent_class->add_to_notebook = net_proxy_add_to_notebook;
256
g_type_class_add_private (klass, sizeof (NetProxyPrivate));
261
ubuntu_is_in_admin_group (int id_group)
266
ngroups = getgroups (1024, groups);
268
perror ("getgroups");
272
for (i = 0; i < ngroups; ++i) {
273
if (groups[i] == id_group)
283
struct group *admin_group;
285
admin_group = getgrnam ("admin");
286
if (admin_group != NULL && ubuntu_is_in_admin_group (admin_group->gr_gid))
289
admin_group = getgrnam ("sudo");
290
if (admin_group != NULL && ubuntu_is_in_admin_group (admin_group->gr_gid))
297
ubuntu_reset_system_proxy (GDBusProxy *proxy, const gchar *protocol)
300
GError *error = NULL;
302
result = g_dbus_proxy_call_sync (proxy, "set_proxy",
303
g_variant_new ("(ss)", protocol, ""),
304
G_DBUS_CALL_FLAGS_NONE,
307
g_variant_unref (result);
309
g_warning ("Error while calling set_proxy for %s protocol: %s", protocol, error->message);
310
g_error_free (error);
315
ubuntu_set_proxy_for_protocol (GDBusProxy *proxy, const gchar *protocol, GSettings *settings)
318
gchar *proxy_str, *host;
319
GError *error = NULL;
322
host = g_settings_get_string (settings, "host");
323
port = g_settings_get_int (settings, "port");
325
if (host && *host == '\0') {
326
ubuntu_reset_system_proxy (proxy, protocol);
328
proxy_str = g_strdup_printf ("%s://%s:%i/", protocol, host, port);
330
result = g_dbus_proxy_call_sync (proxy, "set_proxy",
331
g_variant_new ("(ss)", protocol, proxy_str),
332
G_DBUS_CALL_FLAGS_NONE,
335
g_variant_unref (result);
337
g_warning ("Error while calling set_proxy for %s protocol: %s", protocol, error->message);
338
g_error_free (error);
345
g_object_unref (settings);
349
ubuntu_on_proxy_apply_system_settings (GtkButton *button, gpointer user_data)
351
GDBusConnection *bus;
352
GDBusProxy *dbus_proxy;
354
GDesktopProxyMode proxy_mode;
355
NetProxy *proxy = NET_PROXY (user_data);
358
bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
360
g_warning ("Could not retrieve system bus: %s", error->message);
361
g_error_free (error);
366
dbus_proxy = g_dbus_proxy_new_sync (bus, 0, NULL,
367
"com.ubuntu.SystemService",
369
"com.ubuntu.SystemService",
373
g_warning ("Could not retrieve bus object: %s", error->message);
374
g_error_free (error);
379
/* Retrieve the current settings */
380
proxy_mode = g_settings_get_enum (proxy->priv->settings, "mode");
381
switch (proxy_mode) {
382
case G_DESKTOP_PROXY_MODE_AUTO:
383
case G_DESKTOP_PROXY_MODE_NONE:
384
ubuntu_reset_system_proxy (dbus_proxy, "http");
385
ubuntu_reset_system_proxy (dbus_proxy, "https");
386
ubuntu_reset_system_proxy (dbus_proxy, "ftp");
387
ubuntu_reset_system_proxy (dbus_proxy, "socks");
389
case G_DESKTOP_PROXY_MODE_MANUAL:
390
ubuntu_set_proxy_for_protocol (dbus_proxy, "http", g_settings_get_child (proxy->priv->settings, "http"));
391
ubuntu_set_proxy_for_protocol (dbus_proxy, "https", g_settings_get_child (proxy->priv->settings, "https"));
392
ubuntu_set_proxy_for_protocol (dbus_proxy, "ftp", g_settings_get_child (proxy->priv->settings, "ftp"));
393
ubuntu_set_proxy_for_protocol (dbus_proxy, "socks", g_settings_get_child (proxy->priv->settings, "socks"));
398
g_object_unref (dbus_proxy);
402
net_proxy_init (NetProxy *proxy)
404
GError *error = NULL;
406
GSettings *settings_tmp;
407
GtkAdjustment *adjustment;
410
proxy->priv = NET_PROXY_GET_PRIVATE (proxy);
412
proxy->priv->builder = gtk_builder_new ();
413
gtk_builder_add_from_file (proxy->priv->builder,
414
GNOMECC_UI_DIR "/network-proxy.ui",
417
g_warning ("Could not load interface file: %s", error->message);
418
g_error_free (error);
422
proxy->priv->settings = g_settings_new ("org.gnome.system.proxy");
423
g_signal_connect (proxy->priv->settings,
425
G_CALLBACK (settings_changed_cb),
428
/* explicitly set this to false as the panel has no way of
429
* linking the http and https proxies them together */
430
g_settings_set_boolean (proxy->priv->settings,
435
value = g_settings_get_enum (proxy->priv->settings, "mode");
436
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
437
"combobox_proxy_mode"));
438
panel_set_value_for_combo (proxy, GTK_COMBO_BOX (widget), value);
439
g_signal_connect (widget, "changed",
440
G_CALLBACK (panel_proxy_mode_combo_changed_cb),
443
/* bind the proxy values */
444
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
446
g_settings_bind (proxy->priv->settings, "autoconfig-url",
448
G_SETTINGS_BIND_DEFAULT);
450
/* bind the HTTP proxy values */
451
settings_tmp = g_settings_get_child (proxy->priv->settings, "http");
452
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
453
"entry_proxy_http"));
454
g_settings_bind (settings_tmp, "host",
456
G_SETTINGS_BIND_DEFAULT);
457
adjustment = GTK_ADJUSTMENT (gtk_builder_get_object (proxy->priv->builder,
458
"adjustment_proxy_port_http"));
459
g_settings_bind (settings_tmp, "port",
461
G_SETTINGS_BIND_DEFAULT);
462
g_object_unref (settings_tmp);
464
/* bind the HTTPS proxy values */
465
settings_tmp = g_settings_get_child (proxy->priv->settings, "https");
466
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
467
"entry_proxy_https"));
468
g_settings_bind (settings_tmp, "host",
470
G_SETTINGS_BIND_DEFAULT);
471
adjustment = GTK_ADJUSTMENT (gtk_builder_get_object (proxy->priv->builder,
472
"adjustment_proxy_port_https"));
473
g_settings_bind (settings_tmp, "port",
475
G_SETTINGS_BIND_DEFAULT);
476
g_object_unref (settings_tmp);
478
/* bind the FTP proxy values */
479
settings_tmp = g_settings_get_child (proxy->priv->settings, "ftp");
480
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
482
g_settings_bind (settings_tmp, "host",
484
G_SETTINGS_BIND_DEFAULT);
485
adjustment = GTK_ADJUSTMENT (gtk_builder_get_object (proxy->priv->builder,
486
"adjustment_proxy_port_ftp"));
487
g_settings_bind (settings_tmp, "port",
489
G_SETTINGS_BIND_DEFAULT);
490
g_object_unref (settings_tmp);
492
/* bind the SOCKS proxy values */
493
settings_tmp = g_settings_get_child (proxy->priv->settings, "socks");
494
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
495
"entry_proxy_socks"));
496
g_settings_bind (settings_tmp, "host",
498
G_SETTINGS_BIND_DEFAULT);
499
adjustment = GTK_ADJUSTMENT (gtk_builder_get_object (proxy->priv->builder,
500
"adjustment_proxy_port_socks"));
501
g_settings_bind (settings_tmp, "port",
503
G_SETTINGS_BIND_DEFAULT);
504
g_object_unref (settings_tmp);
506
/* set header to something sane */
507
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
508
"image_proxy_device"));
509
gtk_image_set_from_icon_name (GTK_IMAGE (widget),
510
"preferences-system-network",
511
GTK_ICON_SIZE_DIALOG);
512
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
513
"label_proxy_device"));
514
gtk_label_set_label (GTK_LABEL (widget),
516
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
517
"label_proxy_status"));
518
gtk_label_set_label (GTK_LABEL (widget), "");
520
/* Ubuntu button for system proxy settings */
521
if (ubuntu_is_admin ()) {
522
g_signal_connect (G_OBJECT (gtk_builder_get_object (proxy->priv->builder, "system_proxy_button")), "clicked",
523
G_CALLBACK (ubuntu_on_proxy_apply_system_settings), proxy);
525
gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, "system_proxy_button")));
527
/* hide the switch until we get some more detail in the mockup */
528
widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder,
529
"device_proxy_off_switch"));
531
gtk_widget_hide (widget);
538
proxy = g_object_new (NET_TYPE_PROXY,
542
return NET_PROXY (proxy);