mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-25 13:00:16 +01:00
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:
parent
944e9e5b6d
commit
380929b20d
7 changed files with 239 additions and 327 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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_ */
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue