2 * Copyright (C) 2015 Lubomir Rintel
3 * Copyright (C) 2013 Tobias Brunner
4 * Copyright (C) 2008 Martin Willi
5 * HSR Hochschule fuer Technik Rapperswil
6 * Copyright (C) 2005 David Zeuthen
7 * Copyright (C) 2005-2008 Dan Williams
9 * Based on NetworkManager's vpnc plugin
11 * This program is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by the
13 * Free Software Foundation; either version 2 of the License, or (at your
14 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
16 * This program is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
27 #include <glib/gi18n-lib.h>
30 #ifdef NM_STRONGSWAN_OLD
31 #define NM_VPN_LIBNM_COMPAT
32 #include <nm-vpn-plugin-ui-interface.h>
33 #include <nm-setting-vpn.h>
34 #include <nm-setting-connection.h>
35 #include <nm-ui-utils.h>
37 #include <NetworkManager.h>
38 #include <nma-ui-utils.h>
41 #include "nm-strongswan.h"
43 #define STRONGSWAN_PLUGIN_NAME _("IPsec/IKEv2 (strongswan)")
44 #define STRONGSWAN_PLUGIN_DESC _("IPsec with the IKEv2 key exchange protocol.")
45 #define STRONGSWAN_PLUGIN_SERVICE "org.freedesktop.NetworkManager.strongswan"
46 #define NM_DBUS_SERVICE_STRONGSWAN "org.freedesktop.NetworkManager.strongswan"
48 /************** plugin class **************/
57 static void strongswan_plugin_ui_interface_init (NMVpnEditorPluginInterface
*iface_class
);
59 G_DEFINE_TYPE_EXTENDED (StrongswanPluginUi
, strongswan_plugin_ui
, G_TYPE_OBJECT
, 0,
60 G_IMPLEMENT_INTERFACE (NM_TYPE_VPN_EDITOR_PLUGIN
,
61 strongswan_plugin_ui_interface_init
))
63 /************** UI widget class **************/
65 static void strongswan_plugin_ui_widget_interface_init (NMVpnEditorInterface
*iface_class
);
70 } StrongswanPluginUiWidgetPrivate
;
72 G_DEFINE_TYPE_EXTENDED (StrongswanPluginUiWidget
, strongswan_plugin_ui_widget
, G_TYPE_OBJECT
, 0,
73 G_ADD_PRIVATE (StrongswanPluginUiWidget
)
74 G_IMPLEMENT_INTERFACE (NM_TYPE_VPN_EDITOR
,
75 strongswan_plugin_ui_widget_interface_init
))
77 #define STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE(o) ((StrongswanPluginUiWidgetPrivate*)strongswan_plugin_ui_widget_get_instance_private(o))
79 #define STRONGSWAN_PLUGIN_UI_ERROR strongswan_plugin_ui_error_quark ()
82 strongswan_plugin_ui_error_quark (void)
84 static GQuark error_quark
= 0;
86 if (G_UNLIKELY (error_quark
== 0))
87 error_quark
= g_quark_from_static_string ("strongswan-plugin-ui-error-quark");
92 #define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
95 strongswan_plugin_ui_error_get_type (void)
97 static GType etype
= 0;
100 static const GEnumValue values
[] = {
102 ENUM_ENTRY (STRONGSWAN_PLUGIN_UI_ERROR_UNKNOWN
, "UnknownError"),
103 /* The specified property was invalid. */
104 ENUM_ENTRY (STRONGSWAN_PLUGIN_UI_ERROR_INVALID_PROPERTY
, "InvalidProperty"),
105 /* The specified property was missing and is required. */
106 ENUM_ENTRY (STRONGSWAN_PLUGIN_UI_ERROR_MISSING_PROPERTY
, "MissingProperty"),
109 etype
= g_enum_register_static ("StrongswanPluginUiError", values
);
115 check_validity (StrongswanPluginUiWidget
*self
, GError
**error
)
117 StrongswanPluginUiWidgetPrivate
*priv
= STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (self
);
121 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "address-entry"));
122 str
= (char *) gtk_entry_get_text (GTK_ENTRY (widget
));
123 if (!str
|| !strlen (str
)) {
125 STRONGSWAN_PLUGIN_UI_ERROR
,
126 STRONGSWAN_PLUGIN_UI_ERROR_INVALID_PROPERTY
,
130 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "method-combo"));
131 switch (gtk_combo_box_get_active (GTK_COMBO_BOX (widget
)))
135 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-entry"));
136 str
= (char *) gtk_entry_get_text (GTK_ENTRY (widget
));
137 if (str
&& strlen (str
) < 20) {
139 STRONGSWAN_PLUGIN_UI_ERROR
,
140 STRONGSWAN_PLUGIN_UI_ERROR_INVALID_PROPERTY
,
141 "password is too short");
149 static void update_sensitive (GtkWidget
*widget
, StrongswanPluginUiWidgetPrivate
*priv
)
151 switch (gtk_combo_box_get_active (GTK_COMBO_BOX (widget
)))
154 gtk_combo_box_set_active (GTK_COMBO_BOX (widget
), 0);
157 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "usercert-label")), TRUE
);
158 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "usercert-button")), TRUE
);
159 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "userkey-label")), TRUE
);
160 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "userkey-button")), TRUE
);
161 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "user-label")), FALSE
);
162 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "user-entry")), FALSE
);
163 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-show")), FALSE
);
164 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-label")), FALSE
);
165 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-entry")), FALSE
);
168 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "usercert-label")), TRUE
);
169 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "usercert-button")), TRUE
);
170 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "user-label")), FALSE
);
171 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "user-entry")), FALSE
);
172 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-show")), FALSE
);
173 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-label")), FALSE
);
174 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-entry")), FALSE
);
175 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "userkey-label")), FALSE
);
176 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "userkey-button")), FALSE
);
179 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "usercert-label")), FALSE
);
180 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "usercert-button")), FALSE
);
181 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "user-label")), FALSE
);
182 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "user-entry")), FALSE
);
183 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-show")), FALSE
);
184 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-label")), FALSE
);
185 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-entry")), FALSE
);
186 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "userkey-label")), FALSE
);
187 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "userkey-button")), FALSE
);
191 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "user-label")), TRUE
);
192 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "user-entry")), TRUE
);
193 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-show")), TRUE
);
194 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-label")), TRUE
);
195 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-entry")), TRUE
);
196 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "usercert-label")), FALSE
);
197 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "usercert-button")), FALSE
);
198 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "userkey-label")), FALSE
);
199 gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "userkey-button")), FALSE
);
206 settings_changed_cb (GtkWidget
*widget
, gpointer user_data
)
208 StrongswanPluginUiWidget
*self
= STRONGSWAN_PLUGIN_UI_WIDGET (user_data
);
209 StrongswanPluginUiWidgetPrivate
*priv
= STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (self
);
211 if (widget
== GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "method-combo")))
213 update_sensitive (GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "method-combo")), priv
);
215 g_signal_emit_by_name (STRONGSWAN_PLUGIN_UI_WIDGET (user_data
), "changed");
219 show_toggled_cb (GtkCheckButton
*button
, StrongswanPluginUiWidget
*self
)
221 StrongswanPluginUiWidgetPrivate
*priv
= STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (self
);
225 visible
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button
));
227 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-entry"));
228 gtk_entry_set_visibility (GTK_ENTRY (widget
), visible
);
232 toggle_proposal_cb(GtkCheckButton
*button
, StrongswanPluginUiWidget
*self
)
234 StrongswanPluginUiWidgetPrivate
*priv
= STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (self
);
235 gboolean visible
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button
));
236 gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(priv
->builder
, "ike-entry")), visible
);
237 gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(priv
->builder
, "esp-entry")), visible
);
241 password_storage_changed_cb (GObject
*entry
, GParamSpec
*pspec
, gpointer user_data
)
243 settings_changed_cb (NULL
, STRONGSWAN_PLUGIN_UI_WIDGET (user_data
));
247 init_password_icon (StrongswanPluginUiWidget
*self
, NMSettingVpn
*settings
,
248 const char *secret_key
, const char *entry_name
)
250 StrongswanPluginUiWidgetPrivate
*priv
= STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (self
);
252 const char *value
= NULL
;
253 NMSettingSecretFlags pw_flags
= NM_SETTING_SECRET_FLAG_NONE
;
255 /* If there's already a password and the password type can't be found in
256 * the VPN settings, default to saving it. Otherwise, always ask for it.
258 entry
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, entry_name
));
260 nma_utils_setup_password_storage (entry
, 0, NM_SETTING (settings
), secret_key
, TRUE
, FALSE
);
262 /* If there's no password and no flags in the setting,
263 * initialize flags as "always-ask".
267 nm_setting_get_secret_flags (NM_SETTING (settings
), secret_key
, &pw_flags
, NULL
);
270 value
= gtk_entry_get_text (GTK_ENTRY (entry
));
271 if ((!value
|| !*value
) && (pw_flags
== NM_SETTING_SECRET_FLAG_NONE
))
273 nma_utils_update_password_storage (entry
, NM_SETTING_SECRET_FLAG_NOT_SAVED
,
274 NM_SETTING (settings
), secret_key
);
277 g_signal_connect (entry
, "notify::secondary-icon-name",
278 G_CALLBACK (password_storage_changed_cb
), self
);
282 init_plugin_ui (StrongswanPluginUiWidget
*self
, NMConnection
*connection
, GError
**error
)
284 StrongswanPluginUiWidgetPrivate
*priv
= STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (self
);
285 NMSettingVpn
*settings
;
289 settings
= NM_SETTING_VPN(nm_connection_get_setting(connection
, NM_TYPE_SETTING_VPN
));
290 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "address-entry"));
291 value
= nm_setting_vpn_get_data_item (settings
, "address");
293 gtk_entry_set_text (GTK_ENTRY (widget
), value
);
294 g_signal_connect (G_OBJECT (widget
), "changed", G_CALLBACK (settings_changed_cb
), self
);
296 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "certificate-button"));
297 value
= nm_setting_vpn_get_data_item (settings
, "certificate");
299 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget
), value
);
300 g_signal_connect (G_OBJECT (widget
), "selection-changed", G_CALLBACK (settings_changed_cb
), self
);
302 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "remote-identity-entry"));
303 value
= nm_setting_vpn_get_data_item (settings
, "remote-identity");
305 gtk_entry_set_text (GTK_ENTRY (widget
), value
);
306 g_signal_connect (G_OBJECT (widget
), "changed", G_CALLBACK (settings_changed_cb
), self
);
308 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "user-entry"));
309 value
= nm_setting_vpn_get_data_item (settings
, "user");
311 gtk_entry_set_text (GTK_ENTRY (widget
), value
);
312 g_signal_connect (G_OBJECT (widget
), "changed", G_CALLBACK (settings_changed_cb
), self
);
314 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-show"));
315 g_signal_connect (G_OBJECT (widget
), "toggled", G_CALLBACK (show_toggled_cb
), self
);
316 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-entry"));
317 value
= nm_setting_vpn_get_secret (settings
, "password");
319 gtk_entry_set_text (GTK_ENTRY (widget
), value
);
320 g_signal_connect (G_OBJECT (widget
), "changed", G_CALLBACK (settings_changed_cb
), self
);
321 init_password_icon (self
, settings
, "password", "passwd-entry");
323 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "method-combo"));
324 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget
), _("Certificate/private key"));
325 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget
), _("Certificate/ssh-agent"));
326 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget
), _("Smartcard"));
327 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget
), _("EAP"));
328 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget
), _("Pre-shared key"));
329 value
= nm_setting_vpn_get_data_item (settings
, "method");
331 if (g_strcmp0 (value
, "key") == 0) {
332 gtk_combo_box_set_active (GTK_COMBO_BOX (widget
), 0);
334 if (g_strcmp0 (value
, "agent") == 0) {
335 gtk_combo_box_set_active (GTK_COMBO_BOX (widget
), 1);
337 if (g_strcmp0 (value
, "smartcard") == 0) {
338 gtk_combo_box_set_active (GTK_COMBO_BOX (widget
), 2);
340 if (g_strcmp0 (value
, "eap") == 0) {
341 gtk_combo_box_set_active (GTK_COMBO_BOX (widget
), 3);
343 if (g_strcmp0 (value
, "psk") == 0) {
344 gtk_combo_box_set_active (GTK_COMBO_BOX (widget
), 4);
347 if (gtk_combo_box_get_active (GTK_COMBO_BOX (widget
)) == -1)
349 gtk_combo_box_set_active (GTK_COMBO_BOX (widget
), 0);
351 update_sensitive (widget
, priv
);
352 g_signal_connect (G_OBJECT (widget
), "changed", G_CALLBACK (settings_changed_cb
), self
);
354 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "usercert-button"));
355 value
= nm_setting_vpn_get_data_item (settings
, "usercert");
357 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget
), value
);
358 g_signal_connect (G_OBJECT (widget
), "selection-changed", G_CALLBACK (settings_changed_cb
), self
);
360 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "userkey-button"));
361 value
= nm_setting_vpn_get_data_item (settings
, "userkey");
363 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget
), value
);
364 g_signal_connect (G_OBJECT (widget
), "selection-changed", G_CALLBACK (settings_changed_cb
), self
);
366 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "virtual-check"));
367 value
= nm_setting_vpn_get_data_item (settings
, "virtual");
368 if (value
&& strcmp(value
, "yes") == 0)
370 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget
), TRUE
);
372 g_signal_connect (G_OBJECT (widget
), "toggled", G_CALLBACK (settings_changed_cb
), self
);
374 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "encap-check"));
375 value
= nm_setting_vpn_get_data_item (settings
, "encap");
376 if (value
&& strcmp(value
, "yes") == 0)
378 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget
), TRUE
);
380 g_signal_connect (G_OBJECT (widget
), "toggled", G_CALLBACK (settings_changed_cb
), self
);
382 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "ipcomp-check"));
383 value
= nm_setting_vpn_get_data_item (settings
, "ipcomp");
384 if (value
&& strcmp(value
, "yes") == 0)
386 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget
), TRUE
);
388 g_signal_connect (G_OBJECT (widget
), "toggled", G_CALLBACK (settings_changed_cb
), self
);
390 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "proposal-check"));
391 value
= nm_setting_vpn_get_data_item(settings
, "proposal");
392 if (value
&& strcmp(value
, "yes") == 0)
393 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget
), TRUE
);
395 toggle_proposal_cb(GTK_CHECK_BUTTON(widget
), self
);
396 g_signal_connect (G_OBJECT (widget
), "toggled", G_CALLBACK (toggle_proposal_cb
), self
);
398 widget
= GTK_WIDGET(gtk_builder_get_object(priv
->builder
, "ike-entry"));
399 value
= nm_setting_vpn_get_data_item(settings
, "ike");
402 value
= g_strdelimit (g_strdup (value
), ";", ',');
403 gtk_entry_set_text (GTK_ENTRY (widget
), value
);
404 g_free ((char*)value
);
406 g_signal_connect (G_OBJECT (widget
), "changed", G_CALLBACK (settings_changed_cb
), self
);
408 widget
= GTK_WIDGET(gtk_builder_get_object(priv
->builder
, "esp-entry"));
409 value
= nm_setting_vpn_get_data_item(settings
, "esp");
412 value
= g_strdelimit (g_strdup (value
), ";", ',');
413 gtk_entry_set_text (GTK_ENTRY (widget
), value
);
414 g_free ((char*)value
);
416 g_signal_connect (G_OBJECT (widget
), "changed", G_CALLBACK (settings_changed_cb
), self
);
422 get_widget (NMVpnEditor
*iface
)
424 StrongswanPluginUiWidget
*self
= STRONGSWAN_PLUGIN_UI_WIDGET (iface
);
425 StrongswanPluginUiWidgetPrivate
*priv
= STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (self
);
427 return G_OBJECT (priv
->widget
);
431 save_password_and_flags (NMSettingVpn
*settings
, GtkBuilder
*builder
,
432 const char *entry_name
, const char *secret_key
)
434 NMSettingSecretFlags flags
;
435 const char *password
;
438 /* Get secret flags */
439 entry
= GTK_WIDGET (gtk_builder_get_object (builder
, entry_name
));
440 flags
= nma_utils_menu_to_secret_flags (entry
);
442 /* Save password and convert flags to legacy data items */
444 case NM_SETTING_SECRET_FLAG_NONE
:
446 case NM_SETTING_SECRET_FLAG_AGENT_OWNED
:
447 password
= gtk_entry_get_text (GTK_ENTRY (entry
));
448 if (password
&& strlen (password
))
450 nm_setting_vpn_add_secret (settings
, secret_key
, password
);
457 /* Set new secret flags */
458 nm_setting_set_secret_flags (NM_SETTING (settings
), secret_key
, flags
, NULL
);
462 update_connection (NMVpnEditor
*iface
,
463 NMConnection
*connection
,
466 StrongswanPluginUiWidget
*self
= STRONGSWAN_PLUGIN_UI_WIDGET (iface
);
467 StrongswanPluginUiWidgetPrivate
*priv
= STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (self
);
468 NMSettingVpn
*settings
;
473 if (!check_validity (self
, error
))
475 settings
= NM_SETTING_VPN (nm_setting_vpn_new ());
477 g_object_set (settings
, NM_SETTING_VPN_SERVICE_TYPE
,
478 NM_DBUS_SERVICE_STRONGSWAN
, NULL
);
480 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "address-entry"));
481 str
= (char *) gtk_entry_get_text (GTK_ENTRY (widget
));
482 if (str
&& strlen (str
)) {
483 nm_setting_vpn_add_data_item (settings
, "address", str
);
486 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "certificate-button"));
487 str
= (char *) gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget
));
489 nm_setting_vpn_add_data_item (settings
, "certificate", str
);
492 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "remote-identity-entry"));
493 str
= (char *) gtk_entry_get_text (GTK_ENTRY (widget
));
494 if (str
&& strlen (str
)) {
495 nm_setting_vpn_add_data_item (settings
, "remote-identity", str
);
498 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "method-combo"));
499 switch (gtk_combo_box_get_active (GTK_COMBO_BOX (widget
)))
503 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "userkey-button"));
504 str
= (char *) gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget
));
506 nm_setting_vpn_add_data_item (settings
, "userkey", str
);
508 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "usercert-button"));
509 str
= (char *) gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget
));
511 nm_setting_vpn_add_data_item (settings
, "usercert", str
);
516 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "usercert-button"));
517 str
= (char *) gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget
));
519 nm_setting_vpn_add_data_item (settings
, "usercert", str
);
524 nm_setting_set_secret_flags (NM_SETTING (settings
), "password",
525 NM_SETTING_SECRET_FLAG_NOT_SAVED
, NULL
);
529 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "user-entry"));
530 str
= (char *) gtk_entry_get_text (GTK_ENTRY (widget
));
531 if (str
&& strlen (str
)) {
532 nm_setting_vpn_add_data_item (settings
, "user", str
);
534 save_password_and_flags (settings
, priv
->builder
, "passwd-entry", "password");
538 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "user-entry"));
539 str
= (char *) gtk_entry_get_text (GTK_ENTRY (widget
));
540 if (str
&& strlen (str
)) {
541 nm_setting_vpn_add_data_item (settings
, "user", str
);
543 save_password_and_flags (settings
, priv
->builder
, "passwd-entry", "password");
547 nm_setting_vpn_add_data_item (settings
, "method", str
);
549 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "virtual-check"));
550 active
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget
));
551 nm_setting_vpn_add_data_item (settings
, "virtual", active ?
"yes" : "no");
553 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "encap-check"));
554 active
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget
));
555 nm_setting_vpn_add_data_item (settings
, "encap", active ?
"yes" : "no");
557 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "ipcomp-check"));
558 active
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget
));
559 nm_setting_vpn_add_data_item (settings
, "ipcomp", active ?
"yes" : "no");
561 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "proposal-check"));
562 active
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget
));
563 nm_setting_vpn_add_data_item (settings
, "proposal", active ?
"yes" : "no");
565 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "ike-entry"));
566 str
= (char *) gtk_entry_get_text (GTK_ENTRY (widget
));
567 if (str
&& strlen (str
)) {
568 str
= g_strdelimit (g_strdup (str
), ",", ';');
569 nm_setting_vpn_add_data_item (settings
, "ike", str
);
573 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "esp-entry"));
574 str
= (char *) gtk_entry_get_text (GTK_ENTRY (widget
));
575 if (str
&& strlen (str
)) {
576 str
= g_strdelimit (g_strdup (str
), ",", ';');
577 nm_setting_vpn_add_data_item (settings
, "esp", str
);
581 nm_connection_add_setting (connection
, NM_SETTING (settings
));
586 nm_vpn_plugin_ui_widget_interface_new (NMConnection
*connection
, GError
**error
)
589 StrongswanPluginUiWidgetPrivate
*priv
;
593 g_return_val_if_fail (*error
== NULL
, NULL
);
595 object
= g_object_new (STRONGSWAN_TYPE_PLUGIN_UI_WIDGET
, NULL
);
597 g_set_error (error
, STRONGSWAN_PLUGIN_UI_ERROR
, 0, "could not create strongswan object");
601 priv
= STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE ((StrongswanPluginUiWidget
*)object
);
602 ui_file
= g_strdup_printf ("%s/%s", UIDIR
, "nm-strongswan-dialog.ui");
603 priv
->builder
= gtk_builder_new ();
605 gtk_builder_set_translation_domain (priv
->builder
, GETTEXT_PACKAGE
);
607 if (!gtk_builder_add_from_file (priv
->builder
, ui_file
, error
)) {
608 g_warning ("Couldn't load builder file: %s",
609 error
&& *error ?
(*error
)->message
: "(unknown)");
610 g_clear_error (error
);
611 g_set_error (error
, STRONGSWAN_PLUGIN_UI_ERROR
, 0,
612 "could not load required resources at %s", ui_file
);
614 g_object_unref (object
);
619 priv
->widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "strongswan-vbox") );
621 g_set_error (error
, STRONGSWAN_PLUGIN_UI_ERROR
, 0, "could not load UI widget");
622 g_object_unref (object
);
625 g_object_ref_sink (priv
->widget
);
627 if (!init_plugin_ui (STRONGSWAN_PLUGIN_UI_WIDGET (object
), connection
, error
)) {
628 g_object_unref (object
);
636 dispose (GObject
*object
)
638 StrongswanPluginUiWidget
*plugin
= STRONGSWAN_PLUGIN_UI_WIDGET (object
);
639 StrongswanPluginUiWidgetPrivate
*priv
= STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (plugin
);
642 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-entry"));
643 g_signal_handlers_disconnect_by_func (G_OBJECT (widget
), G_CALLBACK (password_storage_changed_cb
), plugin
);
646 g_object_unref (priv
->widget
);
649 g_object_unref (priv
->builder
);
651 G_OBJECT_CLASS (strongswan_plugin_ui_widget_parent_class
)->dispose (object
);
655 strongswan_plugin_ui_widget_class_init (StrongswanPluginUiWidgetClass
*req_class
)
657 GObjectClass
*object_class
= G_OBJECT_CLASS (req_class
);
659 object_class
->dispose
= dispose
;
663 strongswan_plugin_ui_widget_init (StrongswanPluginUiWidget
*plugin
)
668 strongswan_plugin_ui_widget_interface_init (NMVpnEditorInterface
*iface_class
)
670 /* interface implementation */
671 iface_class
->get_widget
= get_widget
;
672 iface_class
->update_connection
= update_connection
;
676 get_capabilities (NMVpnEditorPlugin
*iface
)
678 return NM_VPN_EDITOR_PLUGIN_CAPABILITY_IPV6
;
682 get_editor (NMVpnEditorPlugin
*iface
, NMConnection
*connection
, GError
**error
)
684 return nm_vpn_plugin_ui_widget_interface_new (connection
, error
);
688 get_property (GObject
*object
, guint prop_id
,
689 GValue
*value
, GParamSpec
*pspec
)
693 g_value_set_string (value
, STRONGSWAN_PLUGIN_NAME
);
696 g_value_set_string (value
, STRONGSWAN_PLUGIN_DESC
);
699 g_value_set_string (value
, STRONGSWAN_PLUGIN_SERVICE
);
702 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
708 strongswan_plugin_ui_class_init (StrongswanPluginUiClass
*req_class
)
710 GObjectClass
*object_class
= G_OBJECT_CLASS (req_class
);
712 object_class
->get_property
= get_property
;
714 g_object_class_override_property (object_class
,
716 NM_VPN_EDITOR_PLUGIN_NAME
);
718 g_object_class_override_property (object_class
,
720 NM_VPN_EDITOR_PLUGIN_DESCRIPTION
);
722 g_object_class_override_property (object_class
,
724 NM_VPN_EDITOR_PLUGIN_SERVICE
);
728 strongswan_plugin_ui_init (StrongswanPluginUi
*plugin
)
733 strongswan_plugin_ui_interface_init (NMVpnEditorPluginInterface
*iface_class
)
735 /* interface implementation */
736 iface_class
->get_editor
= get_editor
;
737 iface_class
->get_capabilities
= get_capabilities
;
738 /* TODO: implement delete_connection to purge associated secrets */
742 G_MODULE_EXPORT NMVpnEditorPlugin
*
743 nm_vpn_editor_plugin_factory (GError
**error
)
746 g_return_val_if_fail (*error
== NULL
, NULL
);
748 return g_object_new (STRONGSWAN_TYPE_PLUGIN_UI
, NULL
);