|
Packit Service |
639700 |
// SPDX-License-Identifier: GPL-2.0+
|
|
Packit |
fabffb |
/* NetworkManager Connection editor -- Connection editor for NetworkManager
|
|
Packit |
fabffb |
*
|
|
Packit |
fabffb |
* Copyright 2012 - 2014 Red Hat, Inc.
|
|
Packit |
fabffb |
*/
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#include "nm-default.h"
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#include "page-general.h"
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
G_DEFINE_TYPE (CEPageGeneral, ce_page_general, CE_TYPE_PAGE)
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#define CE_PAGE_GENERAL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CE_TYPE_PAGE_GENERAL, CEPageGeneralPrivate))
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
typedef struct {
|
|
Packit |
fabffb |
NMSettingConnection *setting;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
gboolean is_vpn;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
GDBusProxy *fw_proxy;
|
|
Packit |
fabffb |
GCancellable *cancellable;
|
|
Packit |
fabffb |
GtkComboBoxText *firewall_zone;
|
|
Packit |
fabffb |
GtkLabel *firewall_zone_label;
|
|
Packit |
fabffb |
char **zones;
|
|
Packit |
fabffb |
gboolean got_zones;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
GtkToggleButton *dependent_vpn_checkbox;
|
|
Packit |
fabffb |
GtkComboBox *dependent_vpn;
|
|
Packit |
fabffb |
GtkListStore *dependent_vpn_store;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
GtkWidget *autoconnect;
|
|
Packit |
fabffb |
GtkSpinButton *autoconnect_prio;
|
|
Packit |
fabffb |
GtkWidget *all_checkbutton;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
GtkComboBox *metered_combo;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
gboolean setup_finished;
|
|
Packit |
fabffb |
} CEPageGeneralPrivate;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* TRANSLATORS: Default zone set for firewall, when no zone is selected */
|
|
Packit |
fabffb |
#define FIREWALL_ZONE_DEFAULT _("Default")
|
|
Packit |
fabffb |
#define FIREWALL_ZONE_TOOLTIP _("The zone defines the trust level of the connection. Default is not a regular zone, selecting it results in the use of the default zone set in the firewall. Only usable if firewalld is active.")
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
enum {
|
|
Packit |
fabffb |
COL_ID,
|
|
Packit |
fabffb |
COL_UUID,
|
|
Packit |
fabffb |
N_COLUMNS
|
|
Packit |
fabffb |
};
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void populate_firewall_zones_ui (CEPageGeneral *self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
get_zones_cb (GDBusProxy *proxy, GAsyncResult *result, gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageGeneral *self;
|
|
Packit |
fabffb |
CEPageGeneralPrivate *priv;
|
|
Packit |
fabffb |
GVariant *variant = NULL;
|
|
Packit |
fabffb |
GError *error = NULL;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
variant = g_dbus_proxy_call_finish (proxy, result, &error);
|
|
Packit |
fabffb |
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
|
|
Packit |
fabffb |
g_clear_error (&error);
|
|
Packit |
fabffb |
return;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
self = CE_PAGE_GENERAL (user_data);
|
|
Packit |
fabffb |
priv = CE_PAGE_GENERAL_GET_PRIVATE (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (variant) {
|
|
Packit |
fabffb |
if (g_variant_is_of_type (variant, G_VARIANT_TYPE ("(as)")))
|
|
Packit |
fabffb |
g_variant_get (variant, "(^as)", &priv->zones);
|
|
Packit |
fabffb |
else {
|
|
Packit |
fabffb |
g_warning ("Failed to get zones from FirewallD: invalid reply type '%s'",
|
|
Packit |
fabffb |
g_variant_get_type_string (variant));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
g_variant_unref (variant);
|
|
Packit |
fabffb |
} else if (!g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_SERVICE_UNKNOWN))
|
|
Packit |
fabffb |
g_warning ("Failed to get zones from FirewallD: %s", error->message);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
priv->got_zones = TRUE;
|
|
Packit |
fabffb |
if (priv->setup_finished)
|
|
Packit |
fabffb |
populate_firewall_zones_ui (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_clear_error (&error);
|
|
Packit |
fabffb |
g_clear_object (&priv->cancellable);
|
|
Packit |
fabffb |
g_clear_object (&priv->fw_proxy);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
on_fw_proxy_acquired (GObject *object, GAsyncResult *result, gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageGeneral *self;
|
|
Packit |
fabffb |
CEPageGeneralPrivate *priv;
|
|
Packit |
fabffb |
GError *error = NULL;
|
|
Packit |
fabffb |
GDBusProxy *proxy;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
proxy = g_dbus_proxy_new_for_bus_finish (result, &error);
|
|
Packit |
fabffb |
if (!proxy) {
|
|
Packit |
fabffb |
g_warning ("Failed to get FirewallD proxy: %s", error->message);
|
|
Packit |
fabffb |
g_clear_error (&error);
|
|
Packit |
fabffb |
return;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
self = CE_PAGE_GENERAL (user_data);
|
|
Packit |
fabffb |
priv = CE_PAGE_GENERAL_GET_PRIVATE (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
priv->fw_proxy = proxy;
|
|
Packit |
fabffb |
g_dbus_proxy_call (priv->fw_proxy,
|
|
Packit |
fabffb |
"getZones",
|
|
Packit |
fabffb |
NULL,
|
|
Packit |
fabffb |
G_DBUS_CALL_FLAGS_NONE,
|
|
Packit |
fabffb |
-1,
|
|
Packit |
fabffb |
priv->cancellable,
|
|
Packit |
fabffb |
(GAsyncReadyCallback) get_zones_cb,
|
|
Packit |
fabffb |
self);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
general_private_init (CEPageGeneral *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageGeneralPrivate *priv = CE_PAGE_GENERAL_GET_PRIVATE (self);
|
|
Packit |
fabffb |
GtkBuilder *builder;
|
|
Packit |
fabffb |
GtkWidget *vbox;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
builder = CE_PAGE (self)->builder;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/*-- Firewall zone --*/
|
|
Packit |
fabffb |
priv->firewall_zone = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new ());
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
vbox = GTK_WIDGET (gtk_builder_get_object (builder, "firewall_zone_vbox"));
|
|
Packit |
fabffb |
gtk_container_add (GTK_CONTAINER (vbox), GTK_WIDGET (priv->firewall_zone));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Get zones from FirewallD */
|
|
Packit |
fabffb |
priv->cancellable = g_cancellable_new ();
|
|
Packit |
fabffb |
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
|
|
Packit |
fabffb |
G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
|
|
Packit |
fabffb |
NULL,
|
|
Packit |
fabffb |
"org.fedoraproject.FirewallD1",
|
|
Packit |
fabffb |
"/org/fedoraproject/FirewallD1",
|
|
Packit |
fabffb |
"org.fedoraproject.FirewallD1.zone",
|
|
Packit |
fabffb |
priv->cancellable,
|
|
Packit |
fabffb |
(GAsyncReadyCallback) on_fw_proxy_acquired,
|
|
Packit |
fabffb |
self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Set mnemonic widget for device Firewall zone label */
|
|
Packit |
fabffb |
priv->firewall_zone_label = GTK_LABEL (gtk_builder_get_object (builder, "firewall_zone_label"));
|
|
Packit |
fabffb |
gtk_label_set_mnemonic_widget (priv->firewall_zone_label, GTK_WIDGET (priv->firewall_zone));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/*-- Dependent VPN connection --*/
|
|
Packit |
fabffb |
priv->dependent_vpn_checkbox = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "dependent_vpn_checkbox"));
|
|
Packit |
fabffb |
priv->dependent_vpn = GTK_COMBO_BOX (gtk_builder_get_object (builder, "dependent_vpn_combo"));
|
|
Packit |
fabffb |
priv->dependent_vpn_store = GTK_LIST_STORE (gtk_builder_get_object (builder, "dependent_vpn_model"));
|
|
Packit Service |
639700 |
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (priv->dependent_vpn_store), 0,
|
|
Packit Service |
639700 |
GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
priv->autoconnect = GTK_WIDGET (gtk_builder_get_object (builder, "connection_autoconnect"));
|
|
Packit |
fabffb |
priv->autoconnect_prio = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "autoconnect_prio"));
|
|
Packit |
fabffb |
priv->all_checkbutton = GTK_WIDGET (gtk_builder_get_object (builder, "system_checkbutton"));
|
|
Packit |
fabffb |
priv->metered_combo = GTK_COMBO_BOX (gtk_builder_get_object (builder, "metered_combo"));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
dispose (GObject *object)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageGeneralPrivate *priv = CE_PAGE_GENERAL_GET_PRIVATE (object);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (priv->cancellable) {
|
|
Packit |
fabffb |
g_cancellable_cancel (priv->cancellable);
|
|
Packit |
fabffb |
g_clear_object (&priv->cancellable);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
g_clear_object (&priv->fw_proxy);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_clear_pointer (&priv->zones, g_strfreev);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
G_OBJECT_CLASS (ce_page_general_parent_class)->dispose (object);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
stuff_changed (GtkWidget *w, gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
ce_page_changed (CE_PAGE (user_data));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
vpn_checkbox_toggled (GtkToggleButton *button, gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageGeneralPrivate *priv = CE_PAGE_GENERAL_GET_PRIVATE (user_data);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->dependent_vpn), gtk_toggle_button_get_active (priv->dependent_vpn_checkbox));
|
|
Packit |
fabffb |
ce_page_changed (CE_PAGE (user_data));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
autoconnect_checkbox_toggled (GtkToggleButton *button, gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageGeneralPrivate *priv = CE_PAGE_GENERAL_GET_PRIVATE (user_data);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->autoconnect_prio),
|
|
Packit |
fabffb |
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->autoconnect)));
|
|
Packit |
fabffb |
ce_page_changed (CE_PAGE (user_data));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
populate_firewall_zones_ui (CEPageGeneral *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageGeneralPrivate *priv = CE_PAGE_GENERAL_GET_PRIVATE (self);
|
|
Packit |
fabffb |
NMSettingConnection *setting = priv->setting;
|
|
Packit |
fabffb |
const char *s_zone;
|
|
Packit |
fabffb |
char **zone_ptr;
|
|
Packit |
fabffb |
guint32 combo_idx = 0, idx;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
s_zone = nm_setting_connection_get_zone (setting);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Always add "fake" 'Default' zone for default firewall settings */
|
|
Packit |
fabffb |
gtk_combo_box_text_append_text (priv->firewall_zone, FIREWALL_ZONE_DEFAULT);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
for (zone_ptr = priv->zones, idx = 0; zone_ptr && *zone_ptr; zone_ptr++, idx++) {
|
|
Packit |
fabffb |
gtk_combo_box_text_append_text (priv->firewall_zone, *zone_ptr);
|
|
Packit |
fabffb |
if (g_strcmp0 (s_zone, *zone_ptr) == 0)
|
|
Packit |
fabffb |
combo_idx = idx + 1;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (s_zone && combo_idx == 0) {
|
|
Packit |
fabffb |
/* Unknown zone in connection setting - add it to combobox */
|
|
Packit |
fabffb |
gtk_combo_box_text_append_text (priv->firewall_zone, s_zone);
|
|
Packit |
fabffb |
combo_idx = idx + 1;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
gtk_combo_box_set_active (GTK_COMBO_BOX (priv->firewall_zone), combo_idx);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Zone tooltip and availability */
|
|
Packit |
fabffb |
if (priv->zones) {
|
|
Packit |
fabffb |
gtk_widget_set_tooltip_text (GTK_WIDGET (priv->firewall_zone), FIREWALL_ZONE_TOOLTIP);
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->firewall_zone), TRUE);
|
|
Packit |
fabffb |
gtk_widget_show_all (GTK_WIDGET (priv->firewall_zone));
|
|
Packit |
fabffb |
gtk_widget_show (GTK_WIDGET (priv->firewall_zone_label));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
stuff_changed (NULL, self);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
populate_ui (CEPageGeneral *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageGeneralPrivate *priv = CE_PAGE_GENERAL_GET_PRIVATE (self);
|
|
Packit |
fabffb |
NMSettingConnection *setting = priv->setting;
|
|
Packit |
fabffb |
const char *vpn_uuid;
|
|
Packit |
fabffb |
guint32 combo_idx = 0, idx;
|
|
Packit |
fabffb |
const GPtrArray *con_list;
|
|
Packit |
fabffb |
int i;
|
|
Packit |
fabffb |
GtkTreeIter iter;
|
|
Packit |
fabffb |
gboolean global_connection = TRUE;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Zones are filled when got them from firewalld */
|
|
Packit |
fabffb |
if (priv->got_zones)
|
|
Packit |
fabffb |
populate_firewall_zones_ui (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Secondary UUID (VPN) */
|
|
Packit |
fabffb |
vpn_uuid = nm_setting_connection_get_secondary (setting, 0);
|
|
Packit |
fabffb |
con_list = nm_client_get_connections (CE_PAGE (self)->client);
|
|
Packit |
fabffb |
for (i = 0, idx = 0, combo_idx = 0; i < con_list->len; i++) {
|
|
Packit |
fabffb |
NMConnection *conn = con_list->pdata[i];
|
|
Packit |
fabffb |
const char *uuid = nm_connection_get_uuid (conn);
|
|
Packit |
fabffb |
const char *id = nm_connection_get_id (conn);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (!nm_connection_is_type (conn, NM_SETTING_VPN_SETTING_NAME))
|
|
Packit |
fabffb |
continue;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
gtk_list_store_append (priv->dependent_vpn_store, &iter);
|
|
Packit |
fabffb |
gtk_list_store_set (priv->dependent_vpn_store, &iter, COL_ID, id, COL_UUID, uuid, -1);
|
|
Packit |
fabffb |
if (g_strcmp0 (vpn_uuid, uuid) == 0)
|
|
Packit |
fabffb |
combo_idx = idx;
|
|
Packit |
fabffb |
idx++;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
gtk_combo_box_set_active (GTK_COMBO_BOX (priv->dependent_vpn), combo_idx);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* We don't support multiple VPNs at the moment, so hide secondary
|
|
Packit |
fabffb |
* stuff for VPN connections. We'll revisit this later when we support
|
|
Packit |
fabffb |
* multiple VPNs.
|
|
Packit |
fabffb |
*/
|
|
Packit |
fabffb |
if (priv->is_vpn) {
|
|
Packit |
fabffb |
gtk_widget_hide (GTK_WIDGET (priv->dependent_vpn_checkbox));
|
|
Packit |
fabffb |
gtk_widget_hide (GTK_WIDGET (priv->dependent_vpn));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* 'Automatically connect to this network' checkbox */
|
|
Packit |
fabffb |
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->autoconnect),
|
|
Packit |
fabffb |
nm_setting_connection_get_autoconnect (priv->setting));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Connection priority */
|
|
Packit |
fabffb |
gtk_spin_button_set_value (priv->autoconnect_prio,
|
|
Packit |
fabffb |
nm_setting_connection_get_autoconnect_priority(priv->setting));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* VPN connections don't have a blanket "autoconnect" as that is too coarse
|
|
Packit |
fabffb |
* a behavior, instead the user configures another connection to start the
|
|
Packit |
fabffb |
* VPN on success.
|
|
Packit |
fabffb |
*/
|
|
Packit |
fabffb |
if (priv->is_vpn) {
|
|
Packit |
fabffb |
gtk_widget_hide (priv->autoconnect);
|
|
Packit |
fabffb |
gtk_widget_hide (GTK_WIDGET (priv->autoconnect_prio));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* 'All users may connect to this network' checkbox */
|
|
Packit |
fabffb |
if (nm_setting_connection_get_num_permissions (priv->setting))
|
|
Packit |
fabffb |
global_connection = FALSE;
|
|
Packit |
fabffb |
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->all_checkbutton), global_connection);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Metered */
|
|
Packit |
fabffb |
gtk_combo_box_set_active (priv->metered_combo, nm_setting_connection_get_metered (priv->setting));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
stuff_changed (NULL, self);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
finish_setup (CEPageGeneral *self, gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageGeneralPrivate *priv = CE_PAGE_GENERAL_GET_PRIVATE (self);
|
|
Packit |
fabffb |
gboolean any_dependent_vpn;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
priv->setup_finished = TRUE;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
populate_ui (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_signal_connect (priv->firewall_zone, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
any_dependent_vpn = !!nm_setting_connection_get_num_secondaries (priv->setting);
|
|
Packit |
fabffb |
gtk_toggle_button_set_active (priv->dependent_vpn_checkbox, any_dependent_vpn);
|
|
Packit |
fabffb |
g_signal_connect (priv->dependent_vpn_checkbox, "toggled", G_CALLBACK (vpn_checkbox_toggled), self);
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->dependent_vpn), any_dependent_vpn);
|
|
Packit |
fabffb |
g_signal_connect (priv->dependent_vpn, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_signal_connect (priv->autoconnect, "toggled", G_CALLBACK (autoconnect_checkbox_toggled), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->autoconnect_prio, "value-changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->autoconnect_prio), nm_setting_connection_get_autoconnect (priv->setting));
|
|
Packit |
fabffb |
g_signal_connect (priv->all_checkbutton, "toggled", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
CEPage *
|
|
Packit |
fabffb |
ce_page_general_new (NMConnectionEditor *editor,
|
|
Packit |
fabffb |
NMConnection *connection,
|
|
Packit |
fabffb |
GtkWindow *parent_window,
|
|
Packit |
fabffb |
NMClient *client,
|
|
Packit |
fabffb |
const char **out_secrets_setting_name,
|
|
Packit |
fabffb |
GError **error)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageGeneral *self;
|
|
Packit |
fabffb |
CEPageGeneralPrivate *priv;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
self = CE_PAGE_GENERAL (ce_page_new (CE_TYPE_PAGE_GENERAL,
|
|
Packit |
fabffb |
editor,
|
|
Packit |
fabffb |
connection,
|
|
Packit |
fabffb |
parent_window,
|
|
Packit |
fabffb |
client,
|
|
Packit |
fabffb |
"/org/gnome/nm_connection_editor/ce-page-general.ui",
|
|
Packit |
fabffb |
"GeneralPage",
|
|
Packit |
fabffb |
_("General")));
|
|
Packit |
fabffb |
if (!self) {
|
|
Packit |
fabffb |
g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC,
|
|
Packit |
fabffb |
_("Could not load General user interface."));
|
|
Packit |
fabffb |
return NULL;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
general_private_init (self);
|
|
Packit |
fabffb |
priv = CE_PAGE_GENERAL_GET_PRIVATE (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
priv->setting = nm_connection_get_setting_connection (connection);
|
|
Packit |
fabffb |
if (!priv->setting) {
|
|
Packit |
fabffb |
priv->setting = NM_SETTING_CONNECTION (nm_setting_connection_new ());
|
|
Packit |
fabffb |
nm_connection_add_setting (connection, NM_SETTING (priv->setting));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
priv->is_vpn = nm_connection_is_type (connection, NM_SETTING_VPN_SETTING_NAME);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_signal_connect (self, CE_PAGE_INITIALIZED, G_CALLBACK (finish_setup), NULL);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
return CE_PAGE (self);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
ui_to_setting (CEPageGeneral *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageGeneralPrivate *priv = CE_PAGE_GENERAL_GET_PRIVATE (self);
|
|
Packit |
fabffb |
char *uuid = NULL;
|
|
Packit |
fabffb |
GtkTreeIter iter;
|
|
Packit |
fabffb |
gboolean autoconnect = FALSE, everyone = FALSE;
|
|
Packit |
fabffb |
int prio;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* We can't take and save zone until the combo was properly initialized. Zones
|
|
Packit |
fabffb |
* are received from FirewallD asynchronously; got_zones indicates we are ready.
|
|
Packit |
fabffb |
*/
|
|
Packit |
fabffb |
if (priv->got_zones) {
|
|
Packit |
fabffb |
char *zone;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
zone = gtk_combo_box_text_get_active_text (priv->firewall_zone);
|
|
Packit |
fabffb |
g_object_set (priv->setting, NM_SETTING_CONNECTION_ZONE,
|
|
Packit |
fabffb |
(g_strcmp0 (zone, FIREWALL_ZONE_DEFAULT) != 0) ? zone : NULL,
|
|
Packit |
fabffb |
NULL);
|
|
Packit |
fabffb |
g_free (zone);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if ( gtk_toggle_button_get_active (priv->dependent_vpn_checkbox)
|
|
Packit |
fabffb |
&& gtk_combo_box_get_active_iter (priv->dependent_vpn, &iter))
|
|
Packit |
fabffb |
gtk_tree_model_get (GTK_TREE_MODEL (priv->dependent_vpn_store), &iter,
|
|
Packit |
fabffb |
COL_UUID, &uuid, -1);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_object_set (G_OBJECT (priv->setting), NM_SETTING_CONNECTION_SECONDARIES, NULL, NULL);
|
|
Packit |
fabffb |
if (uuid)
|
|
Packit |
fabffb |
nm_setting_connection_add_secondary (priv->setting, uuid);
|
|
Packit |
fabffb |
g_free (uuid);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
autoconnect = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->autoconnect));
|
|
Packit |
fabffb |
prio = gtk_spin_button_get_value_as_int (priv->autoconnect_prio);
|
|
Packit |
fabffb |
g_object_set (G_OBJECT (priv->setting),
|
|
Packit |
fabffb |
NM_SETTING_CONNECTION_AUTOCONNECT, autoconnect,
|
|
Packit |
fabffb |
NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY, prio,
|
|
Packit |
fabffb |
NULL);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Handle visibility */
|
|
Packit |
fabffb |
everyone = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->all_checkbutton));
|
|
Packit |
fabffb |
g_object_set (G_OBJECT (priv->setting), NM_SETTING_CONNECTION_PERMISSIONS, NULL, NULL);
|
|
Packit |
fabffb |
if (everyone == FALSE) {
|
|
Packit |
fabffb |
/* Only visible to this user */
|
|
Packit |
fabffb |
nm_setting_connection_add_permission (priv->setting, "user", g_get_user_name (), NULL);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_object_set (G_OBJECT (priv->setting),
|
|
Packit |
fabffb |
NM_SETTING_CONNECTION_METERED,
|
|
Packit |
fabffb |
gtk_combo_box_get_active (priv->metered_combo),
|
|
Packit |
fabffb |
NULL);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static gboolean
|
|
Packit |
fabffb |
ce_page_validate_v (CEPage *page, NMConnection *connection, GError **error)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageGeneral *self = CE_PAGE_GENERAL (page);
|
|
Packit |
fabffb |
CEPageGeneralPrivate *priv = CE_PAGE_GENERAL_GET_PRIVATE (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
ui_to_setting (self);
|
|
Packit |
fabffb |
return nm_setting_verify (NM_SETTING (priv->setting), NULL, error);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
ce_page_general_init (CEPageGeneral *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
ce_page_general_class_init (CEPageGeneralClass *connection_class)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
GObjectClass *object_class = G_OBJECT_CLASS (connection_class);
|
|
Packit |
fabffb |
CEPageClass *parent_class = CE_PAGE_CLASS (connection_class);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_type_class_add_private (object_class, sizeof (CEPageGeneralPrivate));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* virtual methods */
|
|
Packit |
fabffb |
object_class->dispose = dispose;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
parent_class->ce_page_validate_v = ce_page_validate_v;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|