[network-manager-openconnect: 11/15] properties: split "nm-openconnect-editor-plugin.c" out of "nm-openconnect.c"
- From: Thomas Haller <thaller src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [network-manager-openconnect: 11/15] properties: split "nm-openconnect-editor-plugin.c" out of "nm-openconnect.c"
- Date: Thu, 16 Jun 2016 15:24:34 +0000 (UTC)
commit 78cb33c06683261c23abe7693186b61a4c50bcb0
Author: Thomas Haller <thaller redhat com>
Date: Thu Jun 16 17:17:50 2016 +0200
properties: split "nm-openconnect-editor-plugin.c" out of "nm-openconnect.c"
po/POTFILES.in | 3 +-
properties/Makefile.am | 24 +-
properties/auth-helpers.c | 2 -
properties/nm-openconnect-editor-plugin.c | 514 +++++++++++
...penconnect.h => nm-openconnect-editor-plugin.h} | 28 +-
properties/nm-openconnect-editor.c | 505 ++++++++++
.../{nm-openconnect.h => nm-openconnect-editor.h} | 31 +-
properties/nm-openconnect.c | 973 --------------------
8 files changed, 1045 insertions(+), 1035 deletions(-)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index c1d06d8..948e971 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -4,7 +4,8 @@ appdata/network-manager-openconnect.metainfo.xml.in
auth-dialog/main.c
openconnect-strings.txt
properties/auth-helpers.c
-properties/nm-openconnect.c
+properties/nm-openconnect-editor-plugin.c
+properties/nm-openconnect-editor.c
src/nm-openconnect-service.c
shared/nm-utils/nm-vpn-plugin-utils.c
[type: gettext/glade]properties/nm-openconnect-dialog.ui
diff --git a/properties/Makefile.am b/properties/Makefile.am
index 1d70913..f8bb09f 100644
--- a/properties/Makefile.am
+++ b/properties/Makefile.am
@@ -4,16 +4,22 @@ if WITH_LIBNM_GLIB
plugin_LTLIBRARIES += libnm-openconnect-properties.la
endif
-uidir = $(datadir)/gnome-vpn-properties/openconnect
-ui_DATA = nm-openconnect-dialog.ui
-
plugin_sources = \
+ $(top_srcdir)/shared/nm-utils/nm-vpn-editor-plugin-call.h \
+ nm-openconnect-editor-plugin.c \
+ nm-openconnect-editor-plugin.h \
+ $(NULL)
+
+editor_sources = \
auth-helpers.c \
auth-helpers.h \
- nm-openconnect.c \
- nm-openconnect.h
+ nm-openconnect-editor.c \
+ nm-openconnect-editor.h
$(NULL)
+uidir = $(datadir)/gnome-vpn-properties/openconnect
+ui_DATA = nm-openconnect-dialog.ui
+
common_CFLAGS = \
$(GLIB_CFLAGS) \
$(GTK_CFLAGS) \
@@ -26,7 +32,8 @@ common_CFLAGS = \
###############################################################################
libnm_vpn_plugin_openconnect_la_SOURCES = \
- $(plugin_sources)
+ $(plugin_sources) \
+ $(editor_sources)
libnm_vpn_plugin_openconnect_la_CFLAGS = \
-DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_LIB \
@@ -45,7 +52,8 @@ libnm_vpn_plugin_openconnect_la_LDFLAGS = \
###############################################################################
libnm_openconnect_properties_la_SOURCES = \
- $(plugin_sources)
+ $(plugin_sources) \
+ $(editor_sources)
libnm_openconnect_properties_la_CFLAGS = \
-DNM_VPN_OLD \
@@ -67,7 +75,7 @@ libnm_openconnect_properties_la_LDFLAGS = \
CLEANFILES = *.bak *~
EXTRA_DIST = \
- $(ui_DATA) \
libnm-openconnect-properties.ver \
libnm-vpn-plugin-openconnect.ver \
+ nm-openconnect-dialog.ui \
$(NULL)
diff --git a/properties/auth-helpers.c b/properties/auth-helpers.c
index e60d16f..a5a0248 100644
--- a/properties/auth-helpers.c
+++ b/properties/auth-helpers.c
@@ -33,8 +33,6 @@
#include <unistd.h>
#include <errno.h>
-#include "nm-openconnect.h"
-
void
tls_pw_init_auth_widget (GtkBuilder *builder,
GtkSizeGroup *group,
diff --git a/properties/nm-openconnect-editor-plugin.c b/properties/nm-openconnect-editor-plugin.c
new file mode 100644
index 0000000..8486b59
--- /dev/null
+++ b/properties/nm-openconnect-editor-plugin.c
@@ -0,0 +1,514 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/***************************************************************************
+ * Copyright (C) 2005 David Zeuthen, <davidz redhat com>
+ * Copyright (C) 2005 - 2008 Dan Williams, <dcbw redhat com>
+ * Copyright (C) 2005 - 2011 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ **************************************************************************/
+
+#include "nm-default.h"
+
+#include "nm-openconnect-editor-plugin.h"
+
+#include <stdio.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <openconnect.h>
+
+#ifndef OPENCONNECT_CHECK_VER
+#define OPENCONNECT_CHECK_VER(x,y) 0
+#endif
+
+#if !OPENCONNECT_CHECK_VER(2,1)
+#define openconnect_has_stoken_support() 0
+#endif
+#if !OPENCONNECT_CHECK_VER(2,2)
+#define openconnect_has_oath_support() 0
+#endif
+
+#include "nm-openconnect-editor.h"
+
+#ifndef NM_VPN_OLD
+#include "nm-utils/nm-vpn-editor-plugin-call.h"
+#endif
+
+#define OPENCONNECT_PLUGIN_NAME _("Cisco AnyConnect Compatible VPN (openconnect)")
+#define OPENCONNECT_PLUGIN_DESC _("Compatible with Cisco AnyConnect SSL VPN.")
+
+/************** plugin class **************/
+
+enum {
+ PROP_0,
+ PROP_NAME,
+ PROP_DESC,
+ PROP_SERVICE
+};
+
+static void openconnect_editor_plugin_interface_init (NMVpnEditorPluginInterface *iface_class);
+
+G_DEFINE_TYPE_EXTENDED (OpenconnectEditorPlugin, openconnect_editor_plugin, G_TYPE_OBJECT, 0,
+ G_IMPLEMENT_INTERFACE (NM_TYPE_VPN_EDITOR_PLUGIN,
+ openconnect_editor_plugin_interface_init))
+
+typedef struct {
+ char **supported_protocols;
+} OpenconnectEditorPluginPrivate;
+
+#define OPENCONNECT_EDITOR_PLUGIN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o),
OPENCONNECT_TYPE_EDITOR_PLUGIN, OpenconnectEditorPluginPrivate))
+
+/************** import/export **************/
+
+typedef enum {
+ NM_OPENCONNECT_IMPORT_EXPORT_ERROR_UNKNOWN = 0,
+ NM_OPENCONNECT_IMPORT_EXPORT_ERROR_NOT_OPENCONNECT,
+ NM_OPENCONNECT_IMPORT_EXPORT_ERROR_BAD_DATA,
+} NMOpenconnectImportError;
+
+#define NM_OPENCONNECT_IMPORT_EXPORT_ERROR nm_openconnect_import_export_error_quark ()
+
+static GQuark
+nm_openconnect_import_export_error_quark (void)
+{
+ static GQuark quark = 0;
+
+ if (G_UNLIKELY (quark == 0))
+ quark = g_quark_from_static_string ("nm-openconnect-import-export-error-quark");
+ return quark;
+}
+
+static NMConnection *
+import (NMVpnEditorPlugin *iface, const char *path, GError **error)
+{
+ NMConnection *connection;
+ NMSettingConnection *s_con;
+ NMSettingVpn *s_vpn;
+ NMSettingIP4Config *s_ip4;
+ GKeyFile *keyfile;
+ GKeyFileFlags flags;
+ const char *buf;
+ gboolean bval;
+
+ keyfile = g_key_file_new ();
+ flags = G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS;
+
+ if (!g_key_file_load_from_file (keyfile, path, flags, NULL)) {
+ g_set_error (error,
+ NM_OPENCONNECT_IMPORT_EXPORT_ERROR,
+ NM_OPENCONNECT_IMPORT_EXPORT_ERROR_NOT_OPENCONNECT,
+ "does not look like a %s VPN connection (parse failed)",
+ OPENCONNECT_PLUGIN_NAME);
+ return NULL;
+ }
+
+ connection = nm_simple_connection_new ();
+ s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
+ nm_connection_add_setting (connection, NM_SETTING (s_con));
+
+ s_vpn = NM_SETTING_VPN (nm_setting_vpn_new ());
+ g_object_set (s_vpn, NM_SETTING_VPN_SERVICE_TYPE, NM_VPN_SERVICE_TYPE_OPENCONNECT, NULL);
+ nm_connection_add_setting (connection, NM_SETTING (s_vpn));
+
+ s_ip4 = NM_SETTING_IP4_CONFIG (nm_setting_ip4_config_new ());
+ nm_connection_add_setting (connection, NM_SETTING (s_ip4));
+
+ /* Host */
+ buf = g_key_file_get_string (keyfile, "openconnect", "Host", NULL);
+ if (buf) {
+ nm_setting_vpn_add_data_item (s_vpn, NM_OPENCONNECT_KEY_GATEWAY, buf);
+ } else {
+ g_set_error (error,
+ NM_OPENCONNECT_IMPORT_EXPORT_ERROR,
+ NM_OPENCONNECT_IMPORT_EXPORT_ERROR_BAD_DATA,
+ "does not look like a %s VPN connection (no Host)",
+ OPENCONNECT_PLUGIN_NAME);
+ g_object_unref (connection);
+ return NULL;
+ }
+
+ /* Optional Settings */
+
+ /* Description */
+ buf = g_key_file_get_string (keyfile, "openconnect", "Description", NULL);
+ if (buf)
+ g_object_set (s_con, NM_SETTING_CONNECTION_ID, buf, NULL);
+
+ /* CA Certificate */
+ buf = g_key_file_get_string (keyfile, "openconnect", "CACert", NULL);
+ if (buf)
+ nm_setting_vpn_add_data_item (s_vpn, NM_OPENCONNECT_KEY_CACERT, buf);
+
+ /* Proxy */
+ buf = g_key_file_get_string (keyfile, "openconnect", "Proxy", NULL);
+ if (buf)
+ nm_setting_vpn_add_data_item (s_vpn, NM_OPENCONNECT_KEY_PROXY, buf);
+
+ /* Cisco Secure Desktop */
+ bval = g_key_file_get_boolean (keyfile, "openconnect", "CSDEnable", NULL);
+ if (bval)
+ nm_setting_vpn_add_data_item (s_vpn, NM_OPENCONNECT_KEY_CSD_ENABLE, "yes");
+
+ /* Cisco Secure Desktop wrapper */
+ buf = g_key_file_get_string (keyfile, "openconnect", "CSDWrapper", NULL);
+ if (buf)
+ nm_setting_vpn_add_data_item (s_vpn, NM_OPENCONNECT_KEY_CSD_WRAPPER, buf);
+
+ /* User Certificate */
+ buf = g_key_file_get_string (keyfile, "openconnect", "UserCertificate", NULL);
+ if (buf)
+ nm_setting_vpn_add_data_item (s_vpn, NM_OPENCONNECT_KEY_USERCERT, buf);
+
+ /* Private Key */
+ buf = g_key_file_get_string (keyfile, "openconnect", "PrivateKey", NULL);
+ if (buf)
+ nm_setting_vpn_add_data_item (s_vpn, NM_OPENCONNECT_KEY_PRIVKEY, buf);
+
+ /* FSID */
+ bval = g_key_file_get_boolean (keyfile, "openconnect", "FSID", NULL);
+ if (bval)
+ nm_setting_vpn_add_data_item (s_vpn, NM_OPENCONNECT_KEY_PEM_PASSPHRASE_FSID, "yes");
+
+ /* Soft token mode */
+ buf = g_key_file_get_string (keyfile, "openconnect", "StokenSource", NULL);
+ if (buf)
+ nm_setting_vpn_add_data_item (s_vpn, NM_OPENCONNECT_KEY_TOKEN_MODE, buf);
+
+ /* Soft token secret */
+ buf = g_key_file_get_string (keyfile, "openconnect", "StokenString", NULL);
+ if (buf)
+ nm_setting_vpn_add_secret (s_vpn, NM_OPENCONNECT_KEY_TOKEN_SECRET, buf);
+
+ return connection;
+}
+
+static gboolean
+export (NMVpnEditorPlugin *iface,
+ const char *path,
+ NMConnection *connection,
+ GError **error)
+{
+ NMSettingConnection *s_con;
+ NMSettingVpn *s_vpn;
+ const char *value;
+ const char *gateway = NULL;
+ const char *cacert = NULL;
+ const char *proxy = NULL;
+ gboolean csd_enable = FALSE;
+ const char *csd_wrapper = NULL;
+ const char *usercert = NULL;
+ const char *privkey = NULL;
+ gboolean pem_passphrase_fsid = FALSE;
+ const char *token_mode = NULL;
+ const char *token_secret = NULL;
+ gboolean success = FALSE;
+ FILE *f;
+
+ f = fopen (path, "w");
+ if (!f) {
+ g_set_error_literal (error,
+ NM_OPENCONNECT_IMPORT_EXPORT_ERROR,
+ NM_OPENCONNECT_IMPORT_EXPORT_ERROR_UNKNOWN,
+ "could not open file for writing");
+ return FALSE;
+ }
+
+ s_con = nm_connection_get_setting_connection (connection);
+
+ s_vpn = nm_connection_get_setting_vpn (connection);
+
+ value = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_GATEWAY);
+ if (value && strlen (value))
+ gateway = value;
+ else {
+ g_set_error_literal (error,
+ NM_OPENCONNECT_IMPORT_EXPORT_ERROR,
+ NM_OPENCONNECT_IMPORT_EXPORT_ERROR_BAD_DATA,
+ "connection was incomplete (missing gateway)");
+ goto done;
+ }
+
+ value = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_CACERT);
+ if (value && strlen (value))
+ cacert = value;
+
+ value = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_PROXY);
+ if (value && strlen (value))
+ proxy = value;
+
+ value = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_CSD_ENABLE);
+ if (value && !strcmp (value, "yes"))
+ csd_enable = TRUE;
+
+ value = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_CSD_WRAPPER);
+ if (value && strlen (value))
+ csd_wrapper = value;
+
+ value = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_USERCERT);
+ if (value && strlen (value))
+ usercert = value;
+
+ value = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_PRIVKEY);
+ if (value && strlen (value))
+ privkey = value;
+
+ value = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_PEM_PASSPHRASE_FSID);
+ if (value && !strcmp (value, "yes"))
+ pem_passphrase_fsid = TRUE;
+
+ value = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_TOKEN_MODE);
+ if (value && strlen (value))
+ token_mode = value;
+
+ value = nm_setting_vpn_get_secret (s_vpn, NM_OPENCONNECT_KEY_TOKEN_SECRET);
+ if (value && strlen (value))
+ token_secret = value;
+ else {
+ value = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_TOKEN_SECRET);
+ if (value && strlen (value))
+ token_secret = value;
+ }
+
+ fprintf (f,
+ "[openconnect]\n"
+ "Description=%s\n"
+ "Host=%s\n"
+ "CACert=%s\n"
+ "Proxy=%s\n"
+ "CSDEnable=%s\n"
+ "CSDWrapper=%s\n"
+ "UserCertificate=%s\n"
+ "PrivateKey=%s\n"
+ "FSID=%s\n"
+ "StokenSource=%s\n"
+ "StokenString=%s\n",
+ /* Description */ nm_setting_connection_get_id (s_con),
+ /* Host */ gateway,
+ /* CA Certificate */ cacert,
+ /* Proxy */ proxy ? proxy : "",
+ /* Cisco Secure Desktop */ csd_enable ? "1" : "0",
+ /* CSD Wrapper Script */ csd_wrapper ? csd_wrapper : "",
+ /* User Certificate */ usercert,
+ /* Private Key */ privkey,
+ /* FSID */ pem_passphrase_fsid ? "1" : "0",
+ /* Soft token mode */ token_mode ? token_mode : "",
+ /* Soft token secret */ token_secret ? token_secret : "");
+
+ success = TRUE;
+
+done:
+ fclose (f);
+ return success;
+}
+
+static guint32
+get_capabilities (NMVpnEditorPlugin *iface)
+{
+ return (NM_VPN_EDITOR_PLUGIN_CAPABILITY_IMPORT |
+ NM_VPN_EDITOR_PLUGIN_CAPABILITY_EXPORT |
+ NM_VPN_EDITOR_PLUGIN_CAPABILITY_IPV6);
+}
+
+#ifndef NM_VPN_OLD
+static void
+notify_plugin_info_set (NMVpnEditorPlugin *plugin,
+ NMVpnPluginInfo *plugin_info)
+{
+ OpenconnectEditorPluginPrivate *priv = OPENCONNECT_EDITOR_PLUGIN_GET_PRIVATE (plugin);
+ const char *supported_protocols;
+ guint i, j;
+
+ if (!plugin_info)
+ return;
+
+ supported_protocols = nm_vpn_plugin_info_lookup_property (plugin_info, "openconnect",
"supported-protocols");
+
+ g_strfreev (priv->supported_protocols);
+ priv->supported_protocols = supported_protocols
+ ? g_strsplit_set (supported_protocols, ",", -1)
+ : g_new0 (char *, 1);
+
+ /*remove empty entries and whitespace */
+ for (i = 0, j = 0; priv->supported_protocols[j]; j++) {
+ g_strstrip (priv->supported_protocols[j]);
+ if (priv->supported_protocols[j][0] == '\0')
+ g_free (priv->supported_protocols[j]);
+ else
+ priv->supported_protocols[i++] = priv->supported_protocols[j];
+ }
+ priv->supported_protocols[i] = NULL;
+}
+
+static char **
+_vt_impl_get_service_add_details (NMVpnEditorPlugin *plugin,
+ const char *service_type)
+{
+ return g_strdupv (OPENCONNECT_EDITOR_PLUGIN_GET_PRIVATE (plugin)->supported_protocols);
+}
+
+static gboolean
+_vt_impl_get_service_add_detail (NMVpnEditorPlugin *plugin,
+ const char *service_type,
+ const char *add_detail,
+ char **out_pretty_name,
+ char **out_description,
+ char **out_add_detail_key,
+ char **out_add_detail_val,
+ guint *out_flags)
+{
+ OpenconnectEditorPluginPrivate *priv;
+ guint i;
+
+ if (!nm_streq (service_type, NM_VPN_SERVICE_TYPE_OPENCONNECT))
+ return FALSE;
+
+ priv = OPENCONNECT_EDITOR_PLUGIN_GET_PRIVATE (plugin);
+ for (i = 0; priv->supported_protocols[i]; i++) {
+ if (!nm_streq (add_detail, priv->supported_protocols[i]))
+ continue;
+ if (nm_streq (add_detail, "anyconnect")) {
+ NM_SET_OUT (out_pretty_name, g_strdup (OPENCONNECT_PLUGIN_NAME));
+ NM_SET_OUT (out_description, g_strdup (OPENCONNECT_PLUGIN_DESC));
+ /* we unset @add_detail, because "anyconnect" is the default and no need
+ * to set the protocol explicitly. */
+ add_detail = NULL;
+ } else if (nm_streq (add_detail, "nc")) {
+ NM_SET_OUT (out_pretty_name, g_strdup (_("Juniper Network Connect (openconnect)")));
+ NM_SET_OUT (out_description, g_strdup (_("Compatible with Juniper Network Connect /
Pulse Secure SSL VPN")));
+ } else {
+ /* we don't know this protocol by name, but it's configured in the .name file,
+ * so just take it. */
+ NM_SET_OUT (out_pretty_name, g_strdup_printf (_("Openconnect VPN (%s)"), add_detail));
+ NM_SET_OUT (out_description, g_strdup_printf (_("Openconnect SSL VPN with %s
protocol"), add_detail));
+ }
+ NM_SET_OUT (out_add_detail_key, g_strdup (add_detail ? NM_OPENCONNECT_KEY_PROTOCOL : NULL));
+ NM_SET_OUT (out_add_detail_val, g_strdup (add_detail));
+ NM_SET_OUT (out_flags, 0);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+NM_VPN_EDITOR_PLUGIN_VT_DEFINE (vt, _get_vt,
+ .fcn_get_service_add_details = _vt_impl_get_service_add_details,
+ .fcn_get_service_add_detail = _vt_impl_get_service_add_detail,
+)
+
+#endif
+
+static NMVpnEditor *
+get_editor (NMVpnEditorPlugin *iface, NMConnection *connection, GError **error)
+{
+ return nm_vpn_editor_interface_new (connection, error);
+}
+
+static void
+get_property (GObject *object, guint prop_id,
+ GValue *value, GParamSpec *pspec)
+{
+ switch (prop_id) {
+ case PROP_NAME:
+ g_value_set_string (value, OPENCONNECT_PLUGIN_NAME);
+ break;
+ case PROP_DESC:
+ g_value_set_string (value, OPENCONNECT_PLUGIN_DESC);
+ break;
+ case PROP_SERVICE:
+ g_value_set_string (value, NM_VPN_SERVICE_TYPE_OPENCONNECT);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+openconnect_editor_plugin_dispose (GObject *object)
+{
+ OpenconnectEditorPlugin *plugin = OPENCONNECT_EDITOR_PLUGIN (object);
+ OpenconnectEditorPluginPrivate *priv = OPENCONNECT_EDITOR_PLUGIN_GET_PRIVATE (plugin);
+
+ g_strfreev (priv->supported_protocols);
+ priv->supported_protocols = NULL;
+
+ G_OBJECT_CLASS (openconnect_editor_plugin_parent_class)->dispose (object);
+}
+
+static void
+openconnect_editor_plugin_class_init (OpenconnectEditorPluginClass *req_class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (req_class);
+
+ g_type_class_add_private (req_class, sizeof (OpenconnectEditorPluginPrivate));
+
+ object_class->get_property = get_property;
+ object_class->dispose = openconnect_editor_plugin_dispose;
+
+ g_object_class_override_property (object_class,
+ PROP_NAME,
+ NM_VPN_EDITOR_PLUGIN_NAME);
+
+ g_object_class_override_property (object_class,
+ PROP_DESC,
+ NM_VPN_EDITOR_PLUGIN_DESCRIPTION);
+
+ g_object_class_override_property (object_class,
+ PROP_SERVICE,
+ NM_VPN_EDITOR_PLUGIN_SERVICE);
+}
+
+static void
+openconnect_editor_plugin_init (OpenconnectEditorPlugin *plugin)
+{
+ OpenconnectEditorPluginPrivate *priv = OPENCONNECT_EDITOR_PLUGIN_GET_PRIVATE (plugin);
+ char *dflt[] = {
+ "anyconnect",
+ "nc",
+ NULL,
+ };
+
+ priv->supported_protocols = g_strdupv (dflt);
+}
+
+static void
+openconnect_editor_plugin_interface_init (NMVpnEditorPluginInterface *iface_class)
+{
+ /* interface implementation */
+ iface_class->get_editor = get_editor;
+ iface_class->get_capabilities = get_capabilities;
+ iface_class->import_from_file = import;
+ iface_class->export_to_file = export;
+#ifndef NM_VPN_OLD
+ iface_class->notify_plugin_info_set = notify_plugin_info_set;
+ iface_class->get_vt = _get_vt;
+#endif
+}
+
+G_MODULE_EXPORT NMVpnEditorPlugin *
+nm_vpn_editor_plugin_factory (GError **error)
+{
+ if (error)
+ g_return_val_if_fail (*error == NULL, NULL);
+
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+
+ return g_object_new (OPENCONNECT_TYPE_EDITOR_PLUGIN, NULL);
+}
+
diff --git a/properties/nm-openconnect.h b/properties/nm-openconnect-editor-plugin.h
similarity index 65%
copy from properties/nm-openconnect.h
copy to properties/nm-openconnect-editor-plugin.h
index a392b73..4625528 100644
--- a/properties/nm-openconnect.h
+++ b/properties/nm-openconnect-editor-plugin.h
@@ -1,7 +1,5 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
/***************************************************************************
- * nm-openconnect.h : GNOME UI dialogs for configuring openconnect VPN connections
- *
* Copyright (C) 2008 Dan Williams, <dcbw redhat com>
*
* This program is free software; you can redistribute it and/or modify
@@ -20,8 +18,8 @@
*
**************************************************************************/
-#ifndef _NM_OPENCONNECT_H_
-#define _NM_OPENCONNECT_H_
+#ifndef __NM_OPENCONNECT_EDITOR_PLUGIN_H__
+#define __NM_OPENCONNECT_EDITOR_PLUGIN_H__
#define OPENCONNECT_TYPE_EDITOR_PLUGIN (openconnect_editor_plugin_get_type ())
#define OPENCONNECT_EDITOR_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),
OPENCONNECT_TYPE_EDITOR_PLUGIN, OpenconnectEditorPlugin))
@@ -44,25 +42,5 @@ struct _OpenconnectEditorPluginClass {
GType openconnect_editor_plugin_get_type (void);
-#define OPENCONNECT_TYPE_EDITOR (openconnect_editor_get_type ())
-#define OPENCONNECT_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), OPENCONNECT_TYPE_EDITOR,
OpenconnectEditor))
-#define OPENCONNECT_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), OPENCONNECT_TYPE_EDITOR,
OpenconnectEditorClass))
-#define OPENCONNECT_IS_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), OPENCONNECT_TYPE_EDITOR))
-#define OPENCONNECT_IS_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), OPENCONNECT_TYPE_EDITOR))
-#define OPENCONNECT_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), OPENCONNECT_TYPE_EDITOR,
OpenconnectEditorClass))
-
-typedef struct _OpenconnectEditor OpenconnectEditor;
-typedef struct _OpenconnectEditorClass OpenconnectEditorClass;
-
-struct _OpenconnectEditor {
- GObject parent;
-};
-
-struct _OpenconnectEditorClass {
- GObjectClass parent;
-};
-
-GType openconnect_editor_get_type (void);
-
-#endif /* _NM_OPENCONNECT_H_ */
+#endif /* __NM_OPENCONNECT_EDITOR_PLUGIN_H__ */
diff --git a/properties/nm-openconnect-editor.c b/properties/nm-openconnect-editor.c
new file mode 100644
index 0000000..7021642
--- /dev/null
+++ b/properties/nm-openconnect-editor.c
@@ -0,0 +1,505 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/***************************************************************************
+ * Copyright (C) 2005 David Zeuthen, <davidz redhat com>
+ * Copyright (C) 2005 - 2008 Dan Williams, <dcbw redhat com>
+ * Copyright (C) 2005 - 2011 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ **************************************************************************/
+
+#include "nm-default.h"
+
+#include "nm-openconnect-editor.h"
+
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gtk/gtk.h>
+
+#include <openconnect.h>
+
+#ifndef OPENCONNECT_CHECK_VER
+#define OPENCONNECT_CHECK_VER(x,y) 0
+#endif
+
+#if !OPENCONNECT_CHECK_VER(2,1)
+#define openconnect_has_stoken_support() 0
+#endif
+#if !OPENCONNECT_CHECK_VER(2,2)
+#define openconnect_has_oath_support() 0
+#endif
+
+#include "auth-helpers.h"
+
+/************** UI widget class **************/
+
+static void openconnect_editor_interface_init (NMVpnEditorInterface *iface_class);
+
+G_DEFINE_TYPE_EXTENDED (OpenconnectEditor, openconnect_editor, G_TYPE_OBJECT, 0,
+ G_IMPLEMENT_INTERFACE (NM_TYPE_VPN_EDITOR,
+ openconnect_editor_interface_init))
+
+#define OPENCONNECT_EDITOR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), OPENCONNECT_TYPE_EDITOR,
OpenconnectEditorPrivate))
+
+typedef struct {
+ GtkBuilder *builder;
+ GtkWidget *widget;
+ GtkSizeGroup *group;
+ GtkWindowGroup *window_group;
+ gboolean window_added;
+} OpenconnectEditorPrivate;
+
+#define COL_AUTH_NAME 0
+#define COL_AUTH_PAGE 1
+#define COL_AUTH_TYPE 2
+
+/*****************************************************************************/
+
+static gboolean
+check_validity (OpenconnectEditor *self, GError **error)
+{
+ OpenconnectEditorPrivate *priv = OPENCONNECT_EDITOR_GET_PRIVATE (self);
+ GtkWidget *widget;
+ const char *str;
+
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "gateway_entry"));
+ str = gtk_entry_get_text (GTK_ENTRY (widget));
+ if (!str || !strlen (str)) {
+ g_set_error (error,
+ NMV_EDITOR_PLUGIN_ERROR,
+ NMV_EDITOR_PLUGIN_ERROR_INVALID_PROPERTY,
+ NM_OPENCONNECT_KEY_GATEWAY);
+ return FALSE;
+ }
+
+
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "proxy_entry"));
+ str = gtk_entry_get_text (GTK_ENTRY (widget));
+ if (str && str[0] &&
+ strncmp(str, "socks://", 8) && strncmp(str, "http://", 7)) {
+ g_set_error (error,
+ NMV_EDITOR_PLUGIN_ERROR,
+ NMV_EDITOR_PLUGIN_ERROR_INVALID_PROPERTY,
+ NM_OPENCONNECT_KEY_PROXY);
+ return FALSE;
+ }
+
+ if (!auth_widget_check_validity (priv->builder, error))
+ return FALSE;
+
+ return TRUE;
+}
+
+static void
+stuff_changed_cb (GtkWidget *widget, gpointer user_data)
+{
+ g_signal_emit_by_name (OPENCONNECT_EDITOR (user_data), "changed");
+}
+
+static gboolean
+init_token_mode_options (GtkComboBox *token_mode)
+{
+ GtkListStore *token_mode_list = GTK_LIST_STORE (gtk_combo_box_get_model (token_mode));
+ GtkTreeModel *model = GTK_TREE_MODEL (token_mode_list);
+ GtkTreeIter iter;
+ gboolean iter_valid;
+ int valid_rows = 0;
+
+ if (!gtk_tree_model_get_iter_first (model, &iter))
+ return FALSE;
+ do {
+ char *token_type;
+
+ gtk_tree_model_get (model, &iter, 2, &token_type, -1);
+ if (!strcmp (token_type, "stoken") && !openconnect_has_stoken_support ())
+ iter_valid = gtk_list_store_remove (token_mode_list, &iter);
+ else if (!strcmp (token_type, "totp") && !openconnect_has_oath_support ())
+ iter_valid = gtk_list_store_remove (token_mode_list, &iter);
+ else if (!strcmp (token_type, "hotp") &&
+ (!openconnect_has_oath_support () || !OPENCONNECT_CHECK_VER(3,4)))
+ iter_valid = gtk_list_store_remove (token_mode_list, &iter);
+ else {
+ iter_valid = gtk_tree_model_iter_next (model, &iter);
+ valid_rows++;
+ }
+ g_free (token_type);
+ } while (iter_valid);
+
+ /* if the only option is "Disabled", don't show the token section at all */
+ return valid_rows > 1;
+}
+
+static gboolean
+init_token_ui (OpenconnectEditor *self,
+ OpenconnectEditorPrivate *priv,
+ NMSettingVpn *s_vpn)
+{
+ GtkWidget *widget;
+ GtkComboBox *token_mode;
+ GtkTextBuffer *buffer;
+ const char *value;
+
+ token_mode = GTK_COMBO_BOX (gtk_builder_get_object (priv->builder, "token_mode"));
+ if (!token_mode)
+ return FALSE;
+ if (!init_token_mode_options (token_mode))
+ return TRUE;
+
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "token_vbox"));
+ if (!widget)
+ return FALSE;
+ gtk_box_pack_start (GTK_BOX (priv->widget), widget, FALSE, FALSE, 0);
+
+ if (s_vpn) {
+ GtkTreeModel *model = gtk_combo_box_get_model (token_mode);
+ int active_option = 0;
+
+ value = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_TOKEN_MODE);
+ if (value) {
+ int i;
+ GtkTreeIter iter;
+
+ if (!gtk_tree_model_get_iter_first (model, &iter))
+ return FALSE;
+ for (i = 0; ; i++) {
+ char *pref_value;
+
+ gtk_tree_model_get (model, &iter, 1, &pref_value, -1);
+ if (!strcmp (value, pref_value))
+ active_option = i;
+ g_free (pref_value);
+ if (!gtk_tree_model_iter_next (model, &iter))
+ break;
+ }
+ }
+ gtk_combo_box_set_active (token_mode, active_option);
+ }
+ g_signal_connect (G_OBJECT (token_mode), "changed", G_CALLBACK (stuff_changed_cb), self);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "token_secret"));
+ if (!widget)
+ return FALSE;
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
+ if (!buffer)
+ return FALSE;
+ if (s_vpn) {
+ value = nm_setting_vpn_get_secret (s_vpn, NM_OPENCONNECT_KEY_TOKEN_SECRET);
+ if (!value)
+ value = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_TOKEN_SECRET);
+ if (value)
+ gtk_text_buffer_set_text (buffer, value, -1);
+ }
+ g_signal_connect (G_OBJECT (buffer), "changed", G_CALLBACK (stuff_changed_cb), self);
+
+ return TRUE;
+}
+
+static gboolean
+init_editor_plugin (OpenconnectEditor *self, NMConnection *connection, GError **error)
+{
+ OpenconnectEditorPrivate *priv = OPENCONNECT_EDITOR_GET_PRIVATE (self);
+ NMSettingVpn *s_vpn;
+ GtkWidget *widget;
+ const char *value;
+
+ s_vpn = nm_connection_get_setting_vpn (connection);
+
+ priv->group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "gateway_entry"));
+ if (!widget)
+ return FALSE;
+ gtk_size_group_add_widget (priv->group, widget);
+ if (s_vpn) {
+ value = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_GATEWAY);
+ if (value)
+ gtk_entry_set_text (GTK_ENTRY (widget), value);
+ }
+ g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (stuff_changed_cb), self);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "proxy_entry"));
+ if (!widget)
+ return FALSE;
+ gtk_size_group_add_widget (priv->group, widget);
+ if (s_vpn) {
+ value = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_PROXY);
+ if (value)
+ gtk_entry_set_text (GTK_ENTRY (widget), value);
+ }
+ g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (stuff_changed_cb), self);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "fsid_button"));
+ if (!widget)
+ return FALSE;
+ if (s_vpn) {
+ value = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_PEM_PASSPHRASE_FSID);
+ if (value && !strcmp(value, "yes"))
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (widget), TRUE);
+ }
+ g_signal_connect (G_OBJECT (widget), "toggled", G_CALLBACK (stuff_changed_cb), self);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "csd_button"));
+ if (!widget)
+ return FALSE;
+ if (s_vpn) {
+ value = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_CSD_ENABLE);
+ if (value && !strcmp(value, "yes"))
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (widget), TRUE);
+ }
+ g_signal_connect (G_OBJECT (widget), "toggled", G_CALLBACK (stuff_changed_cb), self);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "csd_wrapper_entry"));
+ if (!widget)
+ return FALSE;
+ if (s_vpn) {
+ value = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_CSD_WRAPPER);
+ if (value)
+ gtk_entry_set_text (GTK_ENTRY (widget), value);
+ }
+ g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (stuff_changed_cb), self);
+
+ if (init_token_ui (self, priv, s_vpn) == FALSE)
+ return FALSE;
+
+ tls_pw_init_auth_widget (priv->builder, priv->group, s_vpn, stuff_changed_cb, self);
+
+ return TRUE;
+}
+
+static GObject *
+get_widget (NMVpnEditor *iface)
+{
+ OpenconnectEditor *self = OPENCONNECT_EDITOR (iface);
+ OpenconnectEditorPrivate *priv = OPENCONNECT_EDITOR_GET_PRIVATE (self);
+
+ return G_OBJECT (priv->widget);
+}
+
+static gboolean
+update_connection (NMVpnEditor *iface,
+ NMConnection *connection,
+ GError **error)
+{
+ OpenconnectEditor *self = OPENCONNECT_EDITOR (iface);
+ OpenconnectEditorPrivate *priv = OPENCONNECT_EDITOR_GET_PRIVATE (self);
+ NMSettingVpn *s_vpn;
+ GtkWidget *widget;
+ char *str;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gboolean token_secret_editable = FALSE;
+ GtkTextIter iter_start, iter_end;
+ GtkTextBuffer *buffer;
+ const char *auth_type = NULL;
+ const char *protocol = NULL;
+
+ s_vpn = nm_connection_get_setting_vpn (connection);
+ if (s_vpn)
+ protocol = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_PROTOCOL);
+
+ s_vpn = NM_SETTING_VPN (nm_setting_vpn_new ());
+ g_object_set (s_vpn, NM_SETTING_VPN_SERVICE_TYPE, NM_VPN_SERVICE_TYPE_OPENCONNECT, NULL);
+
+ if (protocol)
+ nm_setting_vpn_add_data_item (s_vpn, NM_OPENCONNECT_KEY_PROTOCOL, protocol);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "gateway_entry"));
+ str = (char *) gtk_entry_get_text (GTK_ENTRY (widget));
+ if (str && strlen (str))
+ nm_setting_vpn_add_data_item (s_vpn, NM_OPENCONNECT_KEY_GATEWAY, str);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "proxy_entry"));
+ str = (char *) gtk_entry_get_text (GTK_ENTRY (widget));
+ if (str && strlen (str))
+ nm_setting_vpn_add_data_item (s_vpn, NM_OPENCONNECT_KEY_PROXY, str);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "fsid_button"));
+ str = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget))?"yes":"no";
+ nm_setting_vpn_add_data_item (s_vpn, NM_OPENCONNECT_KEY_PEM_PASSPHRASE_FSID, str);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "csd_button"));
+ str = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget))?"yes":"no";
+ nm_setting_vpn_add_data_item (s_vpn, NM_OPENCONNECT_KEY_CSD_ENABLE, str);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "csd_wrapper_entry"));
+ str = (char *) gtk_entry_get_text (GTK_ENTRY (widget));
+ if (str && strlen (str))
+ nm_setting_vpn_add_data_item (s_vpn, NM_OPENCONNECT_KEY_CSD_WRAPPER, str);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "token_mode"));
+ model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
+ if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter)) {
+ gtk_tree_model_get (model, &iter, 1, &str, 3, &token_secret_editable, -1);
+ nm_setting_vpn_add_data_item (s_vpn, NM_OPENCONNECT_KEY_TOKEN_MODE, str);
+ g_free(str);
+ }
+
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "token_secret_label"));
+ gtk_widget_set_sensitive (widget, token_secret_editable);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "token_secret"));
+ gtk_widget_set_sensitive (widget, token_secret_editable);
+
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
+ gtk_text_buffer_get_start_iter (buffer, &iter_start);
+ gtk_text_buffer_get_end_iter (buffer, &iter_end);
+ str = (char *) gtk_text_buffer_get_text (buffer, &iter_start, &iter_end, TRUE);
+ if (str) {
+ char *src = str, *dst = str;
+
+ /* zap invalid characters */
+ for (; *src; src++)
+ if (*src >= ' ' && *src <= '~')
+ *(dst++) = *src;
+ *dst = 0;
+
+ if (strlen (str))
+ nm_setting_vpn_add_secret (s_vpn, NM_OPENCONNECT_KEY_TOKEN_SECRET, str);
+ }
+
+ if (!check_validity (self, error))
+ return FALSE;
+
+ /* These are different for every login session, and should not be stored */
+ nm_setting_set_secret_flags (NM_SETTING (s_vpn), "gwcert",
+ NM_SETTING_SECRET_FLAG_NOT_SAVED, NULL);
+ nm_setting_set_secret_flags (NM_SETTING (s_vpn), "cookie",
+ NM_SETTING_SECRET_FLAG_NOT_SAVED, NULL);
+ nm_setting_set_secret_flags (NM_SETTING (s_vpn), "gateway",
+ NM_SETTING_SECRET_FLAG_NOT_SAVED, NULL);
+
+ /* These are purely internal data for the auth-dialog, and should be stored */
+ nm_setting_set_secret_flags (NM_SETTING (s_vpn), "xmlconfig",
+ NM_SETTING_SECRET_FLAG_NONE, NULL);
+ nm_setting_set_secret_flags (NM_SETTING (s_vpn), "lasthost",
+ NM_SETTING_SECRET_FLAG_NONE, NULL);
+ nm_setting_set_secret_flags (NM_SETTING (s_vpn), "autoconnect",
+ NM_SETTING_SECRET_FLAG_NONE, NULL);
+ nm_setting_set_secret_flags (NM_SETTING (s_vpn), "certsigs",
+ NM_SETTING_SECRET_FLAG_NONE, NULL);
+ /* Note that the auth-dialog will also store "extra" secrets for form
+ entries, depending on the arbitrary forms that we're offered by the
+ server during authentication. We can't know about those in advance,
+ but the presence of the above four is sufficient to trigger a write
+ of the new secrets, and the code in the keyfile plugin will treat the
+ absence of a flags configuration for a given secret as equivalent to
+ FLAG_NONE, and thus save our "extra" secrets too. */
+
+ auth_widget_update_connection (priv->builder, auth_type, s_vpn);
+
+ nm_connection_add_setting (connection, NM_SETTING (s_vpn));
+ return TRUE;
+}
+
+NMVpnEditor *
+nm_vpn_editor_interface_new (NMConnection *connection, GError **error)
+{
+ NMVpnEditor *object;
+ OpenconnectEditorPrivate *priv;
+ char *ui_file;
+
+ if (error)
+ g_return_val_if_fail (*error == NULL, NULL);
+
+ object = g_object_new (OPENCONNECT_TYPE_EDITOR, NULL);
+ if (!object) {
+ g_set_error (error, NMV_EDITOR_PLUGIN_ERROR, 0, "could not create openconnect object");
+ return NULL;
+ }
+
+ priv = OPENCONNECT_EDITOR_GET_PRIVATE (object);
+
+ ui_file = g_strdup_printf ("%s/%s", UIDIR, "nm-openconnect-dialog.ui");
+ priv->builder = gtk_builder_new ();
+
+ gtk_builder_set_translation_domain (priv->builder, GETTEXT_PACKAGE);
+
+ if (!gtk_builder_add_from_file (priv->builder, ui_file, error)) {
+ g_warning ("Couldn't load builder file: %s",
+ error && *error ? (*error)->message : "(unknown)");
+ g_clear_error (error);
+ g_set_error (error, NMV_EDITOR_PLUGIN_ERROR, 0,
+ "could not load required resources at %s", ui_file);
+ g_free (ui_file);
+ g_object_unref (object);
+ return NULL;
+ }
+ g_free (ui_file);
+
+ priv->widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "openconnect-vbox"));
+ if (!priv->widget) {
+ g_set_error (error, NMV_EDITOR_PLUGIN_ERROR, 0, "could not load UI widget");
+ g_object_unref (object);
+ return NULL;
+ }
+ g_object_ref_sink (priv->widget);
+
+ priv->window_group = gtk_window_group_new ();
+
+ if (!init_editor_plugin (OPENCONNECT_EDITOR (object), connection, error)) {
+ g_object_unref (object);
+ return NULL;
+ }
+
+ return object;
+}
+
+static void
+dispose (GObject *object)
+{
+ OpenconnectEditor *plugin = OPENCONNECT_EDITOR (object);
+ OpenconnectEditorPrivate *priv = OPENCONNECT_EDITOR_GET_PRIVATE (plugin);
+
+ if (priv->group)
+ g_object_unref (priv->group);
+
+ if (priv->window_group)
+ g_object_unref (priv->window_group);
+
+ if (priv->widget)
+ g_object_unref (priv->widget);
+
+ if (priv->builder)
+ g_object_unref (priv->builder);
+
+ G_OBJECT_CLASS (openconnect_editor_parent_class)->dispose (object);
+}
+
+static void
+openconnect_editor_class_init (OpenconnectEditorClass *req_class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (req_class);
+
+ g_type_class_add_private (req_class, sizeof (OpenconnectEditorPrivate));
+
+ object_class->dispose = dispose;
+}
+
+static void
+openconnect_editor_init (OpenconnectEditor *plugin)
+{
+}
+
+static void
+openconnect_editor_interface_init (NMVpnEditorInterface *iface_class)
+{
+ /* interface implementation */
+ iface_class->get_widget = get_widget;
+ iface_class->update_connection = update_connection;
+}
+
diff --git a/properties/nm-openconnect.h b/properties/nm-openconnect-editor.h
similarity index 60%
rename from properties/nm-openconnect.h
rename to properties/nm-openconnect-editor.h
index a392b73..7bca40b 100644
--- a/properties/nm-openconnect.h
+++ b/properties/nm-openconnect-editor.h
@@ -1,7 +1,5 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
/***************************************************************************
- * nm-openconnect.h : GNOME UI dialogs for configuring openconnect VPN connections
- *
* Copyright (C) 2008 Dan Williams, <dcbw redhat com>
*
* This program is free software; you can redistribute it and/or modify
@@ -20,29 +18,8 @@
*
**************************************************************************/
-#ifndef _NM_OPENCONNECT_H_
-#define _NM_OPENCONNECT_H_
-
-#define OPENCONNECT_TYPE_EDITOR_PLUGIN (openconnect_editor_plugin_get_type ())
-#define OPENCONNECT_EDITOR_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),
OPENCONNECT_TYPE_EDITOR_PLUGIN, OpenconnectEditorPlugin))
-#define OPENCONNECT_EDITOR_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),
OPENCONNECT_TYPE_EDITOR_PLUGIN, OpenconnectEditorPluginClass))
-#define OPENCONNECT_IS_EDITOR_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),
OPENCONNECT_TYPE_EDITOR_PLUGIN))
-#define OPENCONNECT_IS_EDITOR_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),
OPENCONNECT_TYPE_EDITOR_PLUGIN))
-#define OPENCONNECT_EDITOR_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),
OPENCONNECT_TYPE_EDITOR_PLUGIN, OpenconnectEditorPluginClass))
-
-typedef struct _OpenconnectEditorPlugin OpenconnectEditorPlugin;
-typedef struct _OpenconnectEditorPluginClass OpenconnectEditorPluginClass;
-
-struct _OpenconnectEditorPlugin {
- GObject parent;
-};
-
-struct _OpenconnectEditorPluginClass {
- GObjectClass parent;
-};
-
-GType openconnect_editor_plugin_get_type (void);
-
+#ifndef __NM_OPENCONNECT_EDITOR_H__
+#define __NM_OPENCONNECT_EDITOR_H__
#define OPENCONNECT_TYPE_EDITOR (openconnect_editor_get_type ())
#define OPENCONNECT_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), OPENCONNECT_TYPE_EDITOR,
OpenconnectEditor))
@@ -64,5 +41,7 @@ struct _OpenconnectEditorClass {
GType openconnect_editor_get_type (void);
-#endif /* _NM_OPENCONNECT_H_ */
+NMVpnEditor *nm_vpn_editor_interface_new (NMConnection *connection, GError **error);
+
+#endif /* __NM_OPENCONNECT_EDITOR_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]