static void state_changed_cb (GObject *object, NMVPNServiceState state, gpointer user_data) { NML2tpPluginPrivate *priv = NM_L2TP_PLUGIN_GET_PRIVATE (object); switch (state) { case NM_VPN_SERVICE_STATE_STARTED: remove_timeout_handler (NM_L2TP_PLUGIN (object)); break; case NM_VPN_SERVICE_STATE_UNKNOWN: case NM_VPN_SERVICE_STATE_INIT: case NM_VPN_SERVICE_STATE_SHUTDOWN: case NM_VPN_SERVICE_STATE_STOPPING: case NM_VPN_SERVICE_STATE_STOPPED: remove_timeout_handler (NM_L2TP_PLUGIN (object)); if (priv->connection) { g_object_unref (priv->connection); priv->connection = NULL; } if (priv->service) { g_object_unref (priv->service); priv->service = NULL; } break; default: break; } }
static gboolean handle_set_ip4_config (NMDBusSstpPpp *object, GDBusMethodInvocation *invocation, GVariant *arg_config, gpointer user_data) { remove_timeout_handler (NM_SSTP_PLUGIN (user_data)); nm_vpn_service_plugin_set_ip4_config (NM_VPN_SERVICE_PLUGIN (user_data), arg_config); g_dbus_method_invocation_return_value (invocation, NULL); return TRUE; }
static gboolean handle_set_state (NMDBusSstpPpp *object, GDBusMethodInvocation *invocation, guint arg_state, gpointer user_data) { remove_timeout_handler (NM_SSTP_PLUGIN (user_data)); if (arg_state == NM_PPP_STATUS_DEAD || arg_state == NM_PPP_STATUS_DISCONNECT) nm_vpn_service_plugin_disconnect (NM_VPN_SERVICE_PLUGIN (user_data), NULL); g_dbus_method_invocation_return_value (invocation, NULL); return TRUE; }
static gboolean handle_need_secrets (NMDBusSstpPpp *object, GDBusMethodInvocation *invocation, gpointer user_data) { NMSstpPlugin *self = NM_SSTP_PLUGIN (user_data); NMSstpPluginPrivate *priv = NM_SSTP_PLUGIN_GET_PRIVATE (self); NMSettingVpn *s_vpn; const char *user, *password, *domain; gchar *username; remove_timeout_handler (NM_SSTP_PLUGIN (user_data)); s_vpn = nm_connection_get_setting_vpn (priv->connection); g_assert (s_vpn); /* Username; try SSTP specific username first, then generic username */ user = nm_setting_vpn_get_data_item (s_vpn, NM_SSTP_KEY_USER); if (!user || !strlen (user)) user = nm_setting_vpn_get_user_name (s_vpn); if (!user || !strlen (user)) { g_dbus_method_invocation_return_error_literal (invocation, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_INVALID_CONNECTION, _("Missing VPN username.")); return FALSE; } password = nm_setting_vpn_get_secret (s_vpn, NM_SSTP_KEY_PASSWORD); if (!password || !strlen (password)) { g_dbus_method_invocation_return_error_literal (invocation, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_INVALID_CONNECTION, _("Missing or invalid VPN password.")); return FALSE;; } /* Domain is optional */ domain = nm_setting_vpn_get_data_item (s_vpn, NM_SSTP_KEY_DOMAIN); /* Success */ if (domain && strlen (domain)) username = g_strdup_printf ("%s\\%s", domain, user); else username = g_strdup (user); nmdbus_sstp_ppp_complete_need_secrets (object, invocation, username, password); g_free (username); return TRUE; }
static void impl_ppp_manager_set_ip6_config (NMPPPManager *manager, GDBusMethodInvocation *context, GVariant *config_dict) { NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (manager); NMIP6Config *config; NMPlatformIP6Address addr; struct in6_addr a; NMUtilsIPv6IfaceId iid = NM_UTILS_IPV6_IFACE_ID_INIT; _LOGI ("(IPv6 Config Get) reply received."); remove_timeout_handler (manager); config = nm_ip6_config_new (nm_platform_link_get_ifindex (NM_PLATFORM_GET, priv->ip_iface)); memset (&addr, 0, sizeof (addr)); addr.plen = 64; if (iid_value_to_ll6_addr (config_dict, NM_PPP_IP6_CONFIG_PEER_IID, &a, NULL)) { nm_ip6_config_set_gateway (config, &a); addr.peer_address = a; } if (iid_value_to_ll6_addr (config_dict, NM_PPP_IP6_CONFIG_OUR_IID, &addr.address, &iid)) { nm_ip6_config_add_address (config, &addr); if (set_ip_config_common (manager, config_dict, NM_PPP_IP6_CONFIG_INTERFACE, NULL)) { /* Push the IPv6 config and interface identifier up to the device */ g_signal_emit (manager, signals[IP6_CONFIG], 0, priv->ip_iface, &iid, config); } } else _LOGE ("invalid IPv6 address received!"); g_object_unref (config); g_dbus_method_invocation_return_value (context, NULL); }
static void service_plugin_alive_cb (NML2tpPppService *service, NML2tpPlugin *plugin) { remove_timeout_handler (plugin); }
static void impl_ppp_manager_set_ip4_config (NMPPPManager *manager, GDBusMethodInvocation *context, GVariant *config_dict) { NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (manager); NMIP4Config *config; NMPlatformIP4Address address; guint32 u32; GVariantIter *iter; _LOGI ("(IPv4 Config Get) reply received."); remove_timeout_handler (manager); config = nm_ip4_config_new (nm_platform_link_get_ifindex (NM_PLATFORM_GET, priv->ip_iface)); memset (&address, 0, sizeof (address)); address.plen = 32; if (g_variant_lookup (config_dict, NM_PPP_IP4_CONFIG_ADDRESS, "u", &u32)) address.address = u32; if (g_variant_lookup (config_dict, NM_PPP_IP4_CONFIG_GATEWAY, "u", &u32)) { nm_ip4_config_set_gateway (config, u32); address.peer_address = u32; } else address.peer_address = address.address; if (g_variant_lookup (config_dict, NM_PPP_IP4_CONFIG_PREFIX, "u", &u32)) address.plen = u32; if (address.address && address.plen) { address.source = NM_IP_CONFIG_SOURCE_PPP; nm_ip4_config_add_address (config, &address); } else { _LOGE ("invalid IPv4 address received!"); goto out; } if (g_variant_lookup (config_dict, NM_PPP_IP4_CONFIG_DNS, "au", &iter)) { while (g_variant_iter_next (iter, "u", &u32)) nm_ip4_config_add_nameserver (config, u32); g_variant_iter_free (iter); } if (g_variant_lookup (config_dict, NM_PPP_IP4_CONFIG_WINS, "au", &iter)) { while (g_variant_iter_next (iter, "u", &u32)) nm_ip4_config_add_wins (config, u32); g_variant_iter_free (iter); } if (!set_ip_config_common (manager, config_dict, NM_PPP_IP4_CONFIG_INTERFACE, &u32)) goto out; if (u32) nm_ip4_config_set_mtu (config, u32, NM_IP_CONFIG_SOURCE_PPP); /* Push the IP4 config up to the device */ g_signal_emit (manager, signals[IP4_CONFIG], 0, priv->ip_iface, config); out: g_object_unref (config); g_dbus_method_invocation_return_value (context, NULL); }
static gboolean impl_ppp_manager_set_ip4_config (NMPPPManager *manager, GHashTable *config_hash, GError **err) { NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (manager); NMConnection *connection; NMSettingPPP *s_ppp; NMIP4Config *config; NMIP4Address *addr; GValue *val; int i; nm_log_info (LOGD_PPP, "PPP manager(IP Config Get) reply received."); remove_timeout_handler (manager); config = nm_ip4_config_new (); addr = nm_ip4_address_new (); nm_ip4_address_set_prefix (addr, 32); val = (GValue *) g_hash_table_lookup (config_hash, NM_PPP_IP4_CONFIG_GATEWAY); if (val) { nm_ip4_address_set_gateway (addr, g_value_get_uint (val)); nm_ip4_config_set_ptp_address (config, g_value_get_uint (val)); } val = (GValue *) g_hash_table_lookup (config_hash, NM_PPP_IP4_CONFIG_ADDRESS); if (val) nm_ip4_address_set_address (addr, g_value_get_uint (val)); val = (GValue *) g_hash_table_lookup (config_hash, NM_PPP_IP4_CONFIG_PREFIX); if (val) nm_ip4_address_set_prefix (addr, g_value_get_uint (val)); if (nm_ip4_address_get_address (addr) && nm_ip4_address_get_prefix (addr)) { nm_ip4_config_take_address (config, addr); } else { nm_log_err (LOGD_PPP, "invalid IPv4 address received!"); nm_ip4_address_unref (addr); goto out; } val = (GValue *) g_hash_table_lookup (config_hash, NM_PPP_IP4_CONFIG_DNS); if (val) { GArray *dns = (GArray *) g_value_get_boxed (val); for (i = 0; i < dns->len; i++) nm_ip4_config_add_nameserver (config, g_array_index (dns, guint, i)); } val = (GValue *) g_hash_table_lookup (config_hash, NM_PPP_IP4_CONFIG_WINS); if (val) { GArray *wins = (GArray *) g_value_get_boxed (val); for (i = 0; i < wins->len; i++) nm_ip4_config_add_wins (config, g_array_index (wins, guint, i)); } val = (GValue *) g_hash_table_lookup (config_hash, NM_PPP_IP4_CONFIG_INTERFACE); if (!val || !G_VALUE_HOLDS_STRING (val)) { nm_log_err (LOGD_PPP, "no interface received!"); goto out; } priv->ip_iface = g_value_dup_string (val); /* Got successful IP4 config; obviously the secrets worked */ connection = nm_act_request_get_connection (priv->act_req); g_assert (connection); g_object_set_data (G_OBJECT (connection), PPP_MANAGER_SECRET_TRIES, NULL); /* Merge in custom MTU */ s_ppp = (NMSettingPPP *) nm_connection_get_setting (connection, NM_TYPE_SETTING_PPP); if (s_ppp) { guint32 mtu = nm_setting_ppp_get_mtu (s_ppp); if (mtu) nm_ip4_config_set_mtu (config, mtu); } /* Push the IP4 config up to the device */ g_signal_emit (manager, signals[IP4_CONFIG], 0, priv->ip_iface, config); monitor_stats (manager); out: g_object_unref (config); return TRUE; }