]> git.ipfire.org Git - people/ms/strongswan.git/blob - src/frontends/gnome/properties/nm-strongswan.c
nm: Add pre-shared key option in GUI
[people/ms/strongswan.git] / src / frontends / gnome / properties / nm-strongswan.c
1 /*
2 * Copyright (C) 2013 Tobias Brunner
3 * Copyright (C) 2008 Martin Willi
4 * Hochschule fuer Technik Rapperswil
5 * Copyright (C) 2005 David Zeuthen
6 * Copyright (C) 2005-2008 Dan Williams
7 *
8 * Based on NetworkManager's vpnc plugin
9 *
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by the
12 * Free Software Foundation; either version 2 of the License, or (at your
13 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
14 *
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 * for more details.
19 */
20
21 #ifdef HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24
25 #include <glib.h>
26 #include <glib/gi18n-lib.h>
27 #include <gtk/gtk.h>
28
29 #define NM_VPN_API_SUBJECT_TO_CHANGE
30
31 #include <nm-vpn-plugin-ui-interface.h>
32 #include <nm-setting-vpn.h>
33 #include <nm-setting-connection.h>
34
35 #include "nm-strongswan.h"
36
37 #define STRONGSWAN_PLUGIN_NAME _("IPsec/IKEv2 (strongswan)")
38 #define STRONGSWAN_PLUGIN_DESC _("IPsec with the IKEv2 key exchange protocol.")
39 #define STRONGSWAN_PLUGIN_SERVICE "org.freedesktop.NetworkManager.strongswan"
40 #define NM_DBUS_SERVICE_STRONGSWAN "org.freedesktop.NetworkManager.strongswan"
41
42 /************** plugin class **************/
43
44 static void strongswan_plugin_ui_interface_init (NMVpnPluginUiInterface *iface_class);
45
46 G_DEFINE_TYPE_EXTENDED (StrongswanPluginUi, strongswan_plugin_ui, G_TYPE_OBJECT, 0,
47 G_IMPLEMENT_INTERFACE (NM_TYPE_VPN_PLUGIN_UI_INTERFACE,
48 strongswan_plugin_ui_interface_init))
49
50 /************** UI widget class **************/
51
52 static void strongswan_plugin_ui_widget_interface_init (NMVpnPluginUiWidgetInterface *iface_class);
53
54 G_DEFINE_TYPE_EXTENDED (StrongswanPluginUiWidget, strongswan_plugin_ui_widget, G_TYPE_OBJECT, 0,
55 G_IMPLEMENT_INTERFACE (NM_TYPE_VPN_PLUGIN_UI_WIDGET_INTERFACE,
56 strongswan_plugin_ui_widget_interface_init))
57
58 #define STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), STRONGSWAN_TYPE_PLUGIN_UI_WIDGET, StrongswanPluginUiWidgetPrivate))
59
60 typedef struct {
61 GtkBuilder *builder;
62 GtkWidget *widget;
63 } StrongswanPluginUiWidgetPrivate;
64
65
66 #define STRONGSWAN_PLUGIN_UI_ERROR strongswan_plugin_ui_error_quark ()
67
68 static GQuark
69 strongswan_plugin_ui_error_quark (void)
70 {
71 static GQuark error_quark = 0;
72
73 if (G_UNLIKELY (error_quark == 0))
74 error_quark = g_quark_from_static_string ("strongswan-plugin-ui-error-quark");
75
76 return error_quark;
77 }
78
79 #define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
80
81 GType
82 strongswan_plugin_ui_error_get_type (void)
83 {
84 static GType etype = 0;
85
86 if (etype == 0) {
87 static const GEnumValue values[] = {
88 /* Unknown error. */
89 ENUM_ENTRY (STRONGSWAN_PLUGIN_UI_ERROR_UNKNOWN, "UnknownError"),
90 /* The specified property was invalid. */
91 ENUM_ENTRY (STRONGSWAN_PLUGIN_UI_ERROR_INVALID_PROPERTY, "InvalidProperty"),
92 /* The specified property was missing and is required. */
93 ENUM_ENTRY (STRONGSWAN_PLUGIN_UI_ERROR_MISSING_PROPERTY, "MissingProperty"),
94 { 0, 0, 0 }
95 };
96 etype = g_enum_register_static ("StrongswanPluginUiError", values);
97 }
98 return etype;
99 }
100
101 static gboolean
102 check_validity (StrongswanPluginUiWidget *self, GError **error)
103 {
104 StrongswanPluginUiWidgetPrivate *priv = STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (self);
105 GtkWidget *widget;
106 char *str;
107
108 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "address-entry"));
109 str = (char *) gtk_entry_get_text (GTK_ENTRY (widget));
110 if (!str || !strlen (str)) {
111 g_set_error (error,
112 STRONGSWAN_PLUGIN_UI_ERROR,
113 STRONGSWAN_PLUGIN_UI_ERROR_INVALID_PROPERTY,
114 "address");
115 return FALSE;
116 }
117 return TRUE;
118 }
119
120 static void update_layout (GtkWidget *widget, StrongswanPluginUiWidgetPrivate *priv)
121 {
122 switch (gtk_combo_box_get_active (GTK_COMBO_BOX (widget)))
123 {
124 default:
125 gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
126 /* FALL */
127 case 0:
128 gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (priv->builder, "usercert-label")));
129 gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (priv->builder, "usercert-button")));
130 gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (priv->builder, "userkey-label")));
131 gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (priv->builder, "userkey-button")));
132 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->builder, "user-label")));
133 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->builder, "user-entry")));
134 break;
135 case 1:
136 gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (priv->builder, "usercert-label")));
137 gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (priv->builder, "usercert-button")));
138 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->builder, "user-label")));
139 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->builder, "user-entry")));
140 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->builder, "userkey-label")));
141 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->builder, "userkey-button")));
142 break;
143 case 2:
144 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->builder, "usercert-label")));
145 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->builder, "usercert-button")));
146 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->builder, "user-label")));
147 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->builder, "user-entry")));
148 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->builder, "userkey-label")));
149 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->builder, "userkey-button")));
150 break;
151 case 3:
152 case 4:
153 gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (priv->builder, "user-label")));
154 gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (priv->builder, "user-entry")));
155 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->builder, "usercert-label")));
156 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->builder, "usercert-button")));
157 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->builder, "userkey-label")));
158 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->builder, "userkey-button")));
159 break;
160 }
161
162 }
163
164 static void
165 settings_changed_cb (GtkWidget *widget, gpointer user_data)
166 {
167 StrongswanPluginUiWidget *self = STRONGSWAN_PLUGIN_UI_WIDGET (user_data);
168 StrongswanPluginUiWidgetPrivate *priv = STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (self);
169
170 if (widget == GTK_WIDGET (gtk_builder_get_object (priv->builder, "method-combo")))
171 {
172 update_layout(GTK_WIDGET (gtk_builder_get_object (priv->builder, "method-combo")), priv);
173 }
174 g_signal_emit_by_name (STRONGSWAN_PLUGIN_UI_WIDGET (user_data), "changed");
175 }
176
177 static gboolean
178 init_plugin_ui (StrongswanPluginUiWidget *self, NMConnection *connection, GError **error)
179 {
180 StrongswanPluginUiWidgetPrivate *priv = STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (self);
181 NMSettingVPN *settings;
182 GtkWidget *widget;
183 const char *value;
184
185 settings = NM_SETTING_VPN(nm_connection_get_setting(connection, NM_TYPE_SETTING_VPN));
186 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "address-entry"));
187 value = nm_setting_vpn_get_data_item (settings, "address");
188 if (value)
189 gtk_entry_set_text (GTK_ENTRY (widget), value);
190 g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (settings_changed_cb), self);
191
192 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "certificate-button"));
193 value = nm_setting_vpn_get_data_item (settings, "certificate");
194 if (value)
195 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget), value);
196 g_signal_connect (G_OBJECT (widget), "selection-changed", G_CALLBACK (settings_changed_cb), self);
197
198 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "user-label"));
199 gtk_widget_set_no_show_all (widget, TRUE);
200 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "user-entry"));
201 gtk_widget_set_no_show_all (widget, TRUE);
202 value = nm_setting_vpn_get_data_item (settings, "user");
203 if (value)
204 gtk_entry_set_text (GTK_ENTRY (widget), value);
205 g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (settings_changed_cb), self);
206
207 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "method-combo"));
208 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), _("Certificate/private key"));
209 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), _("Certificate/ssh-agent"));
210 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), _("Smartcard"));
211 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), _("EAP"));
212 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), _("Pre-shared key"));
213 value = nm_setting_vpn_get_data_item (settings, "method");
214 if (value) {
215 if (g_strcmp0 (value, "key") == 0) {
216 gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
217 }
218 if (g_strcmp0 (value, "agent") == 0) {
219 gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 1);
220 }
221 if (g_strcmp0 (value, "smartcard") == 0) {
222 gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 2);
223 }
224 if (g_strcmp0 (value, "eap") == 0) {
225 gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 3);
226 }
227 if (g_strcmp0 (value, "psk") == 0) {
228 gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 4);
229 }
230 }
231 if (gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) == -1)
232 {
233 gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
234 }
235 update_layout (widget, priv);
236 g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (settings_changed_cb), self);
237
238 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "usercert-label"));
239 gtk_widget_set_no_show_all (widget, TRUE);
240 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "usercert-button"));
241 gtk_widget_set_no_show_all (widget, TRUE);
242 value = nm_setting_vpn_get_data_item (settings, "usercert");
243 if (value)
244 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget), value);
245 g_signal_connect (G_OBJECT (widget), "selection-changed", G_CALLBACK (settings_changed_cb), self);
246
247 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "userkey-label"));
248 gtk_widget_set_no_show_all (widget, TRUE);
249 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "userkey-button"));
250 gtk_widget_set_no_show_all (widget, TRUE);
251 value = nm_setting_vpn_get_data_item (settings, "userkey");
252 if (value)
253 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget), value);
254 g_signal_connect (G_OBJECT (widget), "selection-changed", G_CALLBACK (settings_changed_cb), self);
255
256 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "virtual-check"));
257 value = nm_setting_vpn_get_data_item (settings, "virtual");
258 if (value && strcmp(value, "yes") == 0)
259 {
260 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
261 }
262 g_signal_connect (G_OBJECT (widget), "toggled", G_CALLBACK (settings_changed_cb), self);
263
264 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "encap-check"));
265 value = nm_setting_vpn_get_data_item (settings, "encap");
266 if (value && strcmp(value, "yes") == 0)
267 {
268 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
269 }
270 g_signal_connect (G_OBJECT (widget), "toggled", G_CALLBACK (settings_changed_cb), self);
271
272 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "ipcomp-check"));
273 value = nm_setting_vpn_get_data_item (settings, "ipcomp");
274 if (value && strcmp(value, "yes") == 0)
275 {
276 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
277 }
278 g_signal_connect (G_OBJECT (widget), "toggled", G_CALLBACK (settings_changed_cb), self);
279
280 return TRUE;
281 }
282
283 static GObject *
284 get_widget (NMVpnPluginUiWidgetInterface *iface)
285 {
286 StrongswanPluginUiWidget *self = STRONGSWAN_PLUGIN_UI_WIDGET (iface);
287 StrongswanPluginUiWidgetPrivate *priv = STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (self);
288
289 return G_OBJECT (priv->widget);
290 }
291
292 static gboolean
293 update_connection (NMVpnPluginUiWidgetInterface *iface,
294 NMConnection *connection,
295 GError **error)
296 {
297 StrongswanPluginUiWidget *self = STRONGSWAN_PLUGIN_UI_WIDGET (iface);
298 StrongswanPluginUiWidgetPrivate *priv = STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (self);
299 NMSettingVPN *settings;
300 GtkWidget *widget;
301 gboolean active;
302 char *str;
303
304 if (!check_validity (self, error))
305 return FALSE;
306 settings = NM_SETTING_VPN (nm_setting_vpn_new ());
307
308 g_object_set (settings, NM_SETTING_VPN_SERVICE_TYPE,
309 NM_DBUS_SERVICE_STRONGSWAN, NULL);
310
311 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "address-entry"));
312 str = (char *) gtk_entry_get_text (GTK_ENTRY (widget));
313 if (str && strlen (str)) {
314 nm_setting_vpn_add_data_item (settings, "address", str);
315 }
316
317 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "certificate-button"));
318 str = (char *) gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
319 if (str) {
320 nm_setting_vpn_add_data_item (settings, "certificate", str);
321 }
322
323 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "method-combo"));
324 switch (gtk_combo_box_get_active (GTK_COMBO_BOX (widget)))
325 {
326 default:
327 case 0:
328 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "userkey-button"));
329 str = (char *) gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
330 if (str) {
331 nm_setting_vpn_add_data_item (settings, "userkey", str);
332 }
333 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "usercert-button"));
334 str = (char *) gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
335 if (str) {
336 nm_setting_vpn_add_data_item (settings, "usercert", str);
337 }
338 str = "key";
339 break;
340 case 1:
341 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "usercert-button"));
342 str = (char *) gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
343 if (str) {
344 nm_setting_vpn_add_data_item (settings, "usercert", str);
345 }
346 str = "agent";
347 break;
348 case 2:
349 str = "smartcard";
350 break;
351 case 3:
352 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "user-entry"));
353 str = (char *) gtk_entry_get_text (GTK_ENTRY (widget));
354 if (str && strlen (str)) {
355 nm_setting_vpn_add_data_item (settings, "user", str);
356 }
357 str = "eap";
358 break;
359 case 4:
360 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "user-entry"));
361 str = (char *) gtk_entry_get_text (GTK_ENTRY (widget));
362 if (str && strlen (str)) {
363 nm_setting_vpn_add_data_item (settings, "user", str);
364 }
365 str = "psk";
366 break;
367 }
368 nm_setting_vpn_add_data_item (settings, "method", str);
369
370 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "virtual-check"));
371 active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
372 nm_setting_vpn_add_data_item (settings, "virtual", active ? "yes" : "no");
373
374 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "encap-check"));
375 active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
376 nm_setting_vpn_add_data_item (settings, "encap", active ? "yes" : "no");
377
378 widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "ipcomp-check"));
379 active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
380 nm_setting_vpn_add_data_item (settings, "ipcomp", active ? "yes" : "no");
381
382 nm_setting_set_secret_flags (NM_SETTING (settings), "password",
383 NM_SETTING_SECRET_FLAG_AGENT_OWNED, NULL);
384
385 nm_connection_add_setting (connection, NM_SETTING (settings));
386 return TRUE;
387 }
388
389 static NMVpnPluginUiWidgetInterface *
390 nm_vpn_plugin_ui_widget_interface_new (NMConnection *connection, GError **error)
391 {
392 NMVpnPluginUiWidgetInterface *object;
393 StrongswanPluginUiWidgetPrivate *priv;
394 char *ui_file;
395
396 if (error)
397 g_return_val_if_fail (*error == NULL, NULL);
398
399 object = NM_VPN_PLUGIN_UI_WIDGET_INTERFACE (g_object_new (STRONGSWAN_TYPE_PLUGIN_UI_WIDGET, NULL));
400 if (!object) {
401 g_set_error (error, STRONGSWAN_PLUGIN_UI_ERROR, 0, "could not create strongswan object");
402 return NULL;
403 }
404
405 priv = STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (object);
406 ui_file = g_strdup_printf ("%s/%s", UIDIR, "nm-strongswan-dialog.ui");
407 priv->builder = gtk_builder_new ();
408
409 gtk_builder_set_translation_domain (priv->builder, GETTEXT_PACKAGE);
410
411 if (!gtk_builder_add_from_file (priv->builder, ui_file, error)) {
412 g_warning ("Couldn't load builder file: %s",
413 error && *error ? (*error)->message : "(unknown)");
414 g_clear_error (error);
415 g_set_error (error, STRONGSWAN_PLUGIN_UI_ERROR, 0,
416 "could not load required resources at %s", ui_file);
417 g_free (ui_file);
418 g_object_unref (object);
419 return NULL;
420 }
421 g_free (ui_file);
422
423 priv->widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "strongswan-vbox") );
424 if (!priv->widget) {
425 g_set_error (error, STRONGSWAN_PLUGIN_UI_ERROR, 0, "could not load UI widget");
426 g_object_unref (object);
427 return NULL;
428 }
429 g_object_ref_sink (priv->widget);
430
431 if (!init_plugin_ui (STRONGSWAN_PLUGIN_UI_WIDGET (object), connection, error)) {
432 g_object_unref (object);
433 return NULL;
434 }
435
436 return object;
437 }
438
439 static void
440 dispose (GObject *object)
441 {
442 StrongswanPluginUiWidget *plugin = STRONGSWAN_PLUGIN_UI_WIDGET (object);
443 StrongswanPluginUiWidgetPrivate *priv = STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE (plugin);
444
445 if (priv->widget)
446 g_object_unref (priv->widget);
447
448 if (priv->builder)
449 g_object_unref (priv->builder);
450
451 G_OBJECT_CLASS (strongswan_plugin_ui_widget_parent_class)->dispose (object);
452 }
453
454 static void
455 strongswan_plugin_ui_widget_class_init (StrongswanPluginUiWidgetClass *req_class)
456 {
457 GObjectClass *object_class = G_OBJECT_CLASS (req_class);
458
459 g_type_class_add_private (req_class, sizeof (StrongswanPluginUiWidgetPrivate));
460
461 object_class->dispose = dispose;
462 }
463
464 static void
465 strongswan_plugin_ui_widget_init (StrongswanPluginUiWidget *plugin)
466 {
467 }
468
469 static void
470 strongswan_plugin_ui_widget_interface_init (NMVpnPluginUiWidgetInterface *iface_class)
471 {
472 /* interface implementation */
473 iface_class->get_widget = get_widget;
474 iface_class->update_connection = update_connection;
475 }
476
477 static guint32
478 get_capabilities (NMVpnPluginUiInterface *iface)
479 {
480 return 0;
481 }
482
483 static NMVpnPluginUiWidgetInterface *
484 ui_factory (NMVpnPluginUiInterface *iface, NMConnection *connection, GError **error)
485 {
486 return nm_vpn_plugin_ui_widget_interface_new (connection, error);
487 }
488
489 static void
490 get_property (GObject *object, guint prop_id,
491 GValue *value, GParamSpec *pspec)
492 {
493 switch (prop_id) {
494 case NM_VPN_PLUGIN_UI_INTERFACE_PROP_NAME:
495 g_value_set_string (value, STRONGSWAN_PLUGIN_NAME);
496 break;
497 case NM_VPN_PLUGIN_UI_INTERFACE_PROP_DESC:
498 g_value_set_string (value, STRONGSWAN_PLUGIN_DESC);
499 break;
500 case NM_VPN_PLUGIN_UI_INTERFACE_PROP_SERVICE:
501 g_value_set_string (value, STRONGSWAN_PLUGIN_SERVICE);
502 break;
503 default:
504 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
505 break;
506 }
507 }
508
509 static void
510 strongswan_plugin_ui_class_init (StrongswanPluginUiClass *req_class)
511 {
512 GObjectClass *object_class = G_OBJECT_CLASS (req_class);
513
514 object_class->get_property = get_property;
515
516 g_object_class_override_property (object_class,
517 NM_VPN_PLUGIN_UI_INTERFACE_PROP_NAME,
518 NM_VPN_PLUGIN_UI_INTERFACE_NAME);
519
520 g_object_class_override_property (object_class,
521 NM_VPN_PLUGIN_UI_INTERFACE_PROP_DESC,
522 NM_VPN_PLUGIN_UI_INTERFACE_DESC);
523
524 g_object_class_override_property (object_class,
525 NM_VPN_PLUGIN_UI_INTERFACE_PROP_SERVICE,
526 NM_VPN_PLUGIN_UI_INTERFACE_SERVICE);
527 }
528
529 static void
530 strongswan_plugin_ui_init (StrongswanPluginUi *plugin)
531 {
532 }
533
534 static void
535 strongswan_plugin_ui_interface_init (NMVpnPluginUiInterface *iface_class)
536 {
537 /* interface implementation */
538 iface_class->ui_factory = ui_factory;
539 iface_class->get_capabilities = get_capabilities;
540 /* TODO: implement delete_connection to purge associated secrets */
541 }
542
543
544 G_MODULE_EXPORT NMVpnPluginUiInterface *
545 nm_vpn_plugin_ui_factory (GError **error)
546 {
547 if (error)
548 g_return_val_if_fail (*error == NULL, NULL);
549
550 return NM_VPN_PLUGIN_UI_INTERFACE (g_object_new (STRONGSWAN_TYPE_PLUGIN_UI, NULL));
551 }