panels/privacy: add network connectivity checking toggle
NetworkManager supports toggling the periodic network check, a check that by itself can be a security threat since it leaks information about the host. This patch adds a periodic network check toggle to the Privacy panel. This is only enabled when a recent enough NetworkManager is supported. https://bugzilla.gnome.org/show_bug.cgi?id=737362
This commit is contained in:
parent
5a66372deb
commit
dbbea7ddcb
3 changed files with 167 additions and 1 deletions
|
@ -18,6 +18,8 @@
|
|||
* Author: Matthias Clasen <mclasen@redhat.com>
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "shell/list-box-helper.h"
|
||||
#include "cc-privacy-panel.h"
|
||||
#include "cc-privacy-resources.h"
|
||||
|
@ -25,6 +27,11 @@
|
|||
|
||||
#include <gio/gdesktopappinfo.h>
|
||||
#include <glib/gi18n.h>
|
||||
#ifdef BUILD_NETWORK
|
||||
# include <NetworkManager.h>
|
||||
#else
|
||||
typedef struct _NMClient NMClient;
|
||||
#endif
|
||||
|
||||
CC_PANEL_REGISTER (CcPrivacyPanel, cc_privacy_panel)
|
||||
|
||||
|
@ -75,6 +82,10 @@ struct _CcPrivacyPanelPrivate
|
|||
GHashTable *location_app_switches;
|
||||
|
||||
GtkSizeGroup *location_icon_size_group;
|
||||
|
||||
NMClient *nm_client;
|
||||
GtkWidget *connectivity_check_dialog;
|
||||
GtkWidget *connectivity_check_row;
|
||||
};
|
||||
|
||||
static char *
|
||||
|
@ -1242,6 +1253,66 @@ add_abrt (CcPrivacyPanel *self)
|
|||
NULL);
|
||||
}
|
||||
|
||||
#if defined(BUILD_NETWORK) && NM_CHECK_VERSION(1,10,0)
|
||||
static gboolean
|
||||
transform_on_off_label (GBinding *binding G_GNUC_UNUSED,
|
||||
const GValue *from_value,
|
||||
GValue *to_value,
|
||||
gpointer user_data G_GNUC_UNUSED)
|
||||
{
|
||||
g_value_set_string (to_value, g_value_get_boolean (from_value) ? _("On") : _("Off"));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static GtkWidget *
|
||||
get_connectivity_check_label (NMClient *client)
|
||||
{
|
||||
GtkWidget *w;
|
||||
|
||||
w = gtk_label_new ("");
|
||||
g_object_bind_property_full (client, NM_CLIENT_CONNECTIVITY_CHECK_ENABLED,
|
||||
w, "label",
|
||||
G_BINDING_SYNC_CREATE,
|
||||
transform_on_off_label,
|
||||
NULL, NULL, NULL);
|
||||
return w;
|
||||
}
|
||||
|
||||
static void
|
||||
add_connectivity_check (CcPrivacyPanel *self)
|
||||
{
|
||||
GtkWidget *w;
|
||||
GtkWidget *dialog;
|
||||
|
||||
self->priv->nm_client = nm_client_new (NULL, NULL);
|
||||
if (!self->priv->nm_client)
|
||||
return;
|
||||
|
||||
w = get_connectivity_check_label (self->priv->nm_client);
|
||||
self->priv->connectivity_check_row = add_row (self, _("Periodic Network Connectivity Check"), "connectivity_check_dialog", w);
|
||||
g_object_bind_property (self->priv->nm_client, NM_CLIENT_CONNECTIVITY_CHECK_AVAILABLE,
|
||||
self->priv->connectivity_check_row, "visible",
|
||||
G_BINDING_SYNC_CREATE);
|
||||
|
||||
dialog = self->priv->connectivity_check_dialog;
|
||||
g_signal_connect (dialog, "delete-event",
|
||||
G_CALLBACK (gtk_widget_hide_on_delete), NULL);
|
||||
|
||||
w = GTK_WIDGET (gtk_builder_get_object (self->priv->builder, "connectivity_check_switch"));
|
||||
g_object_bind_property (self->priv->nm_client, NM_CLIENT_CONNECTIVITY_CHECK_ENABLED,
|
||||
w, "active",
|
||||
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
add_connectivity_check (CcPrivacyPanel *self)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static void
|
||||
cc_privacy_panel_finalize (GObject *object)
|
||||
{
|
||||
|
@ -1273,6 +1344,8 @@ cc_privacy_panel_finalize (GObject *object)
|
|||
g_clear_pointer (&priv->location_apps_perms, g_variant_unref);
|
||||
g_clear_pointer (&priv->location_apps_data, g_variant_unref);
|
||||
g_clear_pointer (&priv->location_app_switches, g_hash_table_unref);
|
||||
g_clear_object (&priv->nm_client);
|
||||
g_clear_pointer (&priv->connectivity_check_dialog, gtk_widget_destroy);
|
||||
|
||||
G_OBJECT_CLASS (cc_privacy_panel_parent_class)->finalize (object);
|
||||
}
|
||||
|
@ -1338,6 +1411,7 @@ cc_privacy_panel_init (CcPrivacyPanel *self)
|
|||
self->priv->trash_dialog = GTK_WIDGET (gtk_builder_get_object (self->priv->builder, "trash_dialog"));
|
||||
self->priv->software_dialog = GTK_WIDGET (gtk_builder_get_object (self->priv->builder, "software_dialog"));
|
||||
self->priv->abrt_dialog = GTK_WIDGET (gtk_builder_get_object (self->priv->builder, "abrt_dialog"));
|
||||
self->priv->connectivity_check_dialog = GTK_WIDGET (gtk_builder_get_object (self->priv->builder, "connectivity_check_dialog"));
|
||||
|
||||
frame = WID ("frame");
|
||||
widget = gtk_list_box_new ();
|
||||
|
@ -1372,6 +1446,7 @@ cc_privacy_panel_init (CcPrivacyPanel *self)
|
|||
add_trash_temp (self);
|
||||
add_software (self);
|
||||
add_abrt (self);
|
||||
add_connectivity_check (self);
|
||||
|
||||
g_signal_connect (self->priv->lockdown_settings, "changed",
|
||||
G_CALLBACK (on_lockdown_settings_changed), self);
|
||||
|
|
|
@ -29,12 +29,17 @@ sources += gnome.compile_resources(
|
|||
export: true
|
||||
)
|
||||
|
||||
deps = common_deps
|
||||
if host_is_linux
|
||||
deps += network_manager_deps
|
||||
endif
|
||||
|
||||
cflags += '-DGNOMELOCALEDIR="@0@"'.format(control_center_localedir)
|
||||
|
||||
panels_libs += static_library(
|
||||
cappletname,
|
||||
sources: sources,
|
||||
include_directories: [top_inc, common_inc],
|
||||
dependencies: common_deps,
|
||||
dependencies: deps,
|
||||
c_args: cflags
|
||||
)
|
||||
|
|
|
@ -1038,4 +1038,90 @@ All the information we collect is made anonymous, and we will never share your d
|
|||
</child>
|
||||
</object>
|
||||
|
||||
<object class="GtkDialog" id="connectivity_check_dialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="border_width">5</property>
|
||||
<property name="title" translatable="yes">Connectivity Checking</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="use_header_bar">1</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">2</property>
|
||||
<property name="margin_start">12</property>
|
||||
<property name="margin_end">12</property>
|
||||
<property name="margin_top">12</property>
|
||||
<property name="margin_bottom">12</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="connectivity_check_explanation_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_start">12</property>
|
||||
<property name="margin_end">12</property>
|
||||
<property name="margin_top">6</property>
|
||||
<property name="margin_bottom">12</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="label" translatable="yes">Check whether network connections can reach the internet. This makes it possible to detect captive portals, but also generates a small network traffic periodically.</property>
|
||||
<property name="wrap">True</property>
|
||||
<property name="max_width_chars">50</property>
|
||||
<style>
|
||||
<class name="dim-label"/>
|
||||
</style>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkGrid">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_start">12</property>
|
||||
<property name="margin_end">12</property>
|
||||
<property name="margin_top">12</property>
|
||||
<property name="margin_bottom">12</property>
|
||||
<property name="row_spacing">12</property>
|
||||
<property name="column_spacing">6</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="connectivity_check_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="label" translatable="yes">_Connectivity Checking</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="mnemonic_widget">connectivity_check_switch</property>
|
||||
<property name="xalign">0</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">0</property>
|
||||
<property name="top_attach">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="connectivity_check_switch">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="halign">end</property>
|
||||
<property name="valign">center</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="top_attach">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
|
||||
</interface>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue