diff --git a/ChangeLog b/ChangeLog index 0339cde2c0..8dd6e8cdd2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,38 @@ +2006-02-09 Dan Williams + + Patch from: Vinay A R + * src/vpn-manager/nm-vpn-act-request.[ch] + - Added 'routes' and 'routes_count' to struct NMVPNActRequest since + IPSec VPNs require them for std gateway. + - (nm_vpn_act_request_new): takes arguments for 'user_routes' + and 'user_routes_count' + - (nm_vpn_act_request_get_user_routes): new function; gets user + defined routes from NMVPNActRequest object, returns the string + array of routes. + + * src/vpn-manager/nm-vpn-manager.[ch] + - (nm_vpn_manager_activate_vpn_connection): take additional arguments + for 'user_routes' and 'user_routes_count' + + * src/vpn-manager/nm-dbus-vpn.c + - (nm_dbus_vpn_activate_connection): gets 'user_routes' from + nm_dbus_vpn_get_routes() to pass to nm_vpn_manager_activate_vpn_connection() + + * src/vpn-manager/nm-vpn-service.c + - (nm_vpn_service_stage3_connect): pass user routes over dbus to + the vpn daemon + + Modifications by Dan: + * src/vpn-manager/nm-vpn-service.c + - (nm_vpn_service_stage3_connect): ensure that we don't pass NULL string + arrays into dbus + + * vpn-daemons/vpnc/src/nm-vpnc-service.c + * vpn-daemons/pptp/src/nm-pptp-service.c + * vpn-daemons/openvpn/src/nm-openvpn-service.c + - Grab user routes from dbus message + - Free all string arrays we got from dbus + 2006-02-07 Robert Love Patch by Stefan Seyfried : diff --git a/src/vpn-manager/nm-dbus-vpn.c b/src/vpn-manager/nm-dbus-vpn.c index df956fcf03..95796ab07b 100644 --- a/src/vpn-manager/nm-dbus-vpn.c +++ b/src/vpn-manager/nm-dbus-vpn.c @@ -701,16 +701,20 @@ static DBusMessage *nm_dbus_vpn_activate_connection (DBusConnection *connection, { int item_count = -1; char **items; - + int routes_count = -1; + char **routes; + routes = nm_dbus_vpn_get_routes (connection, vpn, &routes_count); if ((items = nm_dbus_vpn_get_vpn_data (connection, vpn, &item_count))) { char * joined_string = g_strjoinv (" / ", items); - - nm_info ("Will activate VPN connection '%s', service '%s', user_name '%s', vpn_data '%s'.", - name, nm_vpn_connection_get_service_name (vpn), nm_vpn_connection_get_user_name (vpn), joined_string); - nm_vpn_manager_activate_vpn_connection (data->data->vpn_manager, vpn, passwords, num_passwords, items, item_count); + char * routes_string = g_strjoinv (" / ", routes); + nm_info ("Will activate VPN connection '%s', service '%s', user_name '%s', vpn_data '%s', route '%s'.", + name, nm_vpn_connection_get_service_name (vpn), nm_vpn_connection_get_user_name (vpn), joined_string, routes_string); + nm_vpn_manager_activate_vpn_connection (data->data->vpn_manager, vpn, passwords, num_passwords, items, item_count, + routes, routes_count); g_free (joined_string); + g_free (routes_string); g_strfreev (items); } } else { diff --git a/src/vpn-manager/nm-vpn-act-request.c b/src/vpn-manager/nm-vpn-act-request.c index b335453be1..d9948d56b1 100644 --- a/src/vpn-manager/nm-vpn-act-request.c +++ b/src/vpn-manager/nm-vpn-act-request.c @@ -40,6 +40,8 @@ struct NMVPNActRequest int password_count; char ** data_items; int data_count; + char ** user_routes; + int user_routes_count; guint daemon_wait_count; guint callback_id; @@ -48,7 +50,8 @@ struct NMVPNActRequest NMVPNActRequest *nm_vpn_act_request_new (NMVPNManager *manager, NMVPNService *service, NMVPNConnection *vpn, - NMDevice *parent_dev, char **password_items, int password_count, char **data_items, int data_count) + NMDevice *parent_dev, char **password_items, int password_count, char **data_items, int data_count, + char **user_routes, int user_routes_count) { NMVPNActRequest *req; @@ -75,6 +78,8 @@ NMVPNActRequest *nm_vpn_act_request_new (NMVPNManager *manager, NMVPNService *se req->password_count = password_count; req->data_items = g_strdupv (data_items); req->data_count = data_count; + req->user_routes = g_strdupv (user_routes); + req->user_routes_count = user_routes_count; return req; } @@ -194,6 +199,15 @@ const char ** nm_vpn_act_request_get_data_items (NMVPNActRequest *req, guint *co return (const char **) (req->data_items); } +const char ** nm_vpn_act_request_get_user_routes (NMVPNActRequest *req, guint *count) +{ + g_return_val_if_fail (req != NULL, NULL); + g_return_val_if_fail (count != NULL, NULL); + + *count = req->user_routes_count; + return (const char **) (req->user_routes); +} + void nm_vpn_act_request_cancel (NMVPNActRequest *req) { g_return_if_fail (req != NULL); diff --git a/src/vpn-manager/nm-vpn-act-request.h b/src/vpn-manager/nm-vpn-act-request.h index 302c850d32..f77fcf3d46 100644 --- a/src/vpn-manager/nm-vpn-act-request.h +++ b/src/vpn-manager/nm-vpn-act-request.h @@ -29,7 +29,8 @@ NMVPNActRequest * nm_vpn_act_request_new (NMVPNManager *manager, NMVPNService *service, NMVPNConnection *vpn, - NMDevice *parent_dev, char **password_items, int password_count, char **data_items, int data_count); + NMDevice *parent_dev, char **password_items, int password_count, char **data_items, int data_count, + char **user_routes, int user_routes_count); void nm_vpn_act_request_ref (NMVPNActRequest *req); void nm_vpn_act_request_unref (NMVPNActRequest *req); @@ -43,6 +44,7 @@ NMDevice * nm_vpn_act_request_get_parent_dev (NMVPNActRequest *req); const char ** nm_vpn_act_request_get_password_items (NMVPNActRequest *req, guint *count); const char ** nm_vpn_act_request_get_data_items (NMVPNActRequest *req, guint *count); +const char ** nm_vpn_act_request_get_user_routes (NMVPNActRequest *req, guint *count); void nm_vpn_act_request_cancel (NMVPNActRequest *req); gboolean nm_vpn_act_request_should_cancel (NMVPNActRequest *req); diff --git a/src/vpn-manager/nm-vpn-manager.c b/src/vpn-manager/nm-vpn-manager.c index b34b251608..0634515110 100644 --- a/src/vpn-manager/nm-vpn-manager.c +++ b/src/vpn-manager/nm-vpn-manager.c @@ -335,7 +335,7 @@ gboolean nm_vpn_manager_process_name_owner_changed (NMVPNManager *manager, const * */ void nm_vpn_manager_activate_vpn_connection (NMVPNManager *manager, NMVPNConnection *vpn, - char **password_items, int password_count, char **data_items, int data_count) + char **password_items, int password_count, char **data_items, int data_count, char **user_routes, int user_routes_count) { NMDevice * parent_dev; NMVPNActRequest * req; @@ -360,7 +360,8 @@ void nm_vpn_manager_activate_vpn_connection (NMVPNManager *manager, NMVPNConnect return; } - req = nm_vpn_act_request_new (manager, service, vpn, parent_dev, password_items, password_count, data_items, data_count); + req = nm_vpn_act_request_new (manager, service, vpn, parent_dev, password_items, password_count, data_items, data_count, + user_routes, user_routes_count); manager->act_req = req; nm_vpn_service_start_connection (service, req); diff --git a/src/vpn-manager/nm-vpn-manager.h b/src/vpn-manager/nm-vpn-manager.h index df13650761..a46870d573 100644 --- a/src/vpn-manager/nm-vpn-manager.h +++ b/src/vpn-manager/nm-vpn-manager.h @@ -37,7 +37,8 @@ NMVPNActRequest * nm_vpn_manager_get_vpn_act_request (NMVPNManager *manager); GSList * nm_vpn_manager_vpn_connection_list_copy (NMVPNManager *manager); void nm_vpn_manager_activate_vpn_connection (NMVPNManager *manager, NMVPNConnection *vpn, char **password_items, - int password_count, char **data_items, int data_count); + int password_count, char **data_items, int data_count, + char **user_routes, int user_routes_count ); void nm_vpn_manager_deactivate_vpn_connection (NMVPNManager *manager, NMDevice *dev); NMVPNConnection * nm_vpn_manager_find_connection_by_name (NMVPNManager *manager, const char *con_name); diff --git a/src/vpn-manager/nm-vpn-service.c b/src/vpn-manager/nm-vpn-service.c index b55bae5dc0..286777e4bb 100644 --- a/src/vpn-manager/nm-vpn-service.c +++ b/src/vpn-manager/nm-vpn-service.c @@ -472,6 +472,22 @@ out: } +static char ** +sanitize_dbus_string_array (char **in_array, dbus_uint32_t *in_num) +{ + char ** out_array; + + g_return_val_if_fail (in_num != NULL, NULL); + + if (in_array) + return in_array; + + out_array = g_malloc0 (sizeof (char *)); + out_array[0] = g_strdup (""); + *in_num = 1; + return out_array; +} + static gboolean nm_vpn_service_stage3_connect (gpointer user_data) { NMVPNActRequest * req = (NMVPNActRequest *) user_data; @@ -484,6 +500,8 @@ static gboolean nm_vpn_service_stage3_connect (gpointer user_data) dbus_uint32_t password_count; char ** data_items; dbus_uint32_t data_count; + char ** user_routes; + dbus_uint32_t user_routes_count = 0; DBusMessage * message; DBusPendingCall * pcall = NULL; @@ -512,10 +530,17 @@ static gboolean nm_vpn_service_stage3_connect (gpointer user_data) user_name = nm_vpn_connection_get_user_name (vpn); password_items = (char **) nm_vpn_act_request_get_password_items (req, &password_count); data_items = (char **) nm_vpn_act_request_get_data_items (req, &data_count); + user_routes = (char **) nm_vpn_act_request_get_user_routes(req, &user_routes_count); + + /* Ensure that data_items and user_routes are safe to put through dbus */ + data_items = sanitize_dbus_string_array (data_items, &data_count); + user_routes = sanitize_dbus_string_array (user_routes, &user_routes_count); + dbus_message_append_args (message, DBUS_TYPE_STRING, &name, DBUS_TYPE_STRING, &user_name, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &password_items, password_count, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &data_items, data_count, + DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &user_routes, user_routes_count, DBUS_TYPE_INVALID); dbus_connection_send_with_reply (service->app_data->dbus_connection, message, &pcall, -1); diff --git a/vpn-daemons/openvpn/src/nm-openvpn-service.c b/vpn-daemons/openvpn/src/nm-openvpn-service.c index 9e02c52301..d37bf724d3 100644 --- a/vpn-daemons/openvpn/src/nm-openvpn-service.c +++ b/vpn-daemons/openvpn/src/nm-openvpn-service.c @@ -1007,6 +1007,8 @@ nm_openvpn_dbus_handle_start_vpn (DBusMessage *message, NmOpenVPNData *data) int num_items = -1; char ** password_items = NULL; int num_passwords = -1; + char ** user_routes = NULL; + int user_routes_count = -1; const char * name = NULL; const char * user_name = NULL; DBusError error; @@ -1024,6 +1026,7 @@ nm_openvpn_dbus_handle_start_vpn (DBusMessage *message, NmOpenVPNData *data) DBUS_TYPE_STRING, &user_name, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &password_items, &num_passwords, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &data_items, &num_items, + DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &user_routes, &user_routes_count, DBUS_TYPE_INVALID)) { nm_warning ("Could not process the request because its arguments were invalid. dbus said: '%s'", error.message); @@ -1047,6 +1050,8 @@ nm_openvpn_dbus_handle_start_vpn (DBusMessage *message, NmOpenVPNData *data) out: dbus_free_string_array (data_items); + dbus_free_string_array (password_items); + dbus_free_string_array (user_routes); if (!success) nm_openvpn_set_state (data, NM_VPN_STATE_STOPPED); return success; diff --git a/vpn-daemons/pptp/src/nm-pptp-service.c b/vpn-daemons/pptp/src/nm-pptp-service.c index 499f86ec25..6b6e2dd42d 100644 --- a/vpn-daemons/pptp/src/nm-pptp-service.c +++ b/vpn-daemons/pptp/src/nm-pptp-service.c @@ -596,6 +596,8 @@ static gboolean nm_pptp_dbus_handle_start_vpn (DBusMessage *message, NmPPTPData int num_items = -1; char ** password_items = NULL; int num_passwords = -1; + char ** user_routes = NULL; + int user_routes_count = -1; const char * name = NULL; const char * user_name = NULL; DBusError error; @@ -613,6 +615,7 @@ static gboolean nm_pptp_dbus_handle_start_vpn (DBusMessage *message, NmPPTPData DBUS_TYPE_STRING, &user_name, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &password_items, &num_passwords, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &data_items, &num_items, + DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &user_routes, &user_routes_count, DBUS_TYPE_INVALID)) { nm_warning ("Could not process the request because its arguments were invalid. dbus said: '%s'", error.message); @@ -635,6 +638,8 @@ static gboolean nm_pptp_dbus_handle_start_vpn (DBusMessage *message, NmPPTPData out: dbus_free_string_array (data_items); + dbus_free_string_array (password_items); + dbus_free_string_array (user_routes); if (!success) nm_pptp_set_state (data, NM_VPN_STATE_STOPPED); return success; diff --git a/vpn-daemons/vpnc/src/nm-vpnc-service.c b/vpn-daemons/vpnc/src/nm-vpnc-service.c index 96f3a17ae9..e400e0e6aa 100644 --- a/vpn-daemons/vpnc/src/nm-vpnc-service.c +++ b/vpn-daemons/vpnc/src/nm-vpnc-service.c @@ -576,9 +576,11 @@ static gboolean nm_vpnc_config_options_validate (char **data_items, int num_item static gboolean nm_vpnc_dbus_handle_start_vpn (DBusMessage *message, NmVpncData *data) { char ** data_items = NULL; - int num_items = -1; + int num_items = -1; char ** password_items = NULL; - int num_passwords = -1; + int num_passwords = -1; + char ** user_routes = NULL; + int user_routes_count = -1; const char * name = NULL; const char * user_name = NULL; DBusError error; @@ -596,6 +598,7 @@ static gboolean nm_vpnc_dbus_handle_start_vpn (DBusMessage *message, NmVpncData DBUS_TYPE_STRING, &user_name, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &password_items, &num_passwords, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &data_items, &num_items, + DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &user_routes, &user_routes_count, DBUS_TYPE_INVALID)) { nm_warning ("Could not process the request because its arguments were invalid. dbus said: '%s'", error.message); @@ -622,6 +625,8 @@ static gboolean nm_vpnc_dbus_handle_start_vpn (DBusMessage *message, NmVpncData out: dbus_free_string_array (data_items); + dbus_free_string_array (password_items); + dbus_free_string_array (user_routes); if (!success) nm_vpnc_set_state (data, NM_VPN_STATE_STOPPED); return success;