manager: Remove legacy PoC manager web application

This has not been developed for years and as far as web applications
go it has some serious (security) issues.  So just remove it.
This commit is contained in:
Tobias Brunner
2026-07-24 14:17:47 +02:00
parent ea7a721dd8
commit f55bb2b384
56 changed files with 13 additions and 5944 deletions
-1
View File
@@ -20,7 +20,6 @@ options = \
options/imcv.opt \
options/imv_policy_manager.opt \
options/iptfs.opt \
options/manager.opt \
options/medsrv.opt \
options/pki.opt \
options/pool.opt \
-18
View File
@@ -1,18 +0,0 @@
manager.database =
Credential database URI for manager. If it contains a password, make
sure to adjust the permissions of the config file accordingly.
manager.debug = no
Enable debugging in manager.
manager.load =
Plugins to load in manager.
manager.socket =
FastCGI socket of manager, to run it statically.
manager.threads = 10
Threads to use for request handling.
manager.timeout = 15m
Session timeout for manager.
+12 -22
View File
@@ -291,7 +291,6 @@ ARG_ENABL_SET([conftest], [enforce Suite B conformance test framework.])
ARG_ENABL_SET([fast], [enable libfast (FastCGI Application Server w/ templates.])
ARG_ENABL_SET([fuzzing], [enable fuzzing scripts (found in directory fuzz).])
ARG_ENABL_SET([libipsec], [enable user space IPsec implementation.])
ARG_ENABL_SET([manager], [enable web management console (proof of concept).])
ARG_ENABL_SET([medcli], [enable mediation client configuration database plugin.])
ARG_ENABL_SET([medsrv], [enable mediation server web frontend and daemon plugin.])
ARG_ENABL_SET([nm], [enable NetworkManager backend.])
@@ -475,10 +474,6 @@ if test x$smp = xtrue -o x$tnccs_11 = xtrue -o x$tnc_ifmap = xtrue; then
xml=true
fi
if test x$manager = xtrue; then
fast=true
fi
if test x$medsrv = xtrue; then
mediation=true
fast=true
@@ -1534,7 +1529,6 @@ pool_plugins=
attest_plugins=
pki_plugins=
scripts_plugins=
manager_plugins=
medsrv_plugins=
nm_plugins=
cmd_plugins=
@@ -1562,19 +1556,19 @@ ADD_PLUGIN([blowfish], [s charon swanctl pki scripts nm cmd])
ADD_PLUGIN([rc2], [s charon swanctl pki scripts nm cmd])
ADD_PLUGIN([sha2], [s charon swanctl pki scripts medsrv attest nm cmd aikgen fc])
ADD_PLUGIN([sha3], [s charon swanctl pki scripts medsrv attest nm cmd aikgen fc])
ADD_PLUGIN([sha1], [s charon swanctl pki scripts manager medsrv attest nm cmd aikgen fc])
ADD_PLUGIN([sha1], [s charon swanctl pki scripts medsrv attest nm cmd aikgen fc])
ADD_PLUGIN([md4], [s charon swanctl pki nm cmd])
ADD_PLUGIN([md5], [s charon swanctl pki scripts attest nm cmd aikgen])
ADD_PLUGIN([mgf1], [s charon swanctl pki scripts medsrv attest nm cmd aikgen fc])
ADD_PLUGIN([rdrand], [s charon swanctl pki scripts medsrv attest nm cmd aikgen])
ADD_PLUGIN([random], [s charon swanctl pki scripts manager medsrv attest nm cmd aikgen])
ADD_PLUGIN([random], [s charon swanctl pki scripts medsrv attest nm cmd aikgen])
ADD_PLUGIN([nonce], [s charon nm cmd aikgen])
ADD_PLUGIN([x509], [s charon swanctl pki scripts attest nm cmd aikgen fd fc])
ADD_PLUGIN([revocation], [s charon pki nm cmd])
ADD_PLUGIN([constraints], [s charon pki nm cmd])
ADD_PLUGIN([acert], [s charon])
ADD_PLUGIN([pubkey], [s charon swanctl pki cmd aikgen])
ADD_PLUGIN([pkcs1], [s charon swanctl pki scripts manager medsrv attest nm cmd aikgen fd fc])
ADD_PLUGIN([pkcs1], [s charon swanctl pki scripts medsrv attest nm cmd aikgen fd fc])
ADD_PLUGIN([pkcs7], [s charon swanctl pki scripts nm cmd])
ADD_PLUGIN([pkcs12], [s charon swanctl pki scripts cmd])
ADD_PLUGIN([pgp], [s charon])
@@ -1582,16 +1576,16 @@ ADD_PLUGIN([dnskey], [s charon swanctl pki])
ADD_PLUGIN([sshkey], [s charon swanctl pki nm cmd])
ADD_PLUGIN([dnscert], [c charon])
ADD_PLUGIN([ipseckey], [c charon])
ADD_PLUGIN([pem], [s charon swanctl pki scripts manager medsrv attest nm cmd aikgen fd fc])
ADD_PLUGIN([pem], [s charon swanctl pki scripts medsrv attest nm cmd aikgen fd fc])
ADD_PLUGIN([padlock], [s charon])
ADD_PLUGIN([openssl], [s charon swanctl pki scripts manager medsrv attest nm cmd aikgen fd])
ADD_PLUGIN([wolfssl], [s charon swanctl pki scripts manager medsrv attest nm cmd aikgen])
ADD_PLUGIN([gcrypt], [s charon swanctl pki scripts manager medsrv attest nm cmd aikgen])
ADD_PLUGIN([botan], [s charon swanctl pki scripts manager medsrv attest nm cmd aikgen])
ADD_PLUGIN([pkcs8], [s charon swanctl pki scripts manager medsrv attest nm cmd])
ADD_PLUGIN([openssl], [s charon swanctl pki scripts medsrv attest nm cmd aikgen fd])
ADD_PLUGIN([wolfssl], [s charon swanctl pki scripts medsrv attest nm cmd aikgen])
ADD_PLUGIN([gcrypt], [s charon swanctl pki scripts medsrv attest nm cmd aikgen])
ADD_PLUGIN([botan], [s charon swanctl pki scripts medsrv attest nm cmd aikgen])
ADD_PLUGIN([pkcs8], [s charon swanctl pki scripts medsrv attest nm cmd])
ADD_PLUGIN([af-alg], [s charon swanctl pki scripts medsrv attest nm cmd aikgen])
ADD_PLUGIN([fips-prf], [s charon nm cmd])
ADD_PLUGIN([gmp], [s charon swanctl pki scripts manager medsrv attest nm cmd aikgen fc])
ADD_PLUGIN([gmp], [s charon swanctl pki scripts medsrv attest nm cmd aikgen fc])
ADD_PLUGIN([curve25519], [s charon swanctl pki scripts nm cmd])
ADD_PLUGIN([agent], [s charon nm cmd])
ADD_PLUGIN([keychain], [s charon cmd])
@@ -1609,8 +1603,8 @@ ADD_PLUGIN([curl], [s charon pki scripts nm cmd])
ADD_PLUGIN([files], [s charon pki scripts nm cmd])
ADD_PLUGIN([winhttp], [s charon pki scripts])
ADD_PLUGIN([soup], [s charon pki scripts nm cmd])
ADD_PLUGIN([mysql], [s charon pki pool manager medsrv attest])
ADD_PLUGIN([sqlite], [s charon pki pool manager medsrv attest])
ADD_PLUGIN([mysql], [s charon pki pool medsrv attest])
ADD_PLUGIN([sqlite], [s charon pki pool medsrv attest])
ADD_PLUGIN([openxpki], [s pki])
ADD_PLUGIN([attr], [c charon])
ADD_PLUGIN([attr-sql], [c charon])
@@ -1695,7 +1689,6 @@ AC_SUBST(pool_plugins)
AC_SUBST(attest_plugins)
AC_SUBST(pki_plugins)
AC_SUBST(scripts_plugins)
AC_SUBST(manager_plugins)
AC_SUBST(medsrv_plugins)
AC_SUBST(nm_plugins)
AC_SUBST(cmd_plugins)
@@ -1874,7 +1867,6 @@ AM_CONDITIONAL(USE_PF_HANDLER, test x$dhcp = xtrue -o x$farp = xtrue)
AM_CONDITIONAL(USE_LEAK_DETECTIVE, test x$leak_detective = xtrue)
AM_CONDITIONAL(USE_LOCK_PROFILER, test x$lock_profiler = xtrue)
AM_CONDITIONAL(USE_FAST, test x$fast = xtrue)
AM_CONDITIONAL(USE_MANAGER, test x$manager = xtrue)
AM_CONDITIONAL(USE_ME, test x$mediation = xtrue)
AM_CONDITIONAL(USE_INTEGRITY_TEST, test x$integrity_test = xtrue)
AM_CONDITIONAL(USE_LOAD_WARNING, test x$load_warning = xtrue)
@@ -1986,7 +1978,6 @@ AM_COND_IF([USE_IMCV], [strongswan_options=${strongswan_options}" imcv imv_polic
AM_COND_IF([USE_IMC_SWIMA], [strongswan_options=${strongswan_options}" sw-collector"])
AM_COND_IF([USE_IMV_SWIMA], [strongswan_options=${strongswan_options}" sec-updater"])
AM_COND_IF([USE_LIBTNCCS], [strongswan_options=${strongswan_options}" tnc"])
AM_COND_IF([USE_MANAGER], [strongswan_options=${strongswan_options}" manager"])
AM_COND_IF([USE_MEDSRV], [strongswan_options=${strongswan_options}" medsrv"])
AM_COND_IF([USE_CMD], [strongswan_options=${strongswan_options}" charon-cmd"])
AM_COND_IF([USE_NM], [strongswan_options=${strongswan_options}" charon-nm"])
@@ -2196,7 +2187,6 @@ AC_CONFIG_FILES([
src/pki/man/Makefile
src/pool/Makefile
src/libfast/Makefile
src/manager/Makefile
src/medsrv/Makefile
src/checksum/Makefile
src/conftest/Makefile
+1 -1
View File
@@ -304,7 +304,7 @@ all|alpine|codeql|coverage|sonarcloud|no-dbg|no-testable-ke)
# no TrouSerS either
CONFIG="$CONFIG --disable-tss-trousers --disable-aikgen"
# and no Clearsilver
CONFIG="$CONFIG --disable-fast --disable-manager --disable-medsrv"
CONFIG="$CONFIG --disable-fast --disable-medsrv"
fi
if test "$1" = "build-deps"; then
build_botan
-4
View File
@@ -91,10 +91,6 @@ if USE_FAST
SUBDIRS += libfast
endif
if USE_MANAGER
SUBDIRS += manager
endif
if USE_MEDSRV
SUBDIRS += medsrv
endif
-1
View File
@@ -1 +0,0 @@
manager.fcgi
-64
View File
@@ -1,64 +0,0 @@
managerdir = ${ipsecdir}/manager
manager_PROGRAMS = manager.fcgi
manager_fcgi_SOURCES = \
main.c manager.c manager.h gateway.h gateway.c storage.h storage.c xml.h xml.c \
controller/auth_controller.c controller/auth_controller.h \
controller/ikesa_controller.c controller/ikesa_controller.h \
controller/control_controller.c controller/control_controller.h \
controller/config_controller.c controller/config_controller.h \
controller/gateway_controller.c controller/gateway_controller.h
manager_fcgi_LDADD = $(top_builddir)/src/libstrongswan/libstrongswan.la $(top_builddir)/src/libfast/libfast.la ${xml_LIBS}
main.o : $(top_builddir)/config.status
AM_CPPFLAGS = \
-I$(top_srcdir)/src/libstrongswan \
-I$(top_srcdir)/src/libfast \
-DIPSECDIR=\"${ipsecdir}\" \
-DIPSEC_PIDDIR=\"${piddir}\" \
-DPLUGINS=\""${manager_plugins}\""
AM_CFLAGS = \
${xml_CFLAGS} \
$(PLUGIN_CFLAGS)
# Don't forget to add templates to EXTRA_DIST !!! How to automate?
manager_templatesdir = ${managerdir}/templates
manager_templates_DATA = templates/header.cs templates/footer.cs templates/error.cs
manager_templates_authdir = ${manager_templatesdir}/auth
manager_templates_auth_DATA = templates/auth/login.cs
manager_templates_gatewaydir = ${manager_templatesdir}/gateway
manager_templates_gateway_DATA = templates/gateway/list.cs
manager_templates_ikesadir = ${manager_templatesdir}/ikesa
manager_templates_ikesa_DATA = templates/ikesa/list.cs
manager_templates_controldir = ${manager_templatesdir}/control
manager_templates_control_DATA = templates/control/result.cs
manager_templates_configdir = ${manager_templatesdir}/config
manager_templates_config_DATA = templates/config/list.cs
manager_templates_staticdir = ${manager_templatesdir}/static
manager_templates_static_DATA = templates/static/style.css templates/static/script.js templates/static/jquery.js \
templates/static/pipe.png templates/static/pipe-good.png templates/static/pipe-bad.png \
templates/static/pipe-thin.png templates/static/pipe-thin-left.png templates/static/pipe-thin-right.png \
templates/static/pipe-thin-green.png templates/static/pipe-thin-left-green.png templates/static/pipe-thin-right-green.png \
templates/static/gateway-left.png templates/static/client-left.png templates/static/strongswan.png \
templates/static/router.png templates/static/gateway-right.png templates/static/client-right.png \
templates/static/close.png templates/static/initiate.png
EXTRA_DIST = templates/header.cs templates/footer.cs templates/error.cs \
templates/auth/login.cs templates/gateway/list.cs templates/ikesa/list.cs \
templates/config/list.cs templates/control/result.cs \
templates/static/style.css templates/static/script.js templates/static/jquery.js \
templates/static/pipe.png templates/static/pipe-good.png templates/static/pipe-bad.png \
templates/static/pipe-thin.png templates/static/pipe-thin-left.png templates/static/pipe-thin-right.png \
templates/static/pipe-thin-green.png templates/static/pipe-thin-left-green.png templates/static/pipe-thin-right-green.png \
templates/static/gateway-left.png templates/static/client-left.png templates/static/strongswan.png \
templates/static/router.png templates/static/gateway-right.png templates/static/client-right.png \
templates/static/close.png templates/static/initiate.png
-124
View File
@@ -1,124 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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 "auth_controller.h"
#include "../manager.h"
#include <library.h>
typedef struct private_auth_controller_t private_auth_controller_t;
/**
* private data of the task manager
*/
struct private_auth_controller_t {
/**
* public functions
*/
auth_controller_t public;
/**
* manager instance
*/
manager_t *manager;
};
static void login(private_auth_controller_t *this, fast_request_t *request)
{
request->set(request, "action", "check");
request->set(request, "title", "Login");
request->render(request, "templates/auth/login.cs");
}
static void check(private_auth_controller_t *this, fast_request_t *request)
{
char *username, *password;
username = request->get_query_data(request, "username");
password = request->get_query_data(request, "password");
if (username && password &&
this->manager->login(this->manager, username, password))
{
request->redirect(request, "ikesa/list");
}
else
{
request->redirect(request, "auth/login");
}
}
static void logout(private_auth_controller_t *this, fast_request_t *request)
{
this->manager->logout(this->manager);
request->redirect(request, "auth/login");
}
METHOD(fast_controller_t, get_name, char*,
private_auth_controller_t *this)
{
return "auth";
}
METHOD(fast_controller_t, handle, void,
private_auth_controller_t *this, fast_request_t *request, char *action,
char *p2, char *p3, char *p4, char *p5)
{
if (action)
{
if (streq(action, "login"))
{
return login(this, request);
}
else if (streq(action, "check"))
{
return check(this, request);
}
else if (streq(action, "logout"))
{
return logout(this, request);
}
}
request->redirect(request, "auth/login");
}
METHOD(fast_controller_t, destroy, void,
private_auth_controller_t *this)
{
free(this);
}
/*
* see header file
*/
fast_controller_t *auth_controller_create(fast_context_t *context, void *param)
{
private_auth_controller_t *this;
INIT(this,
.public = {
.controller = {
.get_name = _get_name,
.handle = _handle,
.destroy = _destroy,
},
},
.manager = (manager_t*)context,
);
return &this->public.controller;
}
-45
View File
@@ -1,45 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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.
*/
/**
* @defgroup auth_controller auth_controller
* @{ @ingroup manager_controller
*/
#ifndef AUTH_CONTROLLER_H_
#define AUTH_CONTROLLER_H_
#include <fast_controller.h>
typedef struct auth_controller_t auth_controller_t;
/**
* Authentication controller.
*/
struct auth_controller_t {
/**
* Implements controller_t interface.
*/
fast_controller_t controller;
};
/**
* Create a auth_controller controller instance.
*/
fast_controller_t *auth_controller_create(fast_context_t *context, void *param);
#endif /** AUTH_CONTROLLER_H_ @}*/
-207
View File
@@ -1,207 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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 "config_controller.h"
#include "../manager.h"
#include "../gateway.h"
#include <xml.h>
#include <library.h>
typedef struct private_config_controller_t private_config_controller_t;
/**
* private data of the task manager
*/
struct private_config_controller_t {
/**
* public functions
*/
config_controller_t public;
/**
* manager instance
*/
manager_t *manager;
};
/**
* read XML of a peerconfig element and fill template
*/
static void process_peerconfig(private_config_controller_t *this,
enumerator_t *e, fast_request_t *r)
{
xml_t *xml;
enumerator_t *e1, *e2, *e3;
char *name, *value, *config = "", *child = "", *section = "";
while (e->enumerate(e, &xml, &name, &value))
{
if (streq(name, "name"))
{
config = value;
}
else if (streq(name, "ikeconfig"))
{
e1 = xml->children(xml);
while (e1->enumerate(e1, &xml, &name, &value))
{
if (streq(name, "local") || streq(name, "remote"))
{
if (streq(value, "0.0.0.0") || streq(value, "::"))
{
value = "%any";
}
r->setf(r, "peercfgs.%s.ikecfg.%s=%s", config, name, value);
}
}
e1->destroy(e1);
}
else if (streq(name, "childconfiglist"))
{
e1 = xml->children(xml);
while (e1->enumerate(e1, &xml, &name, &value))
{
if (streq(name, "childconfig"))
{
int num = 0;
e2 = xml->children(xml);
while (e2->enumerate(e2, &xml, &name, &value))
{
if (streq(name, "name"))
{
child = value;
}
else if (streq(name, "local") || streq(name, "remote"))
{
section = name;
e3 = xml->children(xml);
while (e3->enumerate(e3, &xml, &name, &value))
{
if (streq(name, "network"))
{
r->setf(r, "peercfgs.%s.childcfgs.%s.%s.networks.%d=%s",
config, child, section, ++num, value);
}
}
e3->destroy(e3);
}
}
e2->destroy(e2);
}
}
e1->destroy(e1);
}
else
{
r->setf(r, "peercfgs.%s.%s=%s", config, name, value);
}
}
}
static void list(private_config_controller_t *this, fast_request_t *r)
{
gateway_t *gateway;
xml_t *xml;
enumerator_t *e1, *e2;
char *name, *value;
gateway = this->manager->select_gateway(this->manager, 0);
e1 = gateway->query_configlist(gateway);
if (e1 == NULL)
{
r->set(r, "title", "Error");
r->set(r, "error", "querying the gateway failed");
r->render(r, "templates/error.cs");
}
else
{
r->set(r, "title", "Configuration overview");
while (e1->enumerate(e1, &xml, &name, &value))
{
if (streq(name, "peerconfig"))
{
e2 = xml->children(xml);
process_peerconfig(this, e2, r);
e2->destroy(e2);
}
}
e1->destroy(e1);
r->render(r, "templates/config/list.cs");
}
}
METHOD(fast_controller_t, get_name, char*,
private_config_controller_t *this)
{
return "config";
}
METHOD(fast_controller_t, handle, void,
private_config_controller_t *this, fast_request_t *request, char *action,
char *p2, char *p3, char *p4, char *p5)
{
if (!this->manager->logged_in(this->manager))
{
return request->redirect(request, "auth/login");
}
if (this->manager->select_gateway(this->manager, 0) == NULL)
{
return request->redirect(request, "gateway/list");
}
if (action)
{
if (streq(action, "list"))
{
return list(this, request);
}
}
return request->redirect(request, "config/list");
}
METHOD(fast_controller_t, destroy, void,
private_config_controller_t *this)
{
free(this);
}
/*
* see header file
*/
fast_controller_t *config_controller_create(fast_context_t *context,
void *param)
{
private_config_controller_t *this;
INIT(this,
.public = {
.controller = {
.get_name = _get_name,
.handle = _handle,
.destroy = _destroy,
},
},
.manager = (manager_t*)context,
);
return &this->public.controller;
}
@@ -1,46 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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.
*/
/**
* @defgroup config_controller config_controller
* @{ @ingroup manager_controller
*/
#ifndef CONFIG_CONTROLLER_H_
#define CONFIG_CONTROLLER_H_
#include <fast_controller.h>
typedef struct config_controller_t config_controller_t;
/**
* Status controller.
*/
struct config_controller_t {
/**
* Implements controller_t interface.
*/
fast_controller_t controller;
};
/**
* Create a config_controller controller instance.
*/
fast_controller_t *config_controller_create(fast_context_t *context,
void *param);
#endif /** CONFIG_CONTROLLER_H_ @}*/
-204
View File
@@ -1,204 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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 "control_controller.h"
#include "../manager.h"
#include "../gateway.h"
#include <xml.h>
#include <library.h>
typedef struct private_control_controller_t private_control_controller_t;
/**
* private data of the task manager
*/
struct private_control_controller_t {
/**
* public functions
*/
control_controller_t public;
/**
* manager instance
*/
manager_t *manager;
};
/**
* handle the result of a control operation
*/
static void handle_result(private_control_controller_t *this, fast_request_t *r,
enumerator_t *e)
{
enumerator_t *e1;
xml_t *xml;
char *name, *value;
int num = 0;
if (e)
{
while (e->enumerate(e, &xml, &name, &value))
{
if (streq(name, "status"))
{
if (value && atoi(value) == 0)
{
r->set(r, "result", "Operation executed successfully:");
}
else
{
r->set(r, "result", "Operation failed:");
}
}
else if (streq(name, "log"))
{
e1 = xml->children(xml);
while (e1->enumerate(e1, &xml, &name, &value))
{
if (streq(name, "item"))
{
r->setf(r, "log.%d=%s", ++num, value);
}
}
e1->destroy(e1);
}
}
e->destroy(e);
r->render(r, "templates/control/result.cs");
}
else
{
r->set(r, "title", "Error");
r->set(r, "error", "controlling the gateway failed");
r->render(r, "templates/error.cs");
}
}
/**
* initiate an IKE or CHILD SA
*/
static void initiate(private_control_controller_t *this, fast_request_t *r,
bool ike, char *config)
{
gateway_t *gateway;
enumerator_t *e;
r->setf(r, "title=Establishing %s SA %s", ike ? "IKE" : "CHILD", config);
gateway = this->manager->select_gateway(this->manager, 0);
e = gateway->initiate(gateway, ike, config);
handle_result(this, r, e);
}
/**
* terminate an IKE or CHILD SA
*/
static void terminate(private_control_controller_t *this, fast_request_t *r,
bool ike, uint32_t id)
{
gateway_t *gateway;
enumerator_t *e;
r->setf(r, "title=Terminate %s SA %d", ike ? "IKE" : "CHILD", id);
gateway = this->manager->select_gateway(this->manager, 0);
e = gateway->terminate(gateway, ike, id);
handle_result(this, r, e);
}
METHOD(fast_controller_t, get_name, char*,
private_control_controller_t *this)
{
return "control";
}
METHOD(fast_controller_t, handle, void,
private_control_controller_t *this, fast_request_t *request, char *action,
char *str, char *p3, char *p4, char *p5)
{
if (!this->manager->logged_in(this->manager))
{
return request->redirect(request, "auth/login");
}
if (this->manager->select_gateway(this->manager, 0) == NULL)
{
return request->redirect(request, "gateway/list");
}
if (action)
{
uint32_t id;
if (streq(action, "terminateike"))
{
if (str && (id = atoi(str)))
{
return terminate(this, request, TRUE, id);
}
}
if (streq(action, "terminatechild"))
{
if (str && (id = atoi(str)))
{
return terminate(this, request, FALSE, id);
}
}
if (streq(action, "initiateike"))
{
if (str)
{
return initiate(this, request, TRUE, str);
}
}
if (streq(action, "initiatechild"))
{
if (str)
{
return initiate(this, request, FALSE, str);
}
}
}
return request->redirect(request, "ikesa/list");
}
METHOD(fast_controller_t, destroy, void,
private_control_controller_t *this)
{
free(this);
}
/*
* see header file
*/
fast_controller_t *control_controller_create(fast_context_t *context,
void *param)
{
private_control_controller_t *this;
INIT(this,
.public = {
.controller = {
.get_name = _get_name,
.handle = _handle,
.destroy = _destroy,
},
},
.manager = (manager_t*)context,
);
return &this->public.controller;
}
@@ -1,46 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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.
*/
/**
* @defgroup control_controller control_controller
* @{ @ingroup manager_controller
*/
#ifndef CONTROL_CONTROLLER_H_
#define CONTROL_CONTROLLER_H_
#include <fast_controller.h>
typedef struct control_controller_t control_controller_t;
/**
* Control controller.
*/
struct control_controller_t {
/**
* Implements controller_t interface.
*/
fast_controller_t controller;
};
/**
* Create a control_controller controller instance.
*/
fast_controller_t *control_controller_create(fast_context_t *context,
void *param);
#endif /** CONTROL_CONTROLLER_H_ @}*/
-140
View File
@@ -1,140 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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 "gateway_controller.h"
#include "../manager.h"
#include "../gateway.h"
#include <library.h>
typedef struct private_gateway_controller_t private_gateway_controller_t;
/**
* private data of the gateway_controller
*/
struct private_gateway_controller_t {
/**
* public functions
*/
gateway_controller_t public;
/**
* manager instance
*/
manager_t *manager;
};
static void list(private_gateway_controller_t *this, fast_request_t *request)
{
enumerator_t *enumerator;
char *name, *address;
int id, port;
enumerator = this->manager->create_gateway_enumerator(this->manager);
while (enumerator->enumerate(enumerator, &id, &name, &port, &address))
{
request->setf(request, "gateways.%d.name=%s", id, name);
if (port)
{
request->setf(request, "gateways.%d.address=tcp://%s:%d",
id, address, port);
}
else
{
request->setf(request, "gateways.%d.address=unix://%s",
id, IPSEC_PIDDIR"/charon.xml");
}
}
enumerator->destroy(enumerator);
request->set(request, "action", "select");
request->set(request, "title", "Choose gateway");
request->render(request, "templates/gateway/list.cs");
}
static void _select(private_gateway_controller_t *this, fast_request_t *request)
{
char *id;
id = request->get_query_data(request, "gateway");
if (id)
{
if (this->manager->select_gateway(this->manager, atoi(id)))
{
request->redirect(request, "ikesa/list");
return;
}
}
request->redirect(request, "gateway/list");
}
METHOD(fast_controller_t, get_name, char*,
private_gateway_controller_t *this)
{
return "gateway";
}
METHOD(fast_controller_t, handle, void,
private_gateway_controller_t *this, fast_request_t *request, char *action,
char *p2, char *p3, char *p4, char *p5)
{
if (!this->manager->logged_in(this->manager))
{
return request->redirect(request, "auth/login");
}
if (action)
{
if (streq(action, "list"))
{
return list(this, request);
}
else if (streq(action, "select"))
{
return _select(this, request);
}
}
request->redirect(request, "gateway/list");
}
METHOD(fast_controller_t, destroy, void,
private_gateway_controller_t *this)
{
free(this);
}
/*
* see header file
*/
fast_controller_t *gateway_controller_create(fast_context_t *context,
void *param)
{
private_gateway_controller_t *this;
INIT(this,
.public = {
.controller = {
.get_name = _get_name,
.handle = _handle,
.destroy = _destroy,
},
},
.manager = (manager_t*)context,
);
return &this->public.controller;
}
@@ -1,46 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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.
*/
/**
* @defgroup gateway_controller gateway_controller
* @{ @ingroup manager_controller
*/
#ifndef GATEWAY_CONTROLLER_H_
#define GATEWAY_CONTROLLER_H_
#include <fast_controller.h>
typedef struct gateway_controller_t gateway_controller_t;
/**
* Status controller.
*/
struct gateway_controller_t {
/**
* Implements controller_t interface.
*/
fast_controller_t controller;
};
/**
* Create a gateway_controller controller instance.
*/
fast_controller_t *gateway_controller_create(fast_context_t *context,
void *param);
#endif /** GATEWAY_CONTROLLER_H_ @}*/
-230
View File
@@ -1,230 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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 "ikesa_controller.h"
#include "../manager.h"
#include "../gateway.h"
#include <xml.h>
#include <library.h>
typedef struct private_ikesa_controller_t private_ikesa_controller_t;
/**
* private data of the task manager
*/
struct private_ikesa_controller_t {
/**
* public functions
*/
ikesa_controller_t public;
/**
* manager instance
*/
manager_t *manager;
};
/**
* read XML of a childsa element and fill template
*/
static void process_childsa(private_ikesa_controller_t *this, char *id,
enumerator_t *e, fast_request_t *r)
{
xml_t *xml;
enumerator_t *e1, *e2;
char *name, *value, *reqid = "", *section = "";
int num = 0;
while (e->enumerate(e, &xml, &name, &value))
{
if (streq(name, "reqid"))
{
reqid = value;
}
else if (streq(name, "local") || streq(name, "remote"))
{
section = name;
e1 = xml->children(xml);
while (e1->enumerate(e1, &xml, &name, &value))
{
if (streq(name, "networks"))
{
e2 = xml->children(xml);
while (e2->enumerate(e2, &xml, &name, &value))
{
if (streq(name, "network"))
{
r->setf(r, "ikesas.%s.childsas.%s.%s.networks.%d=%s",
id, reqid, section, ++num, value);
}
}
e2->destroy(e2);
}
else
{
r->setf(r, "ikesas.%s.childsas.%s.%s.%s=%s",
id, reqid, section, name, value);
}
}
e1->destroy(e1);
}
else
{
r->setf(r, "ikesas.%s.childsas.%s.%s=%s",
id, reqid, name, value);
}
}
}
/**
* read XML of a ikesa element and fill template
*/
static void process_ikesa(private_ikesa_controller_t *this,
enumerator_t *e, fast_request_t *r)
{
xml_t *xml;
enumerator_t *e1, *e2;
char *name, *value, *id = "", *section = "";
while (e->enumerate(e, &xml, &name, &value))
{
if (streq(name, "id"))
{
id = value;
}
else if (streq(name, "local") || streq(name, "remote"))
{
section = name;
e1 = xml->children(xml);
while (e1->enumerate(e1, &xml, &name, &value))
{
r->setf(r, "ikesas.%s.%s.%s=%s", id, section, name, value);
}
e1->destroy(e1);
}
else if (streq(name, "childsalist"))
{
e1 = xml->children(xml);
while (e1->enumerate(e1, &xml, &name, &value))
{
if (streq(name, "childsa"))
{
e2 = xml->children(xml);
process_childsa(this, id, e2, r);
e2->destroy(e2);
}
}
e1->destroy(e1);
}
else
{
r->setf(r, "ikesas.%s.%s=%s", id, name, value);
}
}
}
static void list(private_ikesa_controller_t *this, fast_request_t *r)
{
gateway_t *gateway;
xml_t *xml;
enumerator_t *e1, *e2;
char *name, *value;
gateway = this->manager->select_gateway(this->manager, 0);
e1 = gateway->query_ikesalist(gateway);
if (e1 == NULL)
{
r->set(r, "title", "Error");
r->set(r, "error", "querying the gateway failed");
r->render(r, "templates/error.cs");
}
else
{
r->set(r, "title", "IKE SA overview");
while (e1->enumerate(e1, &xml, &name, &value))
{
if (streq(name, "ikesa"))
{
e2 = xml->children(xml);
process_ikesa(this, e2, r);
e2->destroy(e2);
}
}
e1->destroy(e1);
r->render(r, "templates/ikesa/list.cs");
}
}
METHOD(fast_controller_t, get_name, char*,
private_ikesa_controller_t *this)
{
return "ikesa";
}
METHOD(fast_controller_t, handle, void,
private_ikesa_controller_t *this, fast_request_t *request, char *action,
char *p2, char *p3, char *p4, char *p5)
{
if (!this->manager->logged_in(this->manager))
{
return request->redirect(request, "auth/login");
}
if (this->manager->select_gateway(this->manager, 0) == NULL)
{
return request->redirect(request, "gateway/list");
}
if (action)
{
if (streq(action, "list"))
{
return list(this, request);
}
}
return request->redirect(request, "ikesa/list");
}
METHOD(fast_controller_t, destroy, void,
private_ikesa_controller_t *this)
{
free(this);
}
/*
* see header file
*/
fast_controller_t *ikesa_controller_create(fast_context_t *context, void *param)
{
private_ikesa_controller_t *this;
INIT(this,
.public = {
.controller = {
.get_name = _get_name,
.handle = _handle,
.destroy = _destroy,
},
},
.manager = (manager_t*)context,
);
return &this->public.controller;
}
-45
View File
@@ -1,45 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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.
*/
/**
* @defgroup ikesa_controller ikesa_controller
* @{ @ingroup manager_controller
*/
#ifndef IKESA_CONTROLLER_H_
#define IKESA_CONTROLLER_H_
#include <fast_controller.h>
typedef struct ikesa_controller_t ikesa_controller_t;
/**
* Status controller.
*/
struct ikesa_controller_t {
/**
* Implements controller_t interface.
*/
fast_controller_t controller;
};
/**
* Create a ikesa_controller controller instance.
*/
fast_controller_t *ikesa_controller_create(fast_context_t *context, void *param);
#endif /** IKESA_CONTROLLER_H_ @}*/
-398
View File
@@ -1,398 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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 "gateway.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <xml.h>
typedef struct private_gateway_t private_gateway_t;
/**
* private data of gateway
*/
struct private_gateway_t {
/**
* public functions
*/
gateway_t public;
/**
* name of the gateway
*/
char *name;
/**
* host to connect using tcp
*/
host_t *host;
/**
* socket file descriptor, > 0 if connected
*/
int fd;
/**
* unique id assigned to each xml message
*/
int xmlid;
};
struct sockaddr_un unix_addr = { AF_UNIX, IPSEC_PIDDIR "/charon.xml"};
/**
* establish connection to gateway
*/
static bool connect_(private_gateway_t *this)
{
int family, len;
struct sockaddr *addr;
if (this->fd >= 0)
{
close(this->fd);
}
if (this->host)
{
family = AF_INET;
addr = this->host->get_sockaddr(this->host);
len = *this->host->get_sockaddr_len(this->host);
}
else
{
family = AF_UNIX;
addr = (struct sockaddr*)&unix_addr;
len = sizeof(unix_addr);
}
this->fd = socket(family, SOCK_STREAM, 0);
if (this->fd < 0)
{
return FALSE;
}
if (connect(this->fd, addr, len) != 0)
{
close(this->fd);
this->fd = -1;
return FALSE;
}
return TRUE;
}
METHOD(gateway_t, request, char*,
private_gateway_t *this, char *xml, ...)
{
if (this->fd < 0)
{
if (!connect_(this))
{
return NULL;
}
}
while (TRUE)
{
char buf[8096];
ssize_t len;
va_list args;
va_start(args, xml);
len = vsnprintf(buf, sizeof(buf), xml, args);
va_end(args);
if (len < 0 || len >= sizeof(buf))
{
return NULL;
}
if (send(this->fd, buf, len, 0) != len)
{
if (!connect_(this))
{
return NULL;
}
continue;
}
len = recv(this->fd, buf, sizeof(buf) - 1, 0);
if (len <= 0)
{
if (!connect_(this))
{
return NULL;
}
continue;
}
buf[len] = 0;
return strdup(buf);
}
}
METHOD(gateway_t, query_ikesalist, enumerator_t*,
private_gateway_t *this)
{
char *str, *name, *value;
xml_t *xml;
enumerator_t *e1, *e2, *e3, *e4 = NULL;
str = request(this, "<message type=\"request\" id=\"%d\">"
"<query>"
"<ikesalist/>"
"</query>"
"</message>", this->xmlid++);
if (str == NULL)
{
return NULL;
}
xml = xml_create(str);
if (xml == NULL)
{
return NULL;
}
e1 = xml->children(xml);
free(str);
while (e1->enumerate(e1, &xml, &name, &value))
{
if (streq(name, "message"))
{
e2 = xml->children(xml);
while (e2->enumerate(e2, &xml, &name, &value))
{
if (streq(name, "query"))
{
e3 = xml->children(xml);
while (e3->enumerate(e3, &xml, &name, &value))
{
if (streq(name, "ikesalist"))
{
e4 = xml->children(xml);
e1->destroy(e1);
e2->destroy(e2);
e3->destroy(e3);
return e4;
}
}
e3->destroy(e3);
}
}
e2->destroy(e2);
}
}
e1->destroy(e1);
return NULL;
}
METHOD(gateway_t, query_configlist, enumerator_t*,
private_gateway_t *this)
{
char *str, *name, *value;
xml_t *xml;
enumerator_t *e1, *e2, *e3, *e4 = NULL;
str = request(this, "<message type=\"request\" id=\"%d\">"
"<query>"
"<configlist/>"
"</query>"
"</message>", this->xmlid++);
if (str == NULL)
{
return NULL;
}
xml = xml_create(str);
if (xml == NULL)
{
return NULL;
}
e1 = xml->children(xml);
free(str);
while (e1->enumerate(e1, &xml, &name, &value))
{
if (streq(name, "message"))
{
e2 = xml->children(xml);
while (e2->enumerate(e2, &xml, &name, &value))
{
if (streq(name, "query"))
{
e3 = xml->children(xml);
while (e3->enumerate(e3, &xml, &name, &value))
{
if (streq(name, "configlist"))
{
e4 = xml->children(xml);
e1->destroy(e1);
e2->destroy(e2);
e3->destroy(e3);
return e4;
}
}
e3->destroy(e3);
}
}
e2->destroy(e2);
}
}
e1->destroy(e1);
return NULL;
}
/**
* create enumerator over control elements children of a control response
*/
static enumerator_t* read_result(private_gateway_t *this, char *res)
{
char *name, *value;
xml_t *xml;
enumerator_t *e1, *e2, *e3;
if (res == NULL)
{
return NULL;
}
xml = xml_create(res);
if (xml == NULL)
{
return NULL;
}
e1 = xml->children(xml);
free(res);
while (e1->enumerate(e1, &xml, &name, &value))
{
if (streq(name, "message"))
{
e2 = xml->children(xml);
while (e2->enumerate(e2, &xml, &name, &value))
{
if (streq(name, "control"))
{
e3 = xml->children(xml);
e1->destroy(e1);
e2->destroy(e2);
return e3;
}
}
e2->destroy(e2);
}
}
e1->destroy(e1);
return NULL;
}
METHOD(gateway_t, initiate, enumerator_t*,
private_gateway_t *this, bool ike, char *name)
{
char *str, *kind;
if (ike)
{
kind = "ike";
}
else
{
kind = "child";
}
str = request(this, "<message type=\"request\" id=\"%d\">"
"<control>"
"<%ssainitiate>%s</%ssainitiate>"
"</control>"
"</message>", this->xmlid++, kind, name, kind);
return read_result(this, str);
}
METHOD(gateway_t, terminate, enumerator_t*,
private_gateway_t *this, bool ike, uint32_t id)
{
char *str, *kind;
if (ike)
{
kind = "ike";
}
else
{
kind = "child";
}
str = request(this, "<message type=\"request\" id=\"%d\">"
"<control>"
"<%ssaterminate>%d</%ssaterminate>"
"</control>"
"</message>", this->xmlid++, kind, id, kind);
return read_result(this, str);
}
METHOD(gateway_t, destroy, void,
private_gateway_t *this)
{
if (this->fd >= 0)
{
close(this->fd);
}
if (this->host) this->host->destroy(this->host);
free(this->name);
free(this);
}
/**
* generic constructor
*/
static private_gateway_t *gateway_create(char *name)
{
private_gateway_t *this;
INIT(this,
.public = {
.request = _request,
.query_ikesalist = _query_ikesalist,
.query_configlist = _query_configlist,
.initiate = _initiate,
.terminate = _terminate,
.destroy = _destroy,
},
.name = strdup(name),
.fd = -1,
.xmlid = 1,
);
return this;
}
/**
* see header
*/
gateway_t *gateway_create_tcp(char *name, host_t *host)
{
private_gateway_t *this = gateway_create(name);
this->host = host;
return &this->public;
}
/**
* see header
*/
gateway_t *gateway_create_unix(char *name)
{
private_gateway_t *this = gateway_create(name);
return &this->public;
}
-99
View File
@@ -1,99 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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.
*/
/**
* @defgroup gateway gateway
* @{ @ingroup manager
*/
#ifndef GATEWAY_H_
#define GATEWAY_H_
#include <networking/host.h>
#include <collections/enumerator.h>
typedef struct gateway_t gateway_t;
/**
* A connection to a gateway.
*/
struct gateway_t {
/**
* Send an XML request to the gateway.
*
* @param xml xml request string
* @param ... printf style argument list for xml request string
* @return allocated xml response string
*/
char* (*request)(gateway_t *this, char *xml, ...);
/**
* Query the list of IKE_SAs and all its children.
*
* @return enumerator over ikesa XML elements
*/
enumerator_t* (*query_ikesalist)(gateway_t *this);
/**
* Query the list of peer configs and its subconfigs.
*
* @return enumerator over peerconfig XML elements
*/
enumerator_t* (*query_configlist)(gateway_t *this);
/**
* Terminate an IKE or a CHILD SA.
*
* @param ike TRUE for IKE-, FALSE for a CHILD-SA
* @param id ID of the SA to terminate
* @return enumerator over control response XML children
*/
enumerator_t* (*terminate)(gateway_t *this, bool ike, uint32_t id);
/**
* Initiate an IKE or a CHILD SA.
*
* @param ike TRUE for IKE-, FALSE for CHILD-SA
* @param name name of the peer/child config
* @return enumerator over control response XML children
*/
enumerator_t* (*initiate)(gateway_t *this, bool ike, char *name);
/**
* Destroy a gateway instance.
*/
void (*destroy)(gateway_t *this);
};
/**
* Create a gateway instance using a TCP connection.
*
* @param name name of the gateway
* @param host gateway connection endpoint
* @return gateway connection
*/
gateway_t *gateway_create_tcp(char *name, host_t *host);
/**
* Create a gateway instance using a UNIX socket.
*
* @param name name of the gateway
* @return gateway connection
*/
gateway_t *gateway_create_unix(char *name);
#endif /** GATEWAY_H_ @}*/
-81
View File
@@ -1,81 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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 <fast_dispatcher.h>
#include <utils/debug.h>
#include <stdio.h>
#include "manager.h"
#include "storage.h"
#include "controller/auth_controller.h"
#include "controller/ikesa_controller.h"
#include "controller/gateway_controller.h"
#include "controller/control_controller.h"
#include "controller/config_controller.h"
int main (int arc, char *argv[])
{
fast_dispatcher_t *dispatcher;
storage_t *storage;
char *socket;
char *database;
bool debug;
int threads, timeout;
library_init(NULL, "manager");
if (!lib->plugins->load(lib->plugins,
lib->settings->get_str(lib->settings, "manager.load", PLUGINS)))
{
return 1;
}
socket = lib->settings->get_str(lib->settings, "manager.socket", NULL);
debug = lib->settings->get_bool(lib->settings, "manager.debug", FALSE);
timeout = lib->settings->get_time(lib->settings, "manager.timeout", 900);
threads = lib->settings->get_int(lib->settings, "manager.threads", 10);
database = lib->settings->get_str(lib->settings, "manager.database", NULL);
if (!database)
{
DBG1(DBG_LIB, "database URI undefined, set manager.database "
"in strongswan.conf");
return 1;
}
storage = storage_create(database);
if (storage == NULL)
{
return 1;
}
dispatcher = fast_dispatcher_create(socket, debug, timeout,
(fast_context_constructor_t)manager_create, storage);
dispatcher->add_controller(dispatcher, ikesa_controller_create, NULL);
dispatcher->add_controller(dispatcher, gateway_controller_create, NULL);
dispatcher->add_controller(dispatcher, auth_controller_create, NULL);
dispatcher->add_controller(dispatcher, control_controller_create, NULL);
dispatcher->add_controller(dispatcher, config_controller_create, NULL);
dispatcher->run(dispatcher, threads);
dispatcher->waitsignal(dispatcher);
dispatcher->destroy(dispatcher);
storage->destroy(storage);
library_deinit();
return 0;
}
-15
View File
@@ -1,15 +0,0 @@
#!/bin/bash
#
# Debug helper script, launches manager statically. Use Apache config:
# FastCgiIpcDir /var/lib/apache2/fastcgi
# FastCgiExternalServer /var/www/manager-dbg -socket manager
make CFLAGS="-g -O2 -DFCGI_SOCKET=\\\"/var/lib/apache2/fastcgi/manager\\\"" || exit
sudo make install || exit
if [ "$1" == "dbg" ]
then
sudo -u www-data gdb -q /usr/local/libexec/ipsec/manager.fcgi
else
sudo -u www-data /usr/local/libexec/ipsec/manager.fcgi
fi
-151
View File
@@ -1,151 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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 "manager.h"
#include "gateway.h"
#include <collections/linked_list.h>
typedef struct private_manager_t private_manager_t;
/**
* private data of manager
*/
struct private_manager_t {
/**
* public functions
*/
manager_t public;
/**
* underlying storage database
*/
storage_t *store;
/**
* user id, if we are logged in
*/
int user;
/**
* selected gateway
*/
gateway_t *gateway;
};
METHOD(manager_t, create_gateway_enumerator, enumerator_t*,
private_manager_t *this)
{
return this->store->create_gateway_enumerator(this->store, this->user);
}
METHOD(manager_t, select_gateway, gateway_t*,
private_manager_t *this, int select_id)
{
if (select_id != 0)
{
enumerator_t *enumerator;
int id, port;
char *name, *address;
host_t *host;
if (this->gateway) this->gateway->destroy(this->gateway);
this->gateway = NULL;
enumerator = this->store->create_gateway_enumerator(this->store, this->user);
while (enumerator->enumerate(enumerator, &id, &name, &port, &address))
{
if (select_id == id)
{
if (port == 0)
{
this->gateway = gateway_create_unix(name);
}
else
{
host = host_create_from_string(address, port);
if (host)
{
this->gateway = gateway_create_tcp(name, host);
}
}
break;
}
}
enumerator->destroy(enumerator);
}
return this->gateway;
}
METHOD(manager_t, logged_in, bool,
private_manager_t *this)
{
return this->user != 0;
}
METHOD(manager_t, login, bool,
private_manager_t *this, char *username, char *password)
{
if (!this->user)
{
this->user = this->store->login(this->store, username, password);
}
return this->user != 0;
}
METHOD(manager_t, logout, void,
private_manager_t *this)
{
if (this->gateway)
{
this->gateway->destroy(this->gateway);
this->gateway = NULL;
}
this->user = 0;
}
METHOD(fast_context_t, destroy, void,
private_manager_t *this)
{
if (this->gateway) this->gateway->destroy(this->gateway);
free(this);
}
/*
* see header file
*/
manager_t *manager_create(storage_t *storage)
{
private_manager_t *this;
INIT(this,
.public = {
.login = _login,
.logged_in = _logged_in,
.logout = _logout,
.create_gateway_enumerator = _create_gateway_enumerator,
.select_gateway = _select_gateway,
.context = {
.destroy = _destroy,
},
},
.store = storage,
);
return &this->public;
}
-95
View File
@@ -1,95 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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.
*/
/**
* @defgroup manager manager
*
* @defgroup manager_controller controller
* @ingroup manager
*
* @defgroup manager_i manager
* @{ @ingroup manager
*/
#ifndef MANAGER_H_
#define MANAGER_H_
#include "storage.h"
#include "gateway.h"
#include <fast_context.h>
typedef struct manager_t manager_t;
/**
* The manager, manages multiple gateways.
*/
struct manager_t {
/**
* implements context_t interface
*/
fast_context_t context;
/**
* Create an enumerator over all configured gateways.
*
* enumerate() arguments: int id, char *name, int port, char *address
* If port is 0, address is a Unix socket address.
*
* @return enumerator
*/
enumerator_t* (*create_gateway_enumerator)(manager_t *this);
/**
* Select a gateway.
*
* If id is 0, the previously selected gateway is returned. If none has
* been selected yet, NULL is returned.
*
* @param id id of the gateway (from enumerate), or 0
* @return selected gateway, or NULL
*/
gateway_t* (*select_gateway)(manager_t *this, int id);
/**
* Try to log in.
*
* @param username username
* @param password cleartext password
* @return TRUE if login successful
*/
bool (*login)(manager_t *this, char *username, char *password);
/**
* Check if user logged in.
*
* @return TRUE if logged in
*/
bool (*logged_in)(manager_t *this);
/**
* Log out.
*/
void (*logout)(manager_t *this);
};
/**
* Create a manager instance.
*/
manager_t *manager_create(storage_t *storage);
#endif /** MANAGER_H_ @}*/
-30
View File
@@ -1,30 +0,0 @@
CREATE TABLE users (
username TEXT, password TEXT
);
CREATE TABLE gateways (
name TEXT,
port INTEGER,
address text
);
CREATE TABLE user_gateway (
user INTEGER,
gateway INTEGER
);
INSERT INTO users VALUES(
'strongSwan',
'44092c0394d3661bd3c3587f43e48729836bdf6e' -- strongSwan
);
INSERT INTO gateways VALUES(
'Local Unix',
0,
'/var/run/charon.xml'
);
INSERT INTO user_gateway VALUES(
1,1
);
-129
View File
@@ -1,129 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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 "storage.h"
#include <library.h>
#include <crypto/hashers/hasher.h>
typedef struct private_storage_t private_storage_t;
/**
* private data of storage
*/
struct private_storage_t {
/**
* public functions
*/
storage_t public;
/**
* database connection
*/
database_t *db;
};
METHOD(storage_t, login, int,
private_storage_t *this, char *username, char *password)
{
hasher_t *hasher;
chunk_t hash, data, hex_str;
size_t username_len, password_len;
int uid = 0;
enumerator_t *enumerator;
/* hash = SHA1( username | password ) */
hasher = lib->crypto->create_hasher(lib->crypto, HASH_SHA1);
if (hasher == NULL)
{
return 0;
}
hash = chunk_alloca(hasher->get_hash_size(hasher));
username_len = strlen(username);
password_len = strlen(password);
data = chunk_alloca(username_len + password_len);
memcpy(data.ptr, username, username_len);
memcpy(data.ptr + username_len, password, password_len);
if (!hasher->get_hash(hasher, data, hash.ptr))
{
hasher->destroy(hasher);
return 0;
}
hasher->destroy(hasher);
hex_str = chunk_to_hex(hash, NULL, FALSE);
enumerator = this->db->query(this->db,
"SELECT oid FROM users WHERE username = ? AND password = ?;",
DB_TEXT, username, DB_TEXT, hex_str.ptr,
DB_INT);
if (enumerator)
{
enumerator->enumerate(enumerator, &uid);
enumerator->destroy(enumerator);
}
free(hex_str.ptr);
return uid;
}
METHOD(storage_t, create_gateway_enumerator, enumerator_t*,
private_storage_t *this, int user)
{
enumerator_t *enumerator;
enumerator = this->db->query(this->db,
"SELECT gateways.oid AS gid, name, port, address FROM "
"gateways, user_gateway AS ug ON gid = ug.gateway WHERE ug.user = ?;",
DB_INT, user,
DB_INT, DB_TEXT, DB_INT, DB_TEXT);
if (!enumerator)
{
enumerator = enumerator_create_empty();
}
return enumerator;
}
METHOD(storage_t, destroy, void,
private_storage_t *this)
{
this->db->destroy(this->db);
free(this);
}
/*
* see header file
*/
storage_t *storage_create(char *uri)
{
private_storage_t *this;
INIT(this,
.public = {
.login = _login,
.create_gateway_enumerator = _create_gateway_enumerator,
.destroy = _destroy,
},
.db = lib->db->create(lib->db, uri),
);
if (this->db == NULL)
{
free(this);
return NULL;
}
return &this->public;
}
-68
View File
@@ -1,68 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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.
*/
/**
* @defgroup storage storage
* @{ @ingroup manager
*/
#ifndef STORAGE_H_
#define STORAGE_H_
#include <collections/enumerator.h>
typedef struct storage_t storage_t;
/**
* Persistent database storage.
*/
struct storage_t {
/**
* Try to log in using specified credentials.
*
* @param username username
* @param password plaintext password
* @return user ID if login good, 0 otherwise
*/
int (*login)(storage_t *this, char *username, char *password);
/**
* Create an enumerator over the gateways.
*
* enumerate() arguments: int id, char *name, int port, char *address
* If port is 0, address is a Unix socket address.
*
* @param user user Id
* @return enumerator
*/
enumerator_t* (*create_gateway_enumerator)(storage_t *this, int user);
/**
* Destroy a storage instance.
*/
void (*destroy)(storage_t *this);
};
/**
* Create a storage instance.
*
* @param uri database connection URI
*/
storage_t *storage_create(char *uri);
#endif /** STORAGE_H_ @}*/
-17
View File
@@ -1,17 +0,0 @@
<?cs include:"templates/header.cs" ?>
<div align="center">
<form method="post" action="<?cs var:action ?>">
<table>
<tr>
<td>Username</td><td><input type="text" name="username" size="25" /></td>
</tr>
<tr>
<td>Password</td><td><input type="password" name="password" size="25" /></td>
</tr>
<tr>
<td/><td><input type="submit" value="Login"/></td>
</tr>
</table>
</form>
</div>
<?cs include:"templates/footer.cs" ?>
-104
View File
@@ -1,104 +0,0 @@
<?cs include:"templates/header.cs" ?>
<?cs each:peercfg = peercfgs ?>
<div class="expand" id="peercfg-<?cs name:peercfg ?>">
<h1><?cs name:peercfg ?>:
<span><?cs var:peercfg.local ?></span> &lt;-&gt;
<span><?cs var:peercfg.remote ?></span>
</h1>
<div class="controls">
<?cs if:peercfg.remote != "%any" ?>
<a title="initiate SA" href="<?cs var:base ?>/control/initiateike/<?cs name:peercfg ?>">
<img src="<?cs var:base ?>/static/initiate.png"/>
</a>
<?cs else ?>
&nbsp;
<?cs /if ?>
</div>
<div class="expander">
<hr/>
<table class="drawing">
<tr>
<td class="left" colspan="3">
<?cs var:peercfg.local ?>
</td>
<td>
</td>
<td class="right" colspan="3">
<?cs var:peercfg.remote ?>
</td>
</tr>
<tr class="images">
<td>
<?cs if:peercfg.remote != "%any" ?>
<img title="Local host can be the initiator" src="<?cs var:base ?>/static/client-left.png"></img>
<?cs else ?>
<img title="Local host must be the responder" src="<?cs var:base ?>/static/gateway-left.png"></img>
<?cs /if ?>
</td>
<td style="background-image:url(<?cs var:base ?>/static/pipe.png)">
<font color="#e5bf5e">0123456789abdcef</font><br/><br/><br/>
<?cs var:peercfg.ikecfg.local ?>
</td>
<td>
<img src="<?cs var:base ?>/static/pipe.png"></img>
</td>
<td>
<img title="IKE connection is down" src="<?cs var:base ?>/static/pipe.png"></img>
</td>
<td>
<img src="<?cs var:base ?>/static/pipe.png"></img>
</td>
<td class="right" style="background-image:url(<?cs var:base ?>/static/pipe.png)">
<font color="#e5bf5e">0123456789abcdef</font><br/><br/><br/>
<?cs var:peercfg.ikecfg.remote ?>
</td>
<td>
<?cs if:peercfg.remote == "%any" ?>
<img title="Remote host must be the initiator" src="<?cs var:base ?>/static/client-right.png"></img>
<?cs else ?>
<img title="Remote host can be the responder" src="<?cs var:base ?>/static/gateway-right.png"></img>
<?cs /if ?>
</td>
</tr>
<?cs each:childcfg = peercfg.childcfgs ?>
<tr>
<td colspan="6" class="expand">
<h1><?cs name:childcfg ?>:</h1>
</td>
<td class="controls">
<?cs if:peercfg.remote != "%any" ?>
<a title="initiate SA" href="<?cs var:base ?>/control/initiatechild/<?cs name:childcfg ?>">
<img src="<?cs var:base ?>/static/initiate.png"/>
</a>
<?cs /if ?>
</td>
</tr>
<tr>
<td colspan="7"><hr/></td>
</tr>
<tr class="images">
<td colspan="2">
<?cs each:net = childcfg.local.networks ?>
<p><?cs var:net ?></p>
<?cs /each ?>
</td>
<td style="background-image:url(<?cs var:base ?>/static/pipe-thin-left.png)">
<br/><br/><br/>
</td>
<td style="background-image:url(<?cs var:base ?>/static/pipe-thin.png)">
</td>
<td class="right" style="background-image:url(<?cs var:base ?>/static/pipe-thin-right.png)">
<br/><br/><br/>
</td>
<td class="right" colspan="2">
<?cs each:net = childcfg.remote.networks ?>
<p><?cs var:net ?></p>
<?cs /each ?>
</td>
</tr>
<?cs /each ?>
</table>
</div>
</div>
<?cs /each ?>
<?cs include:"templates/footer.cs" ?>
-14
View File
@@ -1,14 +0,0 @@
<?cs include:"templates/header.cs" ?>
<div class="expand">
<h1><?cs var:result ?></h1>
<div class="controls">&nbsp;</div>
<div class="expander">
<hr/>
<ul>
<?cs each:item = log ?>
<li><?cs var:item ?></li>
<?cs /each ?>
</ul>
</div>
</div>
<?cs include:"templates/footer.cs" ?>
-3
View File
@@ -1,3 +0,0 @@
<?cs include:"templates/header.cs" ?>
<div><?cs var:error ?></div>
<?cs include:"templates/footer.cs" ?>
-4
View File
@@ -1,4 +0,0 @@
</div>
</div>
</body>
</html>
-15
View File
@@ -1,15 +0,0 @@
<?cs include:"templates/header.cs" ?>
<div class="dialog">
<form method="post" action="<?cs var:action ?>">
<p>
<select name="gateway" size="1">
<?cs each:gateway = gateways ?>
<option value="<?cs name:gateway ?>"><?cs var:gateway.name ?> (<?cs var:gateway.address ?>)</option>
<?cs /each ?>
</select>
</p>
<input type="submit" value="Select"/>
<p>
</form>
</div>
<?cs include:"templates/footer.cs" ?>
-26
View File
@@ -1,26 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><?cs var:title ?> - strongSwan Manager</title>
<link rel="stylesheet" type="text/css" href="<?cs var:base ?>/static/style.css" />
<script type="text/javascript" src="<?cs var:base ?>/static/jquery.js"></script>
<script type="text/javascript" src="<?cs var:base ?>/static/script.js"></script>
</head>
<body>
<div class="fleft">
<a href="<?cs var:base ?>/ikesa/list">
<img class="fleft" src="<?cs var:base ?>/static/strongswan.png"/>
</a>
<h1>strongSwan Manager</h1>
<h2><?cs var:title ?></h2>
</div>
<div class="menu">
| <a href="<?cs var:base ?>/ikesa/list">IKE SAs</a>
| <a href="<?cs var:base ?>/config/list">Config</a>
| <a href="<?cs var:base ?>/gateway/list">Gateway</a>
| <a href="<?cs var:base ?>/auth/logout">Logout</a>
</div>
<hr class="cleft"/>
<div class="center">
<div class="content">
-111
View File
@@ -1,111 +0,0 @@
<?cs include:"templates/header.cs" ?>
<?cs each:ikesa = ikesas ?>
<div class="expand" id="ikesa-<?cs name:ikesa ?>">
<h1>
<?cs var:ikesa.peerconfig ?> [IKE #<?cs name:ikesa ?>]:
<span><?cs var:ikesa.local.identification ?></span> &lt;-&gt;
<span><?cs var:ikesa.remote.identification ?></span>
</h1>
<div class="controls">
<a title="close IKE_SA" href="<?cs var:base ?>/control/terminateike/<?cs name:ikesa ?>">
<img src="<?cs var:base ?>/static/close.png"/>
</a>
</div>
<div class="expander">
<hr/>
<table class="drawing">
<tr>
<td class="left" colspan="3">
<?cs var:ikesa.local.identification ?>
</td>
<td>
</td>
<td class="right" colspan="3">
<?cs var:ikesa.remote.identification ?>
</td>
</tr>
<tr class="images">
<td>
<?cs if:ikesa.role == "initiator" ?>
<img title="Local host is the initiator" src="<?cs var:base ?>/static/client-left.png"></img>
<?cs else ?>
<img title="Local host is the responder" src="<?cs var:base ?>/static/gateway-left.png"></img>
<?cs /if ?>
</td>
<td style="background-image:url(<?cs var:base ?>/static/pipe.png)">
<?cs var:ikesa.local.spi ?><br/><br/><br/>
<?cs var:ikesa.local.address ?>
</td>
<td>
<?cs if:ikesa.local.nat == "true" ?>
<img title="Local host is behind NAT" src="<?cs var:base ?>/static/router.png"></img>
<?cs else ?>
<img title="Local host is not NATed" src="<?cs var:base ?>/static/pipe.png"></img>
<?cs /if ?>
</td>
<td>
<?cs if:ikesa.status == "established" ?>
<img title="IKE connection <?cs var:ikesa.status ?>" src="<?cs var:base ?>/static/pipe-good.png"></img>
<?cs else ?>
<img title="IKE connection in state <?cs var:ikesa.status ?>" src="<?cs var:base ?>/static/pipe-bad.png"></img>
<?cs /if ?>
</td>
<td>
<?cs if:ikesa.remote.nat == "true" ?>
<img title="Remote host is behind NAT" src="<?cs var:base ?>/static/router.png"></img>
<?cs else ?>
<img title="Remote host is not NATed" src="<?cs var:base ?>/static/pipe.png"></img>
<?cs /if ?>
</td>
<td class="right" style="background-image:url(<?cs var:base ?>/static/pipe.png)">
<?cs var:ikesa.remote.spi ?><br/><br/><br/>
<?cs var:ikesa.remote.address ?>
</td>
<td>
<?cs if:ikesa.role == "responder" ?>
<img title="Remote host is the initiator" src="<?cs var:base ?>/static/client-right.png"></img>
<?cs else ?>
<img title="Remote host is the responder" src="<?cs var:base ?>/static/gateway-right.png"></img>
<?cs /if ?>
</td>
</tr>
<?cs each:childsa = ikesa.childsas ?>
<tr>
<td colspan="6" class="expand">
<h1><?cs var:childsa.childconfig ?> [IPsec #<?cs name:childsa ?>]:</h1>
</td>
<td class="controls">
<a title="close CHILD_SA" href="<?cs var:base ?>/control/terminatechild/<?cs name:childsa ?>">
<img src="<?cs var:base ?>/static/close.png"/>
</a>
</td>
</tr>
<tr>
<td colspan="7"><hr/></td>
</tr>
<tr class="images">
<td colspan="2">
<?cs each:net = childsa.local.networks ?>
<p><?cs var:net ?></p>
<?cs /each ?>
</td>
<td style="background-image:url(<?cs var:base ?>/static/pipe-thin-left-green.png)">
<?cs var:childsa.local.spi ?> &lt;-<br/><br/><br/>
</td>
<td style="background-image:url(<?cs var:base ?>/static/pipe-thin-green.png)">
</td>
<td class="right" style="background-image:url(<?cs var:base ?>/static/pipe-thin-right-green.png)">
-&gt; <?cs var:childsa.remote.spi ?><br/><br/><br/>
</td>
<td class="right" colspan="2">
<?cs each:net = childsa.remote.networks ?>
<p><?cs var:net ?></p>
<?cs /each ?>
</td>
</tr>
<?cs /each ?>
</table>
</div>
</div>
<?cs /each ?>
<?cs include:"templates/footer.cs" ?>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 825 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 601 B

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 449 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 345 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 460 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

-7
View File
@@ -1,7 +0,0 @@
$(function(){
$(".expand > h1").toggle(
function(){$(this).parent(".expand").find(".expander").slideUp('fast');},
function(){$(this).parent(".expand").find(".expander").slideDown('fast');}
);
});
Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

-133
View File
@@ -1,133 +0,0 @@
body {
font-family: Verdana, Helvetica, sans-serif;
font-size: .9em;
color: #230100;
background-color: #f7f4d3;
margin: 0;
}
.content {
text-align: center;
}
.content > * {
background-color: #e5bf5e;
border: solid 2px;
padding: .2em 1em .2em 1em;
margin: 1em;
text-align: left;
}
textarea, select, input {
background-color: #ffec9e;
border: 1px solid;
padding: 1px 3px 1px 3px;
}
.menu {
text-align: right;
background-color: #e5bf5e;
padding: 3px;
border-bottom: solid 2px;
}
a {
color: black;
text-decoration: none;
}
h1 {
margin-top: 1em;
}
hr {
border: solid 1px;
}
a img {
border: none;
}
.expand {
}
.expand h1 {
font-size: 1em;
cursor: pointer;
margin: 0;
float: left;
padding-top: 3px;
}
.expand h1 span {
margin-left: 2em;
margin-right: 2em;
}
.expander {
clear:left;
}
.controls {
margin-top: 3px;
text-align: right;
}
.center {
text-align: center;
}
.left {
text-align: left;
}
.right {
text-align: right;
}
.highlight {
}
.fleft {
margin-right: 2em;
float: left;
}
.fright {
float: left;
}
.cleft {
clear:left;
}
.cright {
clear:right;
}
.both {
clear:both;
}
.drawing {
border-collapse:collapse
}
.drawing .images {
height: 100px;
}
.drawing .images td {
padding: 0px;
width: 100px;
}
.drawing tr .left {
text-align: left;
}
.drawing tr .right {
text-align: right;
}
-173
View File
@@ -1,173 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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 "xml.h"
#include <libxml/parser.h>
#include <libxml/tree.h>
typedef struct private_xml_t private_xml_t;
/**
* private data of xml
*/
struct private_xml_t {
/**
* public functions
*/
xml_t public;
/**
* root node of this xml (part)
*/
xmlNode *node;
/**
* document, only for root xml_t
*/
xmlDoc *doc;
/**
* Root xml_t*
*/
private_xml_t *root;
/**
* number of enumerator instances
*/
int enums;
};
/**
* child element enumerator
*/
typedef struct {
/** enumerator interface */
enumerator_t e;
/** current child context (returned to enumerate() caller) */
private_xml_t child;
/** currently processing node */
xmlNode *node;
} child_enum_t;
METHOD(enumerator_t, child_enumerate, bool,
child_enum_t *e, va_list args)
{
private_xml_t **child;
char **name, **value;
VA_ARGS_VGET(args, child, name, value);
while (e->node && e->node->type != XML_ELEMENT_NODE)
{
e->node = e->node->next;
}
if (e->node)
{
xmlNode *text;
text = e->node->children;
*value = NULL;
while (text && text->type != XML_TEXT_NODE)
{
text = text->next;
}
if (text)
{
*value = text->content;
}
*name = (char*)e->node->name;
*child = &e->child;
e->child.node = e->node->children;
e->node = e->node->next;
return TRUE;
}
return FALSE;
}
METHOD(xml_t, get_attribute, char*,
private_xml_t *this, char *name)
{
return NULL;
}
METHOD(enumerator_t, child_destroy, void,
child_enum_t *this)
{
if (--this->child.root->enums == 0)
{
xmlFreeDoc(this->child.root->doc);
free(this->child.root);
}
free(this);
}
METHOD(xml_t, children, enumerator_t*,
private_xml_t *this)
{
child_enum_t *ce;
INIT(ce,
.e = {
.enumerate = enumerator_enumerate_default,
.venumerate = _child_enumerate,
.destroy = _child_destroy,
},
.child = {
.public = {
.get_attribute = _get_attribute,
.children = _children,
},
.doc = this->doc,
.root = this->root,
},
.node = this->node,
);
this->root->enums++;
return &ce->e;
}
/*
* see header file
*/
xml_t *xml_create(char *xml)
{
private_xml_t *this;
INIT(this,
.public = {
.get_attribute = _get_attribute,
.children = _children,
},
.doc = xmlReadMemory(xml, strlen(xml), NULL, NULL, 0),
);
if (!this->doc)
{
free(this);
return NULL;
}
this->node = xmlDocGetRootElement(this->doc);
this->root = this;
return &this->public;
}
-62
View File
@@ -1,62 +0,0 @@
/*
* Copyright (C) 2007 Martin Willi
*
* Copyright (C) secunet Security Networks AG
*
* 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.
*/
/**
* @defgroup xml xml
* @{ @ingroup manager
*/
#ifndef XML_H_
#define XML_H_
#include <collections/enumerator.h>
typedef struct xml_t xml_t;
/**
* Simple enumerator based XML parser.
*
* An xml_t is a single node of the XML tree, but also serves as root node
* and therefore the document.
* This object has no destructor, the tree gets destroyed when all enumerator
* instances get destroyed.
*/
struct xml_t {
/**
* Create an enumerator over all children.
*
* Enumerated values must not be manipulated or freed.
*
* @return enumerator over (xml_t* child, char *name, char *value)
*/
enumerator_t* (*children)(xml_t *this);
/**
* Get an attribute value by its name.
*
* @param name name of the attribute
* @return attribute value, NULL if not found
*/
char *(*get_attribute)(xml_t *this, char *name);
};
/**
* Create a xml instance.
*/
xml_t *xml_create(char *xml);
#endif /** XML_H_ @}*/