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
, "server-port-entry"));
309 value
= nm_setting_vpn_get_data_item (settings
, "server-port");
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
, "user-entry"));
315 value
= nm_setting_vpn_get_data_item (settings
, "user");
317 gtk_entry_set_text (GTK_ENTRY (widget
), value
);
318 g_signal_connect (G_OBJECT (widget
), "changed", G_CALLBACK (settings_changed_cb
), self
);
320 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-show"));
321 g_signal_connect (G_OBJECT (widget
), "toggled", G_CALLBACK (show_toggled_cb
), self
);
322 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-entry"));
323 value
= nm_setting_vpn_get_secret (settings
, "password");
325 gtk_entry_set_text (GTK_ENTRY (widget
), value
);
326 g_signal_connect (G_OBJECT (widget
), "changed", G_CALLBACK (settings_changed_cb
), self
);
327 init_password_icon (self
, settings
, "password", "passwd-entry");
329 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "method-combo"));
330 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget
), _("Certificate/private key"));
331 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget
), _("Certificate/ssh-agent"));
332 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget
), _("Smartcard"));
333 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget
), _("EAP"));
334 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget
), _("Pre-shared key"));
335 value
= nm_setting_vpn_get_data_item (settings
, "method");
337 if (g_strcmp0 (value
, "key") == 0) {
338 gtk_combo_box_set_active (GTK_COMBO_BOX (widget
), 0);
340 if (g_strcmp0 (value
, "agent") == 0) {
341 gtk_combo_box_set_active (GTK_COMBO_BOX (widget
), 1);
343 if (g_strcmp0 (value
, "smartcard") == 0) {
344 gtk_combo_box_set_active (GTK_COMBO_BOX (widget
), 2);
346 if (g_strcmp0 (value
, "eap") == 0) {
347 gtk_combo_box_set_active (GTK_COMBO_BOX (widget
), 3);
349 if (g_strcmp0 (value
, "psk") == 0) {
350 gtk_combo_box_set_active (GTK_COMBO_BOX (widget
), 4);
353 if (gtk_combo_box_get_active (GTK_COMBO_BOX (widget
)) == -1)
355 gtk_combo_box_set_active (GTK_COMBO_BOX (widget
), 0);
357 update_sensitive (widget
, priv
);
358 g_signal_connect (G_OBJECT (widget
), "changed", G_CALLBACK (settings_changed_cb
), self
);
360 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "usercert-button"));
361 value
= nm_setting_vpn_get_data_item (settings
, "usercert");
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
, "userkey-button"));
367 value
= nm_setting_vpn_get_data_item (settings
, "userkey");
369 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget
), value
);
370 g_signal_connect (G_OBJECT (widget
), "selection-changed", G_CALLBACK (settings_changed_cb
), self
);
372 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "virtual-check"));
373 value
= nm_setting_vpn_get_data_item (settings
, "virtual");
374 if (value
&& strcmp(value
, "yes") == 0)
376 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget
), TRUE
);
378 g_signal_connect (G_OBJECT (widget
), "toggled", G_CALLBACK (settings_changed_cb
), self
);
380 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "encap-check"));
381 value
= nm_setting_vpn_get_data_item (settings
, "encap");
382 if (value
&& strcmp(value
, "yes") == 0)
384 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget
), TRUE
);
386 g_signal_connect (G_OBJECT (widget
), "toggled", G_CALLBACK (settings_changed_cb
), self
);
388 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "ipcomp-check"));
389 value
= nm_setting_vpn_get_data_item (settings
, "ipcomp");
390 if (value
&& strcmp(value
, "yes") == 0)
392 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget
), TRUE
);
394 g_signal_connect (G_OBJECT (widget
), "toggled", G_CALLBACK (settings_changed_cb
), self
);
396 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "proposal-check"));
397 value
= nm_setting_vpn_get_data_item(settings
, "proposal");
398 if (value
&& strcmp(value
, "yes") == 0)
399 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget
), TRUE
);
401 toggle_proposal_cb(GTK_CHECK_BUTTON(widget
), self
);
402 g_signal_connect (G_OBJECT (widget
), "toggled", G_CALLBACK (toggle_proposal_cb
), self
);
404 widget
= GTK_WIDGET(gtk_builder_get_object(priv
->builder
, "ike-entry"));
405 value
= nm_setting_vpn_get_data_item(settings
, "ike");
408 value
= g_strdelimit (g_strdup (value
), ";", ',');
409 gtk_entry_set_text (GTK_ENTRY (widget
), value
);
410 g_free ((char*)value
);
412 g_signal_connect (G_OBJECT (widget
), "changed", G_CALLBACK (settings_changed_cb
), self
);
414 widget
= GTK_WIDGET(gtk_builder_get_object(priv
->builder
, "esp-entry"));
415 value
= nm_setting_vpn_get_data_item(settings
, "esp");
418 value
= g_strdelimit (g_strdup (value
), ";", ',');
419 gtk_entry_set_text (GTK_ENTRY (widget
), value
);
420 g_free ((char*)value
);
422 g_signal_connect (G_OBJECT (widget
), "changed", G_CALLBACK (settings_changed_cb
), self
);
428 get_widget (NMVpnEditor
*iface
)
430 StrongswanPluginUiWidget
*self
= STRONGSWAN_PLUGIN_UI_WIDGET (iface
);
431 StrongswanPluginUiWidgetPrivate
*priv
= STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (self
);
433 return G_OBJECT (priv
->widget
);
437 save_password_and_flags (NMSettingVpn
*settings
, GtkBuilder
*builder
,
438 const char *entry_name
, const char *secret_key
)
440 NMSettingSecretFlags flags
;
441 const char *password
;
444 /* Get secret flags */
445 entry
= GTK_WIDGET (gtk_builder_get_object (builder
, entry_name
));
446 flags
= nma_utils_menu_to_secret_flags (entry
);
448 /* Save password and convert flags to legacy data items */
450 case NM_SETTING_SECRET_FLAG_NONE
:
452 case NM_SETTING_SECRET_FLAG_AGENT_OWNED
:
453 password
= gtk_entry_get_text (GTK_ENTRY (entry
));
454 if (password
&& strlen (password
))
456 nm_setting_vpn_add_secret (settings
, secret_key
, password
);
463 /* Set new secret flags */
464 nm_setting_set_secret_flags (NM_SETTING (settings
), secret_key
, flags
, NULL
);
468 update_connection (NMVpnEditor
*iface
,
469 NMConnection
*connection
,
472 StrongswanPluginUiWidget
*self
= STRONGSWAN_PLUGIN_UI_WIDGET (iface
);
473 StrongswanPluginUiWidgetPrivate
*priv
= STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (self
);
474 NMSettingVpn
*settings
;
479 if (!check_validity (self
, error
))
481 settings
= NM_SETTING_VPN (nm_setting_vpn_new ());
483 g_object_set (settings
, NM_SETTING_VPN_SERVICE_TYPE
,
484 NM_DBUS_SERVICE_STRONGSWAN
, NULL
);
486 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "address-entry"));
487 str
= (char *) gtk_entry_get_text (GTK_ENTRY (widget
));
488 if (str
&& strlen (str
)) {
489 nm_setting_vpn_add_data_item (settings
, "address", str
);
492 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "certificate-button"));
493 str
= (char *) gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget
));
495 nm_setting_vpn_add_data_item (settings
, "certificate", str
);
498 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "remote-identity-entry"));
499 str
= (char *) gtk_entry_get_text (GTK_ENTRY (widget
));
500 if (str
&& strlen (str
)) {
501 nm_setting_vpn_add_data_item (settings
, "remote-identity", str
);
504 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "server-port-entry"));
505 str
= (char *) gtk_entry_get_text (GTK_ENTRY (widget
));
506 if (str
&& strlen (str
)) {
507 nm_setting_vpn_add_data_item (settings
, "server-port", str
);
510 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "method-combo"));
511 switch (gtk_combo_box_get_active (GTK_COMBO_BOX (widget
)))
515 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "userkey-button"));
516 str
= (char *) gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget
));
518 nm_setting_vpn_add_data_item (settings
, "userkey", str
);
520 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "usercert-button"));
521 str
= (char *) gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget
));
523 nm_setting_vpn_add_data_item (settings
, "usercert", str
);
528 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "usercert-button"));
529 str
= (char *) gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget
));
531 nm_setting_vpn_add_data_item (settings
, "usercert", str
);
536 nm_setting_set_secret_flags (NM_SETTING (settings
), "password",
537 NM_SETTING_SECRET_FLAG_NOT_SAVED
, NULL
);
541 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "user-entry"));
542 str
= (char *) gtk_entry_get_text (GTK_ENTRY (widget
));
543 if (str
&& strlen (str
)) {
544 nm_setting_vpn_add_data_item (settings
, "user", str
);
546 save_password_and_flags (settings
, priv
->builder
, "passwd-entry", "password");
550 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "user-entry"));
551 str
= (char *) gtk_entry_get_text (GTK_ENTRY (widget
));
552 if (str
&& strlen (str
)) {
553 nm_setting_vpn_add_data_item (settings
, "user", str
);
555 save_password_and_flags (settings
, priv
->builder
, "passwd-entry", "password");
559 nm_setting_vpn_add_data_item (settings
, "method", str
);
561 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "virtual-check"));
562 active
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget
));
563 nm_setting_vpn_add_data_item (settings
, "virtual", active ?
"yes" : "no");
565 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "encap-check"));
566 active
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget
));
567 nm_setting_vpn_add_data_item (settings
, "encap", active ?
"yes" : "no");
569 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "ipcomp-check"));
570 active
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget
));
571 nm_setting_vpn_add_data_item (settings
, "ipcomp", active ?
"yes" : "no");
573 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "proposal-check"));
574 active
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget
));
575 nm_setting_vpn_add_data_item (settings
, "proposal", active ?
"yes" : "no");
577 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "ike-entry"));
578 str
= (char *) gtk_entry_get_text (GTK_ENTRY (widget
));
579 if (str
&& strlen (str
)) {
580 str
= g_strdelimit (g_strdup (str
), ",", ';');
581 nm_setting_vpn_add_data_item (settings
, "ike", str
);
585 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "esp-entry"));
586 str
= (char *) gtk_entry_get_text (GTK_ENTRY (widget
));
587 if (str
&& strlen (str
)) {
588 str
= g_strdelimit (g_strdup (str
), ",", ';');
589 nm_setting_vpn_add_data_item (settings
, "esp", str
);
593 nm_connection_add_setting (connection
, NM_SETTING (settings
));
598 nm_vpn_plugin_ui_widget_interface_new (NMConnection
*connection
, GError
**error
)
601 StrongswanPluginUiWidgetPrivate
*priv
;
605 g_return_val_if_fail (*error
== NULL
, NULL
);
607 object
= g_object_new (STRONGSWAN_TYPE_PLUGIN_UI_WIDGET
, NULL
);
609 g_set_error (error
, STRONGSWAN_PLUGIN_UI_ERROR
, 0, "could not create strongswan object");
613 priv
= STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE ((StrongswanPluginUiWidget
*)object
);
614 ui_file
= g_strdup_printf ("%s/%s", UIDIR
, "nm-strongswan-dialog.ui");
615 priv
->builder
= gtk_builder_new ();
617 gtk_builder_set_translation_domain (priv
->builder
, GETTEXT_PACKAGE
);
619 if (!gtk_builder_add_from_file (priv
->builder
, ui_file
, error
)) {
620 g_warning ("Couldn't load builder file: %s",
621 error
&& *error ?
(*error
)->message
: "(unknown)");
622 g_clear_error (error
);
623 g_set_error (error
, STRONGSWAN_PLUGIN_UI_ERROR
, 0,
624 "could not load required resources at %s", ui_file
);
626 g_object_unref (object
);
631 priv
->widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "strongswan-vbox") );
633 g_set_error (error
, STRONGSWAN_PLUGIN_UI_ERROR
, 0, "could not load UI widget");
634 g_object_unref (object
);
637 g_object_ref_sink (priv
->widget
);
639 if (!init_plugin_ui (STRONGSWAN_PLUGIN_UI_WIDGET (object
), connection
, error
)) {
640 g_object_unref (object
);
648 dispose (GObject
*object
)
650 StrongswanPluginUiWidget
*plugin
= STRONGSWAN_PLUGIN_UI_WIDGET (object
);
651 StrongswanPluginUiWidgetPrivate
*priv
= STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (plugin
);
654 widget
= GTK_WIDGET (gtk_builder_get_object (priv
->builder
, "passwd-entry"));
655 g_signal_handlers_disconnect_by_func (G_OBJECT (widget
), G_CALLBACK (password_storage_changed_cb
), plugin
);
658 g_object_unref (priv
->widget
);
661 g_object_unref (priv
->builder
);
663 G_OBJECT_CLASS (strongswan_plugin_ui_widget_parent_class
)->dispose (object
);
667 strongswan_plugin_ui_widget_class_init (StrongswanPluginUiWidgetClass
*req_class
)
669 GObjectClass
*object_class
= G_OBJECT_CLASS (req_class
);
671 object_class
->dispose
= dispose
;
675 strongswan_plugin_ui_widget_init (StrongswanPluginUiWidget
*plugin
)
680 strongswan_plugin_ui_widget_interface_init (NMVpnEditorInterface
*iface_class
)
682 /* interface implementation */
683 iface_class
->get_widget
= get_widget
;
684 iface_class
->update_connection
= update_connection
;
688 get_capabilities (NMVpnEditorPlugin
*iface
)
690 return NM_VPN_EDITOR_PLUGIN_CAPABILITY_IPV6
;
694 get_editor (NMVpnEditorPlugin
*iface
, NMConnection
*connection
, GError
**error
)
696 return nm_vpn_plugin_ui_widget_interface_new (connection
, error
);
700 get_property (GObject
*object
, guint prop_id
,
701 GValue
*value
, GParamSpec
*pspec
)
705 g_value_set_string (value
, STRONGSWAN_PLUGIN_NAME
);
708 g_value_set_string (value
, STRONGSWAN_PLUGIN_DESC
);
711 g_value_set_string (value
, STRONGSWAN_PLUGIN_SERVICE
);
714 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
720 strongswan_plugin_ui_class_init (StrongswanPluginUiClass
*req_class
)
722 GObjectClass
*object_class
= G_OBJECT_CLASS (req_class
);
724 object_class
->get_property
= get_property
;
726 g_object_class_override_property (object_class
,
728 NM_VPN_EDITOR_PLUGIN_NAME
);
730 g_object_class_override_property (object_class
,
732 NM_VPN_EDITOR_PLUGIN_DESCRIPTION
);
734 g_object_class_override_property (object_class
,
736 NM_VPN_EDITOR_PLUGIN_SERVICE
);
740 strongswan_plugin_ui_init (StrongswanPluginUi
*plugin
)
745 strongswan_plugin_ui_interface_init (NMVpnEditorPluginInterface
*iface_class
)
747 /* interface implementation */
748 iface_class
->get_editor
= get_editor
;
749 iface_class
->get_capabilities
= get_capabilities
;
750 /* TODO: implement delete_connection to purge associated secrets */
754 G_MODULE_EXPORT NMVpnEditorPlugin
*
755 nm_vpn_editor_plugin_factory (GError
**error
)
758 g_return_val_if_fail (*error
== NULL
, NULL
);
760 return g_object_new (STRONGSWAN_TYPE_PLUGIN_UI
, NULL
);