2008-08-11 Dan Williams <dcbw@redhat.com>

Update to match NM svn3924 vpn setting changes; verify options better;
	return more informative errors on VPN launch failures.



git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3927 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
Dan Williams 2008-08-11 17:17:47 +00:00
parent 944e9e5b6d
commit 380929b20d
7 changed files with 239 additions and 327 deletions

View file

@ -1,3 +1,8 @@
2008-08-11 Dan Williams <dcbw@redhat.com>
Update to match NM svn3924 vpn setting changes; verify options better;
return more informative errors on VPN launch failures.
2008-08-07 Dan Williams <dcbw@redhat.com>
* src/nm-pptp-pppd-plugin.c

View file

@ -30,7 +30,6 @@
#include <gnome-keyring.h>
#include <nm-setting-vpn.h>
#include <nm-setting-vpn-properties.h>
#include "../src/nm-pptp-service.h"
#include "gnome-two-password-dialog.h"
@ -58,7 +57,7 @@ find_one_password (const char *vpn_id,
vpn_id,
KEYRING_SN_TAG,
GNOME_KEYRING_ATTRIBUTE_TYPE_STRING,
NM_SETTING_VPN_PROPERTIES_SETTING_NAME,
NM_SETTING_VPN_SETTING_NAME,
KEYRING_SK_TAG,
GNOME_KEYRING_ATTRIBUTE_TYPE_STRING,
secret_name,
@ -105,7 +104,7 @@ save_vpn_password (const char *vpn_id,
GnomeKeyringAttributeList *attrs = NULL;
guint32 id = 0;
display_name = g_strdup_printf ("VPN %s secret for %s/%s/" NM_SETTING_VPN_PROPERTIES_SETTING_NAME,
display_name = g_strdup_printf ("VPN %s secret for %s/%s/" NM_SETTING_VPN_SETTING_NAME,
secret_name,
vpn_name,
vpn_service);
@ -116,7 +115,7 @@ save_vpn_password (const char *vpn_id,
vpn_id);
gnome_keyring_attribute_list_append_string (attrs,
KEYRING_SN_TAG,
NM_SETTING_VPN_PROPERTIES_SETTING_NAME);
NM_SETTING_VPN_SETTING_NAME);
gnome_keyring_attribute_list_append_string (attrs,
KEYRING_SK_TAG,
secret_name);

View file

@ -29,6 +29,7 @@
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <glib.h>
#include <glib/gi18n-lib.h>
@ -36,7 +37,6 @@
#include <nm-connection.h>
#include <nm-setting-vpn.h>
#include <nm-setting-vpn-properties.h>
#include "advanced-dialog.h"
#include "nm-pptp.h"
@ -51,15 +51,6 @@
#define TAG_MSCHAP 2
#define TAG_MSCHAPV2 3
static void
nm_gvalue_destroy (gpointer data)
{
GValue *value = (GValue *) data;
g_value_unset (value);
g_slice_free (GValue, value);
}
static const char *advanced_keys[] = {
NM_PPTP_KEY_REFUSE_EAP,
NM_PPTP_KEY_REFUSE_PAP,
@ -82,30 +73,13 @@ static void
copy_values (gpointer key, gpointer data, gpointer user_data)
{
GHashTable *hash = (GHashTable *) user_data;
GValue *value = (GValue *) data;
const char **i;
for (i = &advanced_keys[0]; *i; i++) {
if (strcmp ((const char *) key, *i))
continue;
if (G_VALUE_HOLDS_STRING (value)) {
g_hash_table_insert (hash,
g_strdup ((const char *) key),
str_to_gvalue (g_value_get_string (value)));
} else if (G_VALUE_HOLDS_INT (value)) {
g_hash_table_insert (hash,
g_strdup ((const char *) key),
int_to_gvalue (g_value_get_int (value)));
} else if (G_VALUE_HOLDS_UINT (value)) {
g_hash_table_insert (hash,
g_strdup ((const char *) key),
uint_to_gvalue (g_value_get_uint (value)));
} else if (G_VALUE_HOLDS_BOOLEAN (value)) {
g_hash_table_insert (hash,
g_strdup ((const char *) key),
bool_to_gvalue (g_value_get_boolean (value)));
}
g_hash_table_insert (hash, g_strdup ((const char *) key), g_strdup ((const char *) data));
}
}
@ -114,13 +88,13 @@ advanced_dialog_new_hash_from_connection (NMConnection *connection,
GError **error)
{
GHashTable *hash;
NMSettingVPNProperties *s_vpn_props;
NMSettingVPN *s_vpn;
hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, nm_gvalue_destroy);
hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
s_vpn_props = (NMSettingVPNProperties *) nm_connection_get_setting (connection, NM_TYPE_SETTING_VPN_PROPERTIES);
if (s_vpn_props && s_vpn_props->data)
g_hash_table_foreach (s_vpn_props->data, copy_values, hash);
s_vpn = (NMSettingVPN *) nm_connection_get_setting (connection, NM_TYPE_SETTING_VPN);
if (s_vpn && s_vpn->data)
g_hash_table_foreach (s_vpn->data, copy_values, hash);
return hash;
}
@ -159,7 +133,7 @@ setup_security_combo (GladeXML *xml, GHashTable *hash)
GtkListStore *store;
GtkTreeIter iter;
int active = -1;
GValue *value;
const char *value;
g_return_if_fail (xml != NULL);
g_return_if_fail (hash != NULL);
@ -177,7 +151,7 @@ setup_security_combo (GladeXML *xml, GHashTable *hash)
gtk_list_store_set (store, &iter, 0, _("128-bit (most secure)"), -1);
if (active < 0) {
value = g_hash_table_lookup (hash, NM_PPTP_KEY_REQUIRE_MPPE_128);
if (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value))
if (value && !strcmp (value, "yes"))
active = SEC_INDEX_MPPE_128;
}
@ -186,7 +160,7 @@ setup_security_combo (GladeXML *xml, GHashTable *hash)
gtk_list_store_set (store, &iter, 0, _("40-bit (less secure)"), -1);
if (active < 0) {
value = g_hash_table_lookup (hash, NM_PPTP_KEY_REQUIRE_MPPE_40);
if (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value))
if (value && !strcmp (value, "yes"))
active = SEC_INDEX_MPPE_40;
}
@ -225,7 +199,7 @@ auth_methods_setup (GladeXML *xml, GHashTable *hash)
GtkWidget *widget;
GtkListStore *store;
GtkTreeIter iter;
GValue *value;
const char *value;
gboolean allowed;
gboolean use_mppe = FALSE;
GtkCellRendererToggle *check_renderer;
@ -237,40 +211,40 @@ auth_methods_setup (GladeXML *xml, GHashTable *hash)
/* Check for MPPE */
value = g_hash_table_lookup (hash, NM_PPTP_KEY_REQUIRE_MPPE);
if (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value))
if (value && !strcmp (value, "yes"))
use_mppe = TRUE;
/* Or MPPE-128 */
value = g_hash_table_lookup (hash, NM_PPTP_KEY_REQUIRE_MPPE_128);
if (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value))
if (value && !strcmp (value, "yes"))
use_mppe = TRUE;
/* Or MPPE-40 */
value = g_hash_table_lookup (hash, NM_PPTP_KEY_REQUIRE_MPPE_40);
if (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value))
if (value && !strcmp (value, "yes"))
use_mppe = TRUE;
/* PAP */
value = g_hash_table_lookup (hash, NM_PPTP_KEY_REFUSE_PAP);
allowed = (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value)) ? FALSE : TRUE;
allowed = (value && !strcmp (value, "yes")) ? FALSE : TRUE;
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter, COL_NAME, _("PAP"), COL_VALUE, allowed, COL_TAG, TAG_PAP, -1);
/* CHAP */
value = g_hash_table_lookup (hash, NM_PPTP_KEY_REFUSE_CHAP);
allowed = (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value)) ? FALSE : TRUE;
allowed = (value && !strcmp (value, "yes")) ? FALSE : TRUE;
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter, COL_NAME, _("CHAP"), COL_VALUE, allowed, COL_TAG, TAG_CHAP, -1);
/* MSCHAP */
value = g_hash_table_lookup (hash, NM_PPTP_KEY_REFUSE_MSCHAP);
allowed = (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value)) ? FALSE : TRUE;
allowed = (value && !strcmp (value, "yes")) ? FALSE : TRUE;
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter, COL_NAME, _("MSCHAP"), COL_VALUE, allowed, COL_TAG, TAG_MSCHAP, -1);
/* PAP */
value = g_hash_table_lookup (hash, NM_PPTP_KEY_REFUSE_MSCHAPV2);
allowed = (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value)) ? FALSE : TRUE;
allowed = (value && !strcmp (value, "yes")) ? FALSE : TRUE;
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter, COL_NAME, _("MSCHAPv2"), COL_VALUE, allowed, COL_TAG, TAG_MSCHAPV2, -1);
@ -306,7 +280,7 @@ advanced_dialog_new (GHashTable *hash)
GtkWidget *dialog = NULL;
char *glade_file = NULL;
GtkWidget *widget;
GValue *value;
const char *value;
g_return_val_if_fail (hash != NULL, NULL);
@ -332,47 +306,41 @@ advanced_dialog_new (GHashTable *hash)
g_signal_connect (G_OBJECT (widget), "toggled", G_CALLBACK (mppe_toggled_cb), xml);
value = g_hash_table_lookup (hash, NM_PPTP_KEY_REQUIRE_MPPE);
if (value && G_VALUE_HOLDS_BOOLEAN (value)) {
if (g_value_get_boolean (value))
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
}
if (value && !strcmp (value, "yes"))
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
mppe_toggled_cb (widget, xml);
widget = glade_xml_get_widget (xml, "ppp_allow_stateful_mppe");
value = g_hash_table_lookup (hash, NM_PPTP_KEY_MPPE_STATEFUL);
if (value && G_VALUE_HOLDS_BOOLEAN (value)) {
widget = glade_xml_get_widget (xml, "ppp_allow_stateful_mppe");
if (g_value_get_boolean (value))
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
}
if (value && !strcmp (value, "yes"))
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
widget = glade_xml_get_widget (xml, "ppp_allow_bsdcomp");
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
value = g_hash_table_lookup (hash, NM_PPTP_KEY_NOBSDCOMP);
if (value && G_VALUE_HOLDS_BOOLEAN (value)) {
if (g_value_get_boolean (value))
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
}
if (value && !strcmp (value, "yes"))
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
widget = glade_xml_get_widget (xml, "ppp_allow_deflate");
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
value = g_hash_table_lookup (hash, NM_PPTP_KEY_NODEFLATE);
if (value && G_VALUE_HOLDS_BOOLEAN (value)) {
if (g_value_get_boolean (value))
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
}
if (value && !strcmp (value, "yes"))
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
widget = glade_xml_get_widget (xml, "ppp_usevj");
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
value = g_hash_table_lookup (hash, NM_PPTP_KEY_NO_VJ_COMP);
if (value && G_VALUE_HOLDS_BOOLEAN (value)) {
if (g_value_get_boolean (value))
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
}
if (value && !strcmp (value, "yes"))
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
widget = glade_xml_get_widget (xml, "ppp_send_echo_packets");
value = g_hash_table_lookup (hash, NM_PPTP_KEY_LCP_ECHO_INTERVAL);
if (value && G_VALUE_HOLDS_UINT (value)) {
widget = glade_xml_get_widget (xml, "ppp_send_echo_packets");
if (g_value_get_uint (value))
if (value && strlen (value)) {
long int tmp_int;
errno = 0;
tmp_int = strtol (value, NULL, 10);
if (errno == 0 && tmp_int > 0)
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
}
@ -400,7 +368,7 @@ advanced_dialog_new_hash_from_dialog (GtkWidget *dialog, GError **error)
xml = g_object_get_data (G_OBJECT (dialog), "glade-xml");
g_return_val_if_fail (xml != NULL, NULL);
hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, nm_gvalue_destroy);
hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
widget = glade_xml_get_widget (xml, "ppp_use_mppe");
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) {
@ -408,37 +376,37 @@ advanced_dialog_new_hash_from_dialog (GtkWidget *dialog, GError **error)
widget = glade_xml_get_widget (xml, "ppp_mppe_security_combo");
switch (gtk_combo_box_get_active (GTK_COMBO_BOX (widget))) {
case SEC_INDEX_MPPE_128:
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_REQUIRE_MPPE_128), bool_to_gvalue (TRUE));
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_REQUIRE_MPPE_128), g_strdup ("yes"));
break;
case SEC_INDEX_MPPE_40:
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_REQUIRE_MPPE_40), bool_to_gvalue (TRUE));
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_REQUIRE_MPPE_40), g_strdup ("yes"));
break;
default:
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_REQUIRE_MPPE), bool_to_gvalue (TRUE));
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_REQUIRE_MPPE), g_strdup ("yes"));
break;
}
widget = glade_xml_get_widget (xml, "ppp_allow_stateful_mppe");
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_MPPE_STATEFUL), bool_to_gvalue (TRUE));
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_MPPE_STATEFUL), g_strdup ("yes"));
}
widget = glade_xml_get_widget (xml, "ppp_allow_bsdcomp");
if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_NOBSDCOMP), bool_to_gvalue (TRUE));
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_NOBSDCOMP), g_strdup ("yes"));
widget = glade_xml_get_widget (xml, "ppp_allow_deflate");
if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_NODEFLATE), bool_to_gvalue (TRUE));
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_NODEFLATE), g_strdup ("yes"));
widget = glade_xml_get_widget (xml, "ppp_usevj");
if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_NO_VJ_COMP), bool_to_gvalue (TRUE));
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_NO_VJ_COMP), g_strdup ("yes"));
widget = glade_xml_get_widget (xml, "ppp_send_echo_packets");
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) {
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_LCP_ECHO_FAILURE), uint_to_gvalue (5));
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_LCP_ECHO_INTERVAL), uint_to_gvalue (30));
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_LCP_ECHO_FAILURE), g_strdup_printf ("%d", 5));
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_LCP_ECHO_INTERVAL), g_strdup_printf ("%d", 30));
}
widget = glade_xml_get_widget (xml, "ppp_auth_methods");
@ -452,19 +420,19 @@ advanced_dialog_new_hash_from_dialog (GtkWidget *dialog, GError **error)
switch (tag) {
case TAG_PAP:
if (!allowed)
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_REFUSE_PAP), bool_to_gvalue (TRUE));
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_REFUSE_PAP), g_strdup ("yes"));
break;
case TAG_CHAP:
if (!allowed)
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_REFUSE_CHAP), bool_to_gvalue (TRUE));
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_REFUSE_CHAP), g_strdup ("yes"));
break;
case TAG_MSCHAP:
if (!allowed)
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_REFUSE_MSCHAP), bool_to_gvalue (TRUE));
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_REFUSE_MSCHAP), g_strdup ("yes"));
break;
case TAG_MSCHAPV2:
if (!allowed)
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_REFUSE_MSCHAPV2), bool_to_gvalue (TRUE));
g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_REFUSE_MSCHAPV2), g_strdup ("yes"));
break;
default:
break;

View file

@ -35,7 +35,6 @@
#include <glib/gi18n-lib.h>
#include <nm-setting-vpn.h>
#include <nm-setting-vpn-properties.h>
#include <nm-setting-connection.h>
#include <nm-setting-ip4-config.h>

View file

@ -38,7 +38,6 @@
#include <nm-vpn-plugin-ui-interface.h>
#include <nm-setting-vpn.h>
#include <nm-setting-vpn-properties.h>
#include <nm-setting-connection.h>
#include <nm-setting-ip4-config.h>
@ -213,14 +212,14 @@ static gboolean
init_plugin_ui (PptpPluginUiWidget *self, NMConnection *connection, GError **error)
{
PptpPluginUiWidgetPrivate *priv = PPTP_PLUGIN_UI_WIDGET_GET_PRIVATE (self);
NMSettingVPNProperties *s_vpn_props;
NMSettingVPN *s_vpn;
GtkWidget *widget;
GtkListStore *store;
GtkTreeIter iter;
int active = -1;
GValue *value;
const char *value;
s_vpn_props = (NMSettingVPNProperties *) nm_connection_get_setting (connection, NM_TYPE_SETTING_VPN_PROPERTIES);
s_vpn = (NMSettingVPN *) nm_connection_get_setting (connection, NM_TYPE_SETTING_VPN);
priv->group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
@ -228,10 +227,10 @@ init_plugin_ui (PptpPluginUiWidget *self, NMConnection *connection, GError **err
if (!widget)
return FALSE;
gtk_size_group_add_widget (priv->group, widget);
if (s_vpn_props) {
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_GATEWAY);
if (value && G_VALUE_HOLDS_STRING (value))
gtk_entry_set_text (GTK_ENTRY (widget), g_value_get_string (value));
if (s_vpn) {
value = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_GATEWAY);
if (value && strlen (value))
gtk_entry_set_text (GTK_ENTRY (widget), value);
}
g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (stuff_changed_cb), self);
@ -239,10 +238,10 @@ init_plugin_ui (PptpPluginUiWidget *self, NMConnection *connection, GError **err
if (!widget)
return FALSE;
gtk_size_group_add_widget (priv->group, widget);
if (s_vpn_props) {
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_USER);
if (value && G_VALUE_HOLDS_STRING (value))
gtk_entry_set_text (GTK_ENTRY (widget), g_value_get_string (value));
if (s_vpn) {
value = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_USER);
if (value && strlen (value))
gtk_entry_set_text (GTK_ENTRY (widget), value);
}
g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (stuff_changed_cb), self);
@ -250,10 +249,10 @@ init_plugin_ui (PptpPluginUiWidget *self, NMConnection *connection, GError **err
if (!widget)
return FALSE;
gtk_size_group_add_widget (priv->group, widget);
if (s_vpn_props) {
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_DOMAIN);
if (value && G_VALUE_HOLDS_STRING (value))
gtk_entry_set_text (GTK_ENTRY (widget), g_value_get_string (value));
if (s_vpn) {
value = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_DOMAIN);
if (value && strlen (value))
gtk_entry_set_text (GTK_ENTRY (widget), value);
}
g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (stuff_changed_cb), self);
@ -272,76 +271,12 @@ get_widget (NMVpnPluginUiWidgetInterface *iface)
return G_OBJECT (priv->widget);
}
GValue *
str_to_gvalue (const char *str)
{
GValue *value;
value = g_slice_new0 (GValue);
g_value_init (value, G_TYPE_STRING);
g_value_set_string (value, str);
return value;
}
GValue *
bool_to_gvalue (gboolean b)
{
GValue *value;
value = g_slice_new0 (GValue);
g_value_init (value, G_TYPE_BOOLEAN);
g_value_set_boolean (value, b);
return value;
}
GValue *
int_to_gvalue (gint i)
{
GValue *value;
value = g_slice_new0 (GValue);
g_value_init (value, G_TYPE_INT);
g_value_set_int (value, i);
return value;
}
GValue *
uint_to_gvalue (guint32 u)
{
GValue *value;
value = g_slice_new0 (GValue);
g_value_init (value, G_TYPE_UINT);
g_value_set_uint (value, u);
return value;
}
static void
hash_copy_advanced (gpointer key, gpointer data, gpointer user_data)
{
GHashTable *hash = (GHashTable *) user_data;
GValue *value = (GValue *) data;
if (G_VALUE_HOLDS_STRING (value)) {
g_hash_table_insert (hash,
g_strdup ((const char *) key),
str_to_gvalue (g_value_get_string (value)));
} else if (G_VALUE_HOLDS_INT (value)) {
g_hash_table_insert (hash,
g_strdup ((const char *) key),
int_to_gvalue (g_value_get_int (value)));
} else if (G_VALUE_HOLDS_BOOLEAN (value)) {
g_hash_table_insert (hash,
g_strdup ((const char *) key),
bool_to_gvalue (g_value_get_boolean (value)));
} else {
g_warning ("%s: unhandled key '%s' of type '%s'",
__func__, (const char *) key, G_VALUE_TYPE_NAME (value));
}
g_hash_table_insert (hash, g_strdup ((const char *) key), g_strdup ((const char *) data));
}
static gboolean
@ -352,9 +287,8 @@ update_connection (NMVpnPluginUiWidgetInterface *iface,
PptpPluginUiWidget *self = PPTP_PLUGIN_UI_WIDGET (iface);
PptpPluginUiWidgetPrivate *priv = PPTP_PLUGIN_UI_WIDGET_GET_PRIVATE (self);
NMSettingVPN *s_vpn;
NMSettingVPNProperties *s_vpn_props;
GtkWidget *widget;
char *str;
const char *str;
GtkTreeModel *model;
GtkTreeIter iter;
gboolean valid = FALSE;
@ -364,41 +298,29 @@ update_connection (NMVpnPluginUiWidgetInterface *iface,
s_vpn = NM_SETTING_VPN (nm_setting_vpn_new ());
s_vpn->service_type = g_strdup (NM_DBUS_SERVICE_PPTP);
nm_connection_add_setting (connection, NM_SETTING (s_vpn));
s_vpn_props = NM_SETTING_VPN_PROPERTIES (nm_setting_vpn_properties_new ());
/* Gateway */
widget = glade_xml_get_widget (priv->xml, "gateway_entry");
str = (char *) gtk_entry_get_text (GTK_ENTRY (widget));
if (str && strlen (str)) {
g_hash_table_insert (s_vpn_props->data,
g_strdup (NM_PPTP_KEY_GATEWAY),
str_to_gvalue (str));
}
str = gtk_entry_get_text (GTK_ENTRY (widget));
if (str && strlen (str))
g_hash_table_insert (s_vpn->data, g_strdup (NM_PPTP_KEY_GATEWAY), g_strdup (str));
/* Username */
widget = glade_xml_get_widget (priv->xml, "user_entry");
str = (char *) gtk_entry_get_text (GTK_ENTRY (widget));
if (str && strlen (str)) {
g_hash_table_insert (s_vpn_props->data,
g_strdup (NM_PPTP_KEY_USER),
str_to_gvalue (str));
}
str = gtk_entry_get_text (GTK_ENTRY (widget));
if (str && strlen (str))
g_hash_table_insert (s_vpn->data, g_strdup (NM_PPTP_KEY_USER), g_strdup (str));
/* Domain */
widget = glade_xml_get_widget (priv->xml, "domain_entry");
str = (char *) gtk_entry_get_text (GTK_ENTRY (widget));
if (str && strlen (str)) {
g_hash_table_insert (s_vpn_props->data,
g_strdup (NM_PPTP_KEY_DOMAIN),
str_to_gvalue (str));
}
str = gtk_entry_get_text (GTK_ENTRY (widget));
if (str && strlen (str))
g_hash_table_insert (s_vpn->data, g_strdup (NM_PPTP_KEY_DOMAIN), g_strdup (str));
if (priv->advanced)
g_hash_table_foreach (priv->advanced, hash_copy_advanced, s_vpn_props->data);
g_hash_table_foreach (priv->advanced, hash_copy_advanced, s_vpn->data);
nm_connection_add_setting (connection, NM_SETTING (s_vpn_props));
nm_connection_add_setting (connection, NM_SETTING (s_vpn));
valid = TRUE;
done:

View file

@ -82,13 +82,5 @@ struct _PptpPluginUiWidgetClass {
GType pptp_plugin_ui_widget_get_type (void);
GValue *int_to_gvalue (gint i);
GValue *uint_to_gvalue (guint32 u);
GValue *bool_to_gvalue (gboolean b);
GValue *str_to_gvalue (const char *str);
#endif /* _NM_PPTP_H_ */

View file

@ -46,7 +46,6 @@
#include <linux/if_ppp.h>
#include <nm-setting-vpn.h>
#include <nm-setting-vpn-properties.h>
#include <nm-utils.h>
#include "nm-pptp-service.h"
@ -228,8 +227,6 @@ nm_pptp_ppp_service_cache_credentials (NMPptpPppService *self,
{
NMPptpPppServicePrivate *priv = NM_PPTP_PPP_SERVICE_GET_PRIVATE (self);
NMSettingVPN *s_vpn;
NMSettingVPNProperties *s_vpn_props;
GValue *value;
const char *username, *password;
g_return_val_if_fail (self != NULL, FALSE);
@ -239,7 +236,7 @@ nm_pptp_ppp_service_cache_credentials (NMPptpPppService *self,
memset (priv->password, 0, sizeof (priv->password));
s_vpn = (NMSettingVPN *) nm_connection_get_setting (connection, NM_TYPE_SETTING_VPN);
if (!s_vpn) {
if (!s_vpn || !s_vpn->data) {
g_set_error (error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_CONNECTION_INVALID,
@ -248,20 +245,9 @@ nm_pptp_ppp_service_cache_credentials (NMPptpPppService *self,
return FALSE;
}
s_vpn_props = (NMSettingVPNProperties *) nm_connection_get_setting (connection, NM_TYPE_SETTING_VPN_PROPERTIES);
if (!s_vpn_props || !s_vpn_props->data) {
g_set_error (error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_CONNECTION_INVALID,
"%s",
"Could not find secrets (connection invalid, no vpn-properties setting).");
return FALSE;
}
/* Username; try PPTP specific username first, then generic username */
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_USER);
if (value && G_VALUE_HOLDS_STRING (value)) {
username = g_value_get_string (value);
username = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_USER);
if (username && strlen (username)) {
if (!username || !strlen (username)) {
g_set_error (error,
NM_VPN_PLUGIN_ERROR,
@ -282,23 +268,13 @@ nm_pptp_ppp_service_cache_credentials (NMPptpPppService *self,
}
}
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_PASSWORD);
if (!value || !G_VALUE_HOLDS_STRING (value)) {
g_set_error (error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_CONNECTION_INVALID,
"%s",
"Missing VPN password.");
return FALSE;
}
password = g_value_get_string (value);
password = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_PASSWORD);
if (!password || !strlen (password)) {
g_set_error (error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_CONNECTION_INVALID,
"%s",
"Invalid VPN password.");
"Missing or invalid VPN password.");
return FALSE;
}
@ -407,9 +383,8 @@ static ValidProperty valid_properties[] = {
};
static gboolean
validate_gateway (GValue *value)
validate_gateway (const char *gateway)
{
const char *gateway = g_value_get_string (value);
const char *p = gateway;
if (!gateway || !strlen (gateway))
@ -426,12 +401,12 @@ validate_gateway (GValue *value)
}
static void
validate_one_property (gpointer key, gpointer val, gpointer user_data)
validate_one_property (gpointer key, gpointer value, gpointer user_data)
{
gboolean *failed = (gboolean *) user_data;
GError **error = (GError **) user_data;
int i;
if (*failed)
if (*error)
return;
/* 'name' is the setting name; always allowed but unused */
@ -440,47 +415,100 @@ validate_one_property (gpointer key, gpointer val, gpointer user_data)
for (i = 0; valid_properties[i].name; i++) {
ValidProperty prop = valid_properties[i];
long int tmp;
if (!strcmp (prop.name, (char *) key) && prop.type == G_VALUE_TYPE ((GValue *) val)) {
if (!strcmp (prop.name, NM_PPTP_KEY_GATEWAY)) {
if (!validate_gateway ((GValue *) val))
goto failed;
if (strcmp (prop.name, (char *) key))
continue;
switch (prop.type) {
case G_TYPE_STRING:
if ( !strcmp (prop.name, NM_PPTP_KEY_GATEWAY)
&& !validate_gateway (value)) {
g_set_error (error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_BAD_ARGUMENTS,
"invalid gateway '%s'",
(const char *) key);
return;
}
/* Property is ok */
return;
return; /* valid */
case G_TYPE_UINT:
errno = 0;
tmp = strtol ((char *) value, NULL, 10);
if (errno == 0)
return; /* valid */
g_set_error (error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_BAD_ARGUMENTS,
"invalid integer property '%s'",
(const char *) key);
break;
case G_TYPE_BOOLEAN:
if (!strcmp ((char *) value, "yes") || !strcmp ((char *) value, "no"))
return; /* valid */
g_set_error (error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_BAD_ARGUMENTS,
"invalid boolean property '%s' (not yes or no)",
(const char *) key);
break;
default:
g_set_error (error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_BAD_ARGUMENTS,
"unhandled property '%s' type %d",
(const char *) key, prop.type);
break;
}
}
failed:
/* Did not find the property from valid_properties or the type did not match */
g_warning ("VPN property '%s' failed validation.", (char *) key);
*failed = TRUE;
if (!valid_properties[i].name) {
g_set_error (error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_BAD_ARGUMENTS,
"property '%s' invalid or not supported",
(const char *) key);
}
}
static gboolean
nm_pptp_properties_validate (GHashTable *properties)
nm_pptp_properties_validate (GHashTable *properties, GError **error)
{
gboolean failed = FALSE;
int i;
if (g_hash_table_size (properties) < 1)
return failed;
if (g_hash_table_size (properties) < 1) {
g_set_error (error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_BAD_ARGUMENTS,
"%s",
"No VPN configuration options.");
return FALSE;
}
g_hash_table_foreach (properties, validate_one_property, &failed);
if (failed)
g_hash_table_foreach (properties, validate_one_property, error);
if (*error)
return FALSE;
/* Ensure required properties exist */
for (i = 0; valid_properties[i].name; i++) {
ValidProperty prop = valid_properties[i];
GValue *value;
const char *value;
if (!prop.required)
continue;
value = g_hash_table_lookup (properties, prop.name);
if (!value || (G_VALUE_TYPE (value) != prop.type))
if (!value || !strlen (value)) {
g_set_error (error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_BAD_ARGUMENTS,
"Missing required option '%s'.",
prop.name);
return FALSE;
}
}
return TRUE;
@ -602,13 +630,11 @@ free_pppd_args (GPtrArray *args)
static GPtrArray *
construct_pppd_args (NMPptpPlugin *plugin,
NMSettingVPN *s_vpn,
NMSettingVPNProperties *s_vpn_props,
const char *pppd,
GError **error)
{
GPtrArray *args = NULL;
GValue *value;
const char *pptp_binary;
const char *value, *pptp_binary;
char *ipparam, *tmp;
pptp_binary = nm_find_pptp ();
@ -625,8 +651,8 @@ construct_pppd_args (NMPptpPlugin *plugin,
g_ptr_array_add (args, (gpointer) g_strdup (pppd));
/* PPTP options */
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_GATEWAY);
if (!value || !G_VALUE_HOLDS_STRING (value)) {
value = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_GATEWAY);
if (!value || !strlen (value)) {
g_set_error (error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_CONNECTION_INVALID,
@ -638,8 +664,7 @@ construct_pppd_args (NMPptpPlugin *plugin,
ipparam = g_strdup_printf ("nm-pptp-service-%d", getpid ());
g_ptr_array_add (args, (gpointer) g_strdup ("pty"));
tmp = g_strdup_printf ("%s %s --nolaunchpppd --logstring %s",
pptp_binary, g_value_get_string (value), ipparam);
tmp = g_strdup_printf ("%s %s --nolaunchpppd --logstring %s", pptp_binary, value, ipparam);
g_ptr_array_add (args, (gpointer) tmp);
/* PPP options */
@ -651,66 +676,82 @@ construct_pppd_args (NMPptpPlugin *plugin,
g_ptr_array_add (args, (gpointer) g_strdup ("usepeerdns"));
g_ptr_array_add (args, (gpointer) g_strdup ("noipdefault"));
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_REFUSE_EAP);
if (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value))
value = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_REFUSE_EAP);
if (value && !strcmp (value, "yes"))
g_ptr_array_add (args, (gpointer) g_strdup ("refuse-eap"));
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_REFUSE_PAP);
if (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value))
value = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_REFUSE_PAP);
if (value && !strcmp (value, "yes"))
g_ptr_array_add (args, (gpointer) g_strdup ("refuse-pap"));
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_REFUSE_CHAP);
if (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value))
value = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_REFUSE_CHAP);
if (value && !strcmp (value, "yes"))
g_ptr_array_add (args, (gpointer) g_strdup ("refuse-chap"));
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_REFUSE_MSCHAP);
if (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value))
value = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_REFUSE_MSCHAP);
if (value && !strcmp (value, "yes"))
g_ptr_array_add (args, (gpointer) g_strdup ("refuse-mschap"));
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_REFUSE_MSCHAPV2);
if (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value))
value = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_REFUSE_MSCHAPV2);
if (value && !strcmp (value, "yes"))
g_ptr_array_add (args, (gpointer) g_strdup ("refuse-mschap-v2"));
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_REQUIRE_MPPE);
if (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value))
value = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_REQUIRE_MPPE);
if (value && !strcmp (value, "yes"))
g_ptr_array_add (args, (gpointer) g_strdup ("require-mppe"));
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_REQUIRE_MPPE_40);
if (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value))
value = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_REQUIRE_MPPE_40);
if (value && !strcmp (value, "yes"))
g_ptr_array_add (args, (gpointer) g_strdup ("require-mppe-40"));
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_REQUIRE_MPPE_128);
if (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value))
value = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_REQUIRE_MPPE_128);
if (value && !strcmp (value, "yes"))
g_ptr_array_add (args, (gpointer) g_strdup ("require-mppe-128"));
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_MPPE_STATEFUL);
if (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value))
value = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_MPPE_STATEFUL);
if (value && !strcmp (value, "yes"))
g_ptr_array_add (args, (gpointer) g_strdup ("mppe-stateful"));
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_NOBSDCOMP);
if (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value))
value = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_NOBSDCOMP);
if (value && !strcmp (value, "yes"))
g_ptr_array_add (args, (gpointer) g_strdup ("nobsdcomp"));
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_NODEFLATE);
if (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value))
value = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_NODEFLATE);
if (value && !strcmp (value, "yes"))
g_ptr_array_add (args, (gpointer) g_strdup ("nodeflate"));
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_NO_VJ_COMP);
if (value && G_VALUE_HOLDS_BOOLEAN (value) && g_value_get_boolean (value))
value = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_NO_VJ_COMP);
if (value && !strcmp (value, "yes"))
g_ptr_array_add (args, (gpointer) g_strdup ("novj"));
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_LCP_ECHO_FAILURE);
if (value && G_VALUE_HOLDS_UINT (value) && g_value_get_uint (value)) {
g_ptr_array_add (args, (gpointer) g_strdup ("lcp-echo-failure"));
tmp = g_strdup_printf ("%d", g_value_get_uint (value));
g_ptr_array_add (args, (gpointer) tmp);
value = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_LCP_ECHO_FAILURE);
if (value && strlen (value)) {
long int tmp_int;
/* Convert to integer and then back to string for security's sake
* because strtol ignores some leading and trailing characters.
*/
errno = 0;
tmp_int = strtol (value, NULL, 10);
if (errno == 0) {
g_ptr_array_add (args, (gpointer) g_strdup ("lcp-echo-failure"));
g_ptr_array_add (args, (gpointer) g_strdup_printf ("%ld", tmp_int));
}
}
value = g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_LCP_ECHO_INTERVAL);
if (value && G_VALUE_HOLDS_UINT (value) && g_value_get_uint (value)) {
g_ptr_array_add (args, (gpointer) g_strdup ("lcp-echo-interval"));
tmp = g_strdup_printf ("%d", g_value_get_uint (value));
g_ptr_array_add (args, (gpointer) tmp);
value = g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_LCP_ECHO_INTERVAL);
if (value && strlen (value)) {
long int tmp_int;
/* Convert to integer and then back to string for security's sake
* because strtol ignores some leading and trailing characters.
*/
errno = 0;
tmp_int = strtol (value, NULL, 10);
if (errno == 0) {
g_ptr_array_add (args, (gpointer) g_strdup ("lcp-echo-interval"));
g_ptr_array_add (args, (gpointer) g_strdup_printf ("%ld", tmp_int));
}
}
g_ptr_array_add (args, (gpointer) g_strdup ("plugin"));
@ -728,29 +769,30 @@ error:
static gboolean
nm_pptp_start_pppd_binary (NMPptpPlugin *plugin,
NMSettingVPN *s_vpn,
NMSettingVPNProperties *s_vpn_props)
GError **error)
{
NMPptpPluginPrivate *priv = NM_PPTP_PLUGIN_GET_PRIVATE (plugin);
GPid pid;
const char *pppd_binary;
GPtrArray *pppd_argv;
GError *err = NULL;
pppd_binary = nm_find_pppd ();
if (!pppd_binary) {
nm_info ("Could not find pppd binary.");
g_set_error (error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_LAUNCH_FAILED,
"%s",
"Could not find the pppd binary.");
return FALSE;
}
pppd_argv = construct_pppd_args (plugin, s_vpn, s_vpn_props, pppd_binary, &err);
pppd_argv = construct_pppd_args (plugin, s_vpn, pppd_binary, error);
if (!pppd_argv)
return FALSE;
if (!g_spawn_async (NULL, (char **) pppd_argv->pdata, NULL,
G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &pid, &err)) {
G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &pid, error)) {
g_ptr_array_free (pppd_argv, TRUE);
nm_warning ("pppd failed to start. error: '%s'", err->message);
g_error_free (err);
return FALSE;
}
free_pppd_args (pppd_argv);
@ -814,24 +856,15 @@ service_ip4_config_cb (NMPptpPppService *service,
static gboolean
real_connect (NMVPNPlugin *plugin,
NMConnection *connection,
GError **err)
GError **error)
{
NMPptpPluginPrivate *priv = NM_PPTP_PLUGIN_GET_PRIVATE (plugin);
NMSettingVPN *s_vpn;
NMSettingVPNProperties *s_vpn_props;
s_vpn_props = NM_SETTING_VPN_PROPERTIES (nm_connection_get_setting (connection, NM_TYPE_SETTING_VPN_PROPERTIES));
if (!s_vpn_props || !nm_pptp_properties_validate (s_vpn_props->data)) {
g_set_error (err,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_BAD_ARGUMENTS,
"%s",
"Invalid arguments.");
return FALSE;
}
s_vpn = NM_SETTING_VPN (nm_connection_get_setting (connection, NM_TYPE_SETTING_VPN));
g_assert (s_vpn);
if (!nm_pptp_properties_validate (s_vpn->data, error))
return FALSE;
/* Start our pppd plugin helper service */
if (priv->service)
@ -839,7 +872,7 @@ real_connect (NMVPNPlugin *plugin,
priv->service = nm_pptp_ppp_service_new ();
if (!priv->service) {
g_set_error (err,
g_set_error (error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_LAUNCH_FAILED,
"%s",
@ -853,17 +886,11 @@ real_connect (NMVPNPlugin *plugin,
/* Cache the username and password so we can relay the secrets to the pppd
* plugin when it asks for them.
*/
if (!nm_pptp_ppp_service_cache_credentials (priv->service, connection, err))
if (!nm_pptp_ppp_service_cache_credentials (priv->service, connection, error))
return FALSE;
if (!nm_pptp_start_pppd_binary (NM_PPTP_PLUGIN (plugin), s_vpn, s_vpn_props)) {
g_set_error (err,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_LAUNCH_FAILED,
"%s",
"Could not start pppd binary.");
if (!nm_pptp_start_pppd_binary (NM_PPTP_PLUGIN (plugin), s_vpn, error))
return FALSE;
}
return TRUE;
}
@ -874,13 +901,13 @@ real_need_secrets (NMVPNPlugin *plugin,
char **setting_name,
GError **error)
{
NMSettingVPNProperties *s_vpn_props;
NMSettingVPN *s_vpn;
g_return_val_if_fail (NM_IS_VPN_PLUGIN (plugin), FALSE);
g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE);
s_vpn_props = NM_SETTING_VPN_PROPERTIES (nm_connection_get_setting (connection, NM_TYPE_SETTING_VPN_PROPERTIES));
if (!s_vpn_props) {
s_vpn = NM_SETTING_VPN (nm_connection_get_setting (connection, NM_TYPE_SETTING_VPN));
if (!s_vpn) {
g_set_error (error,
NM_VPN_PLUGIN_ERROR,
NM_VPN_PLUGIN_ERROR_CONNECTION_INVALID,
@ -889,8 +916,8 @@ real_need_secrets (NMVPNPlugin *plugin,
return FALSE;
}
if (!g_hash_table_lookup (s_vpn_props->data, NM_PPTP_KEY_PASSWORD)) {
*setting_name = NM_SETTING_VPN_PROPERTIES_SETTING_NAME;
if (!g_hash_table_lookup (s_vpn->data, NM_PPTP_KEY_PASSWORD)) {
*setting_name = NM_SETTING_VPN_SETTING_NAME;
return TRUE;
}