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

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