Blame src/connection-editor/page-ppp.c

Packit Service 639700
// SPDX-License-Identifier: GPL-2.0+
Packit fabffb
/* NetworkManager Connection editor -- Connection editor for NetworkManager
Packit fabffb
 *
Packit fabffb
 * Dan Williams <dcbw@redhat.com>
Packit fabffb
 *
Packit fabffb
 * Copyright 2008 - 2014 Red Hat, Inc.
Packit fabffb
 */
Packit fabffb
Packit fabffb
#include "nm-default.h"
Packit fabffb
Packit fabffb
#include <string.h>
Packit fabffb
Packit fabffb
#include "page-ppp.h"
Packit fabffb
#include "ppp-auth-methods-dialog.h"
Packit fabffb
#include "nm-connection-editor.h"
Packit fabffb
Packit fabffb
G_DEFINE_TYPE (CEPagePpp, ce_page_ppp, CE_TYPE_PAGE)
Packit fabffb
Packit fabffb
#define CE_PAGE_PPP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CE_TYPE_PAGE_PPP, CEPagePppPrivate))
Packit fabffb
Packit fabffb
#define COL_NAME  0
Packit fabffb
#define COL_VALUE 1
Packit fabffb
#define COL_TAG 2
Packit fabffb
Packit fabffb
#define TAG_EAP 0
Packit fabffb
#define TAG_PAP 1
Packit fabffb
#define TAG_CHAP 2
Packit fabffb
#define TAG_MSCHAP 3
Packit fabffb
#define TAG_MSCHAPV2 4
Packit fabffb
Packit fabffb
typedef struct {
Packit fabffb
	NMSettingPpp *setting;
Packit fabffb
Packit fabffb
	GtkLabel *auth_methods_label;
Packit fabffb
	GtkButton *auth_methods_button;
Packit fabffb
	gboolean refuse_eap;
Packit fabffb
	gboolean refuse_pap;
Packit fabffb
	gboolean refuse_chap;
Packit fabffb
	gboolean refuse_mschap;
Packit fabffb
	gboolean refuse_mschapv2;
Packit fabffb
Packit fabffb
	guint orig_lcp_echo_failure;
Packit fabffb
	guint orig_lcp_echo_interval;
Packit fabffb
Packit fabffb
	GtkToggleButton *use_mppe;
Packit fabffb
	GtkToggleButton *mppe_require_128;
Packit fabffb
	GtkToggleButton *use_mppe_stateful;
Packit fabffb
Packit fabffb
	GtkToggleButton *allow_bsdcomp;
Packit fabffb
	GtkToggleButton *allow_deflate;
Packit fabffb
	GtkToggleButton *use_vj_comp;
Packit fabffb
Packit fabffb
	GtkToggleButton *send_ppp_echo;
Packit fabffb
Packit fabffb
	GtkWindowGroup *window_group;
Packit fabffb
	gboolean window_added;
Packit fabffb
	char *connection_id;
Packit fabffb
} CEPagePppPrivate;
Packit fabffb
Packit fabffb
static void
Packit fabffb
ppp_private_init (CEPagePpp *self)
Packit fabffb
{
Packit fabffb
	CEPagePppPrivate *priv = CE_PAGE_PPP_GET_PRIVATE (self);
Packit fabffb
	GtkBuilder *builder;
Packit fabffb
Packit fabffb
	builder = CE_PAGE (self)->builder;
Packit fabffb
Packit fabffb
	priv->auth_methods_label = GTK_LABEL (gtk_builder_get_object (builder, "auth_methods_label"));
Packit fabffb
	priv->auth_methods_button = GTK_BUTTON (gtk_builder_get_object (builder, "auth_methods_button"));
Packit fabffb
Packit fabffb
	priv->use_mppe = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "ppp_use_mppe"));
Packit fabffb
	priv->mppe_require_128 = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "ppp_require_mppe_128"));
Packit fabffb
	priv->use_mppe_stateful = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "ppp_use_stateful_mppe"));
Packit fabffb
	priv->allow_bsdcomp = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "ppp_allow_bsdcomp"));
Packit fabffb
	priv->allow_deflate = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "ppp_allow_deflate"));
Packit fabffb
	priv->use_vj_comp = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "ppp_usevj"));
Packit fabffb
	priv->send_ppp_echo = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "ppp_send_echo_packets"));
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
use_mppe_toggled_cb (GtkToggleButton *widget, CEPagePpp *self)
Packit fabffb
{
Packit fabffb
	CEPagePppPrivate *priv = CE_PAGE_PPP_GET_PRIVATE (self);
Packit fabffb
Packit fabffb
	if (gtk_toggle_button_get_active (widget)) {
Packit fabffb
		gtk_widget_set_sensitive (GTK_WIDGET (priv->mppe_require_128), TRUE);
Packit fabffb
		gtk_widget_set_sensitive (GTK_WIDGET (priv->use_mppe_stateful), TRUE);
Packit fabffb
	} else {
Packit fabffb
		gtk_widget_set_sensitive (GTK_WIDGET (priv->mppe_require_128), FALSE);
Packit fabffb
		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->mppe_require_128), FALSE);
Packit fabffb
		gtk_widget_set_sensitive (GTK_WIDGET (priv->use_mppe_stateful), FALSE);
Packit fabffb
		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->use_mppe_stateful), FALSE);
Packit fabffb
	}
Packit fabffb
Packit fabffb
	ce_page_changed (CE_PAGE (self));
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
add_one_auth_method (GString *string, const char *name, gboolean allowed)
Packit fabffb
{
Packit fabffb
	if (allowed) {
Packit fabffb
		if (string->len)
Packit fabffb
			g_string_append (string, ", ");
Packit fabffb
		g_string_append (string, name);
Packit fabffb
	}
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
update_auth_methods_list (CEPagePpp *self)
Packit fabffb
{
Packit fabffb
	CEPagePppPrivate *priv = CE_PAGE_PPP_GET_PRIVATE (self);
Packit fabffb
	GString *list;
Packit fabffb
Packit fabffb
	list = g_string_new ("");
Packit fabffb
	add_one_auth_method (list, _("EAP"), !priv->refuse_eap);
Packit fabffb
	add_one_auth_method (list, _("PAP"), !priv->refuse_pap);
Packit fabffb
	add_one_auth_method (list, _("CHAP"), !priv->refuse_chap);
Packit fabffb
	add_one_auth_method (list, _("MSCHAPv2"), !priv->refuse_mschapv2);
Packit fabffb
	add_one_auth_method (list, _("MSCHAP"), !priv->refuse_mschap);
Packit fabffb
Packit fabffb
	/* Translators: "none" refers to authentication methods */
Packit fabffb
	gtk_label_set_text (priv->auth_methods_label, list->len ? list->str : _("none"));
Packit fabffb
	g_string_free (list, TRUE);
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
auth_methods_dialog_close_cb (GtkWidget *dialog, gpointer user_data)
Packit fabffb
{
Packit fabffb
	gtk_widget_hide (dialog);
Packit fabffb
	/* gtk_widget_destroy() will remove the window from the window group */
Packit fabffb
	gtk_widget_destroy (dialog);
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
auth_methods_dialog_response_cb (GtkWidget *dialog, gint response, gpointer user_data)
Packit fabffb
{
Packit fabffb
	CEPagePpp *self = CE_PAGE_PPP (user_data);
Packit fabffb
	CEPagePppPrivate *priv = CE_PAGE_PPP_GET_PRIVATE (self);
Packit fabffb
Packit fabffb
	if (response == GTK_RESPONSE_OK) {
Packit fabffb
		ppp_auth_methods_dialog_get_methods (dialog,
Packit fabffb
		                                     &priv->refuse_eap,
Packit fabffb
		                                     &priv->refuse_pap,
Packit fabffb
		                                     &priv->refuse_chap,
Packit fabffb
		                                     &priv->refuse_mschap,
Packit fabffb
		                                     &priv->refuse_mschapv2);
Packit fabffb
		ce_page_changed (CE_PAGE (self));
Packit fabffb
		update_auth_methods_list (self);
Packit fabffb
	}
Packit fabffb
Packit fabffb
	auth_methods_dialog_close_cb (dialog, NULL);
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
auth_methods_button_clicked_cb (GtkWidget *button, gpointer user_data)
Packit fabffb
{
Packit fabffb
	CEPagePpp *self = CE_PAGE_PPP (user_data);
Packit fabffb
	CEPagePppPrivate *priv = CE_PAGE_PPP_GET_PRIVATE (self);
Packit fabffb
	GtkWidget *dialog, *toplevel;
Packit fabffb
	char *tmp;
Packit fabffb
Packit fabffb
	toplevel = gtk_widget_get_toplevel (CE_PAGE (self)->page);
Packit fabffb
	g_return_if_fail (gtk_widget_is_toplevel (toplevel));
Packit fabffb
Packit fabffb
	dialog = ppp_auth_methods_dialog_new (priv->refuse_eap,
Packit fabffb
	                                      priv->refuse_pap,
Packit fabffb
	                                      priv->refuse_chap,
Packit fabffb
	                                      priv->refuse_mschap,
Packit fabffb
	                                      priv->refuse_mschapv2);
Packit fabffb
	if (!dialog) {
Packit fabffb
		g_warning ("%s: failed to create the PPP authentication methods dialog!", __func__);
Packit fabffb
		return;
Packit fabffb
	}
Packit fabffb
Packit fabffb
	gtk_window_group_add_window (priv->window_group, GTK_WINDOW (dialog));
Packit fabffb
	if (!priv->window_added) {
Packit fabffb
		gtk_window_group_add_window (priv->window_group, GTK_WINDOW (toplevel));
Packit fabffb
		priv->window_added = TRUE;
Packit fabffb
	}
Packit fabffb
Packit fabffb
	gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (toplevel));
Packit fabffb
	tmp = g_strdup_printf (_("Editing PPP authentication methods for %s"), priv->connection_id);
Packit fabffb
	gtk_window_set_title (GTK_WINDOW (dialog), tmp);
Packit fabffb
	g_free (tmp);
Packit fabffb
Packit fabffb
	g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (auth_methods_dialog_response_cb), self);
Packit fabffb
Packit fabffb
	gtk_widget_show_all (dialog);
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
populate_ui (CEPagePpp *self, NMConnection *connection)
Packit fabffb
{
Packit fabffb
	CEPagePppPrivate *priv = CE_PAGE_PPP_GET_PRIVATE (self);
Packit fabffb
	NMSettingPpp *setting = priv->setting;
Packit fabffb
	gboolean require_mppe, require_mppe_128, mppe_stateful, nobsdcomp, nodeflate, no_vj_comp;
Packit fabffb
Packit fabffb
	g_object_get (setting,
Packit fabffb
	              NM_SETTING_PPP_REFUSE_PAP, &priv->refuse_pap,
Packit fabffb
	              NM_SETTING_PPP_REFUSE_CHAP, &priv->refuse_chap,
Packit fabffb
	              NM_SETTING_PPP_REFUSE_MSCHAPV2, &priv->refuse_mschapv2,
Packit fabffb
	              NM_SETTING_PPP_REFUSE_MSCHAP, &priv->refuse_mschap,
Packit fabffb
	              NM_SETTING_PPP_REFUSE_EAP, &priv->refuse_eap,
Packit fabffb
	              NM_SETTING_PPP_REQUIRE_MPPE, &require_mppe,
Packit fabffb
	              NM_SETTING_PPP_REQUIRE_MPPE_128, &require_mppe_128,
Packit fabffb
	              NM_SETTING_PPP_MPPE_STATEFUL, &mppe_stateful,
Packit fabffb
	              NM_SETTING_PPP_NOBSDCOMP, &nobsdcomp,
Packit fabffb
	              NM_SETTING_PPP_NODEFLATE, &nodeflate,
Packit fabffb
	              NM_SETTING_PPP_NO_VJ_COMP, &no_vj_comp,
Packit fabffb
	              NM_SETTING_PPP_LCP_ECHO_INTERVAL, &priv->orig_lcp_echo_interval,
Packit fabffb
	              NM_SETTING_PPP_LCP_ECHO_FAILURE, &priv->orig_lcp_echo_failure,
Packit fabffb
	              NULL);
Packit fabffb
Packit fabffb
	update_auth_methods_list (self);
Packit fabffb
Packit fabffb
	g_signal_connect (priv->auth_methods_button, "clicked", G_CALLBACK (auth_methods_button_clicked_cb), self);
Packit fabffb
Packit fabffb
	gtk_toggle_button_set_active (priv->use_mppe, require_mppe);
Packit fabffb
	g_signal_connect (priv->use_mppe, "toggled", G_CALLBACK (use_mppe_toggled_cb), self);
Packit fabffb
	use_mppe_toggled_cb (priv->use_mppe, self);
Packit fabffb
Packit fabffb
	gtk_toggle_button_set_active (priv->mppe_require_128, require_mppe_128);
Packit fabffb
	g_signal_connect_swapped (priv->mppe_require_128, "toggled", G_CALLBACK (ce_page_changed), self);
Packit fabffb
Packit fabffb
	gtk_toggle_button_set_active (priv->use_mppe_stateful, mppe_stateful);
Packit fabffb
	g_signal_connect_swapped (priv->use_mppe_stateful, "toggled", G_CALLBACK (ce_page_changed), self);
Packit fabffb
Packit fabffb
	gtk_toggle_button_set_active (priv->allow_bsdcomp, !nobsdcomp);
Packit fabffb
	g_signal_connect_swapped (priv->allow_bsdcomp, "toggled", G_CALLBACK (ce_page_changed), self);
Packit fabffb
	gtk_toggle_button_set_active (priv->allow_deflate, !nodeflate);
Packit fabffb
	g_signal_connect_swapped (priv->allow_deflate, "toggled", G_CALLBACK (ce_page_changed), self);
Packit fabffb
	gtk_toggle_button_set_active (priv->use_vj_comp, !no_vj_comp);
Packit fabffb
	g_signal_connect_swapped (priv->use_vj_comp, "toggled", G_CALLBACK (ce_page_changed), self);
Packit fabffb
Packit fabffb
	gtk_toggle_button_set_active (priv->send_ppp_echo, (priv->orig_lcp_echo_interval > 0) ? TRUE : FALSE);
Packit fabffb
	g_signal_connect_swapped (priv->send_ppp_echo, "toggled", G_CALLBACK (ce_page_changed), self);
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
finish_setup (CEPagePpp *self, gpointer user_data)
Packit fabffb
{
Packit fabffb
	populate_ui (self, CE_PAGE (self)->connection);
Packit fabffb
}
Packit fabffb
Packit fabffb
CEPage *
Packit fabffb
ce_page_ppp_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
	CEPagePpp *self;
Packit fabffb
	CEPagePppPrivate *priv;
Packit fabffb
	NMSettingConnection *s_con;
Packit fabffb
Packit fabffb
	self = CE_PAGE_PPP (ce_page_new (CE_TYPE_PAGE_PPP,
Packit fabffb
	                                 editor,
Packit fabffb
	                                 connection,
Packit fabffb
	                                 parent_window,
Packit fabffb
	                                 client,
Packit fabffb
	                                 "/org/gnome/nm_connection_editor/ce-page-ppp.ui",
Packit fabffb
	                                 "PppPage",
Packit fabffb
	                                 _("PPP Settings")));
Packit fabffb
	if (!self) {
Packit fabffb
		g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("Could not load PPP user interface."));
Packit fabffb
		return NULL;
Packit fabffb
	}
Packit fabffb
Packit fabffb
	ppp_private_init (self);
Packit fabffb
	priv = CE_PAGE_PPP_GET_PRIVATE (self);
Packit fabffb
Packit fabffb
	priv->setting = nm_connection_get_setting_ppp (connection);
Packit fabffb
	if (!priv->setting) {
Packit fabffb
		priv->setting = NM_SETTING_PPP (nm_setting_ppp_new ());
Packit fabffb
		nm_connection_add_setting (connection, NM_SETTING (priv->setting));
Packit fabffb
	}
Packit fabffb
Packit fabffb
	priv->window_group = gtk_window_group_new ();
Packit fabffb
Packit fabffb
	s_con = nm_connection_get_setting_connection (connection);
Packit fabffb
	g_assert (s_con);
Packit fabffb
	priv->connection_id = g_strdup (nm_setting_connection_get_id (s_con));
Packit fabffb
Packit fabffb
	g_signal_connect (self, CE_PAGE_INITIALIZED, G_CALLBACK (finish_setup), NULL);
Packit fabffb
Packit fabffb
	*out_secrets_setting_name = NM_SETTING_PPP_SETTING_NAME;
Packit fabffb
Packit fabffb
	return CE_PAGE (self);
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
ui_to_setting (CEPagePpp *self)
Packit fabffb
{
Packit fabffb
	CEPagePppPrivate *priv = CE_PAGE_PPP_GET_PRIVATE (self);
Packit fabffb
	gboolean require_mppe;
Packit fabffb
	gboolean require_mppe_128;
Packit fabffb
	gboolean mppe_stateful;
Packit fabffb
	gboolean nobsdcomp;
Packit fabffb
	gboolean nodeflate;
Packit fabffb
	gboolean no_vj_comp;
Packit fabffb
	guint lcp_echo_failure = 0, lcp_echo_interval = 0;
Packit fabffb
Packit fabffb
	require_mppe = gtk_toggle_button_get_active (priv->use_mppe);
Packit fabffb
	require_mppe_128 = gtk_toggle_button_get_active (priv->mppe_require_128);
Packit fabffb
	mppe_stateful = gtk_toggle_button_get_active (priv->use_mppe_stateful);
Packit fabffb
Packit fabffb
	nobsdcomp = !gtk_toggle_button_get_active (priv->allow_bsdcomp);
Packit fabffb
	nodeflate = !gtk_toggle_button_get_active (priv->allow_deflate);
Packit fabffb
	no_vj_comp = !gtk_toggle_button_get_active (priv->use_vj_comp);
Packit fabffb
Packit fabffb
	if (gtk_toggle_button_get_active (priv->send_ppp_echo)) {
Packit fabffb
		if (priv->orig_lcp_echo_failure && priv->orig_lcp_echo_interval) {
Packit fabffb
			lcp_echo_failure = priv->orig_lcp_echo_failure;
Packit fabffb
			lcp_echo_interval = priv->orig_lcp_echo_interval;
Packit fabffb
		} else {
Packit fabffb
			/* Set defaults */
Packit fabffb
			lcp_echo_failure = 5;
Packit fabffb
			lcp_echo_interval = 30;
Packit fabffb
		}
Packit fabffb
	}
Packit fabffb
Packit fabffb
	g_object_set (priv->setting,
Packit fabffb
	              NM_SETTING_PPP_REFUSE_EAP, priv->refuse_eap,
Packit fabffb
	              NM_SETTING_PPP_REFUSE_PAP, priv->refuse_pap,
Packit fabffb
	              NM_SETTING_PPP_REFUSE_CHAP, priv->refuse_chap,
Packit fabffb
	              NM_SETTING_PPP_REFUSE_MSCHAP, priv->refuse_mschap,
Packit fabffb
	              NM_SETTING_PPP_REFUSE_MSCHAPV2, priv->refuse_mschapv2,
Packit fabffb
	              NM_SETTING_PPP_NOBSDCOMP, nobsdcomp,
Packit fabffb
	              NM_SETTING_PPP_NODEFLATE, nodeflate,
Packit fabffb
	              NM_SETTING_PPP_NO_VJ_COMP, no_vj_comp,
Packit fabffb
	              NM_SETTING_PPP_REQUIRE_MPPE, require_mppe,
Packit fabffb
	              NM_SETTING_PPP_REQUIRE_MPPE_128, require_mppe_128,
Packit fabffb
	              NM_SETTING_PPP_MPPE_STATEFUL, mppe_stateful,
Packit fabffb
	              NM_SETTING_PPP_LCP_ECHO_FAILURE, lcp_echo_failure,
Packit fabffb
	              NM_SETTING_PPP_LCP_ECHO_INTERVAL, lcp_echo_interval,
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
	CEPagePpp *self = CE_PAGE_PPP (page);
Packit fabffb
	CEPagePppPrivate *priv = CE_PAGE_PPP_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_ppp_init (CEPagePpp *self)
Packit fabffb
{
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
dispose (GObject *object)
Packit fabffb
{
Packit fabffb
	CEPagePppPrivate *priv = CE_PAGE_PPP_GET_PRIVATE (object);
Packit fabffb
Packit fabffb
	g_clear_object (&priv->window_group);
Packit fabffb
	g_clear_pointer (&priv->connection_id, g_free);
Packit fabffb
Packit fabffb
	G_OBJECT_CLASS (ce_page_ppp_parent_class)->dispose (object);
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
ce_page_ppp_class_init (CEPagePppClass *ppp_class)
Packit fabffb
{
Packit fabffb
	GObjectClass *object_class = G_OBJECT_CLASS (ppp_class);
Packit fabffb
	CEPageClass *parent_class = CE_PAGE_CLASS (ppp_class);
Packit fabffb
Packit fabffb
	g_type_class_add_private (object_class, sizeof (CEPagePppPrivate));
Packit fabffb
Packit fabffb
	/* virtual methods */
Packit fabffb
	parent_class->ce_page_validate_v = ce_page_validate_v;
Packit fabffb
	object_class->dispose = dispose;
Packit fabffb
}