|
Packit Service |
639700 |
// SPDX-License-Identifier: GPL-2.0+
|
|
Packit |
fabffb |
/* NetworkManager Connection editor -- Connection editor for NetworkManager
|
|
Packit |
fabffb |
*
|
|
Packit |
fabffb |
* Copyright 2016 Red Hat, Inc.
|
|
Packit |
fabffb |
*/
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#include "nm-default.h"
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#include "page-ip-tunnel.h"
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#include "nm-connection-editor.h"
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
G_DEFINE_TYPE (CEPageIPTunnel, ce_page_ip_tunnel, CE_TYPE_PAGE)
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#define CE_PAGE_IP_TUNNEL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CE_TYPE_PAGE_IP_TUNNEL, CEPageIPTunnelPrivate))
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
typedef struct {
|
|
Packit |
fabffb |
NMSettingIPTunnel *setting;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
GtkEntry *name;
|
|
Packit |
fabffb |
GtkComboBoxText *parent;
|
|
Packit |
fabffb |
GtkComboBox *mode;
|
|
Packit |
fabffb |
GtkEntry *local;
|
|
Packit |
fabffb |
GtkEntry *remote;
|
|
Packit |
fabffb |
GtkEntry *input_key;
|
|
Packit |
fabffb |
GtkEntry *output_key;
|
|
Packit |
fabffb |
GtkSpinButton *mtu;
|
|
Packit |
fabffb |
} CEPageIPTunnelPrivate;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
ip_tunnel_private_init (CEPageIPTunnel *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageIPTunnelPrivate *priv = CE_PAGE_IP_TUNNEL_GET_PRIVATE (self);
|
|
Packit |
fabffb |
GtkBuilder *builder;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
builder = CE_PAGE (self)->builder;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
priv->name = GTK_ENTRY (gtk_builder_get_object (builder, "ip_tunnel_name"));
|
|
Packit |
fabffb |
priv->parent = GTK_COMBO_BOX_TEXT (gtk_builder_get_object (builder, "ip_tunnel_parent"));
|
|
Packit |
fabffb |
priv->mode = GTK_COMBO_BOX (gtk_builder_get_object (builder, "ip_tunnel_mode"));
|
|
Packit |
fabffb |
priv->local = GTK_ENTRY (gtk_builder_get_object (builder, "ip_tunnel_local"));
|
|
Packit |
fabffb |
priv->remote = GTK_ENTRY (gtk_builder_get_object (builder, "ip_tunnel_remote"));
|
|
Packit |
fabffb |
priv->input_key = GTK_ENTRY (gtk_builder_get_object (builder, "ip_tunnel_ikey"));
|
|
Packit |
fabffb |
priv->output_key = GTK_ENTRY (gtk_builder_get_object (builder, "ip_tunnel_okey"));
|
|
Packit |
fabffb |
priv->mtu = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "ip_tunnel_mtu"));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
mode_changed (GtkComboBox *combo, gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageIPTunnel *self = user_data;
|
|
Packit |
fabffb |
CEPageIPTunnelPrivate *priv = CE_PAGE_IP_TUNNEL_GET_PRIVATE (self);
|
|
Packit |
fabffb |
NMIPTunnelMode mode;
|
|
Packit |
fabffb |
gboolean enable;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
mode = gtk_combo_box_get_active (combo) + 1;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
enable = (mode == NM_IP_TUNNEL_MODE_GRE || mode == NM_IP_TUNNEL_MODE_IP6GRE);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->input_key), enable);
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->output_key), enable);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (!enable) {
|
|
Packit |
fabffb |
gtk_entry_set_text (priv->input_key, "");
|
|
Packit |
fabffb |
gtk_entry_set_text (priv->output_key, "");
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
populate_ui (CEPageIPTunnel *self, NMConnection *connection)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageIPTunnelPrivate *priv = CE_PAGE_IP_TUNNEL_GET_PRIVATE (self);
|
|
Packit |
fabffb |
NMSettingIPTunnel *setting = priv->setting;
|
|
Packit |
fabffb |
NMIPTunnelMode mode;
|
|
Packit |
fabffb |
const char *str;
|
|
Packit |
fabffb |
int mtu_def;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
str = nm_connection_get_interface_name (CE_PAGE (self)->connection);
|
|
Packit |
fabffb |
if (str)
|
|
Packit |
fabffb |
gtk_entry_set_text (priv->name, str);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
str = nm_setting_ip_tunnel_get_parent (setting);
|
|
Packit |
fabffb |
ce_page_setup_device_combo (CE_PAGE (self), GTK_COMBO_BOX (priv->parent),
|
|
Packit |
fabffb |
G_TYPE_NONE, str,
|
|
Packit |
fabffb |
NULL, NULL);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
mode = nm_setting_ip_tunnel_get_mode (setting);
|
|
Packit |
fabffb |
if (mode >= NM_IP_TUNNEL_MODE_IPIP && mode <= NM_IP_TUNNEL_MODE_VTI6)
|
|
Packit |
fabffb |
gtk_combo_box_set_active (priv->mode, mode - 1);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
str = nm_setting_ip_tunnel_get_local (setting);
|
|
Packit |
fabffb |
if (str)
|
|
Packit |
fabffb |
gtk_entry_set_text (priv->local, str);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
str = nm_setting_ip_tunnel_get_remote (setting);
|
|
Packit |
fabffb |
if (str)
|
|
Packit |
fabffb |
gtk_entry_set_text (priv->remote, str);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
str = nm_setting_ip_tunnel_get_input_key (setting);
|
|
Packit |
fabffb |
if (str)
|
|
Packit |
fabffb |
gtk_entry_set_text (priv->input_key, str);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
str = nm_setting_ip_tunnel_get_output_key (setting);
|
|
Packit |
fabffb |
if (str)
|
|
Packit |
fabffb |
gtk_entry_set_text (priv->output_key, str);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
mtu_def = ce_get_property_default (NM_SETTING (setting), NM_SETTING_IP_TUNNEL_MTU);
|
|
Packit |
fabffb |
ce_spin_automatic_val (priv->mtu, mtu_def);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
gtk_spin_button_set_value (priv->mtu, (gdouble) nm_setting_ip_tunnel_get_mtu (setting));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
mode_changed (priv->mode, self);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
stuff_changed (GtkEditable *editable, gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
ce_page_changed (CE_PAGE (user_data));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
finish_setup (CEPageIPTunnel *self, gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPage *parent = CE_PAGE (self);
|
|
Packit |
fabffb |
CEPageIPTunnelPrivate *priv = CE_PAGE_IP_TUNNEL_GET_PRIVATE (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
populate_ui (self, parent->connection);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_signal_connect (priv->name, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->parent, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->mode, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->local, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->remote, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->input_key, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->output_key, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->mtu, "value-changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_signal_connect (priv->mode, "changed", G_CALLBACK (mode_changed), self);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
CEPage *
|
|
Packit |
fabffb |
ce_page_ip_tunnel_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 |
CEPageIPTunnel *self;
|
|
Packit |
fabffb |
CEPageIPTunnelPrivate *priv;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
self = CE_PAGE_IP_TUNNEL (ce_page_new (CE_TYPE_PAGE_IP_TUNNEL,
|
|
Packit |
fabffb |
editor,
|
|
Packit |
fabffb |
connection,
|
|
Packit |
fabffb |
parent_window,
|
|
Packit |
fabffb |
client,
|
|
Packit |
fabffb |
"/org/gnome/nm_connection_editor/ce-page-ip-tunnel.ui",
|
|
Packit |
fabffb |
"IPTunnelPage",
|
|
Packit |
fabffb |
_("IP tunnel")));
|
|
Packit |
fabffb |
if (!self) {
|
|
Packit |
fabffb |
g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("Could not load IP tunnel user interface."));
|
|
Packit |
fabffb |
return NULL;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
ip_tunnel_private_init (self);
|
|
Packit |
fabffb |
priv = CE_PAGE_IP_TUNNEL_GET_PRIVATE (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
priv->setting = nm_connection_get_setting_ip_tunnel (connection);
|
|
Packit |
fabffb |
if (!priv->setting) {
|
|
Packit |
fabffb |
priv->setting = NM_SETTING_IP_TUNNEL (nm_setting_ip_tunnel_new ());
|
|
Packit |
fabffb |
nm_connection_add_setting (connection, NM_SETTING (priv->setting));
|
|
Packit |
fabffb |
}
|
|
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 (CEPageIPTunnel *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageIPTunnelPrivate *priv = CE_PAGE_IP_TUNNEL_GET_PRIVATE (self);
|
|
Packit |
fabffb |
NMSettingConnection *s_con;
|
|
Packit |
fabffb |
const char *parent = NULL;
|
|
Packit |
fabffb |
const char *local;
|
|
Packit |
fabffb |
const char *remote;
|
|
Packit |
fabffb |
const char *input_key;
|
|
Packit |
fabffb |
const char *output_key;
|
|
Packit |
fabffb |
NMIPTunnelMode mode;
|
|
Packit |
fabffb |
GtkWidget *entry;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
s_con = nm_connection_get_setting_connection (CE_PAGE (self)->connection);
|
|
Packit |
fabffb |
g_return_if_fail (s_con != NULL);
|
|
Packit |
fabffb |
g_object_set (s_con,
|
|
Packit |
fabffb |
NM_SETTING_CONNECTION_INTERFACE_NAME, gtk_entry_get_text (priv->name),
|
|
Packit |
fabffb |
NULL);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
entry = gtk_bin_get_child (GTK_BIN (priv->parent));
|
|
Packit |
fabffb |
if (entry) {
|
|
Packit |
fabffb |
ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_ETHER, TRUE,
|
|
Packit |
fabffb |
(char **) &parent, NULL, NULL, NULL);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
mode = gtk_combo_box_get_active (priv->mode) + 1;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
local = gtk_entry_get_text (priv->local);
|
|
Packit |
fabffb |
if (local && !local[0])
|
|
Packit |
fabffb |
local = NULL;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
remote = gtk_entry_get_text (priv->remote);
|
|
Packit |
fabffb |
if (remote && !remote[0])
|
|
Packit |
fabffb |
remote = NULL;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
input_key = gtk_entry_get_text (priv->input_key);
|
|
Packit |
fabffb |
if (input_key && !input_key[0])
|
|
Packit |
fabffb |
input_key = NULL;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
output_key = gtk_entry_get_text (priv->output_key);
|
|
Packit |
fabffb |
if (output_key && !output_key[0])
|
|
Packit |
fabffb |
output_key = NULL;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_object_set (priv->setting,
|
|
Packit |
fabffb |
NM_SETTING_IP_TUNNEL_PARENT, parent,
|
|
Packit |
fabffb |
NM_SETTING_IP_TUNNEL_MODE, mode,
|
|
Packit |
fabffb |
NM_SETTING_IP_TUNNEL_LOCAL, local,
|
|
Packit |
fabffb |
NM_SETTING_IP_TUNNEL_REMOTE, remote,
|
|
Packit |
fabffb |
NM_SETTING_IP_TUNNEL_INPUT_KEY, input_key,
|
|
Packit |
fabffb |
NM_SETTING_IP_TUNNEL_OUTPUT_KEY, output_key,
|
|
Packit |
fabffb |
NM_SETTING_IP_TUNNEL_MTU, gtk_spin_button_get_value_as_int (priv->mtu),
|
|
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 |
CEPageIPTunnel *self = CE_PAGE_IP_TUNNEL (page);
|
|
Packit |
fabffb |
CEPageIPTunnelPrivate *priv = CE_PAGE_IP_TUNNEL_GET_PRIVATE (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
ui_to_setting (self);
|
|
Packit |
fabffb |
return nm_setting_verify (NM_SETTING (priv->setting), connection, error);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
ce_page_ip_tunnel_init (CEPageIPTunnel *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
ce_page_ip_tunnel_class_init (CEPageIPTunnelClass *ip_tunnel_class)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
GObjectClass *object_class = G_OBJECT_CLASS (ip_tunnel_class);
|
|
Packit |
fabffb |
CEPageClass *parent_class = CE_PAGE_CLASS (ip_tunnel_class);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_type_class_add_private (object_class, sizeof (CEPageIPTunnelPrivate));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
parent_class->ce_page_validate_v = ce_page_validate_v;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
void
|
|
Packit |
fabffb |
ip_tunnel_connection_new (FUNC_TAG_PAGE_NEW_CONNECTION_IMPL,
|
|
Packit |
fabffb |
GtkWindow *parent,
|
|
Packit |
fabffb |
const char *detail,
|
|
Packit |
fabffb |
gpointer detail_data,
|
|
Packit |
fabffb |
NMConnection *connection,
|
|
Packit |
fabffb |
NMClient *client,
|
|
Packit |
fabffb |
PageNewConnectionResultFunc result_func,
|
|
Packit |
fabffb |
gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
NMSetting *s_ip_tunnel;
|
|
Packit |
fabffb |
gs_unref_object NMConnection *connection_tmp = NULL;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
connection = _ensure_connection_other (connection, &connection_tmp);
|
|
Packit |
fabffb |
ce_page_complete_connection (connection,
|
|
Packit |
fabffb |
_("IP tunnel connection %d"),
|
|
Packit |
fabffb |
NM_SETTING_IP_TUNNEL_SETTING_NAME,
|
|
Packit |
fabffb |
FALSE,
|
|
Packit |
fabffb |
client);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
s_ip_tunnel = nm_setting_ip_tunnel_new ();
|
|
Packit |
fabffb |
g_object_set (s_ip_tunnel, NM_SETTING_IP_TUNNEL_MODE, NM_IP_TUNNEL_MODE_IPIP, NULL);
|
|
Packit |
fabffb |
nm_connection_add_setting (connection, s_ip_tunnel);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
(*result_func) (FUNC_TAG_PAGE_NEW_CONNECTION_RESULT_CALL, connection, FALSE, NULL, user_data);
|
|
Packit |
fabffb |
}
|