CEPage * ce_page_vpn_new (NMConnectionEditor *editor, NMConnection *connection, GtkWindow *parent_window, NMClient *client, const char **out_secrets_setting_name, GError **error) { CEPageVpn *self; CEPageVpnPrivate *priv; const char *service_type; GError *local = NULL; self = CE_PAGE_VPN (ce_page_new (CE_TYPE_PAGE_VPN, editor, connection, parent_window, client, NULL, NULL, _("VPN"))); if (!self) { g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("Could not load VPN user interface.")); return NULL; } priv = CE_PAGE_VPN_GET_PRIVATE (self); priv->setting = nm_connection_get_setting_vpn (connection); g_assert (priv->setting); service_type = nm_setting_vpn_get_service_type (priv->setting); g_assert (service_type); priv->service_type = g_strdup (service_type); priv->plugin = vpn_get_plugin_by_service (service_type); if (!priv->plugin) { g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("Could not find VPN plugin for “%s”."), service_type); g_object_unref (self); return NULL; } priv->plugin = g_object_ref (priv->plugin); priv->editor = nm_vpn_editor_plugin_get_editor (priv->plugin, CE_PAGE (self)->connection, &local); if (!priv->editor) { g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("Could not load editor VPN plugin for “%s” (%s)."), service_type, local ? local->message : _("unknown failure")); g_clear_error (&local); g_object_unref (self); return NULL; } g_signal_connect (self, "initialized", G_CALLBACK (finish_setup), NULL); *out_secrets_setting_name = NM_SETTING_VPN_SETTING_NAME; return CE_PAGE (self); }
CEPage * ce_page_vpn_new (NMConnection *connection, GtkWindow *parent_window, NMClient *client, NMRemoteSettings *settings, const char **out_secrets_setting_name, GError **error) { CEPageVpn *self; CEPageVpnPrivate *priv; const char *service_type; self = CE_PAGE_VPN (ce_page_new (CE_TYPE_PAGE_VPN, connection, parent_window, client, settings, NULL, NULL, _("VPN"))); if (!self) { g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("Could not load VPN user interface.")); return NULL; } priv = CE_PAGE_VPN_GET_PRIVATE (self); priv->setting = nm_connection_get_setting_vpn (connection); g_assert (priv->setting); service_type = nm_setting_vpn_get_service_type (priv->setting); g_assert (service_type); priv->service_type = g_strdup (service_type); priv->plugin = vpn_get_plugin_by_service (service_type); if (!priv->plugin) { g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("Could not find VPN plugin service for '%s'."), service_type); g_object_unref (self); return NULL; } g_signal_connect (self, "initialized", G_CALLBACK (finish_setup), NULL); *out_secrets_setting_name = NM_SETTING_VPN_SETTING_NAME; return CE_PAGE (self); }
void vpn_export (NMConnection *connection) { GtkWidget *dialog; NMVpnPluginUiInterface *plugin; NMSettingVPN *s_vpn = NULL; const char *service_type; const char *home_folder; s_vpn = nm_connection_get_setting_vpn (connection); service_type = s_vpn ? nm_setting_vpn_get_service_type (s_vpn) : NULL; if (!service_type) { g_warning ("%s: invalid VPN connection!", __func__); return; } dialog = gtk_file_chooser_dialog_new (_("Export VPN connection..."), NULL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); home_folder = g_get_home_dir (); gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), home_folder); plugin = vpn_get_plugin_by_service (service_type); if (plugin) { char *suggested = NULL; suggested = nm_vpn_plugin_ui_interface_get_suggested_name (plugin, connection); if (suggested) { gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), suggested); g_free (suggested); } } g_signal_connect (G_OBJECT (dialog), "close", G_CALLBACK (gtk_widget_destroy), NULL); g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (export_vpn_to_file_cb), g_object_ref (connection)); gtk_widget_show_all (dialog); gtk_window_present (GTK_WINDOW (dialog)); }
gboolean vpn_supports_ipv6 (NMConnection *connection) { NMSettingVPN *s_vpn; const char *service_type; NMVpnPluginUiInterface *plugin; guint32 capabilities; s_vpn = nm_connection_get_setting_vpn (connection); g_return_val_if_fail (s_vpn != NULL, FALSE); service_type = nm_setting_vpn_get_service_type (s_vpn); g_return_val_if_fail (service_type != NULL, FALSE); plugin = vpn_get_plugin_by_service (service_type); g_return_val_if_fail (plugin != NULL, FALSE); capabilities = nm_vpn_plugin_ui_interface_get_capabilities (plugin); return (capabilities & NM_VPN_PLUGIN_UI_CAPABILITY_IPV6) != 0; }
gboolean vpn_supports_ipv6 (NMConnection *connection) { NMSettingVpn *s_vpn; const char *service_type; NMVpnEditorPlugin *plugin; guint32 capabilities; s_vpn = nm_connection_get_setting_vpn (connection); g_return_val_if_fail (s_vpn != NULL, FALSE); service_type = nm_setting_vpn_get_service_type (s_vpn); g_return_val_if_fail (service_type != NULL, FALSE); plugin = vpn_get_plugin_by_service (service_type); if (!plugin) return FALSE; capabilities = nm_vpn_editor_plugin_get_capabilities (plugin); return (capabilities & NM_VPN_EDITOR_PLUGIN_CAPABILITY_IPV6) != 0; }
CEPage * ce_page_vpn_new (NMConnection *connection, GtkWindow *parent_window, GError **error) { CEPageVpn *self; CEPageVpnPrivate *priv; CEPage *parent; const char *service_type; self = CE_PAGE_VPN (g_object_new (CE_TYPE_PAGE_VPN, CE_PAGE_CONNECTION, connection, CE_PAGE_PARENT_WINDOW, parent_window, NULL)); parent = CE_PAGE (self); priv = CE_PAGE_VPN_GET_PRIVATE (self); parent->title = g_strdup (_("VPN")); priv->setting = (NMSettingVPN *) nm_connection_get_setting (connection, NM_TYPE_SETTING_VPN); g_assert (priv->setting); service_type = nm_setting_vpn_get_service_type (priv->setting); g_assert (service_type); priv->service_type = g_strdup (service_type); priv->plugin = vpn_get_plugin_by_service (service_type); if (!priv->plugin) { g_set_error (error, 0, 0, _("Could not find VPN plugin service for '%s'."), service_type); g_object_unref (self); return NULL; } g_signal_connect (self, "initialized", G_CALLBACK (finish_setup), NULL); if (!ce_page_initialize (parent, NM_SETTING_VPN_SETTING_NAME, error)) { g_object_unref (self); return NULL; } return CE_PAGE (self); }
static void export_vpn_to_file_cb (GtkWidget *dialog, gint response, gpointer user_data) { NMConnection *connection = NM_CONNECTION (user_data); char *filename = NULL; GError *error = NULL; NMVpnPluginUiInterface *plugin; NMSettingConnection *s_con = NULL; NMSettingVPN *s_vpn = NULL; const char *service_type; const char *id = NULL; gboolean success = FALSE; if (response != GTK_RESPONSE_ACCEPT) goto out; filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); if (!filename) { g_set_error (&error, G_IO_ERROR, G_IO_ERROR_FAILED, "no filename"); goto done; } if (g_file_test (filename, G_FILE_TEST_EXISTS)) { int replace_response; GtkWidget *replace_dialog; char *bname; bname = g_path_get_basename (filename); replace_dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_CANCEL, _("A file named \"%s\" already exists."), bname); gtk_dialog_add_buttons (GTK_DIALOG (replace_dialog), _("_Replace"), GTK_RESPONSE_OK, NULL); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (replace_dialog), _("Do you want to replace %s with the VPN connection you are saving?"), bname); g_free (bname); replace_response = gtk_dialog_run (GTK_DIALOG (replace_dialog)); gtk_widget_destroy (replace_dialog); if (replace_response != GTK_RESPONSE_OK) goto out; } s_con = nm_connection_get_setting_connection (connection); id = s_con ? nm_setting_connection_get_id (s_con) : NULL; if (!id) { g_set_error (&error, G_IO_ERROR, G_IO_ERROR_FAILED, "connection setting invalid"); goto done; } s_vpn = nm_connection_get_setting_vpn (connection); service_type = s_vpn ? nm_setting_vpn_get_service_type (s_vpn) : NULL; if (!service_type) { g_set_error (&error, G_IO_ERROR, G_IO_ERROR_FAILED, "VPN setting invalid"); goto done; } plugin = vpn_get_plugin_by_service (service_type); if (plugin) success = nm_vpn_plugin_ui_interface_export (plugin, filename, connection, &error); done: if (!success) { GtkWidget *err_dialog; char *bname = filename ? g_path_get_basename (filename) : g_strdup ("(none)"); err_dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Cannot export VPN connection")); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (err_dialog), _("The VPN connection '%s' could not be exported to %s.\n\nError: %s."), id ? id : "(unknown)", bname, error ? error->message : "unknown error"); g_free (bname); g_signal_connect (err_dialog, "delete-event", G_CALLBACK (gtk_widget_destroy), NULL); g_signal_connect (err_dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL); gtk_widget_show_all (err_dialog); gtk_window_present (GTK_WINDOW (err_dialog)); } out: if (error) g_error_free (error); g_object_unref (connection); gtk_widget_hide (dialog); gtk_widget_destroy (dialog); }
void vpn_connection_new (FUNC_TAG_PAGE_NEW_CONNECTION_IMPL, GtkWindow *parent, const char *detail, gpointer detail_data, NMConnection *connection, NMClient *client, PageNewConnectionResultFunc result_func, gpointer user_data) { NMSetting *s_vpn; const char *service_type; gs_free char *service_type_free = NULL; gs_free char *add_detail_key_free = NULL; gs_free char *add_detail_val_free = NULL; const CEPageVpnDetailData *vpn_data = detail_data; gssize split_idx, l; const char *add_detail_key = NULL; const char *add_detail_val = NULL; gs_unref_object NMConnection *connection_tmp = NULL; if (!detail && !connection) { NewVpnInfo *info; /* This will happen if nm-c-e is launched from the command line * with "--create --type vpn". Dump the user back into the * new connection dialog to let them pick a subtype now. */ info = g_slice_new (NewVpnInfo); info->result_func = result_func; info->user_data = user_data; new_connection_dialog_full (parent, client, NEW_VPN_CONNECTION_PRIMARY_LABEL, NEW_VPN_CONNECTION_SECONDARY_LABEL, vpn_type_filter_func, vpn_type_result_func, info); return; } connection = _ensure_connection_other (connection, &connection_tmp); if (detail) { service_type = detail; add_detail_key = vpn_data ? vpn_data->add_detail_key : NULL; add_detail_val = vpn_data ? vpn_data->add_detail_val : NULL; service_type_free = nm_vpn_plugin_info_list_find_service_type (vpn_get_plugin_infos (), detail); if (service_type_free) service_type = service_type_free; else if (!vpn_data) { /* when called without @vpn_data, it means that @detail may contain "<SERVICE_TYPE>:<ADD_DETAIL>". * Try to parse them by spliting @detail at the colons and try to interpret the first part as * @service_type and the remainder as add-detail. */ l = strlen (detail); for (split_idx = 1; split_idx < l - 1; split_idx++) { if (detail[split_idx] == ':') { gs_free char *detail_main = g_strndup (detail, split_idx); NMVpnEditorPlugin *plugin; service_type_free = nm_vpn_plugin_info_list_find_service_type (vpn_get_plugin_infos (), detail_main); if (!service_type_free) continue; plugin = vpn_get_plugin_by_service (service_type_free); if (!plugin) { g_clear_pointer (&service_type_free, g_free); continue; } /* we found a @service_type. Try to use the remainder as add-detail. */ service_type = service_type_free; if (nm_vpn_editor_plugin_get_service_add_detail (plugin, service_type, &detail[split_idx + 1], NULL, NULL, &add_detail_key_free, &add_detail_val_free, NULL) && add_detail_key_free && add_detail_key_free[0] && add_detail_val_free && add_detail_val_free[0]) { add_detail_key = add_detail_key_free; add_detail_val = add_detail_val_free; } break; } } } if (!service_type) service_type = detail; s_vpn = nm_setting_vpn_new (); g_object_set (s_vpn, NM_SETTING_VPN_SERVICE_TYPE, service_type, NULL); if (add_detail_key) nm_setting_vpn_add_data_item ((NMSettingVpn *) s_vpn, add_detail_key, add_detail_val); nm_connection_add_setting (connection, s_vpn); } complete_vpn_connection (connection, client); (*result_func) (FUNC_TAG_PAGE_NEW_CONNECTION_RESULT_CALL, connection, FALSE, NULL, user_data); }