diff options
Diffstat (limited to 'src/vpn-manager/nm-vpn-connection.c')
| -rw-r--r-- | src/vpn-manager/nm-vpn-connection.c | 91 |
1 files changed, 60 insertions, 31 deletions
diff --git a/src/vpn-manager/nm-vpn-connection.c b/src/vpn-manager/nm-vpn-connection.c index 73f2b553..b391f1ec 100644 --- a/src/vpn-manager/nm-vpn-connection.c +++ b/src/vpn-manager/nm-vpn-connection.c @@ -15,7 +15,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * - * Copyright (C) 2005 - 2011 Red Hat, Inc. + * Copyright (C) 2005 - 2012 Red Hat, Inc. * Copyright (C) 2006 - 2008 Novell, Inc. */ @@ -30,7 +30,6 @@ #include "NetworkManager.h" #include "NetworkManagerVPN.h" #include "nm-vpn-connection.h" -#include "nm-device-interface.h" #include "nm-setting-connection.h" #include "nm-setting-vpn.h" #include "nm-setting-ip4-config.h" @@ -52,7 +51,7 @@ #include "nm-vpn-connection-glue.h" -G_DEFINE_TYPE (NMVPNConnection, nm_vpn_connection, NM_TYPE_VPN_CONNECTION_BASE) +G_DEFINE_TYPE (NMVPNConnection, nm_vpn_connection, NM_TYPE_ACTIVE_CONNECTION) typedef enum { /* Only system secrets */ @@ -108,12 +107,31 @@ enum { PROP_0, PROP_VPN_STATE, PROP_BANNER, + PROP_MASTER = 2000, LAST_PROP }; static void get_secrets (NMVPNConnection *self, SecretsReq secrets_idx); +static NMActiveConnectionState +ac_state_from_vpn_state (NMVPNConnectionState vpn_state) +{ + /* Set the NMActiveConnection state based on VPN state */ + switch (vpn_state) { + case NM_VPN_CONNECTION_STATE_PREPARE: + case NM_VPN_CONNECTION_STATE_NEED_AUTH: + case NM_VPN_CONNECTION_STATE_CONNECT: + case NM_VPN_CONNECTION_STATE_IP_CONFIG_GET: + return NM_ACTIVE_CONNECTION_STATE_ACTIVATING; + case NM_VPN_CONNECTION_STATE_ACTIVATED: + return NM_ACTIVE_CONNECTION_STATE_ACTIVATED; + default: + break; + } + return NM_ACTIVE_CONNECTION_STATE_UNKNOWN; +} + static void nm_vpn_connection_set_vpn_state (NMVPNConnection *connection, NMVPNConnectionState vpn_state, @@ -134,7 +152,8 @@ nm_vpn_connection_set_vpn_state (NMVPNConnection *connection, priv->vpn_state = vpn_state; /* Update active connection base class state */ - nm_vpn_connection_base_set_state (NM_VPN_CONNECTION_BASE (connection), vpn_state); + nm_active_connection_set_state (NM_ACTIVE_CONNECTION (connection), + ac_state_from_vpn_state (vpn_state)); /* Save ip_iface since when the VPN goes down it may get freed * before we're done with it. @@ -231,7 +250,10 @@ nm_vpn_connection_new (NMConnection *connection, g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); g_return_val_if_fail (NM_IS_DEVICE (parent_device), NULL); - self = (NMVPNConnection *) g_object_new (NM_TYPE_VPN_CONNECTION, NULL); + self = (NMVPNConnection *) g_object_new (NM_TYPE_VPN_CONNECTION, + NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT, specific_object, + NM_ACTIVE_CONNECTION_VPN, TRUE, + NULL); if (!self) return NULL; @@ -246,11 +268,16 @@ nm_vpn_connection_new (NMConnection *connection, G_CALLBACK (device_state_changed), self); - priv->device_ip4 = g_signal_connect (parent_device, "notify::" NM_DEVICE_INTERFACE_IP4_CONFIG, + priv->device_ip4 = g_signal_connect (parent_device, "notify::" NM_DEVICE_IP4_CONFIG, G_CALLBACK (device_ip4_config_changed), self); - nm_vpn_connection_base_export (NM_VPN_CONNECTION_BASE (self), connection, specific_object); + if (!nm_active_connection_export (NM_ACTIVE_CONNECTION (self), + connection, + nm_device_get_path (parent_device))) { + g_object_unref (self); + self = NULL; + } return self; } @@ -259,10 +286,10 @@ static const char * nm_vpn_connection_get_service (NMVPNConnection *connection) { NMVPNConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (connection); - NMSettingVPN *setting; + NMSettingVPN *s_vpn; - setting = (NMSettingVPN *) nm_connection_get_setting (priv->connection, NM_TYPE_SETTING_VPN); - return nm_setting_vpn_get_service_type (setting); + s_vpn = nm_connection_get_setting_vpn (priv->connection); + return nm_setting_vpn_get_service_type (s_vpn); } static void @@ -452,7 +479,7 @@ nm_vpn_connection_ip4_config_get (DBusGProxy *proxy, /* Grab the interface index for address/routing operations */ priv->ip_ifindex = nm_netlink_iface_to_index (priv->ip_iface); - if (!priv->ip_ifindex) { + if (priv->ip_ifindex < 0) { nm_log_err (LOGD_VPN, "(%s): failed to look up VPN interface index", priv->ip_iface); goto error; } @@ -520,6 +547,15 @@ nm_vpn_connection_ip4_config_get (DBusGProxy *proxy, if (val) nm_ip4_config_add_domain (config, g_value_get_string (val)); + val = (GValue *) g_hash_table_lookup (config_hash, NM_VPN_PLUGIN_IP4_CONFIG_DOMAINS); + if (val) { + const char **domains = g_value_get_boxed (val); + const char **domain; + + for (domain = domains; domain && *domain; domain++) + nm_ip4_config_add_domain (config, *domain); + } + val = (GValue *) g_hash_table_lookup (config_hash, NM_VPN_PLUGIN_IP4_CONFIG_BANNER); if (val) { g_free (priv->banner); @@ -559,7 +595,7 @@ nm_vpn_connection_ip4_config_get (DBusGProxy *proxy, print_vpn_config (config, priv->ip4_internal_gw, priv->ip_iface, priv->banner); /* Merge in user overrides from the NMConnection's IPv4 setting */ - s_ip4 = NM_SETTING_IP4_CONFIG (nm_connection_get_setting (priv->connection, NM_TYPE_SETTING_IP4_CONFIG)); + s_ip4 = nm_connection_get_setting_ip4_config (priv->connection); nm_utils_merge_ip4_config (config, s_ip4); nm_system_iface_set_up (priv->ip_ifindex, TRUE, NULL); @@ -646,22 +682,22 @@ static GHashTable * _hash_with_username (NMConnection *connection, const char *username) { NMConnection *dup; - NMSetting *s_vpn; + NMSettingVPN *s_vpn; GHashTable *hash; const char *existing; /* Shortcut if we weren't given a username or if there already was one in * the VPN setting; don't bother duplicating the connection and everything. */ - s_vpn = nm_connection_get_setting (connection, NM_TYPE_SETTING_VPN); + s_vpn = nm_connection_get_setting_vpn (connection); g_assert (s_vpn); - existing = nm_setting_vpn_get_user_name (NM_SETTING_VPN (s_vpn)); + existing = nm_setting_vpn_get_user_name (s_vpn); if (username == NULL || existing) return nm_connection_to_hash (connection, NM_SETTING_HASH_FLAG_ALL); dup = nm_connection_duplicate (connection); g_assert (dup); - s_vpn = nm_connection_get_setting (dup, NM_TYPE_SETTING_VPN); + s_vpn = nm_connection_get_setting_vpn (dup); g_assert (s_vpn); g_object_set (s_vpn, NM_SETTING_VPN_USER_NAME, username, NULL); hash = nm_connection_to_hash (dup, NM_SETTING_HASH_FLAG_ALL); @@ -737,25 +773,17 @@ nm_vpn_connection_activate (NMVPNConnection *connection) } const char * -nm_vpn_connection_get_active_connection_path (NMVPNConnection *connection) -{ - g_return_val_if_fail (NM_IS_VPN_CONNECTION (connection), NULL); - - return nm_vpn_connection_base_get_ac_path (NM_VPN_CONNECTION_BASE (connection)); -} - -const char * nm_vpn_connection_get_name (NMVPNConnection *connection) { NMVPNConnectionPrivate *priv; - NMSettingConnection *setting; + NMSettingConnection *s_con; g_return_val_if_fail (NM_IS_VPN_CONNECTION (connection), NULL); priv = NM_VPN_CONNECTION_GET_PRIVATE (connection); - setting = (NMSettingConnection *) nm_connection_get_setting (priv->connection, NM_TYPE_SETTING_CONNECTION); + s_con = nm_connection_get_setting_connection (priv->connection); - return nm_setting_connection_get_id (setting); + return nm_setting_connection_get_id (s_con); } NMConnection * @@ -1152,6 +1180,9 @@ get_property (GObject *object, guint prop_id, case PROP_BANNER: g_value_set_string (value, priv->banner ? priv->banner : ""); break; + case PROP_MASTER: + g_value_set_boxed (value, nm_device_get_path (priv->parent_dev)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1171,6 +1202,8 @@ nm_vpn_connection_class_init (NMVPNConnectionClass *connection_class) object_class->dispose = dispose; object_class->finalize = finalize; + g_object_class_override_property (object_class, PROP_MASTER, NM_ACTIVE_CONNECTION_MASTER); + /* properties */ g_object_class_install_property (object_class, PROP_VPN_STATE, g_param_spec_uint (NM_VPN_CONNECTION_VPN_STATE, @@ -1199,10 +1232,6 @@ nm_vpn_connection_class_init (NMVPNConnectionClass *connection_class) G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); - signals[PROPERTIES_CHANGED] = - nm_properties_changed_signal_new (object_class, - G_STRUCT_OFFSET (NMVPNConnectionClass, properties_changed)); - dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (object_class), &dbus_glib_nm_vpn_connection_object_info); } |