maemo: Remove obsolete status/settings applet
This commit is contained in:
@@ -1,2 +0,0 @@
|
|||||||
build-arch-stamp
|
|
||||||
build-indep-stamp
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
|
|
||||||
SUBDIRS = src data
|
|
||||||
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
strongswan-applet-1.0.0
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
- Initial release
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
libtoolize --force &&
|
|
||||||
aclocal &&
|
|
||||||
automake -a &&
|
|
||||||
autoconf
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
AC_INIT(strongswan-applet, 1.0.1)
|
|
||||||
AM_INIT_AUTOMAKE
|
|
||||||
|
|
||||||
# Programs
|
|
||||||
AC_PROG_CC
|
|
||||||
AC_PROG_INSTALL
|
|
||||||
AC_PROG_LIBTOOL
|
|
||||||
|
|
||||||
# Headers
|
|
||||||
AC_HEADER_STDC
|
|
||||||
|
|
||||||
# Library dependencies
|
|
||||||
PKG_CHECK_MODULES(HILDON, hildon-1 hildon-fm-2 hildon-control-panel libhildondesktop-1)
|
|
||||||
AC_SUBST(HILDON_CFLAGS)
|
|
||||||
AC_SUBST(HILDON_LIBS)
|
|
||||||
|
|
||||||
PKG_CHECK_MODULES(DBUS, dbus-glib-1 >= 0.60)
|
|
||||||
AC_SUBST(DBUS_CFLAGS)
|
|
||||||
AC_SUBST(DBUS_LIBS)
|
|
||||||
|
|
||||||
PKG_CHECK_MODULES(OSSO, osso-af-settings >= 0.8.5 libosso >= 0.9.17 gnome-vfs-2.0 >= 2.8.4.11 gnome-vfs-module-2.0 >= 2.8.4.11)
|
|
||||||
AC_SUBST(OSSO_CFLAGS)
|
|
||||||
AC_SUBST(OSSO_LIBS)
|
|
||||||
|
|
||||||
# Application icon install directories
|
|
||||||
icon_18x18dir=$datadir/icons/hicolor/18x18/hildon
|
|
||||||
icon_24x24dir=$datadir/icons/hicolor/24x24/hildon
|
|
||||||
icon_32x32dir=$datadir/icons/hicolor/32x32/hildon
|
|
||||||
icon_48x48dir=$datadir/icons/hicolor/48x48/hildon
|
|
||||||
icon_scalabledir=$datadir/icons/hicolor/scalable/hildon
|
|
||||||
|
|
||||||
# Hildon control panel plugin install directories
|
|
||||||
pluginlibdir=`$PKG_CONFIG hildon-control-panel --variable=pluginlibdir`
|
|
||||||
plugindesktopentrydir=`$PKG_CONFIG hildon-control-panel --variable=plugindesktopentrydir`
|
|
||||||
|
|
||||||
# Hildon status widget install directories
|
|
||||||
statuslibdir=`$PKG_CONFIG libhildondesktop-1 --variable=hildondesktoplibdir`
|
|
||||||
statusdesktopentrydir=`$PKG_CONFIG libhildondesktop-1 --variable=hildonstatusmenudesktopentrydir`
|
|
||||||
|
|
||||||
AC_SUBST(icon_18x18dir)
|
|
||||||
AC_SUBST(icon_24x24dir)
|
|
||||||
AC_SUBST(icon_32x32dir)
|
|
||||||
AC_SUBST(icon_48x48dir)
|
|
||||||
AC_SUBST(icon_scalabledir)
|
|
||||||
AC_SUBST(pluginlibdir)
|
|
||||||
AC_SUBST(plugindesktopentrydir)
|
|
||||||
AC_SUBST(statuslibdir)
|
|
||||||
AC_SUBST(statusdesktopentrydir)
|
|
||||||
|
|
||||||
AC_OUTPUT(
|
|
||||||
Makefile \
|
|
||||||
src/Makefile \
|
|
||||||
data/Makefile
|
|
||||||
)
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
plugindesktopentry_DATA = strongswan-settings.desktop
|
|
||||||
|
|
||||||
statusdesktopentry_DATA = strongswan-status.desktop
|
|
||||||
|
|
||||||
icon_18x18_DATA = \
|
|
||||||
icons/18x18/strongswan_lock_open.png \
|
|
||||||
icons/18x18/strongswan_lock_close.png
|
|
||||||
icon_48x48_DATA = \
|
|
||||||
icons/48x48/strongswan_lock_open.png \
|
|
||||||
icons/48x48/strongswan_lock_close.png
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
|
||||||
$(plugindesktopentry_DATA) $(statusdesktopentry_DATA) \
|
|
||||||
$(icon_18x18_DATA) $(icon_48x48_DATA)
|
|
||||||
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.0 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 1.0 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 2.6 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 2.6 KiB |
@@ -1,9 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Encoding=UTF-8
|
|
||||||
Version=1.0
|
|
||||||
Name=strongSwan VPN
|
|
||||||
Comment=A control panel applet to configure strongSwan VPN
|
|
||||||
Type=HildonControlPanelPlugin
|
|
||||||
Icon=strongswan_lock_close
|
|
||||||
Categories=connectivity
|
|
||||||
X-control-panel-plugin=libstrongswan-settings.so
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Encoding=UTF-8
|
|
||||||
Version=1.0
|
|
||||||
Name=strongSwan Status
|
|
||||||
Comment=A status menu widget to control strongSwan
|
|
||||||
Type=default
|
|
||||||
Icon=strongswan_lock_close
|
|
||||||
Category=permanent
|
|
||||||
X-Path=libstrongswan-status.so
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
statuslib_LTLIBRARIES = libstrongswan-status.la
|
|
||||||
libstrongswan_status_la_SOURCES = \
|
|
||||||
strongswan-status.c strongswan-status.h \
|
|
||||||
strongswan-connection.c strongswan-connection.h \
|
|
||||||
strongswan-connections.c strongswan-connections.h
|
|
||||||
|
|
||||||
libstrongswan_status_la_LIBADD = $(HILDON_LIBS) $(DBUS_LIBS) $(OSSO_LIBS)
|
|
||||||
libstrongswan_status_la_CFLAGS = -DUSE_DYNAMIC_TYPES \
|
|
||||||
$(HILDON_CFLAGS) $(DBUS_CFLAGS) $(OSSO_CFLAGS)
|
|
||||||
libstrongswan_status_la_LDFLAGS = -module -avoid-version
|
|
||||||
|
|
||||||
pluginlib_LTLIBRARIES = libstrongswan-settings.la
|
|
||||||
libstrongswan_settings_la_SOURCES = \
|
|
||||||
strongswan-settings.c \
|
|
||||||
strongswan-connection.c strongswan-connection.h \
|
|
||||||
strongswan-connections.c strongswan-connections.h
|
|
||||||
|
|
||||||
libstrongswan_settings_la_LIBADD = $(HILDON_LIBS)
|
|
||||||
libstrongswan_settings_la_CFLAGS = $(HILDON_CFLAGS)
|
|
||||||
libstrongswan_settings_la_LDFLAGS = -module -avoid-version
|
|
||||||
|
|
||||||
@@ -1,260 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 Tobias Brunner
|
|
||||||
* Hochschule fuer Technik Rapperswil
|
|
||||||
*
|
|
||||||
* 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. See <http://www.fsf.org/copyleft/gpl.txt>.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "strongswan-connection.h"
|
|
||||||
|
|
||||||
#define STRONGSWAN_CONNECTION_GET_PRIVATE(object) \
|
|
||||||
(G_TYPE_INSTANCE_GET_PRIVATE ((object), \
|
|
||||||
STRONGSWAN_TYPE_CONNECTION, \
|
|
||||||
StrongswanConnectionPrivate))
|
|
||||||
|
|
||||||
struct _StrongswanConnectionPrivate
|
|
||||||
{
|
|
||||||
gchar *orig_name;
|
|
||||||
gchar *name;
|
|
||||||
gchar *host;
|
|
||||||
gchar *cert;
|
|
||||||
gchar *user;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
PROP_0,
|
|
||||||
PROP_NAME,
|
|
||||||
PROP_HOST,
|
|
||||||
PROP_CERT,
|
|
||||||
PROP_USER,
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifndef USE_DYNAMIC_TYPES
|
|
||||||
G_DEFINE_TYPE (StrongswanConnection, strongswan_connection, G_TYPE_OBJECT);
|
|
||||||
#else
|
|
||||||
G_DEFINE_DYNAMIC_TYPE (StrongswanConnection, strongswan_connection, G_TYPE_OBJECT);
|
|
||||||
void strongswan_connection_register (GTypeModule *type_module)
|
|
||||||
{
|
|
||||||
strongswan_connection_register_type (type_module);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_connection_get_property (GObject *object,
|
|
||||||
guint prop_id,
|
|
||||||
GValue *value,
|
|
||||||
GParamSpec *pspec)
|
|
||||||
{
|
|
||||||
StrongswanConnectionPrivate *priv = STRONGSWAN_CONNECTION (object)->priv;
|
|
||||||
switch (prop_id)
|
|
||||||
{
|
|
||||||
case PROP_NAME:
|
|
||||||
g_value_set_string (value, priv->name);
|
|
||||||
break;
|
|
||||||
case PROP_HOST:
|
|
||||||
g_value_set_string (value, priv->host);
|
|
||||||
break;
|
|
||||||
case PROP_CERT:
|
|
||||||
g_value_set_string (value, priv->cert);
|
|
||||||
break;
|
|
||||||
case PROP_USER:
|
|
||||||
g_value_set_string (value, priv->user);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_connection_set_property (GObject *object,
|
|
||||||
guint prop_id,
|
|
||||||
const GValue *value,
|
|
||||||
GParamSpec *pspec)
|
|
||||||
{
|
|
||||||
StrongswanConnectionPrivate *priv = STRONGSWAN_CONNECTION (object)->priv;
|
|
||||||
switch (prop_id)
|
|
||||||
{
|
|
||||||
case PROP_NAME:
|
|
||||||
g_free (priv->name);
|
|
||||||
priv->name = g_value_dup_string (value);
|
|
||||||
case PROP_HOST:
|
|
||||||
g_free (priv->host);
|
|
||||||
priv->host = g_value_dup_string (value);
|
|
||||||
break;
|
|
||||||
case PROP_CERT:
|
|
||||||
g_free (priv->cert);
|
|
||||||
priv->cert = g_value_dup_string (value);
|
|
||||||
break;
|
|
||||||
case PROP_USER:
|
|
||||||
g_free (priv->user);
|
|
||||||
priv->user = g_value_dup_string (value);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_connection_init (StrongswanConnection *connection)
|
|
||||||
{
|
|
||||||
connection->priv = STRONGSWAN_CONNECTION_GET_PRIVATE (connection);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_connection_dispose (GObject *object)
|
|
||||||
{
|
|
||||||
G_OBJECT_CLASS (strongswan_connection_parent_class)->dispose (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_connection_finalize (GObject *object)
|
|
||||||
{
|
|
||||||
StrongswanConnectionPrivate *priv = STRONGSWAN_CONNECTION (object)->priv;
|
|
||||||
g_free (priv->orig_name);
|
|
||||||
g_free (priv->name);
|
|
||||||
g_free (priv->host);
|
|
||||||
g_free (priv->cert);
|
|
||||||
g_free (priv->user);
|
|
||||||
G_OBJECT_CLASS (strongswan_connection_parent_class)->finalize (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_connection_class_init (StrongswanConnectionClass *klass)
|
|
||||||
{
|
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
||||||
|
|
||||||
object_class->get_property = strongswan_connection_get_property;
|
|
||||||
object_class->set_property = strongswan_connection_set_property;
|
|
||||||
object_class->dispose = strongswan_connection_dispose;
|
|
||||||
object_class->finalize = strongswan_connection_finalize;
|
|
||||||
|
|
||||||
g_object_class_install_property (object_class, PROP_NAME,
|
|
||||||
g_param_spec_string ("name", "Connection name",
|
|
||||||
"The unique name of a connection",
|
|
||||||
NULL,
|
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
||||||
|
|
||||||
g_object_class_install_property (object_class, PROP_HOST,
|
|
||||||
g_param_spec_string ("host", "Hostname or IP address",
|
|
||||||
"The hostname or IP address of the Gateway",
|
|
||||||
NULL,
|
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
||||||
|
|
||||||
g_object_class_install_property (object_class, PROP_CERT,
|
|
||||||
g_param_spec_string ("cert", "Gateway or CA certificate",
|
|
||||||
"The certificate of the gateway or the CA",
|
|
||||||
NULL,
|
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
||||||
|
|
||||||
g_object_class_install_property (object_class, PROP_USER,
|
|
||||||
g_param_spec_string ("user", "Username",
|
|
||||||
"The username for EAP authentication",
|
|
||||||
NULL,
|
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
||||||
|
|
||||||
g_type_class_add_private (klass, sizeof (StrongswanConnectionPrivate));
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef USE_DYNAMIC_TYPES
|
|
||||||
static void
|
|
||||||
strongswan_connection_class_finalize (StrongswanConnectionClass *klass)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static inline gchar *
|
|
||||||
get_string_from_key_file (GKeyFile *key_file,
|
|
||||||
const gchar *name,
|
|
||||||
const gchar *key)
|
|
||||||
{
|
|
||||||
GError *error = NULL;
|
|
||||||
gchar *value;
|
|
||||||
value = g_key_file_get_string (key_file, name, key, &error);
|
|
||||||
if (error)
|
|
||||||
{
|
|
||||||
g_warning ("Failed to read %s/%s from key file: %s",
|
|
||||||
name, key, error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_connection_update_from_key_file (GKeyFile *key_file,
|
|
||||||
StrongswanConnection *connection)
|
|
||||||
{
|
|
||||||
StrongswanConnectionPrivate *priv = connection->priv;
|
|
||||||
gchar *name = priv->name;
|
|
||||||
|
|
||||||
priv->orig_name = g_strdup (name);
|
|
||||||
priv->host = get_string_from_key_file (key_file, name, "host");
|
|
||||||
priv->cert = get_string_from_key_file (key_file, name, "cert");
|
|
||||||
priv->user = get_string_from_key_file (key_file, name, "user");
|
|
||||||
}
|
|
||||||
|
|
||||||
StrongswanConnection *
|
|
||||||
strongswan_connection_new (const gchar *name)
|
|
||||||
{
|
|
||||||
StrongswanConnection *conn;
|
|
||||||
conn = g_object_new (STRONGSWAN_TYPE_CONNECTION,
|
|
||||||
"name", name,
|
|
||||||
NULL);
|
|
||||||
g_return_val_if_fail (conn->priv != NULL, NULL);
|
|
||||||
return conn;
|
|
||||||
}
|
|
||||||
|
|
||||||
StrongswanConnection *
|
|
||||||
strongswan_connection_new_from_key_file (GKeyFile *key_file,
|
|
||||||
const gchar *name)
|
|
||||||
{
|
|
||||||
StrongswanConnection *conn = strongswan_connection_new (name);
|
|
||||||
g_return_val_if_fail (conn != NULL, NULL);
|
|
||||||
strongswan_connection_update_from_key_file (key_file, conn);
|
|
||||||
return conn;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
strongswan_connection_save_to_key_file (GKeyFile *key_file,
|
|
||||||
StrongswanConnection *connection)
|
|
||||||
{
|
|
||||||
StrongswanConnectionPrivate *priv = connection->priv;
|
|
||||||
gchar *name = priv->name;
|
|
||||||
|
|
||||||
if (priv->orig_name && strcmp (name, priv->orig_name))
|
|
||||||
{
|
|
||||||
g_key_file_remove_group (key_file, priv->orig_name, NULL);
|
|
||||||
g_free (priv->orig_name);
|
|
||||||
priv->orig_name = g_strdup (name);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (priv->host)
|
|
||||||
{
|
|
||||||
g_key_file_set_string (key_file, name, "host", priv->host);
|
|
||||||
}
|
|
||||||
if (priv->cert)
|
|
||||||
{
|
|
||||||
g_key_file_set_string (key_file, name, "cert", priv->cert);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_key_file_remove_key (key_file, name, "cert", NULL);
|
|
||||||
}
|
|
||||||
if (priv->user)
|
|
||||||
{
|
|
||||||
g_key_file_set_string (key_file, name, "user", priv->user);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 Tobias Brunner
|
|
||||||
* Hochschule fuer Technik Rapperswil
|
|
||||||
*
|
|
||||||
* 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. See <http://www.fsf.org/copyleft/gpl.txt>.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __STRONGSWAN_CONNECTION_H__
|
|
||||||
#define __STRONGSWAN_CONNECTION_H__
|
|
||||||
|
|
||||||
#include <glib.h>
|
|
||||||
#include <glib-object.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define STRONGSWAN_TYPE_CONNECTION (strongswan_connection_get_type ())
|
|
||||||
#define STRONGSWAN_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), STRONGSWAN_TYPE_CONNECTION, StrongswanConnection))
|
|
||||||
#define STRONGSWAN_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), STRONGSWAN_TYPE_CONNECTION, StrongswanConnectionClass))
|
|
||||||
#define STRONGSWAN_IS_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), STRONGSWAN_TYPE_CONNECTION))
|
|
||||||
#define STRONGSWAN_IS_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), STRONGSWAN_TYPE_CONNECTION))
|
|
||||||
#define STRONGSWAN_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), STRONGSWAN_TYPE_CONNECTION, StrongswanConnectionClass))
|
|
||||||
|
|
||||||
typedef struct _StrongswanConnection StrongswanConnection;
|
|
||||||
typedef struct _StrongswanConnectionClass StrongswanConnectionClass;
|
|
||||||
typedef struct _StrongswanConnectionPrivate StrongswanConnectionPrivate;
|
|
||||||
|
|
||||||
struct _StrongswanConnection
|
|
||||||
{
|
|
||||||
GObject gobject;
|
|
||||||
|
|
||||||
StrongswanConnectionPrivate *priv;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _StrongswanConnectionClass
|
|
||||||
{
|
|
||||||
GObjectClass parent_class;
|
|
||||||
};
|
|
||||||
|
|
||||||
GType strongswan_connection_get_type (void);
|
|
||||||
|
|
||||||
StrongswanConnection *strongswan_connection_new (const gchar *name);
|
|
||||||
|
|
||||||
StrongswanConnection *strongswan_connection_new_from_key_file(GKeyFile *key_file, const gchar *name);
|
|
||||||
void strongswan_connection_save_to_key_file (GKeyFile *key_file, StrongswanConnection *connection);
|
|
||||||
|
|
||||||
#ifdef USE_DYNAMIC_TYPES
|
|
||||||
void strongswan_connection_register (GTypeModule *type_module);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __STRONGSWAN_CONNECTION_H__ */
|
|
||||||
@@ -1,318 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 Tobias Brunner
|
|
||||||
* Hochschule fuer Technik Rapperswil
|
|
||||||
*
|
|
||||||
* 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. See <http://www.fsf.org/copyleft/gpl.txt>.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <glib.h>
|
|
||||||
#include <libgnomevfs/gnome-vfs.h>
|
|
||||||
|
|
||||||
#include "strongswan-connections.h"
|
|
||||||
|
|
||||||
/* connections are stored in ~/.config/strongswan/connections */
|
|
||||||
#define CONFIG_DIR_NAME "strongswan"
|
|
||||||
#define CONFIG_FILE_NAME "connections"
|
|
||||||
|
|
||||||
#define STRONGSWAN_CONNECTIONS_GET_PRIVATE(object) \
|
|
||||||
(G_TYPE_INSTANCE_GET_PRIVATE ((object), STRONGSWAN_TYPE_CONNECTIONS, StrongswanConnectionsPrivate))
|
|
||||||
|
|
||||||
struct _StrongswanConnectionsPrivate
|
|
||||||
{
|
|
||||||
GKeyFile *key_file;
|
|
||||||
gchar *path;
|
|
||||||
GnomeVFSMonitorHandle *monitor;
|
|
||||||
GHashTable *connections;
|
|
||||||
GtkTreeModel *model;
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifndef USE_DYNAMIC_TYPES
|
|
||||||
G_DEFINE_TYPE (StrongswanConnections, strongswan_connections, G_TYPE_OBJECT);
|
|
||||||
#else
|
|
||||||
G_DEFINE_DYNAMIC_TYPE (StrongswanConnections, strongswan_connections, G_TYPE_OBJECT);
|
|
||||||
void strongswan_connections_register (GTypeModule *type_module)
|
|
||||||
{
|
|
||||||
strongswan_connections_register_type (type_module);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_connections_load_connections (StrongswanConnections *connections)
|
|
||||||
{
|
|
||||||
StrongswanConnectionsPrivate *priv = connections->priv;
|
|
||||||
GHashTableIter iter;
|
|
||||||
gpointer key, value;
|
|
||||||
gchar **groups;
|
|
||||||
guint i;
|
|
||||||
|
|
||||||
g_hash_table_remove_all (priv->connections);
|
|
||||||
groups = g_key_file_get_groups (priv->key_file, NULL);
|
|
||||||
for (i = 0; groups[i]; i++)
|
|
||||||
{
|
|
||||||
StrongswanConnection *conn;
|
|
||||||
conn = strongswan_connection_new_from_key_file(priv->key_file,
|
|
||||||
groups[i]);
|
|
||||||
if (conn != NULL)
|
|
||||||
{
|
|
||||||
g_hash_table_insert (priv->connections,
|
|
||||||
g_strdup(groups[i]),
|
|
||||||
conn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
g_strfreev (groups);
|
|
||||||
|
|
||||||
gtk_list_store_clear (GTK_LIST_STORE (priv->model));
|
|
||||||
g_hash_table_iter_init (&iter, priv->connections);
|
|
||||||
while (g_hash_table_iter_next (&iter, &key, &value))
|
|
||||||
{
|
|
||||||
gtk_list_store_insert_with_values (GTK_LIST_STORE (priv->model),
|
|
||||||
NULL,
|
|
||||||
-1,
|
|
||||||
0, key,
|
|
||||||
-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_connections_load_config (StrongswanConnections *connections)
|
|
||||||
{
|
|
||||||
StrongswanConnectionsPrivate *priv = connections->priv;
|
|
||||||
GError *error = NULL;
|
|
||||||
|
|
||||||
if (priv->key_file)
|
|
||||||
{
|
|
||||||
g_key_file_free (priv->key_file);
|
|
||||||
}
|
|
||||||
|
|
||||||
priv->key_file = g_key_file_new ();
|
|
||||||
if (!g_key_file_load_from_file (priv->key_file,
|
|
||||||
priv->path,
|
|
||||||
G_KEY_FILE_KEEP_COMMENTS,
|
|
||||||
&error))
|
|
||||||
{
|
|
||||||
if (g_error_matches (error,
|
|
||||||
G_KEY_FILE_ERROR,
|
|
||||||
G_KEY_FILE_ERROR_PARSE))
|
|
||||||
{
|
|
||||||
g_debug ("Failed to parse config file '%s', treated as empty: %s",
|
|
||||||
priv->path, error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_debug ("Could not read config file '%s': %s",
|
|
||||||
priv->path, error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
strongswan_connections_load_connections (connections);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_connections_file_changed (GnomeVFSMonitorHandle *handle,
|
|
||||||
const gchar *monitor_uri,
|
|
||||||
const gchar *info_uri,
|
|
||||||
GnomeVFSMonitorEventType event_type,
|
|
||||||
StrongswanConnections *connections)
|
|
||||||
{
|
|
||||||
strongswan_connections_load_config (connections);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_connections_init (StrongswanConnections *connections)
|
|
||||||
{
|
|
||||||
StrongswanConnectionsPrivate *priv;
|
|
||||||
connections->priv = STRONGSWAN_CONNECTIONS_GET_PRIVATE (connections);
|
|
||||||
priv = connections->priv;
|
|
||||||
|
|
||||||
priv->path = g_build_filename (g_get_user_config_dir (),
|
|
||||||
CONFIG_DIR_NAME,
|
|
||||||
CONFIG_FILE_NAME,
|
|
||||||
NULL);
|
|
||||||
/* ensure that the directory exists */
|
|
||||||
gchar *dir = g_path_get_dirname (priv->path);
|
|
||||||
g_mkdir_with_parents (dir, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
|
|
||||||
g_free (dir);
|
|
||||||
|
|
||||||
priv->connections = g_hash_table_new_full (g_str_hash,
|
|
||||||
g_str_equal,
|
|
||||||
g_free,
|
|
||||||
g_object_unref);
|
|
||||||
|
|
||||||
priv->model = GTK_TREE_MODEL (gtk_list_store_new (2,
|
|
||||||
G_TYPE_STRING,
|
|
||||||
G_TYPE_STRING));
|
|
||||||
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (priv->model),
|
|
||||||
0,
|
|
||||||
GTK_SORT_ASCENDING);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_connections_constructed (GObject *object)
|
|
||||||
{
|
|
||||||
StrongswanConnectionsPrivate *priv;
|
|
||||||
GnomeVFSResult result;
|
|
||||||
|
|
||||||
if (G_OBJECT_CLASS (strongswan_connections_parent_class)->constructed)
|
|
||||||
{
|
|
||||||
G_OBJECT_CLASS (strongswan_connections_parent_class)->constructed (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_return_if_fail (STRONGSWAN_IS_CONNECTIONS (object));
|
|
||||||
priv = STRONGSWAN_CONNECTIONS (object)->priv;
|
|
||||||
|
|
||||||
result = gnome_vfs_monitor_add (&priv->monitor,
|
|
||||||
priv->path,
|
|
||||||
GNOME_VFS_MONITOR_FILE,
|
|
||||||
(GnomeVFSMonitorCallback) strongswan_connections_file_changed,
|
|
||||||
object);
|
|
||||||
if (result != GNOME_VFS_OK)
|
|
||||||
{
|
|
||||||
g_warning ("Could not monitor '%s': %s",
|
|
||||||
priv->path,
|
|
||||||
gnome_vfs_result_to_string (result));
|
|
||||||
}
|
|
||||||
|
|
||||||
strongswan_connections_load_config (STRONGSWAN_CONNECTIONS (object));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_connections_dispose (GObject *object)
|
|
||||||
{
|
|
||||||
StrongswanConnectionsPrivate *priv;
|
|
||||||
|
|
||||||
g_return_if_fail (STRONGSWAN_IS_CONNECTIONS (object));
|
|
||||||
priv = STRONGSWAN_CONNECTIONS (object)->priv;
|
|
||||||
|
|
||||||
if (priv->model)
|
|
||||||
{
|
|
||||||
priv->model = (g_object_unref (priv->model), NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (strongswan_connections_parent_class)->dispose (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_connections_finalize (GObject *object)
|
|
||||||
{
|
|
||||||
StrongswanConnectionsPrivate *priv;
|
|
||||||
|
|
||||||
g_return_if_fail (STRONGSWAN_IS_CONNECTIONS (object));
|
|
||||||
priv = STRONGSWAN_CONNECTIONS (object)->priv;
|
|
||||||
|
|
||||||
priv->path = (g_free (priv->path), NULL);
|
|
||||||
priv->monitor = (gnome_vfs_monitor_cancel (priv->monitor), NULL);
|
|
||||||
priv->key_file = (g_key_file_free (priv->key_file), NULL);
|
|
||||||
priv->connections = (g_hash_table_destroy (priv->connections), NULL);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (strongswan_connections_parent_class)->finalize (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_connections_class_init (StrongswanConnectionsClass *klass)
|
|
||||||
{
|
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
||||||
|
|
||||||
object_class->constructed = strongswan_connections_constructed;
|
|
||||||
object_class->dispose = strongswan_connections_dispose;
|
|
||||||
object_class->finalize = strongswan_connections_finalize;
|
|
||||||
|
|
||||||
g_type_class_add_private (klass, sizeof (StrongswanConnectionsPrivate));
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef USE_DYNAMIC_TYPES
|
|
||||||
static void
|
|
||||||
strongswan_connections_class_finalize (StrongswanConnectionsClass *klass)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
GtkTreeModel *
|
|
||||||
strongswan_connections_get_model (StrongswanConnections *self)
|
|
||||||
{
|
|
||||||
StrongswanConnectionsPrivate *priv = self->priv;
|
|
||||||
return g_object_ref (priv->model);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
strongswan_connections_setup_column_renderers (StrongswanConnections *self,
|
|
||||||
GtkCellLayout *layout)
|
|
||||||
{
|
|
||||||
GtkCellRenderer *renderer;
|
|
||||||
renderer = gtk_cell_renderer_text_new ();
|
|
||||||
gtk_cell_layout_pack_start (layout,
|
|
||||||
renderer,
|
|
||||||
TRUE);
|
|
||||||
gtk_cell_layout_add_attribute (layout,
|
|
||||||
renderer,
|
|
||||||
"text", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
StrongswanConnections *
|
|
||||||
strongswan_connections_new (void)
|
|
||||||
{
|
|
||||||
StrongswanConnections *connections;
|
|
||||||
connections = g_object_new (STRONGSWAN_TYPE_CONNECTIONS,
|
|
||||||
NULL);
|
|
||||||
return connections;
|
|
||||||
}
|
|
||||||
|
|
||||||
StrongswanConnection *
|
|
||||||
strongswan_connections_get_connection (StrongswanConnections *self,
|
|
||||||
const gchar *name)
|
|
||||||
{
|
|
||||||
StrongswanConnectionsPrivate *priv = self->priv;
|
|
||||||
g_return_val_if_fail (name != NULL, NULL);
|
|
||||||
return g_hash_table_lookup (priv->connections, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_connections_save_connections (StrongswanConnections *self)
|
|
||||||
{
|
|
||||||
StrongswanConnectionsPrivate *priv = self->priv;
|
|
||||||
gchar *data;
|
|
||||||
gsize size;
|
|
||||||
GError *error = NULL;
|
|
||||||
|
|
||||||
data = g_key_file_to_data (priv->key_file, &size, NULL);
|
|
||||||
if (!g_file_set_contents (priv->path, data, size, &error))
|
|
||||||
{
|
|
||||||
g_warning ("Failed to save connections to '%s': %s",
|
|
||||||
priv->path, error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
}
|
|
||||||
g_free (data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
strongswan_connections_save_connection (StrongswanConnections *self,
|
|
||||||
StrongswanConnection *conn)
|
|
||||||
{
|
|
||||||
StrongswanConnectionsPrivate *priv = self->priv;
|
|
||||||
|
|
||||||
strongswan_connection_save_to_key_file (priv->key_file, conn);
|
|
||||||
|
|
||||||
strongswan_connections_save_connections (self);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
strongswan_connections_remove_connection (StrongswanConnections *self,
|
|
||||||
const gchar *name)
|
|
||||||
{
|
|
||||||
StrongswanConnectionsPrivate *priv = self->priv;
|
|
||||||
|
|
||||||
g_key_file_remove_group (priv->key_file, name, NULL);
|
|
||||||
|
|
||||||
strongswan_connections_save_connections (self);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 Tobias Brunner
|
|
||||||
* Hochschule fuer Technik Rapperswil
|
|
||||||
*
|
|
||||||
* 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. See <http://www.fsf.org/copyleft/gpl.txt>.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __STRONGSWAN_CONNECTIONS_H__
|
|
||||||
#define __STRONGSWAN_CONNECTIONS_H__
|
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
|
||||||
|
|
||||||
#include "strongswan-connection.h"
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define STRONGSWAN_TYPE_CONNECTIONS (strongswan_connections_get_type ())
|
|
||||||
#define STRONGSWAN_CONNECTIONS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), STRONGSWAN_TYPE_CONNECTIONS, StrongswanConnections))
|
|
||||||
#define STRONGSWAN_CONNECTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), STRONGSWAN_TYPE_CONNECTIONS, StrongswanConnectionsClass))
|
|
||||||
#define STRONGSWAN_IS_CONNECTIONS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), STRONGSWAN_TYPE_CONNECTIONS))
|
|
||||||
#define STRONGSWAN_IS_CONNECTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), STRONGSWAN_TYPE_CONNECTIONS))
|
|
||||||
#define STRONGSWAN_CONNECTIONS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), STRONGSWAN_TYPE_CONNECTIONS, StrongswanConnectionsClass))
|
|
||||||
|
|
||||||
typedef struct _StrongswanConnections StrongswanConnections;
|
|
||||||
typedef struct _StrongswanConnectionsClass StrongswanConnectionsClass;
|
|
||||||
typedef struct _StrongswanConnectionsPrivate StrongswanConnectionsPrivate;
|
|
||||||
|
|
||||||
struct _StrongswanConnections
|
|
||||||
{
|
|
||||||
GObject gobject;
|
|
||||||
|
|
||||||
StrongswanConnectionsPrivate *priv;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _StrongswanConnectionsClass
|
|
||||||
{
|
|
||||||
GObjectClass parent_class;
|
|
||||||
};
|
|
||||||
|
|
||||||
GType strongswan_connections_get_type (void);
|
|
||||||
|
|
||||||
StrongswanConnections *strongswan_connections_new (void);
|
|
||||||
|
|
||||||
GtkTreeModel *strongswan_connections_get_model (StrongswanConnections *connections);
|
|
||||||
void strongswan_connections_setup_column_renderers (StrongswanConnections *connections, GtkCellLayout *layout);
|
|
||||||
|
|
||||||
StrongswanConnection *strongswan_connections_get_connection (StrongswanConnections *self, const gchar *name);
|
|
||||||
void strongswan_connections_save_connection (StrongswanConnections *self, StrongswanConnection *conn);
|
|
||||||
void strongswan_connections_remove_connection (StrongswanConnections *self, const gchar *name);
|
|
||||||
|
|
||||||
#ifdef USE_DYNAMIC_TYPES
|
|
||||||
void strongswan_connections_register (GTypeModule *type_module);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __STRONGSWAN_CONNECTIONS_H__ */
|
|
||||||
@@ -1,353 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 Tobias Brunner
|
|
||||||
* Hochschule fuer Technik Rapperswil
|
|
||||||
*
|
|
||||||
* 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. See <http://www.fsf.org/copyleft/gpl.txt>.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <hildon-cp-plugin/hildon-cp-plugin-interface.h>
|
|
||||||
#include <gtk/gtk.h>
|
|
||||||
#include <hildon/hildon.h>
|
|
||||||
#include <hildon/hildon-file-chooser-dialog.h>
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "strongswan-connections.h"
|
|
||||||
|
|
||||||
enum {
|
|
||||||
RESPONSE_NEW = 1,
|
|
||||||
RESPONSE_EDIT,
|
|
||||||
RESPONSE_DELETE
|
|
||||||
};
|
|
||||||
|
|
||||||
struct {
|
|
||||||
GtkWidget *dialog;
|
|
||||||
GtkWidget *list;
|
|
||||||
StrongswanConnections *conns;
|
|
||||||
} ListDialog = { 0, };
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Callback if no certificate should be selected
|
|
||||||
*/
|
|
||||||
void no_certificate(HildonButton *button, gpointer user_data)
|
|
||||||
{
|
|
||||||
gtk_dialog_response (GTK_DIALOG (user_data), GTK_RESPONSE_REJECT);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Callback to select a certificate
|
|
||||||
*/
|
|
||||||
void select_cert(HildonButton *button, gpointer user_data)
|
|
||||||
{
|
|
||||||
GtkWidget *selector = hildon_file_chooser_dialog_new (GTK_WINDOW (user_data), GTK_FILE_CHOOSER_ACTION_OPEN);
|
|
||||||
GtkWidget *nocert = hildon_button_new (HILDON_SIZE_FINGER_HEIGHT |
|
|
||||||
HILDON_SIZE_AUTO_WIDTH,
|
|
||||||
HILDON_BUTTON_ARRANGEMENT_VERTICAL);
|
|
||||||
hildon_button_set_text (HILDON_BUTTON (nocert),
|
|
||||||
"No certificate",
|
|
||||||
"Use system-wide CA certificates");
|
|
||||||
hildon_button_set_alignment (HILDON_BUTTON (nocert), 0, 0.5, 1, 1);
|
|
||||||
g_signal_connect (nocert, "clicked", G_CALLBACK (no_certificate), selector);
|
|
||||||
hildon_file_chooser_dialog_add_extra (HILDON_FILE_CHOOSER_DIALOG (selector),
|
|
||||||
nocert);
|
|
||||||
gtk_widget_show_all (selector);
|
|
||||||
|
|
||||||
switch (gtk_dialog_run (GTK_DIALOG (selector)))
|
|
||||||
{
|
|
||||||
case GTK_RESPONSE_OK:
|
|
||||||
{
|
|
||||||
gchar *file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (selector));
|
|
||||||
hildon_button_set_value (button, file);
|
|
||||||
g_free(file);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GTK_RESPONSE_REJECT:
|
|
||||||
{
|
|
||||||
hildon_button_set_value (button, "None");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
gtk_widget_destroy (selector);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shows a dialog to edit the given connection (or create a new one,
|
|
||||||
* if conn is NULL)
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
edit_connection (gpointer *parent, StrongswanConnection *conn)
|
|
||||||
{
|
|
||||||
GtkWidget *dialog;
|
|
||||||
dialog = gtk_dialog_new_with_buttons (
|
|
||||||
conn ? "Edit Connection" : "New Connection",
|
|
||||||
GTK_WINDOW (parent),
|
|
||||||
GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR,
|
|
||||||
GTK_STOCK_CANCEL,
|
|
||||||
GTK_RESPONSE_CANCEL,
|
|
||||||
GTK_STOCK_SAVE,
|
|
||||||
GTK_RESPONSE_OK,
|
|
||||||
NULL);
|
|
||||||
GtkWidget *vbox = GTK_DIALOG (dialog)->vbox;
|
|
||||||
GtkSizeGroup *group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
|
|
||||||
|
|
||||||
GtkWidget *name = hildon_entry_new (HILDON_SIZE_AUTO);
|
|
||||||
hildon_gtk_entry_set_placeholder_text (GTK_ENTRY (name), "Connection Name");
|
|
||||||
hildon_gtk_entry_set_input_mode (GTK_ENTRY (name),
|
|
||||||
HILDON_GTK_INPUT_MODE_AUTOCAP |
|
|
||||||
HILDON_GTK_INPUT_MODE_ALPHA |
|
|
||||||
HILDON_GTK_INPUT_MODE_NUMERIC);
|
|
||||||
GtkWidget *ncap = hildon_caption_new (group,
|
|
||||||
"Name",
|
|
||||||
name,
|
|
||||||
NULL,
|
|
||||||
HILDON_CAPTION_OPTIONAL);
|
|
||||||
gtk_box_pack_start (GTK_BOX (vbox), ncap, TRUE, TRUE, 0);
|
|
||||||
|
|
||||||
GtkWidget *host = hildon_entry_new (HILDON_SIZE_AUTO);
|
|
||||||
hildon_gtk_entry_set_placeholder_text (GTK_ENTRY (host), "Hostname / IP");
|
|
||||||
hildon_gtk_entry_set_input_mode (GTK_ENTRY (host),
|
|
||||||
HILDON_GTK_INPUT_MODE_FULL);
|
|
||||||
GtkWidget *hcap = hildon_caption_new (group,
|
|
||||||
"Host",
|
|
||||||
host,
|
|
||||||
NULL,
|
|
||||||
HILDON_CAPTION_OPTIONAL);
|
|
||||||
gtk_box_pack_start (GTK_BOX (vbox), hcap, TRUE, TRUE, 0);
|
|
||||||
|
|
||||||
GtkWidget *cert = hildon_button_new (HILDON_SIZE_FINGER_HEIGHT |
|
|
||||||
HILDON_SIZE_AUTO_WIDTH,
|
|
||||||
HILDON_BUTTON_ARRANGEMENT_VERTICAL);
|
|
||||||
hildon_button_set_text (HILDON_BUTTON (cert),
|
|
||||||
"Host or CA Certificate",
|
|
||||||
"None");
|
|
||||||
hildon_button_set_alignment (HILDON_BUTTON (cert), 0, 0.5, 1, 1);
|
|
||||||
g_signal_connect (cert, "clicked", G_CALLBACK (select_cert), dialog);
|
|
||||||
GtkWidget *ccap = hildon_caption_new (group,
|
|
||||||
"Certificate",
|
|
||||||
cert,
|
|
||||||
NULL,
|
|
||||||
HILDON_CAPTION_OPTIONAL);
|
|
||||||
gtk_box_pack_start (GTK_BOX (vbox), ccap, TRUE, TRUE, 0);
|
|
||||||
|
|
||||||
GtkWidget *user = hildon_entry_new (HILDON_SIZE_AUTO);
|
|
||||||
hildon_gtk_entry_set_placeholder_text (GTK_ENTRY (user), "Username");
|
|
||||||
hildon_gtk_entry_set_input_mode (GTK_ENTRY (user),
|
|
||||||
HILDON_GTK_INPUT_MODE_FULL);
|
|
||||||
GtkWidget *ucap = hildon_caption_new (group,
|
|
||||||
"Username",
|
|
||||||
user,
|
|
||||||
NULL,
|
|
||||||
HILDON_CAPTION_OPTIONAL);
|
|
||||||
gtk_box_pack_start (GTK_BOX (vbox), ucap, TRUE, TRUE, 0);
|
|
||||||
|
|
||||||
if (conn)
|
|
||||||
{
|
|
||||||
gchar *c_name, *c_host, *c_cert, *c_user;
|
|
||||||
g_object_get (conn,
|
|
||||||
"name", &c_name,
|
|
||||||
"host", &c_host,
|
|
||||||
"cert", &c_cert,
|
|
||||||
"user", &c_user,
|
|
||||||
NULL);
|
|
||||||
gtk_entry_set_text (GTK_ENTRY (name), c_name);
|
|
||||||
gtk_entry_set_text (GTK_ENTRY (host), c_host);
|
|
||||||
hildon_button_set_value (HILDON_BUTTON (cert),
|
|
||||||
c_cert ? c_cert : "None");
|
|
||||||
gtk_entry_set_text (GTK_ENTRY (user), c_user);
|
|
||||||
g_free (c_name);
|
|
||||||
g_free (c_host);
|
|
||||||
g_free (c_cert);
|
|
||||||
g_free (c_user);
|
|
||||||
}
|
|
||||||
|
|
||||||
gtk_widget_show_all (dialog);
|
|
||||||
|
|
||||||
gint retval = gtk_dialog_run (GTK_DIALOG (dialog));
|
|
||||||
if (retval == GTK_RESPONSE_OK)
|
|
||||||
{
|
|
||||||
const gchar *c_name, *c_cert;
|
|
||||||
c_name = gtk_entry_get_text (GTK_ENTRY (name));
|
|
||||||
if (!conn)
|
|
||||||
{
|
|
||||||
conn = strongswan_connection_new (c_name);
|
|
||||||
}
|
|
||||||
c_cert = hildon_button_get_value (HILDON_BUTTON (cert));
|
|
||||||
c_cert = strcmp (c_cert, "None") ? c_cert : NULL;
|
|
||||||
g_object_set (conn,
|
|
||||||
"name", c_name,
|
|
||||||
"host", gtk_entry_get_text (GTK_ENTRY (host)),
|
|
||||||
"cert", c_cert,
|
|
||||||
"user", gtk_entry_get_text (GTK_ENTRY (user)),
|
|
||||||
NULL);
|
|
||||||
strongswan_connections_save_connection (ListDialog.conns, conn);
|
|
||||||
}
|
|
||||||
gtk_widget_destroy (dialog);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a dialog showing a list of all connections
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
create_list_dialog (gpointer *parent)
|
|
||||||
{
|
|
||||||
GtkWidget *dialog = gtk_dialog_new_with_buttons (
|
|
||||||
"strongSwan Connections",
|
|
||||||
GTK_WINDOW (parent),
|
|
||||||
GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR,
|
|
||||||
GTK_STOCK_NEW,
|
|
||||||
RESPONSE_NEW,
|
|
||||||
GTK_STOCK_EDIT,
|
|
||||||
RESPONSE_EDIT,
|
|
||||||
GTK_STOCK_DELETE,
|
|
||||||
RESPONSE_DELETE,
|
|
||||||
GTK_STOCK_CLOSE,
|
|
||||||
GTK_RESPONSE_OK,
|
|
||||||
NULL);
|
|
||||||
ListDialog.dialog = dialog;
|
|
||||||
GtkWidget *vbox = GTK_DIALOG (dialog)->vbox;
|
|
||||||
|
|
||||||
ListDialog.conns = strongswan_connections_new ();
|
|
||||||
|
|
||||||
GtkTreeModel *model = strongswan_connections_get_model (ListDialog.conns);
|
|
||||||
ListDialog.list = gtk_tree_view_new_with_model (model);
|
|
||||||
g_object_unref (model);
|
|
||||||
|
|
||||||
GtkTreeSelection *selection;
|
|
||||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (ListDialog.list));
|
|
||||||
gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
|
|
||||||
|
|
||||||
GtkTreeViewColumn *column = gtk_tree_view_column_new ();
|
|
||||||
strongswan_connections_setup_column_renderers (ListDialog.conns,
|
|
||||||
GTK_CELL_LAYOUT (column));
|
|
||||||
gtk_tree_view_append_column (GTK_TREE_VIEW (ListDialog.list), column);
|
|
||||||
|
|
||||||
gtk_box_pack_start (GTK_BOX (vbox),
|
|
||||||
ListDialog.list,
|
|
||||||
TRUE,
|
|
||||||
TRUE,
|
|
||||||
HILDON_MARGIN_DEFAULT);
|
|
||||||
gtk_widget_show_all (dialog);
|
|
||||||
gtk_widget_hide (dialog);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the name fo the selected connection in the list (or NULL).
|
|
||||||
* The name has to be freed.
|
|
||||||
*/
|
|
||||||
static gchar *
|
|
||||||
get_selected (void)
|
|
||||||
{
|
|
||||||
GtkTreeView *tree = GTK_TREE_VIEW(ListDialog.list);
|
|
||||||
GtkTreeSelection *selection;
|
|
||||||
GtkTreeModel *model;
|
|
||||||
GtkTreeIter iter;
|
|
||||||
gchar *name = NULL;
|
|
||||||
|
|
||||||
selection = gtk_tree_view_get_selection (tree);
|
|
||||||
model = gtk_tree_view_get_model (tree);
|
|
||||||
if (gtk_tree_selection_get_selected (selection, &model, &iter))
|
|
||||||
{
|
|
||||||
gtk_tree_model_get(model, &iter, 0, &name, -1);
|
|
||||||
}
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* main callback for control panel plugins
|
|
||||||
*/
|
|
||||||
osso_return_t execute(osso_context_t *osso, gpointer data,
|
|
||||||
gboolean user_activated)
|
|
||||||
{
|
|
||||||
gint response;
|
|
||||||
|
|
||||||
create_list_dialog (data);
|
|
||||||
|
|
||||||
if (!user_activated)
|
|
||||||
{
|
|
||||||
/* load state */
|
|
||||||
}
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
gchar *selected;
|
|
||||||
response = gtk_dialog_run (GTK_DIALOG (ListDialog.dialog));
|
|
||||||
switch (response)
|
|
||||||
{
|
|
||||||
case RESPONSE_NEW:
|
|
||||||
{
|
|
||||||
edit_connection (data, NULL);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case RESPONSE_EDIT:
|
|
||||||
{
|
|
||||||
StrongswanConnection *conn;
|
|
||||||
selected = get_selected ();
|
|
||||||
conn = strongswan_connections_get_connection (ListDialog.conns,
|
|
||||||
selected);
|
|
||||||
if (conn)
|
|
||||||
{
|
|
||||||
edit_connection (data, conn);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
hildon_banner_show_information (NULL, NULL,
|
|
||||||
"Select a connection first");
|
|
||||||
}
|
|
||||||
g_free (selected);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case RESPONSE_DELETE:
|
|
||||||
{
|
|
||||||
GtkWidget *confirm;
|
|
||||||
gint retval;
|
|
||||||
gchar *msg;
|
|
||||||
selected = get_selected ();
|
|
||||||
if (!selected)
|
|
||||||
{
|
|
||||||
hildon_banner_show_information (NULL, NULL,
|
|
||||||
"Select a connection first");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
msg = g_strdup_printf ("Delete connection?\n%s", selected);
|
|
||||||
confirm = hildon_note_new_confirmation (data, msg);
|
|
||||||
retval = gtk_dialog_run (GTK_DIALOG (confirm));
|
|
||||||
if (retval == GTK_RESPONSE_OK)
|
|
||||||
{
|
|
||||||
strongswan_connections_remove_connection (ListDialog.conns,
|
|
||||||
selected);
|
|
||||||
}
|
|
||||||
gtk_widget_destroy (confirm);
|
|
||||||
g_free (msg);
|
|
||||||
g_free (selected);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (response > 0);
|
|
||||||
|
|
||||||
gtk_widget_destroy (ListDialog.dialog);
|
|
||||||
g_object_unref (ListDialog.conns);
|
|
||||||
return OSSO_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* callback called in case state has to be saved
|
|
||||||
*/
|
|
||||||
osso_return_t save_state(osso_context_t *osso, gpointer data)
|
|
||||||
{
|
|
||||||
/* save state */
|
|
||||||
return OSSO_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,621 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 Tobias Brunner
|
|
||||||
* Hochschule fuer Technik Rapperswil
|
|
||||||
*
|
|
||||||
* 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. See <http://www.fsf.org/copyleft/gpl.txt>.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <hildon/hildon.h>
|
|
||||||
#include <libosso.h>
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "strongswan-status.h"
|
|
||||||
#include "strongswan-connections.h"
|
|
||||||
|
|
||||||
#define STRONGSWAN_STATUS_GET_PRIVATE(object) \
|
|
||||||
(G_TYPE_INSTANCE_GET_PRIVATE ((object), \
|
|
||||||
STRONGSWAN_TYPE_STATUS, \
|
|
||||||
StrongswanStatusPrivate))
|
|
||||||
|
|
||||||
#define OSSO_STATUS_NAME "status"
|
|
||||||
#define OSSO_STATUS_SERVICE "org.strongswan."OSSO_STATUS_NAME
|
|
||||||
#define OSSO_STATUS_OBJECT "/org/strongswan/"OSSO_STATUS_NAME
|
|
||||||
#define OSSO_STATUS_IFACE "org.strongswan."OSSO_STATUS_NAME
|
|
||||||
|
|
||||||
#define OSSO_CHARON_NAME "charon"
|
|
||||||
#define OSSO_CHARON_SERVICE "org.strongswan."OSSO_CHARON_NAME
|
|
||||||
#define OSSO_CHARON_OBJECT "/org/strongswan/"OSSO_CHARON_NAME
|
|
||||||
#define OSSO_CHARON_IFACE "org.strongswan."OSSO_CHARON_NAME
|
|
||||||
|
|
||||||
#define ICON_SIZE_STATUS 18
|
|
||||||
#define ICON_SIZE_BUTTON 48
|
|
||||||
|
|
||||||
#define UNREF_IF(obj) do { \
|
|
||||||
if (obj) { obj = (g_object_unref (obj), NULL); } \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
STATUS_DISCONNECTED,
|
|
||||||
STATUS_CONNECTING,
|
|
||||||
STATUS_CONNECTED,
|
|
||||||
STATUS_AUTH_FAILED,
|
|
||||||
STATUS_CONNECTION_FAILED,
|
|
||||||
} StrongswanConnectionStatus;
|
|
||||||
|
|
||||||
struct _StrongswanStatusPrivate
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
GdkPixbuf *status_open;
|
|
||||||
GdkPixbuf *status_close;
|
|
||||||
GdkPixbuf *button_open;
|
|
||||||
GdkPixbuf *button_close;
|
|
||||||
} icons;
|
|
||||||
|
|
||||||
GtkWidget *dialog;
|
|
||||||
GtkWidget *button;
|
|
||||||
GtkWidget *image;
|
|
||||||
GtkWidget *selector;
|
|
||||||
GtkWidget *box;
|
|
||||||
|
|
||||||
osso_context_t *context;
|
|
||||||
|
|
||||||
StrongswanConnections *conns;
|
|
||||||
|
|
||||||
StrongswanConnectionStatus status;
|
|
||||||
gchar *current;
|
|
||||||
};
|
|
||||||
|
|
||||||
HD_DEFINE_PLUGIN_MODULE_EXTENDED (StrongswanStatus, strongswan_status, \
|
|
||||||
HD_TYPE_STATUS_MENU_ITEM, {}, { \
|
|
||||||
strongswan_connection_register (G_TYPE_MODULE (plugin)); \
|
|
||||||
strongswan_connections_register (G_TYPE_MODULE (plugin)); }, {});
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_status_menu (StrongswanStatus *plugin)
|
|
||||||
{
|
|
||||||
StrongswanStatusPrivate *priv = plugin->priv;
|
|
||||||
switch (priv->status)
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
case STATUS_DISCONNECTED:
|
|
||||||
{
|
|
||||||
hildon_button_set_value (HILDON_BUTTON (priv->button),
|
|
||||||
"Not connected");
|
|
||||||
hd_status_plugin_item_set_status_area_icon (
|
|
||||||
HD_STATUS_PLUGIN_ITEM (plugin),
|
|
||||||
priv->icons.status_open);
|
|
||||||
gtk_image_set_from_pixbuf (GTK_IMAGE (priv->image),
|
|
||||||
priv->icons.button_open);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case STATUS_CONNECTING:
|
|
||||||
{
|
|
||||||
gchar *msg = g_strdup_printf ("Connecting to %s...", priv->current);
|
|
||||||
hildon_button_set_value (HILDON_BUTTON (priv->button), msg);
|
|
||||||
g_free (msg);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case STATUS_CONNECTED:
|
|
||||||
{
|
|
||||||
gchar *msg = g_strdup_printf ("Connected to %s", priv->current);
|
|
||||||
hildon_button_set_value (HILDON_BUTTON (priv->button), msg);
|
|
||||||
g_free (msg);
|
|
||||||
hd_status_plugin_item_set_status_area_icon (
|
|
||||||
HD_STATUS_PLUGIN_ITEM (plugin),
|
|
||||||
priv->icons.status_close);
|
|
||||||
gtk_image_set_from_pixbuf (GTK_IMAGE (priv->image),
|
|
||||||
priv->icons.button_close);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_dialog_connecting (StrongswanStatus *plugin)
|
|
||||||
{
|
|
||||||
StrongswanStatusPrivate *priv = plugin->priv;
|
|
||||||
|
|
||||||
gtk_widget_set_sensitive (priv->box, FALSE);
|
|
||||||
hildon_gtk_window_set_progress_indicator (GTK_WINDOW (priv->dialog), 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_dialog_default (StrongswanStatus *plugin)
|
|
||||||
{
|
|
||||||
StrongswanStatusPrivate *priv = plugin->priv;
|
|
||||||
|
|
||||||
gtk_widget_set_sensitive (priv->box, TRUE);
|
|
||||||
hildon_gtk_window_set_progress_indicator (GTK_WINDOW (priv->dialog), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
dialog_response (GtkDialog *dialog, gint response_id, StrongswanStatus *plugin)
|
|
||||||
{
|
|
||||||
StrongswanStatusPrivate *priv = plugin->priv;
|
|
||||||
gtk_widget_destroy (priv->dialog);
|
|
||||||
priv->dialog = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
handle_status_change (StrongswanStatus *plugin,
|
|
||||||
StrongswanConnectionStatus status,
|
|
||||||
gchar *message)
|
|
||||||
{
|
|
||||||
StrongswanStatusPrivate *priv = plugin->priv;
|
|
||||||
gchar *msg = NULL;
|
|
||||||
|
|
||||||
switch (status)
|
|
||||||
{
|
|
||||||
case STATUS_CONNECTION_FAILED:
|
|
||||||
{
|
|
||||||
if (priv->status == STATUS_CONNECTED)
|
|
||||||
{
|
|
||||||
msg = g_strdup_printf ("Lost connection to %s", priv->current);
|
|
||||||
}
|
|
||||||
else if (message)
|
|
||||||
{
|
|
||||||
msg = g_strdup_printf ("Failed to connect to %s: %s",
|
|
||||||
priv->current, message);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
msg = g_strdup_printf ("Failed to connect to %s",
|
|
||||||
priv->current);
|
|
||||||
}
|
|
||||||
status = STATUS_DISCONNECTED;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case STATUS_AUTH_FAILED:
|
|
||||||
{
|
|
||||||
msg = g_strdup_printf ("Failed to connect to %s: authentication "
|
|
||||||
"failed", priv->current);
|
|
||||||
status = STATUS_DISCONNECTED;
|
|
||||||
/* TODO: show password dialog again? */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case STATUS_CONNECTED:
|
|
||||||
{
|
|
||||||
msg = g_strdup_printf ("Successfully connected to %s",
|
|
||||||
priv->current);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
case STATUS_DISCONNECTED:
|
|
||||||
{
|
|
||||||
msg = g_strdup_printf ("Disconnected from %s", priv->current);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
priv->status = status;
|
|
||||||
|
|
||||||
if (status == STATUS_DISCONNECTED)
|
|
||||||
{
|
|
||||||
priv->current = (g_free (priv->current), NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
hildon_banner_show_information (NULL, NULL, msg);
|
|
||||||
g_free (msg);
|
|
||||||
|
|
||||||
update_status_menu (plugin);
|
|
||||||
|
|
||||||
if (priv->dialog)
|
|
||||||
{
|
|
||||||
update_dialog_default (plugin);
|
|
||||||
if (status == STATUS_CONNECTED)
|
|
||||||
{
|
|
||||||
gtk_dialog_response (GTK_DIALOG (priv->dialog), GTK_RESPONSE_OK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
get_password (StrongswanStatus *plugin, gchar **password)
|
|
||||||
{
|
|
||||||
StrongswanStatusPrivate *priv = plugin->priv;
|
|
||||||
gboolean result = FALSE;
|
|
||||||
|
|
||||||
GtkWidget *dialog = gtk_dialog_new_with_buttons (
|
|
||||||
"Connecting...",
|
|
||||||
GTK_WINDOW(priv->dialog),
|
|
||||||
GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR,
|
|
||||||
GTK_STOCK_CANCEL,
|
|
||||||
GTK_RESPONSE_CANCEL,
|
|
||||||
GTK_STOCK_OK,
|
|
||||||
GTK_RESPONSE_OK,
|
|
||||||
NULL);
|
|
||||||
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
|
|
||||||
GtkWidget *vbox = GTK_DIALOG (dialog)->vbox;
|
|
||||||
GtkSizeGroup *group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
|
|
||||||
|
|
||||||
GtkWidget *pass = hildon_entry_new (HILDON_SIZE_AUTO);
|
|
||||||
hildon_gtk_entry_set_placeholder_text (GTK_ENTRY (pass), "Password");
|
|
||||||
hildon_gtk_entry_set_input_mode (GTK_ENTRY (pass),
|
|
||||||
HILDON_GTK_INPUT_MODE_FULL |
|
|
||||||
HILDON_GTK_INPUT_MODE_INVISIBLE);
|
|
||||||
GtkWidget *pcap = hildon_caption_new (group,
|
|
||||||
"Password",
|
|
||||||
pass,
|
|
||||||
NULL,
|
|
||||||
HILDON_CAPTION_OPTIONAL);
|
|
||||||
gtk_box_pack_start (GTK_BOX (vbox), pcap, TRUE, TRUE, 0);
|
|
||||||
gtk_widget_show_all (dialog);
|
|
||||||
|
|
||||||
gint retval = gtk_dialog_run (GTK_DIALOG (dialog));
|
|
||||||
if (retval == GTK_RESPONSE_OK)
|
|
||||||
{
|
|
||||||
*password = g_strdup (gtk_entry_get_text (GTK_ENTRY (pass)));
|
|
||||||
result = TRUE;
|
|
||||||
}
|
|
||||||
gtk_widget_destroy (dialog);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
connect_clicked (HildonButton *button, StrongswanStatus *plugin)
|
|
||||||
{
|
|
||||||
StrongswanStatusPrivate *priv = plugin->priv;
|
|
||||||
osso_return_t result;
|
|
||||||
osso_rpc_t retval;
|
|
||||||
|
|
||||||
priv->current = hildon_touch_selector_get_current_text (
|
|
||||||
HILDON_TOUCH_SELECTOR (priv->selector));
|
|
||||||
priv->status = STATUS_CONNECTING;
|
|
||||||
update_dialog_connecting (plugin);
|
|
||||||
update_status_menu (plugin);
|
|
||||||
|
|
||||||
StrongswanConnection *conn = strongswan_connections_get_connection (
|
|
||||||
priv->conns,
|
|
||||||
priv->current);
|
|
||||||
if (!conn)
|
|
||||||
{
|
|
||||||
handle_status_change (plugin, STATUS_CONNECTION_FAILED, "not found");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* this call on the system bus is only needed to start charon as root */
|
|
||||||
result = osso_rpc_run_system (priv->context,
|
|
||||||
OSSO_CHARON_SERVICE,
|
|
||||||
OSSO_CHARON_OBJECT,
|
|
||||||
OSSO_CHARON_IFACE,
|
|
||||||
"Start",
|
|
||||||
&retval,
|
|
||||||
DBUS_TYPE_INVALID);
|
|
||||||
osso_rpc_free_val (&retval);
|
|
||||||
if (result != OSSO_OK)
|
|
||||||
{
|
|
||||||
handle_status_change (plugin, STATUS_CONNECTION_FAILED,
|
|
||||||
"couldn't connect to charon");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
gchar *c_host, *c_cert, *c_user, *c_pass;
|
|
||||||
|
|
||||||
if (!get_password (plugin, &c_pass))
|
|
||||||
{
|
|
||||||
update_dialog_default (plugin);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_object_get (conn,
|
|
||||||
"host", &c_host,
|
|
||||||
"cert", &c_cert,
|
|
||||||
"user", &c_user,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
result = osso_rpc_run (priv->context,
|
|
||||||
OSSO_CHARON_SERVICE,
|
|
||||||
OSSO_CHARON_OBJECT,
|
|
||||||
OSSO_CHARON_IFACE,
|
|
||||||
"Connect",
|
|
||||||
&retval,
|
|
||||||
DBUS_TYPE_STRING, priv->current,
|
|
||||||
DBUS_TYPE_STRING, c_host,
|
|
||||||
DBUS_TYPE_STRING, c_cert,
|
|
||||||
DBUS_TYPE_STRING, c_user,
|
|
||||||
DBUS_TYPE_STRING, c_pass,
|
|
||||||
DBUS_TYPE_INVALID);
|
|
||||||
|
|
||||||
g_free (c_host);
|
|
||||||
g_free (c_cert);
|
|
||||||
g_free (c_user);
|
|
||||||
g_free (c_pass);
|
|
||||||
|
|
||||||
if (result != OSSO_OK || !retval.value.b)
|
|
||||||
{
|
|
||||||
handle_status_change (plugin, STATUS_CONNECTION_FAILED,
|
|
||||||
"initiation failed");
|
|
||||||
osso_rpc_free_val (&retval);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
osso_rpc_free_val (&retval);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
disconnect_clicked (HildonButton *button, StrongswanStatus *plugin)
|
|
||||||
{
|
|
||||||
osso_return_t result;
|
|
||||||
osso_rpc_t retval;
|
|
||||||
gchar *msg;
|
|
||||||
StrongswanStatusPrivate *priv = plugin->priv;
|
|
||||||
|
|
||||||
gtk_widget_set_sensitive (priv->box, FALSE);
|
|
||||||
hildon_gtk_window_set_progress_indicator (GTK_WINDOW (priv->dialog), 1);
|
|
||||||
|
|
||||||
result = osso_rpc_run_system (priv->context,
|
|
||||||
OSSO_CHARON_SERVICE,
|
|
||||||
OSSO_CHARON_OBJECT,
|
|
||||||
OSSO_CHARON_IFACE,
|
|
||||||
"Disconnect",
|
|
||||||
&retval,
|
|
||||||
DBUS_TYPE_INVALID);
|
|
||||||
|
|
||||||
gtk_widget_set_sensitive (priv->box, TRUE);
|
|
||||||
hildon_gtk_window_set_progress_indicator (GTK_WINDOW (priv->dialog), 0);
|
|
||||||
|
|
||||||
if (result == OSSO_OK)
|
|
||||||
{
|
|
||||||
msg = g_strdup_printf ("Successfully disconnected from %s",
|
|
||||||
priv->current);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
msg = g_strdup_printf ("Failed to disconnect from %s", priv->current);
|
|
||||||
}
|
|
||||||
hildon_banner_show_information (NULL, NULL, msg);
|
|
||||||
g_free (msg);
|
|
||||||
|
|
||||||
priv->current = (g_free (priv->current), NULL);
|
|
||||||
priv->status = STATUS_DISCONNECTED;
|
|
||||||
|
|
||||||
update_status_menu (plugin);
|
|
||||||
|
|
||||||
gtk_dialog_response (GTK_DIALOG (priv->dialog), GTK_RESPONSE_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
setup_dialog_disconnected (StrongswanStatus *plugin)
|
|
||||||
{
|
|
||||||
StrongswanStatusPrivate *priv = plugin->priv;
|
|
||||||
|
|
||||||
GtkWidget *vbox = GTK_DIALOG (priv->dialog)->vbox;
|
|
||||||
GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
|
|
||||||
priv->box = hbox;
|
|
||||||
GtkWidget *button = hildon_picker_button_new (
|
|
||||||
HILDON_SIZE_FINGER_HEIGHT |
|
|
||||||
HILDON_SIZE_AUTO_WIDTH,
|
|
||||||
HILDON_BUTTON_ARRANGEMENT_HORIZONTAL);
|
|
||||||
hildon_button_set_title (HILDON_BUTTON (button), "Connection:");
|
|
||||||
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
|
|
||||||
|
|
||||||
GtkWidget *selector = hildon_touch_selector_new ();
|
|
||||||
priv->selector = selector;
|
|
||||||
GtkTreeModel *model = strongswan_connections_get_model (priv->conns);
|
|
||||||
hildon_touch_selector_append_text_column (
|
|
||||||
HILDON_TOUCH_SELECTOR (selector),
|
|
||||||
model,
|
|
||||||
TRUE);
|
|
||||||
hildon_picker_button_set_selector (HILDON_PICKER_BUTTON (button),
|
|
||||||
HILDON_TOUCH_SELECTOR (selector));
|
|
||||||
|
|
||||||
button = hildon_button_new_with_text (
|
|
||||||
HILDON_SIZE_FINGER_HEIGHT |
|
|
||||||
HILDON_SIZE_AUTO_WIDTH,
|
|
||||||
HILDON_BUTTON_ARRANGEMENT_HORIZONTAL,
|
|
||||||
"Connect", NULL);
|
|
||||||
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
|
|
||||||
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
|
|
||||||
g_signal_connect (button, "clicked", G_CALLBACK (connect_clicked),
|
|
||||||
plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
setup_dialog_connected (StrongswanStatus *plugin)
|
|
||||||
{
|
|
||||||
StrongswanStatusPrivate *priv = plugin->priv;
|
|
||||||
|
|
||||||
GtkWidget *vbox = GTK_DIALOG (priv->dialog)->vbox;
|
|
||||||
GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
|
|
||||||
priv->box = hbox;
|
|
||||||
GtkWidget *button = hildon_button_new_with_text (
|
|
||||||
HILDON_SIZE_FINGER_HEIGHT |
|
|
||||||
HILDON_SIZE_AUTO_WIDTH,
|
|
||||||
HILDON_BUTTON_ARRANGEMENT_HORIZONTAL,
|
|
||||||
"Disconnect", priv->current);
|
|
||||||
hildon_button_set_style (HILDON_BUTTON (button),
|
|
||||||
HILDON_BUTTON_STYLE_PICKER);
|
|
||||||
g_signal_connect (button, "clicked", G_CALLBACK (disconnect_clicked),
|
|
||||||
plugin);
|
|
||||||
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
|
|
||||||
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
button_clicked (HildonButton *button, StrongswanStatus *plugin)
|
|
||||||
{
|
|
||||||
StrongswanStatusPrivate *priv = plugin->priv;
|
|
||||||
|
|
||||||
priv->dialog = gtk_dialog_new ();
|
|
||||||
gtk_window_set_title (GTK_WINDOW (priv->dialog), "strongSwan VPN");
|
|
||||||
g_signal_connect (priv->dialog, "response",
|
|
||||||
G_CALLBACK (dialog_response), plugin);
|
|
||||||
|
|
||||||
switch (priv->status)
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
case STATUS_DISCONNECTED:
|
|
||||||
setup_dialog_disconnected (plugin);
|
|
||||||
break;
|
|
||||||
case STATUS_CONNECTING:
|
|
||||||
setup_dialog_disconnected (plugin);
|
|
||||||
update_dialog_connecting (plugin);
|
|
||||||
break;
|
|
||||||
case STATUS_CONNECTED:
|
|
||||||
setup_dialog_connected (plugin);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
gtk_widget_show_all (priv->dialog);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gint
|
|
||||||
dbus_req_handler(const gchar *interface, const gchar *method,
|
|
||||||
GArray *arguments, StrongswanStatus *plugin,
|
|
||||||
osso_rpc_t *retval)
|
|
||||||
{
|
|
||||||
if (!strcmp (method, "StatusChanged") && arguments->len == 1)
|
|
||||||
{
|
|
||||||
int status = 0;
|
|
||||||
osso_rpc_t *arg = &g_array_index(arguments, osso_rpc_t, 0);
|
|
||||||
if (arg->type == DBUS_TYPE_INT32)
|
|
||||||
{
|
|
||||||
status = arg->value.i;
|
|
||||||
}
|
|
||||||
handle_status_change (plugin, status, NULL);
|
|
||||||
}
|
|
||||||
return OSSO_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GdkPixbuf*
|
|
||||||
load_icon (GtkIconTheme *theme, const gchar *name, gint size)
|
|
||||||
{
|
|
||||||
GdkPixbuf *icon = gtk_icon_theme_load_icon (theme, name, size,
|
|
||||||
GTK_ICON_LOOKUP_NO_SVG, NULL);
|
|
||||||
return icon;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
load_icons (StrongswanStatusPrivate *priv)
|
|
||||||
{
|
|
||||||
GtkIconTheme *theme = gtk_icon_theme_get_default ();
|
|
||||||
priv->icons.status_open = load_icon (theme, "strongswan_lock_open",
|
|
||||||
ICON_SIZE_STATUS);
|
|
||||||
priv->icons.status_close = load_icon (theme, "strongswan_lock_close",
|
|
||||||
ICON_SIZE_STATUS);
|
|
||||||
priv->icons.button_open = load_icon (theme, "strongswan_lock_open",
|
|
||||||
ICON_SIZE_BUTTON);
|
|
||||||
priv->icons.button_close = load_icon (theme, "strongswan_lock_close",
|
|
||||||
ICON_SIZE_BUTTON);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
icon_theme_changed (GtkIconTheme *theme, StrongswanStatus *plugin)
|
|
||||||
{
|
|
||||||
StrongswanStatusPrivate *priv = plugin->priv;
|
|
||||||
UNREF_IF(priv->icons.status_open);
|
|
||||||
UNREF_IF(priv->icons.status_close);
|
|
||||||
UNREF_IF(priv->icons.button_open);
|
|
||||||
UNREF_IF(priv->icons.button_close);
|
|
||||||
load_icons (priv);
|
|
||||||
update_status_menu (plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_status_init (StrongswanStatus *plugin)
|
|
||||||
{
|
|
||||||
StrongswanStatusPrivate *priv = STRONGSWAN_STATUS_GET_PRIVATE (plugin);
|
|
||||||
plugin->priv = priv;
|
|
||||||
|
|
||||||
priv->context = osso_initialize (OSSO_STATUS_SERVICE, "0.0.1", TRUE, NULL);
|
|
||||||
if (!priv->context)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
osso_return_t result;
|
|
||||||
result = osso_rpc_set_cb_f (priv->context,
|
|
||||||
OSSO_STATUS_SERVICE,
|
|
||||||
OSSO_STATUS_OBJECT,
|
|
||||||
OSSO_STATUS_IFACE,
|
|
||||||
(osso_rpc_cb_f*)dbus_req_handler,
|
|
||||||
plugin);
|
|
||||||
if (result != OSSO_OK)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
priv->conns = strongswan_connections_new ();
|
|
||||||
|
|
||||||
load_icons(priv);
|
|
||||||
|
|
||||||
hd_status_plugin_item_set_status_area_icon (HD_STATUS_PLUGIN_ITEM (plugin),
|
|
||||||
priv->icons.status_open);
|
|
||||||
|
|
||||||
GtkWidget *button = hildon_button_new_with_text (
|
|
||||||
HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH,
|
|
||||||
HILDON_BUTTON_ARRANGEMENT_VERTICAL,
|
|
||||||
"strongSwan VPN", "Not connected");
|
|
||||||
hildon_button_set_style (HILDON_BUTTON (button),
|
|
||||||
HILDON_BUTTON_STYLE_PICKER);
|
|
||||||
priv->button = button;
|
|
||||||
gtk_container_add (GTK_CONTAINER (plugin), button);
|
|
||||||
|
|
||||||
GtkWidget *image = gtk_image_new_from_pixbuf (priv->icons.button_open);
|
|
||||||
priv->image = image;
|
|
||||||
hildon_button_set_image (HILDON_BUTTON (button), image);
|
|
||||||
|
|
||||||
gtk_button_set_alignment (GTK_BUTTON (button), 0.0, 0.5);
|
|
||||||
|
|
||||||
g_signal_connect (button, "clicked", G_CALLBACK (button_clicked), plugin);
|
|
||||||
|
|
||||||
gtk_widget_show_all (GTK_WIDGET (plugin));
|
|
||||||
|
|
||||||
g_signal_connect (gtk_icon_theme_get_default (), "changed",
|
|
||||||
G_CALLBACK (icon_theme_changed), plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_status_dispose (GObject *object)
|
|
||||||
{
|
|
||||||
StrongswanStatusPrivate *priv = STRONGSWAN_STATUS (object)->priv;
|
|
||||||
if (priv->context)
|
|
||||||
{
|
|
||||||
osso_rpc_unset_cb_f (priv->context,
|
|
||||||
OSSO_STATUS_SERVICE,
|
|
||||||
OSSO_STATUS_OBJECT,
|
|
||||||
OSSO_STATUS_IFACE,
|
|
||||||
(osso_rpc_cb_f*)dbus_req_handler,
|
|
||||||
STRONGSWAN_STATUS (object));
|
|
||||||
osso_deinitialize (priv->context);
|
|
||||||
priv->context = NULL;
|
|
||||||
}
|
|
||||||
UNREF_IF(priv->conns);
|
|
||||||
UNREF_IF(priv->icons.status_open);
|
|
||||||
UNREF_IF(priv->icons.status_close);
|
|
||||||
UNREF_IF(priv->icons.button_open);
|
|
||||||
UNREF_IF(priv->icons.button_close);
|
|
||||||
G_OBJECT_CLASS (strongswan_status_parent_class)->dispose (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_status_finalize (GObject *object)
|
|
||||||
{
|
|
||||||
StrongswanStatusPrivate *priv = STRONGSWAN_STATUS (object)->priv;
|
|
||||||
priv->current = (g_free (priv->current), NULL);
|
|
||||||
G_OBJECT_CLASS (strongswan_status_parent_class)->finalize (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_status_class_finalize (StrongswanStatusClass *klass)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
strongswan_status_class_init (StrongswanStatusClass *klass)
|
|
||||||
{
|
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
||||||
|
|
||||||
object_class->dispose = strongswan_status_dispose;
|
|
||||||
object_class->finalize = strongswan_status_finalize;
|
|
||||||
|
|
||||||
g_type_class_add_private (klass, sizeof (StrongswanStatusPrivate));
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 Tobias Brunner
|
|
||||||
* Hochschule fuer Technik Rapperswil
|
|
||||||
*
|
|
||||||
* 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. See <http://www.fsf.org/copyleft/gpl.txt>.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __STRONGSWAN_STATUS_H__
|
|
||||||
#define __STRONGSWAN_STATUS_H__
|
|
||||||
|
|
||||||
#include <libhildondesktop/libhildondesktop.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define STRONGSWAN_TYPE_STATUS (strongswan_status_get_type ())
|
|
||||||
#define STRONGSWAN_STATUS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), STRONGSWAN_TYPE_STATUS, StrongswanStatus))
|
|
||||||
#define STRONGSWAN_STATUS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), STRONGSWAN_TYPE_STATUS, StrongswanStatusClass))
|
|
||||||
#define STRONGSWAN_IS_STATUS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), STRONGSWAN_TYPE_STATUS))
|
|
||||||
#define STRONGSWAN_IS_STATUS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), STRONGSWAN_TYPE_STATUS))
|
|
||||||
#define STRONGSWAN_STATUS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), STRONGSWAN_TYPE_STATUSS, StrongswanStatusClass))
|
|
||||||
|
|
||||||
typedef struct _StrongswanStatus StrongswanStatus;
|
|
||||||
typedef struct _StrongswanStatusClass StrongswanStatusClass;
|
|
||||||
typedef struct _StrongswanStatusPrivate StrongswanStatusPrivate;
|
|
||||||
|
|
||||||
struct _StrongswanStatus
|
|
||||||
{
|
|
||||||
HDStatusMenuItem parent;
|
|
||||||
|
|
||||||
StrongswanStatusPrivate *priv;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _StrongswanStatusClass
|
|
||||||
{
|
|
||||||
HDStatusMenuItemClass parent;
|
|
||||||
};
|
|
||||||
|
|
||||||
GType strongswan_status_get_type (void);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __STRONGSWAN_STATUS_H__ */
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user