1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2  *
3  * Copyright (C) 2012 Red Hat, Inc
4  *
5  * Licensed under the GNU General Public License Version 2
6  *
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.
11  *
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.
16  *
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.
20  */
21 
22 #include "config.h"
23 
24 #include <glib/gi18n.h>
25 
26 #include <NetworkManager.h>
27 
28 #include "ce-page.h"
29 #include "ce-page-details.h"
30 
31 #include "../panel-common.h"
32 
33 struct _CEPageDetails
34 {
35         GtkGrid parent;
36 
37         GtkCheckButton *all_user_check;
38         GtkCheckButton *auto_connect_check;
39         GtkLabel *dns4_heading_label;
40         GtkLabel *dns4_label;
41         GtkLabel *dns6_heading_label;
42         GtkLabel *dns6_label;
43         GtkButton *forget_button;
44         GtkLabel *freq_heading_label;
45         GtkLabel *freq_label;
46         GtkLabel *ipv4_heading_label;
47         GtkLabel *ipv4_label;
48         GtkLabel *ipv6_heading_label;
49         GtkLabel *ipv6_label;
50         GtkLabel *last_used_heading_label;
51         GtkLabel *last_used_label;
52         GtkLabel *mac_heading_label;
53         GtkLabel *mac_label;
54         GtkCheckButton *restrict_data_check;
55         GtkLabel *route_heading_label;
56         GtkLabel *route_label;
57         GtkLabel *security_heading_label;
58         GtkLabel *security_label;
59         GtkLabel *speed_heading_label;
60         GtkLabel *speed_label;
61         GtkLabel *strength_heading_label;
62         GtkLabel *strength_label;
63 
64         NMConnection *connection;
65         NMDevice *device;
66         NMAccessPoint *ap;
67         NetConnectionEditor *editor;
68 };
69 
70 static void ce_page_iface_init (CEPageInterface *);
71 
G_DEFINE_TYPE_WITH_CODE(CEPageDetails,ce_page_details,GTK_TYPE_GRID,G_IMPLEMENT_INTERFACE (ce_page_get_type (),ce_page_iface_init))72 G_DEFINE_TYPE_WITH_CODE (CEPageDetails, ce_page_details, GTK_TYPE_GRID,
73                          G_IMPLEMENT_INTERFACE (ce_page_get_type (), ce_page_iface_init))
74 
75 static void
76 forget_cb (CEPageDetails *self)
77 {
78         net_connection_editor_forget (self->editor);
79 }
80 
81 static gchar *
get_ap_security_string(NMAccessPoint * ap)82 get_ap_security_string (NMAccessPoint *ap)
83 {
84         NM80211ApSecurityFlags wpa_flags, rsn_flags;
85         NM80211ApFlags flags;
86         GString *str;
87 
88         flags = nm_access_point_get_flags (ap);
89         wpa_flags = nm_access_point_get_wpa_flags (ap);
90         rsn_flags = nm_access_point_get_rsn_flags (ap);
91 
92         str = g_string_new ("");
93         if ((flags & NM_802_11_AP_FLAGS_PRIVACY) &&
94             (wpa_flags == NM_802_11_AP_SEC_NONE) &&
95             (rsn_flags == NM_802_11_AP_SEC_NONE)) {
96                 /* TRANSLATORS: this WEP WiFi security */
97                 g_string_append_printf (str, "%s, ", _("WEP"));
98         }
99         if (wpa_flags != NM_802_11_AP_SEC_NONE) {
100                 /* TRANSLATORS: this WPA WiFi security */
101                 g_string_append_printf (str, "%s, ", _("WPA"));
102         }
103         if (rsn_flags != NM_802_11_AP_SEC_NONE) {
104 #if NM_CHECK_VERSION(1,20,6)
105                 if (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_SAE) {
106                         /* TRANSLATORS: this WPA3 WiFi security */
107                         g_string_append_printf (str, "%s, ", _("WPA3"));
108                 }
109 #if NM_CHECK_VERSION(1,24,0)
110 		else if (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_OWE) {
111 			/* TRANSLATORS: this Enhanced Open WiFi security */
112                         g_string_append_printf (str, "%s, ", _("Enhanced Open"));
113 		}
114 #endif
115 		else
116 #endif
117 		{
118                         /* TRANSLATORS: this WPA WiFi security */
119                         g_string_append_printf (str, "%s, ", _("WPA2"));
120                 }
121         }
122         if ((wpa_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X) ||
123             (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) {
124                 /* TRANSLATORS: this Enterprise WiFi security */
125                 g_string_append_printf (str, "%s, ", _("Enterprise"));
126         }
127         if (str->len > 0)
128                 g_string_set_size (str, str->len - 2);
129         else {
130                 g_string_append (str, C_("Wifi security", "None"));
131         }
132         return g_string_free (str, FALSE);
133 }
134 
135 static void
update_last_used(CEPageDetails * self,NMConnection * connection)136 update_last_used (CEPageDetails *self, NMConnection *connection)
137 {
138         g_autofree gchar *last_used = NULL;
139         g_autoptr(GDateTime) now = NULL;
140         g_autoptr(GDateTime) then = NULL;
141         gint days;
142         GTimeSpan diff;
143         guint64 timestamp;
144         NMSettingConnection *s_con;
145 
146         s_con = nm_connection_get_setting_connection (connection);
147         if (s_con == NULL)
148                 goto out;
149         timestamp = nm_setting_connection_get_timestamp (s_con);
150         if (timestamp == 0) {
151                 last_used = g_strdup (_("Never"));
152                 goto out;
153         }
154 
155         /* calculate the amount of time that has elapsed */
156         now = g_date_time_new_now_utc ();
157         then = g_date_time_new_from_unix_utc (timestamp);
158 
159         diff = g_date_time_difference  (now, then);
160         days = diff / G_TIME_SPAN_DAY;
161         if (days == 0)
162                 last_used = g_strdup (_("Today"));
163         else if (days == 1)
164                 last_used = g_strdup (_("Yesterday"));
165         else
166                 last_used = g_strdup_printf (ngettext ("%i day ago", "%i days ago", days), days);
167 out:
168         gtk_label_set_label (self->last_used_label, last_used);
169         gtk_widget_set_visible (GTK_WIDGET (self->last_used_heading_label), last_used != NULL);
170         gtk_widget_set_visible (GTK_WIDGET (self->last_used_label), last_used != NULL);
171 }
172 
173 static void
all_user_changed(CEPageDetails * self)174 all_user_changed (CEPageDetails *self)
175 {
176         gboolean all_users;
177         NMSettingConnection *sc;
178 
179         sc = nm_connection_get_setting_connection (self->connection);
180         all_users = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->all_user_check));
181 
182         g_object_set (sc, "permissions", NULL, NULL);
183         if (!all_users)
184                 nm_setting_connection_add_permission (sc, "user", g_get_user_name (), NULL);
185 }
186 
187 static void
restrict_data_changed(CEPageDetails * self)188 restrict_data_changed (CEPageDetails *self)
189 {
190         NMSettingConnection *s_con;
191         NMMetered metered;
192 
193         s_con = nm_connection_get_setting_connection (self->connection);
194 
195         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->restrict_data_check)))
196                 metered = NM_METERED_YES;
197         else
198                 metered = NM_METERED_NO;
199 
200         g_object_set (s_con, "metered", metered, NULL);
201 }
202 
203 static void
update_restrict_data(CEPageDetails * self)204 update_restrict_data (CEPageDetails *self)
205 {
206         NMSettingConnection *s_con;
207         NMMetered metered;
208         const gchar *type;
209 
210         s_con = nm_connection_get_setting_connection (self->connection);
211 
212         if (s_con == NULL)
213                 return;
214 
215         /* Disable for VPN; NetworkManager does not implement that yet (see
216          * bug https://bugzilla.gnome.org/show_bug.cgi?id=792618) */
217         type = nm_setting_connection_get_connection_type (s_con);
218         if (g_str_equal (type, NM_SETTING_VPN_SETTING_NAME))
219                 return;
220 
221         metered = nm_setting_connection_get_metered (s_con);
222 
223         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->restrict_data_check),
224                                       metered == NM_METERED_YES || metered == NM_METERED_GUESS_YES);
225         gtk_widget_show (GTK_WIDGET (self->restrict_data_check));
226 
227         g_signal_connect_object (self->restrict_data_check, "notify::active", G_CALLBACK (restrict_data_changed), self, G_CONNECT_SWAPPED);
228         g_signal_connect_object (self->restrict_data_check, "notify::active", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
229 }
230 
231 static void
connect_details_page(CEPageDetails * self)232 connect_details_page (CEPageDetails *self)
233 {
234         NMSettingConnection *sc;
235         guint speed;
236         NMDeviceWifiCapabilities wifi_caps;
237         guint frequency;
238         guint strength;
239         NMDeviceState state;
240         NMAccessPoint *active_ap;
241         g_autofree gchar *speed_label = NULL;
242         const gchar *type;
243         const gchar *hw_address = NULL;
244         g_autofree gchar *security_string = NULL;
245         g_autofree gchar *freq_string = NULL;
246         const gchar *strength_label;
247         gboolean device_is_active;
248         NMIPConfig *ipv4_config = NULL, *ipv6_config = NULL;
249         gboolean have_ipv4_address = FALSE, have_ipv6_address = FALSE;
250         gboolean have_dns4 = FALSE, have_dns6 = FALSE;
251         const gchar *route4_text = NULL, *route6_text = NULL;
252 
253         sc = nm_connection_get_setting_connection (self->connection);
254         type = nm_setting_connection_get_connection_type (sc);
255 
256         if (NM_IS_DEVICE_WIFI (self->device)) {
257                 active_ap = nm_device_wifi_get_active_access_point (NM_DEVICE_WIFI (self->device));
258                 frequency = nm_access_point_get_frequency (active_ap);
259         } else {
260                 active_ap = NULL;
261                 frequency = 0;
262         }
263 
264         state = self->device ? nm_device_get_state (self->device) : NM_DEVICE_STATE_DISCONNECTED;
265 
266         device_is_active = FALSE;
267         speed = 0;
268         wifi_caps = 0;
269         if (active_ap && self->ap == active_ap && state != NM_DEVICE_STATE_UNAVAILABLE) {
270                 device_is_active = TRUE;
271                 if (NM_IS_DEVICE_WIFI (self->device)) {
272                         speed = nm_device_wifi_get_bitrate (NM_DEVICE_WIFI (self->device)) / 1000;
273                         wifi_caps = nm_device_wifi_get_capabilities (NM_DEVICE_WIFI (self->device));
274                 }
275         } else if (self->device) {
276                 NMActiveConnection *ac;
277                 const gchar *p1, *p2;
278 
279                 ac = nm_device_get_active_connection (self->device);
280                 p1 = ac ? nm_active_connection_get_uuid (ac) : NULL;
281                 p2 = nm_connection_get_uuid (self->connection);
282                 if (g_strcmp0 (p1, p2) == 0) {
283                         device_is_active = TRUE;
284                         if (NM_IS_DEVICE_WIFI (self->device)) {
285                                 speed = nm_device_wifi_get_bitrate (NM_DEVICE_WIFI (self->device)) / 1000;
286                                 wifi_caps = nm_device_wifi_get_capabilities (NM_DEVICE_WIFI (self->device));
287                         } else if (NM_IS_DEVICE_ETHERNET (self->device))
288                                 speed = nm_device_ethernet_get_speed (NM_DEVICE_ETHERNET (self->device));
289                 }
290         }
291 
292         if (speed > 0 && frequency > 0)
293                 speed_label = g_strdup_printf (_("%d Mb/s (%1.1f GHz)"), speed, (float) (frequency) / 1000.0);
294         else if (speed > 0)
295                 speed_label = g_strdup_printf (_("%d Mb/s"), speed);
296         gtk_label_set_label (self->speed_label, speed_label);
297         gtk_widget_set_visible (GTK_WIDGET (self->speed_heading_label), speed_label != NULL);
298         gtk_widget_set_visible (GTK_WIDGET (self->speed_label), speed_label != NULL);
299 
300         hw_address = nm_device_get_hw_address (self->device);
301         gtk_label_set_label (self->mac_label, hw_address);
302         gtk_widget_set_visible (GTK_WIDGET (self->mac_heading_label), hw_address != NULL);
303         gtk_widget_set_visible (GTK_WIDGET (self->mac_label), hw_address != NULL);
304 
305         if (wifi_caps & NM_WIFI_DEVICE_CAP_FREQ_VALID) {
306                 if (wifi_caps & NM_WIFI_DEVICE_CAP_FREQ_2GHZ &&
307                     wifi_caps & NM_WIFI_DEVICE_CAP_FREQ_5GHZ)
308                         freq_string = g_strdup (_("2.4 GHz / 5 GHz"));
309                 else if (wifi_caps & NM_WIFI_DEVICE_CAP_FREQ_2GHZ)
310                         freq_string = g_strdup (_("2.4 GHz"));
311                 else if (wifi_caps & NM_WIFI_DEVICE_CAP_FREQ_5GHZ)
312                         freq_string = g_strdup (_("5 GHz"));
313         }
314 
315         gtk_label_set_label (self->freq_label, freq_string);
316         gtk_widget_set_visible (GTK_WIDGET (self->freq_heading_label), freq_string != NULL);
317         gtk_widget_set_visible (GTK_WIDGET (self->freq_label), freq_string != NULL);
318 
319         if (device_is_active && active_ap)
320                 security_string = get_ap_security_string (active_ap);
321         gtk_label_set_label (self->security_label, security_string);
322         gtk_widget_set_visible (GTK_WIDGET (self->security_heading_label), security_string != NULL);
323         gtk_widget_set_visible (GTK_WIDGET (self->security_label), security_string != NULL);
324 
325         strength = 0;
326         if (self->ap != NULL)
327                 strength = nm_access_point_get_strength (self->ap);
328 
329         if (strength <= 0)
330                 strength_label = NULL;
331         else if (strength < 20)
332                 strength_label = C_("Signal strength", "None");
333         else if (strength < 40)
334                 strength_label = C_("Signal strength", "Weak");
335         else if (strength < 50)
336                 strength_label = C_("Signal strength", "Ok");
337         else if (strength < 80)
338                 strength_label = C_("Signal strength", "Good");
339         else
340                 strength_label = C_("Signal strength", "Excellent");
341         gtk_label_set_label (self->strength_label, strength_label);
342         gtk_widget_set_visible (GTK_WIDGET (self->strength_heading_label), strength_label != NULL);
343         gtk_widget_set_visible (GTK_WIDGET (self->strength_label), strength_label != NULL);
344 
345         if (device_is_active && self->device != NULL) {
346                 ipv4_config = nm_device_get_ip4_config (self->device);
347                 ipv6_config = nm_device_get_ip6_config (self->device);
348         }
349 
350         if (ipv4_config != NULL) {
351                 GPtrArray *addresses;
352                 const gchar *ipv4_text = NULL;
353                 g_autofree gchar *ip4_dns = NULL;
354 
355                 addresses = nm_ip_config_get_addresses (ipv4_config);
356                 if (addresses->len > 0)
357                         ipv4_text = nm_ip_address_get_address (g_ptr_array_index (addresses, 0));
358                 gtk_label_set_label (self->ipv4_label, ipv4_text);
359                 gtk_widget_set_visible (GTK_WIDGET (self->ipv4_heading_label), ipv4_text != NULL);
360                 gtk_widget_set_visible (GTK_WIDGET (self->ipv4_label), ipv4_text != NULL);
361                 have_ipv4_address = ipv4_text != NULL;
362 
363                 ip4_dns = g_strjoinv (" ", (char **) nm_ip_config_get_nameservers (ipv4_config));
364                 if (!*ip4_dns)
365                         ip4_dns = NULL;
366                 gtk_label_set_label (self->dns4_label, ip4_dns);
367                 gtk_widget_set_visible (GTK_WIDGET (self->dns4_heading_label), ip4_dns != NULL);
368                 gtk_widget_set_visible (GTK_WIDGET (self->dns4_label), ip4_dns != NULL);
369                 have_dns4 = ip4_dns != NULL;
370 
371                 route4_text = nm_ip_config_get_gateway (ipv4_config);
372         } else {
373                 gtk_widget_hide (GTK_WIDGET (self->ipv4_heading_label));
374                 gtk_widget_hide (GTK_WIDGET (self->ipv4_label));
375                 gtk_widget_hide (GTK_WIDGET (self->dns4_heading_label));
376                 gtk_widget_hide (GTK_WIDGET (self->dns4_label));
377         }
378 
379         if (ipv6_config != NULL) {
380                 g_autofree gchar *ipv6_text = NULL;
381                 g_autofree gchar *ip6_dns = NULL;
382 
383                 ipv6_text = net_device_get_ip6_addresses (ipv6_config);
384                 gtk_label_set_label (self->ipv6_label, ipv6_text);
385                 gtk_widget_set_visible (GTK_WIDGET (self->ipv6_heading_label), ipv6_text != NULL);
386                 gtk_widget_set_valign (GTK_WIDGET (self->ipv6_heading_label), GTK_ALIGN_START);
387                 gtk_widget_set_visible (GTK_WIDGET (self->ipv6_label), ipv6_text != NULL);
388                 have_ipv6_address = ipv6_text != NULL;
389 
390                 ip6_dns = g_strjoinv (" ", (char **) nm_ip_config_get_nameservers (ipv6_config));
391                 if (!*ip6_dns)
392                         ip6_dns = NULL;
393                 gtk_label_set_label (self->dns6_label, ip6_dns);
394                 gtk_widget_set_visible (GTK_WIDGET (self->dns6_heading_label), ip6_dns != NULL);
395                 gtk_widget_set_visible (GTK_WIDGET (self->dns6_label), ip6_dns != NULL);
396                 have_dns6 = ip6_dns != NULL;
397 
398                 route6_text = nm_ip_config_get_gateway (ipv6_config);
399         } else {
400                 gtk_widget_hide (GTK_WIDGET (self->ipv6_heading_label));
401                 gtk_widget_hide (GTK_WIDGET (self->ipv6_label));
402                 gtk_widget_hide (GTK_WIDGET (self->dns6_heading_label));
403                 gtk_widget_hide (GTK_WIDGET (self->dns6_label));
404         }
405 
406         if (have_ipv4_address && have_ipv6_address) {
407                 gtk_label_set_label (self->ipv4_heading_label, _("IPv4 Address"));
408                 gtk_label_set_label (self->ipv6_heading_label, _("IPv6 Address"));
409         } else {
410                 gtk_label_set_label (self->ipv4_heading_label, _("IP Address"));
411                 gtk_label_set_label (self->ipv6_heading_label, _("IP Address"));
412         }
413 
414         if (have_dns4 && have_dns6) {
415                 gtk_label_set_label (self->dns4_heading_label, _("DNS4"));
416                 gtk_label_set_label (self->dns6_heading_label, _("DNS6"));
417         } else {
418                 gtk_label_set_label (self->dns4_heading_label, _("DNS"));
419                 gtk_label_set_label (self->dns6_heading_label, _("DNS"));
420         }
421 
422         if (route4_text != NULL || route6_text != NULL) {
423                 g_autofree const gchar *routes_text = NULL;
424 
425                 if (route4_text == NULL) {
426                         routes_text = g_strdup (route6_text);
427                 } else if (route6_text == NULL) {
428                         routes_text = g_strdup (route4_text);
429                 } else {
430                         routes_text = g_strjoin ("\n", route4_text, route6_text, NULL);
431                 }
432                 gtk_label_set_label (self->route_label, routes_text);
433                 gtk_widget_set_visible (GTK_WIDGET (self->route_heading_label), routes_text != NULL);
434                 gtk_widget_set_valign (GTK_WIDGET (self->route_heading_label), GTK_ALIGN_START);
435                 gtk_widget_set_visible (GTK_WIDGET (self->route_label), routes_text != NULL);
436         } else {
437                 gtk_widget_hide (GTK_WIDGET (self->route_heading_label));
438                 gtk_widget_hide (GTK_WIDGET (self->route_label));
439         }
440 
441         if (!device_is_active && self->connection)
442                 update_last_used (self, self->connection);
443         else {
444                 gtk_widget_set_visible (GTK_WIDGET (self->last_used_heading_label), FALSE);
445                 gtk_widget_set_visible (GTK_WIDGET (self->last_used_label), FALSE);
446         }
447 
448         /* Auto connect check */
449         if (g_str_equal (type, NM_SETTING_VPN_SETTING_NAME)) {
450                 gtk_widget_hide (GTK_WIDGET (self->auto_connect_check));
451         } else {
452                 g_object_bind_property (sc, "autoconnect",
453                                         self->auto_connect_check, "active",
454                                         G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
455                 g_signal_connect_object (self->auto_connect_check, "toggled", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
456         }
457 
458         /* All users check */
459         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->all_user_check),
460                                       nm_setting_connection_get_num_permissions (sc) == 0);
461         g_signal_connect_object (self->all_user_check, "toggled", G_CALLBACK (all_user_changed), self, G_CONNECT_SWAPPED);
462         g_signal_connect_object (self->all_user_check, "toggled", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
463 
464         /* Restrict Data check */
465         update_restrict_data (self);
466 
467         /* Forget button */
468         g_signal_connect_object (self->forget_button, "clicked", G_CALLBACK (forget_cb), self, G_CONNECT_SWAPPED);
469 
470         if (g_str_equal (type, NM_SETTING_WIRELESS_SETTING_NAME))
471                 gtk_button_set_label (self->forget_button, _("Forget Connection"));
472         else if (g_str_equal (type, NM_SETTING_WIRED_SETTING_NAME))
473                 gtk_button_set_label (self->forget_button, _("Remove Connection Profile"));
474         else if (g_str_equal (type, NM_SETTING_VPN_SETTING_NAME))
475                 gtk_button_set_label (self->forget_button, _("Remove VPN"));
476         else
477                 gtk_widget_hide (GTK_WIDGET (self->forget_button));
478 }
479 
480 static void
ce_page_details_dispose(GObject * object)481 ce_page_details_dispose (GObject *object)
482 {
483         CEPageDetails *self = CE_PAGE_DETAILS (object);
484 
485         g_clear_object (&self->connection);
486 
487         G_OBJECT_CLASS (ce_page_details_parent_class)->dispose (object);
488 }
489 
490 static const gchar *
ce_page_details_get_title(CEPage * page)491 ce_page_details_get_title (CEPage *page)
492 {
493         return _("Details");
494 }
495 
496 static void
ce_page_details_init(CEPageDetails * self)497 ce_page_details_init (CEPageDetails *self)
498 {
499         gtk_widget_init_template (GTK_WIDGET (self));
500 }
501 
502 static void
ce_page_details_class_init(CEPageDetailsClass * klass)503 ce_page_details_class_init (CEPageDetailsClass *klass)
504 {
505         GObjectClass *object_class = G_OBJECT_CLASS (klass);
506         GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
507 
508         object_class->dispose = ce_page_details_dispose;
509 
510         gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/network/details-page.ui");
511 
512         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, all_user_check);
513         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, auto_connect_check);
514         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, dns4_heading_label);
515         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, dns4_label);
516         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, dns6_heading_label);
517         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, dns6_label);
518         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, forget_button);
519         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, freq_heading_label);
520         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, freq_label);
521         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, ipv4_heading_label);
522         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, ipv4_label);
523         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, ipv6_heading_label);
524         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, ipv6_label);
525         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, last_used_heading_label);
526         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, last_used_label);
527         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, mac_heading_label);
528         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, mac_label);
529         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, restrict_data_check);
530         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, route_heading_label);
531         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, route_label);
532         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, security_heading_label);
533         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, security_label);
534         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, speed_heading_label);
535         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, speed_label);
536         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, strength_heading_label);
537         gtk_widget_class_bind_template_child (widget_class, CEPageDetails, strength_label);
538 }
539 
540 static void
ce_page_iface_init(CEPageInterface * iface)541 ce_page_iface_init (CEPageInterface *iface)
542 {
543         iface->get_title = ce_page_details_get_title;
544 }
545 
546 CEPageDetails *
ce_page_details_new(NMConnection * connection,NMDevice * device,NMAccessPoint * ap,NetConnectionEditor * editor)547 ce_page_details_new (NMConnection        *connection,
548                      NMDevice            *device,
549                      NMAccessPoint       *ap,
550                      NetConnectionEditor *editor)
551 {
552         CEPageDetails *self;
553 
554         self = CE_PAGE_DETAILS (g_object_new (ce_page_details_get_type (), NULL));
555 
556         self->connection = g_object_ref (connection);
557         self->editor = editor;
558         self->device = device;
559         self->ap = ap;
560 
561         connect_details_page (self);
562 
563         return self;
564 }
565