From f55bb2b3848cd0e42e8e2a666407935ec84b3614 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Fri, 24 Jul 2026 14:12:16 +0200 Subject: [PATCH] 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. --- conf/Makefile.am | 1 - conf/options/manager.opt | 18 - configure.ac | 34 +- scripts/test.sh | 2 +- src/Makefile.am | 4 - src/manager/.gitignore | 1 - src/manager/Makefile.am | 64 - src/manager/controller/auth_controller.c | 124 - src/manager/controller/auth_controller.h | 45 - src/manager/controller/config_controller.c | 207 -- src/manager/controller/config_controller.h | 46 - src/manager/controller/control_controller.c | 204 -- src/manager/controller/control_controller.h | 46 - src/manager/controller/gateway_controller.c | 140 - src/manager/controller/gateway_controller.h | 46 - src/manager/controller/ikesa_controller.c | 230 -- src/manager/controller/ikesa_controller.h | 45 - src/manager/gateway.c | 398 --- src/manager/gateway.h | 99 - src/manager/main.c | 81 - src/manager/make-debug | 15 - src/manager/manager.c | 151 - src/manager/manager.h | 95 - src/manager/sqlite.sql | 30 - src/manager/storage.c | 129 - src/manager/storage.h | 68 - src/manager/templates/auth/login.cs | 17 - src/manager/templates/config/list.cs | 104 - src/manager/templates/control/result.cs | 14 - src/manager/templates/error.cs | 3 - src/manager/templates/footer.cs | 4 - src/manager/templates/gateway/list.cs | 15 - src/manager/templates/header.cs | 26 - src/manager/templates/ikesa/list.cs | 111 - src/manager/templates/static/client-left.png | Bin 10228 -> 0 bytes src/manager/templates/static/client-right.png | Bin 10349 -> 0 bytes src/manager/templates/static/close.png | Bin 825 -> 0 bytes src/manager/templates/static/gateway-left.png | Bin 12206 -> 0 bytes .../templates/static/gateway-right.png | Bin 12180 -> 0 bytes src/manager/templates/static/initiate.png | Bin 601 -> 0 bytes src/manager/templates/static/jquery.js | 2965 ----------------- src/manager/templates/static/pipe-bad.png | Bin 4905 -> 0 bytes src/manager/templates/static/pipe-good.png | Bin 322 -> 0 bytes .../templates/static/pipe-thin-green.png | Bin 372 -> 0 bytes .../templates/static/pipe-thin-left-green.png | Bin 449 -> 0 bytes .../templates/static/pipe-thin-left.png | Bin 345 -> 0 bytes .../static/pipe-thin-right-green.png | Bin 460 -> 0 bytes .../templates/static/pipe-thin-right.png | Bin 357 -> 0 bytes src/manager/templates/static/pipe-thin.png | Bin 256 -> 0 bytes src/manager/templates/static/pipe.png | Bin 322 -> 0 bytes src/manager/templates/static/router.png | Bin 3300 -> 0 bytes src/manager/templates/static/script.js | 7 - src/manager/templates/static/strongswan.png | Bin 19837 -> 0 bytes src/manager/templates/static/style.css | 133 - src/manager/xml.c | 173 - src/manager/xml.h | 62 - 56 files changed, 13 insertions(+), 5944 deletions(-) delete mode 100644 conf/options/manager.opt delete mode 100644 src/manager/.gitignore delete mode 100644 src/manager/Makefile.am delete mode 100644 src/manager/controller/auth_controller.c delete mode 100644 src/manager/controller/auth_controller.h delete mode 100644 src/manager/controller/config_controller.c delete mode 100644 src/manager/controller/config_controller.h delete mode 100644 src/manager/controller/control_controller.c delete mode 100644 src/manager/controller/control_controller.h delete mode 100644 src/manager/controller/gateway_controller.c delete mode 100644 src/manager/controller/gateway_controller.h delete mode 100644 src/manager/controller/ikesa_controller.c delete mode 100644 src/manager/controller/ikesa_controller.h delete mode 100644 src/manager/gateway.c delete mode 100644 src/manager/gateway.h delete mode 100644 src/manager/main.c delete mode 100755 src/manager/make-debug delete mode 100644 src/manager/manager.c delete mode 100644 src/manager/manager.h delete mode 100644 src/manager/sqlite.sql delete mode 100644 src/manager/storage.c delete mode 100644 src/manager/storage.h delete mode 100644 src/manager/templates/auth/login.cs delete mode 100644 src/manager/templates/config/list.cs delete mode 100644 src/manager/templates/control/result.cs delete mode 100644 src/manager/templates/error.cs delete mode 100644 src/manager/templates/footer.cs delete mode 100644 src/manager/templates/gateway/list.cs delete mode 100644 src/manager/templates/header.cs delete mode 100644 src/manager/templates/ikesa/list.cs delete mode 100644 src/manager/templates/static/client-left.png delete mode 100644 src/manager/templates/static/client-right.png delete mode 100644 src/manager/templates/static/close.png delete mode 100644 src/manager/templates/static/gateway-left.png delete mode 100644 src/manager/templates/static/gateway-right.png delete mode 100644 src/manager/templates/static/initiate.png delete mode 100644 src/manager/templates/static/jquery.js delete mode 100644 src/manager/templates/static/pipe-bad.png delete mode 100644 src/manager/templates/static/pipe-good.png delete mode 100644 src/manager/templates/static/pipe-thin-green.png delete mode 100644 src/manager/templates/static/pipe-thin-left-green.png delete mode 100644 src/manager/templates/static/pipe-thin-left.png delete mode 100644 src/manager/templates/static/pipe-thin-right-green.png delete mode 100644 src/manager/templates/static/pipe-thin-right.png delete mode 100644 src/manager/templates/static/pipe-thin.png delete mode 100644 src/manager/templates/static/pipe.png delete mode 100644 src/manager/templates/static/router.png delete mode 100644 src/manager/templates/static/script.js delete mode 100644 src/manager/templates/static/strongswan.png delete mode 100644 src/manager/templates/static/style.css delete mode 100644 src/manager/xml.c delete mode 100644 src/manager/xml.h diff --git a/conf/Makefile.am b/conf/Makefile.am index b36493350..6fefbf630 100644 --- a/conf/Makefile.am +++ b/conf/Makefile.am @@ -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 \ diff --git a/conf/options/manager.opt b/conf/options/manager.opt deleted file mode 100644 index dbac73110..000000000 --- a/conf/options/manager.opt +++ /dev/null @@ -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. diff --git a/configure.ac b/configure.ac index 06d07ee05..9bf20a570 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/scripts/test.sh b/scripts/test.sh index 630aade59..bc9316e90 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -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 diff --git a/src/Makefile.am b/src/Makefile.am index 8abcbcf67..f74c9010d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -91,10 +91,6 @@ if USE_FAST SUBDIRS += libfast endif -if USE_MANAGER - SUBDIRS += manager -endif - if USE_MEDSRV SUBDIRS += medsrv endif diff --git a/src/manager/.gitignore b/src/manager/.gitignore deleted file mode 100644 index 8081a964f..000000000 --- a/src/manager/.gitignore +++ /dev/null @@ -1 +0,0 @@ -manager.fcgi diff --git a/src/manager/Makefile.am b/src/manager/Makefile.am deleted file mode 100644 index a4f151ca4..000000000 --- a/src/manager/Makefile.am +++ /dev/null @@ -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 diff --git a/src/manager/controller/auth_controller.c b/src/manager/controller/auth_controller.c deleted file mode 100644 index 7550e3f80..000000000 --- a/src/manager/controller/auth_controller.c +++ /dev/null @@ -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 . - * - * 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 - - -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; -} diff --git a/src/manager/controller/auth_controller.h b/src/manager/controller/auth_controller.h deleted file mode 100644 index 2ac120f83..000000000 --- a/src/manager/controller/auth_controller.h +++ /dev/null @@ -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 . - * - * 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 - -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_ @}*/ diff --git a/src/manager/controller/config_controller.c b/src/manager/controller/config_controller.c deleted file mode 100644 index f45fe05f6..000000000 --- a/src/manager/controller/config_controller.c +++ /dev/null @@ -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 . - * - * 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 - -#include - - -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; -} diff --git a/src/manager/controller/config_controller.h b/src/manager/controller/config_controller.h deleted file mode 100644 index 59b60bebe..000000000 --- a/src/manager/controller/config_controller.h +++ /dev/null @@ -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 . - * - * 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 - -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_ @}*/ diff --git a/src/manager/controller/control_controller.c b/src/manager/controller/control_controller.c deleted file mode 100644 index 669a5fc29..000000000 --- a/src/manager/controller/control_controller.c +++ /dev/null @@ -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 . - * - * 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 - -#include - - -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; -} diff --git a/src/manager/controller/control_controller.h b/src/manager/controller/control_controller.h deleted file mode 100644 index 8ca51becb..000000000 --- a/src/manager/controller/control_controller.h +++ /dev/null @@ -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 . - * - * 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 - -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_ @}*/ diff --git a/src/manager/controller/gateway_controller.c b/src/manager/controller/gateway_controller.c deleted file mode 100644 index 7eeeb39b2..000000000 --- a/src/manager/controller/gateway_controller.c +++ /dev/null @@ -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 . - * - * 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 - - -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; -} diff --git a/src/manager/controller/gateway_controller.h b/src/manager/controller/gateway_controller.h deleted file mode 100644 index 69c877df9..000000000 --- a/src/manager/controller/gateway_controller.h +++ /dev/null @@ -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 . - * - * 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 - -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_ @}*/ diff --git a/src/manager/controller/ikesa_controller.c b/src/manager/controller/ikesa_controller.c deleted file mode 100644 index 698467549..000000000 --- a/src/manager/controller/ikesa_controller.c +++ /dev/null @@ -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 . - * - * 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 - -#include - - -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; -} diff --git a/src/manager/controller/ikesa_controller.h b/src/manager/controller/ikesa_controller.h deleted file mode 100644 index 8d6a82617..000000000 --- a/src/manager/controller/ikesa_controller.h +++ /dev/null @@ -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 . - * - * 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 - -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_ @}*/ diff --git a/src/manager/gateway.c b/src/manager/gateway.c deleted file mode 100644 index 4bb6d857a..000000000 --- a/src/manager/gateway.c +++ /dev/null @@ -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 . - * - * 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 -#include -#include -#include -#include -#include - -#include - -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, "" - "" - "" - "" - "", 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, "" - "" - "" - "" - "", 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, "" - "" - "<%ssainitiate>%s" - "" - "", 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, "" - "" - "<%ssaterminate>%d" - "" - "", 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; -} - diff --git a/src/manager/gateway.h b/src/manager/gateway.h deleted file mode 100644 index 529805a30..000000000 --- a/src/manager/gateway.h +++ /dev/null @@ -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 . - * - * 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 -#include - -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_ @}*/ diff --git a/src/manager/main.c b/src/manager/main.c deleted file mode 100644 index d4b3b917d..000000000 --- a/src/manager/main.c +++ /dev/null @@ -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 . - * - * 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 -#include -#include - -#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; -} diff --git a/src/manager/make-debug b/src/manager/make-debug deleted file mode 100755 index c1093a138..000000000 --- a/src/manager/make-debug +++ /dev/null @@ -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 diff --git a/src/manager/manager.c b/src/manager/manager.c deleted file mode 100644 index 14e80e390..000000000 --- a/src/manager/manager.c +++ /dev/null @@ -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 . - * - * 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 - -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; -} diff --git a/src/manager/manager.h b/src/manager/manager.h deleted file mode 100644 index 76fae32f8..000000000 --- a/src/manager/manager.h +++ /dev/null @@ -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 . - * - * 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 - -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_ @}*/ diff --git a/src/manager/sqlite.sql b/src/manager/sqlite.sql deleted file mode 100644 index c60025e0e..000000000 --- a/src/manager/sqlite.sql +++ /dev/null @@ -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 -); diff --git a/src/manager/storage.c b/src/manager/storage.c deleted file mode 100644 index 55580956b..000000000 --- a/src/manager/storage.c +++ /dev/null @@ -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 . - * - * 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 -#include - - -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; -} - diff --git a/src/manager/storage.h b/src/manager/storage.h deleted file mode 100644 index cb60a90a1..000000000 --- a/src/manager/storage.h +++ /dev/null @@ -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 . - * - * 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 - - -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_ @}*/ diff --git a/src/manager/templates/auth/login.cs b/src/manager/templates/auth/login.cs deleted file mode 100644 index 49a8ec6e0..000000000 --- a/src/manager/templates/auth/login.cs +++ /dev/null @@ -1,17 +0,0 @@ - -
-
- - - - - - - - - - -
Username
Password
-
-
- diff --git a/src/manager/templates/config/list.cs b/src/manager/templates/config/list.cs deleted file mode 100644 index 547a4aee7..000000000 --- a/src/manager/templates/config/list.cs +++ /dev/null @@ -1,104 +0,0 @@ - - -
-

: - <-> - -

-
- - - - - -   - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - - 0123456789abdcef


- -
- - - - - - - 0123456789abcdef


- -
- - - - - -
-

:

-
- - - - - -

- -

- -
-


-
- -


-
- -

- -
-
-
- - diff --git a/src/manager/templates/control/result.cs b/src/manager/templates/control/result.cs deleted file mode 100644 index 1d59df65f..000000000 --- a/src/manager/templates/control/result.cs +++ /dev/null @@ -1,14 +0,0 @@ - -
-

-
 
-
-
-
    - -
  • - -
-
-
- diff --git a/src/manager/templates/error.cs b/src/manager/templates/error.cs deleted file mode 100644 index be9b1a3a1..000000000 --- a/src/manager/templates/error.cs +++ /dev/null @@ -1,3 +0,0 @@ - -
- diff --git a/src/manager/templates/footer.cs b/src/manager/templates/footer.cs deleted file mode 100644 index 9b151ee89..000000000 --- a/src/manager/templates/footer.cs +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/manager/templates/gateway/list.cs b/src/manager/templates/gateway/list.cs deleted file mode 100644 index b93364d6f..000000000 --- a/src/manager/templates/gateway/list.cs +++ /dev/null @@ -1,15 +0,0 @@ - -
-
-

- -

- -

-

-
- diff --git a/src/manager/templates/header.cs b/src/manager/templates/header.cs deleted file mode 100644 index 5d174c4c8..000000000 --- a/src/manager/templates/header.cs +++ /dev/null @@ -1,26 +0,0 @@ - - - - <?cs var:title ?> - strongSwan Manager - - - - - -
- - - -

strongSwan Manager

-

-
- -
-
-
diff --git a/src/manager/templates/ikesa/list.cs b/src/manager/templates/ikesa/list.cs deleted file mode 100644 index 88a88c175..000000000 --- a/src/manager/templates/ikesa/list.cs +++ /dev/null @@ -1,111 +0,0 @@ - - -
-

- [IKE #]: - <-> - -

-
- - - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -


- -
- - - - - - - - - - - - - - - - - - -


- -
- - - - - -
-

[IPsec #]:

-
- - - -

- -

- -
- <-


-
- - ->


-
- -

- -
-
-
- - diff --git a/src/manager/templates/static/client-left.png b/src/manager/templates/static/client-left.png deleted file mode 100644 index 8a082ff9e53cff2a55d1b62daf436dabde60754e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10228 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 LNkvXXu0mjfC4n`= diff --git a/src/manager/templates/static/close.png b/src/manager/templates/static/close.png deleted file mode 100644 index 7cb058d69bad6a103c9786a09d2cfcf4ab3431af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 825 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 diff --git a/src/manager/templates/static/gateway-right.png b/src/manager/templates/static/gateway-right.png deleted file mode 100644 index 0be446827e8d9148198eb5de958331493ff62722..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12180 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 Q`sX3!rB$SAB#eUo57t>-N&o-= diff --git a/src/manager/templates/static/initiate.png b/src/manager/templates/static/initiate.png deleted file mode 100644 index 4463e3b7a41536cd8cefcfe34b9018a0c51908f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 601 zcmV-f0;c_mP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iFS> z5D^5ndrap500G%aL_t(2&xMlBYZGA*hoAR-ceDAHlq6LHO^CI$25Z!&r9zd0LeZdt zv{X@15Coy8UZjFo!J8-l01qm7vqjLJ1VKDh#G@jmde9V1T5GnO{qj&r3t4eaGs8SH zKV}AkOekH9-M=eNKeLpq)=ky4-pAi(v&cER=}#eKP$Y3Y}0jDAw|+^FJ*Jiqznw@~pc zp%{*o_<-kwF2NAcY{C5F*WZ8r+<0$oiiXD0wL1WQac;_s^*?pj9V{X6BZ~5FD0FSf zZQ4-(vA$@%IeP^_YcI!k(JYsN3>-Tu7%YO^alwWOj_J1JZLsBX?zqn7>2UB*0G{at zfVN9q_vlUra=4CNJQ7s2d>*G%8f3JKYf^q5r nda^f=^c|Dd+8i4*9{~OUvjdcba4g$=00000NkvXXu0mjf)7J;2 diff --git a/src/manager/templates/static/jquery.js b/src/manager/templates/static/jquery.js deleted file mode 100644 index 7aaed5e4d..000000000 --- a/src/manager/templates/static/jquery.js +++ /dev/null @@ -1,2965 +0,0 @@ -(function(){ -/* - * jQuery 1.2 - New Wave Javascript - * - * Copyright (c) 2007 John Resig (jquery.com) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * $Date: 2007-09-10 15:45:49 -0400 (Mon, 10 Sep 2007) $ - * $Rev: 3219 $ - */ - -// Map over jQuery in case of overwrite -if ( typeof jQuery != "undefined" ) - var _jQuery = jQuery; - -var jQuery = window.jQuery = function(a,c) { - // If the context is global, return a new object - if ( window == this || !this.init ) - return new jQuery(a,c); - - return this.init(a,c); -}; - -// Map over the $ in case of overwrite -if ( typeof $ != "undefined" ) - var _$ = $; - -// Map the jQuery namespace to the '$' one -window.$ = jQuery; - -var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/; - -jQuery.fn = jQuery.prototype = { - init: function(a,c) { - // Make sure that a selection was provided - a = a || document; - - // Handle HTML strings - if ( typeof a == "string" ) { - var m = quickExpr.exec(a); - if ( m && (m[1] || !c) ) { - // HANDLE: $(html) -> $(array) - if ( m[1] ) - a = jQuery.clean( [ m[1] ], c ); - - // HANDLE: $("#id") - else { - var tmp = document.getElementById( m[3] ); - if ( tmp ) - // Handle the case where IE and Opera return items - // by name instead of ID - if ( tmp.id != m[3] ) - return jQuery().find( a ); - else { - this[0] = tmp; - this.length = 1; - return this; - } - else - a = []; - } - - // HANDLE: $(expr) - } else - return new jQuery( c ).find( a ); - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction(a) ) - return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a ); - - return this.setArray( - // HANDLE: $(array) - a.constructor == Array && a || - - // HANDLE: $(arraylike) - // Watch for when an array-like object is passed as the selector - (a.jquery || a.length && a != window && !a.nodeType && a[0] != undefined && a[0].nodeType) && jQuery.makeArray( a ) || - - // HANDLE: $(*) - [ a ] ); - }, - - jquery: "1.2", - - size: function() { - return this.length; - }, - - length: 0, - - get: function( num ) { - return num == undefined ? - - // Return a 'clean' array - jQuery.makeArray( this ) : - - // Return just the object - this[num]; - }, - - pushStack: function( a ) { - var ret = jQuery(a); - ret.prevObject = this; - return ret; - }, - - setArray: function( a ) { - this.length = 0; - Array.prototype.push.apply( this, a ); - return this; - }, - - each: function( fn, args ) { - return jQuery.each( this, fn, args ); - }, - - index: function( obj ) { - var pos = -1; - this.each(function(i){ - if ( this == obj ) pos = i; - }); - return pos; - }, - - attr: function( key, value, type ) { - var obj = key; - - // Look for the case where we're accessing a style value - if ( key.constructor == String ) - if ( value == undefined ) - return this.length && jQuery[ type || "attr" ]( this[0], key ) || undefined; - else { - obj = {}; - obj[ key ] = value; - } - - // Check to see if we're setting style values - return this.each(function(index){ - // Set all the styles - for ( var prop in obj ) - jQuery.attr( - type ? this.style : this, - prop, jQuery.prop(this, obj[prop], type, index, prop) - ); - }); - }, - - css: function( key, value ) { - return this.attr( key, value, "curCSS" ); - }, - - text: function(e) { - if ( typeof e != "object" && e != null ) - return this.empty().append( document.createTextNode( e ) ); - - var t = ""; - jQuery.each( e || this, function(){ - jQuery.each( this.childNodes, function(){ - if ( this.nodeType != 8 ) - t += this.nodeType != 1 ? - this.nodeValue : jQuery.fn.text([ this ]); - }); - }); - return t; - }, - - wrapAll: function(html) { - if ( this[0] ) - // The elements to wrap the target around - jQuery(html, this[0].ownerDocument) - .clone() - .insertBefore(this[0]) - .map(function(){ - var elem = this; - while ( elem.firstChild ) - elem = elem.firstChild; - return elem; - }) - .append(this); - - return this; - }, - - wrapInner: function(html) { - return this.each(function(){ - jQuery(this).contents().wrapAll(html); - }); - }, - - wrap: function(html) { - return this.each(function(){ - jQuery(this).wrapAll(html); - }); - }, - - append: function() { - return this.domManip(arguments, true, 1, function(a){ - this.appendChild( a ); - }); - }, - - prepend: function() { - return this.domManip(arguments, true, -1, function(a){ - this.insertBefore( a, this.firstChild ); - }); - }, - - before: function() { - return this.domManip(arguments, false, 1, function(a){ - this.parentNode.insertBefore( a, this ); - }); - }, - - after: function() { - return this.domManip(arguments, false, -1, function(a){ - this.parentNode.insertBefore( a, this.nextSibling ); - }); - }, - - end: function() { - return this.prevObject || jQuery([]); - }, - - find: function(t) { - var data = jQuery.map(this, function(a){ return jQuery.find(t,a); }); - return this.pushStack( /[^+>] [^+>]/.test( t ) || t.indexOf("..") > -1 ? - jQuery.unique( data ) : data ); - }, - - clone: function(events) { - // Do the clone - var ret = this.map(function(){ - return this.outerHTML ? jQuery(this.outerHTML)[0] : this.cloneNode(true); - }); - - if (events === true) { - var clone = ret.find("*").andSelf(); - - this.find("*").andSelf().each(function(i) { - var events = jQuery.data(this, "events"); - for ( var type in events ) - for ( var handler in events[type] ) - jQuery.event.add(clone[i], type, events[type][handler], events[type][handler].data); - }); - } - - // Return the cloned set - return ret; - }, - - filter: function(t) { - return this.pushStack( - jQuery.isFunction( t ) && - jQuery.grep(this, function(el, index){ - return t.apply(el, [index]); - }) || - - jQuery.multiFilter(t,this) ); - }, - - not: function(t) { - return this.pushStack( - t.constructor == String && - jQuery.multiFilter(t, this, true) || - - jQuery.grep(this, function(a) { - return ( t.constructor == Array || t.jquery ) - ? jQuery.inArray( a, t ) < 0 - : a != t; - }) - ); - }, - - add: function(t) { - return this.pushStack( jQuery.merge( - this.get(), - t.constructor == String ? - jQuery(t).get() : - t.length != undefined && (!t.nodeName || t.nodeName == "FORM") ? - t : [t] ) - ); - }, - - is: function(expr) { - return expr ? jQuery.multiFilter(expr,this).length > 0 : false; - }, - - hasClass: function(expr) { - return this.is("." + expr); - }, - - val: function( val ) { - if ( val == undefined ) { - if ( this.length ) { - var elem = this[0]; - - // We need to handle select boxes special - if ( jQuery.nodeName(elem, "select") ) { - var index = elem.selectedIndex, - a = [], - options = elem.options, - one = elem.type == "select-one"; - - // Nothing was selected - if ( index < 0 ) - return null; - - // Loop through all the selected options - for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { - var option = options[i]; - if ( option.selected ) { - // Get the specific value for the option - var val = jQuery.browser.msie && !option.attributes["value"].specified ? option.text : option.value; - - // We don't need an array for one selects - if ( one ) - return val; - - // Multi-Selects return an array - a.push(val); - } - } - - return a; - - // Everything else, we just grab the value - } else - return this[0].value.replace(/\r/g, ""); - } - } else - return this.each(function(){ - if ( val.constructor == Array && /radio|checkbox/.test(this.type) ) - this.checked = (jQuery.inArray(this.value, val) >= 0 || - jQuery.inArray(this.name, val) >= 0); - else if ( jQuery.nodeName(this, "select") ) { - var tmp = val.constructor == Array ? val : [val]; - - jQuery("option", this).each(function(){ - this.selected = (jQuery.inArray(this.value, tmp) >= 0 || - jQuery.inArray(this.text, tmp) >= 0); - }); - - if ( !tmp.length ) - this.selectedIndex = -1; - } else - this.value = val; - }); - }, - - html: function( val ) { - return val == undefined ? - ( this.length ? this[0].innerHTML : null ) : - this.empty().append( val ); - }, - - replaceWith: function( val ) { - return this.after( val ).remove(); - }, - - slice: function() { - return this.pushStack( Array.prototype.slice.apply( this, arguments ) ); - }, - - map: function(fn) { - return this.pushStack(jQuery.map( this, function(elem,i){ - return fn.call( elem, i, elem ); - })); - }, - - andSelf: function() { - return this.add( this.prevObject ); - }, - - domManip: function(args, table, dir, fn) { - var clone = this.length > 1, a; - - return this.each(function(){ - if ( !a ) { - a = jQuery.clean(args, this.ownerDocument); - if ( dir < 0 ) - a.reverse(); - } - - var obj = this; - - if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") ) - obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody")); - - jQuery.each( a, function(){ - if ( jQuery.nodeName(this, "script") ) { - if ( this.src ) - jQuery.ajax({ url: this.src, async: false, dataType: "script" }); - else - jQuery.globalEval( this.text || this.textContent || this.innerHTML || "" ); - } else - fn.apply( obj, [ clone ? this.cloneNode(true) : this ] ); - }); - }); - } -}; - -jQuery.extend = jQuery.fn.extend = function() { - // copy reference to target object - var target = arguments[0] || {}, a = 1, al = arguments.length, deep = false; - - // Handle a deep copy situation - if ( target.constructor == Boolean ) { - deep = target; - target = arguments[1] || {}; - } - - // extend jQuery itself if only one argument is passed - if ( al == 1 ) { - target = this; - a = 0; - } - - var prop; - - for ( ; a < al; a++ ) - // Only deal with non-null/undefined values - if ( (prop = arguments[a]) != null ) - // Extend the base object - for ( var i in prop ) { - // Prevent never-ending loop - if ( target == prop[i] ) - continue; - - // Recurse if we're merging object values - if ( deep && typeof prop[i] == 'object' && target[i] ) - jQuery.extend( target[i], prop[i] ); - - // Don't bring in undefined values - else if ( prop[i] != undefined ) - target[i] = prop[i]; - } - - // Return the modified object - return target; -}; - -var expando = "jQuery" + (new Date()).getTime(), uuid = 0, win = {}; - -jQuery.extend({ - noConflict: function(deep) { - window.$ = _$; - if ( deep ) - window.jQuery = _jQuery; - return jQuery; - }, - - // This may seem like some crazy code, but trust me when I say that this - // is the only cross-browser way to do this. --John - isFunction: function( fn ) { - return !!fn && typeof fn != "string" && !fn.nodeName && - fn.constructor != Array && /function/i.test( fn + "" ); - }, - - // check if an element is in a XML document - isXMLDoc: function(elem) { - return elem.documentElement && !elem.body || - elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; - }, - - // Evaluates a script in a global context - // Evaluates Async. in Safari 2 :-( - globalEval: function( data ) { - data = jQuery.trim( data ); - if ( data ) { - if ( window.execScript ) - window.execScript( data ); - else if ( jQuery.browser.safari ) - // safari doesn't provide a synchronous global eval - window.setTimeout( data, 0 ); - else - eval.call( window, data ); - } - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); - }, - - cache: {}, - - data: function( elem, name, data ) { - elem = elem == window ? win : elem; - - var id = elem[ expando ]; - - // Compute a unique ID for the element - if ( !id ) - id = elem[ expando ] = ++uuid; - - // Only generate the data cache if we're - // trying to access or manipulate it - if ( name && !jQuery.cache[ id ] ) - jQuery.cache[ id ] = {}; - - // Prevent overriding the named cache with undefined values - if ( data != undefined ) - jQuery.cache[ id ][ name ] = data; - - // Return the named cache data, or the ID for the element - return name ? jQuery.cache[ id ][ name ] : id; - }, - - removeData: function( elem, name ) { - elem = elem == window ? win : elem; - - var id = elem[ expando ]; - - // If we want to remove a specific section of the element's data - if ( name ) { - if ( jQuery.cache[ id ] ) { - // Remove the section of cache data - delete jQuery.cache[ id ][ name ]; - - // If we've removed all the data, remove the element's cache - name = ""; - for ( name in jQuery.cache[ id ] ) break; - if ( !name ) - jQuery.removeData( elem ); - } - - // Otherwise, we want to remove all of the element's data - } else { - // Clean up the element expando - try { - delete elem[ expando ]; - } catch(e){ - // IE has trouble directly removing the expando - // but it's ok with using removeAttribute - if ( elem.removeAttribute ) - elem.removeAttribute( expando ); - } - - // Completely remove the data cache - delete jQuery.cache[ id ]; - } - }, - - // args is for internal usage only - each: function( obj, fn, args ) { - if ( args ) { - if ( obj.length == undefined ) - for ( var i in obj ) - fn.apply( obj[i], args ); - else - for ( var i = 0, ol = obj.length; i < ol; i++ ) - if ( fn.apply( obj[i], args ) === false ) break; - - // A special, fast, case for the most common use of each - } else { - if ( obj.length == undefined ) - for ( var i in obj ) - fn.call( obj[i], i, obj[i] ); - else - for ( var i = 0, ol = obj.length, val = obj[0]; - i < ol && fn.call(val,i,val) !== false; val = obj[++i] ){} - } - - return obj; - }, - - prop: function(elem, value, type, index, prop){ - // Handle executable functions - if ( jQuery.isFunction( value ) ) - value = value.call( elem, [index] ); - - // exclude the following css properties to add px - var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i; - - // Handle passing in a number to a CSS property - return value && value.constructor == Number && type == "curCSS" && !exclude.test(prop) ? - value + "px" : - value; - }, - - className: { - // internal only, use addClass("class") - add: function( elem, c ){ - jQuery.each( (c || "").split(/\s+/), function(i, cur){ - if ( !jQuery.className.has( elem.className, cur ) ) - elem.className += ( elem.className ? " " : "" ) + cur; - }); - }, - - // internal only, use removeClass("class") - remove: function( elem, c ){ - elem.className = c != undefined ? - jQuery.grep( elem.className.split(/\s+/), function(cur){ - return !jQuery.className.has( c, cur ); - }).join(" ") : ""; - }, - - // internal only, use is(".class") - has: function( t, c ) { - return jQuery.inArray( c, (t.className || t).toString().split(/\s+/) ) > -1; - } - }, - - swap: function(e,o,f) { - for ( var i in o ) { - e.style["old"+i] = e.style[i]; - e.style[i] = o[i]; - } - f.apply( e, [] ); - for ( var i in o ) - e.style[i] = e.style["old"+i]; - }, - - css: function(e,p) { - if ( p == "height" || p == "width" ) { - var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"]; - - jQuery.each( d, function(){ - old["padding" + this] = 0; - old["border" + this + "Width"] = 0; - }); - - jQuery.swap( e, old, function() { - if ( jQuery(e).is(':visible') ) { - oHeight = e.offsetHeight; - oWidth = e.offsetWidth; - } else { - e = jQuery(e.cloneNode(true)) - .find(":radio").removeAttr("checked").end() - .css({ - visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0" - }).appendTo(e.parentNode)[0]; - - var parPos = jQuery.css(e.parentNode,"position") || "static"; - if ( parPos == "static" ) - e.parentNode.style.position = "relative"; - - oHeight = e.clientHeight; - oWidth = e.clientWidth; - - if ( parPos == "static" ) - e.parentNode.style.position = "static"; - - e.parentNode.removeChild(e); - } - }); - - return p == "height" ? oHeight : oWidth; - } - - return jQuery.curCSS( e, p ); - }, - - curCSS: function(elem, prop, force) { - var ret, stack = [], swap = []; - - // A helper method for determining if an element's values are broken - function color(a){ - if ( !jQuery.browser.safari ) - return false; - - var ret = document.defaultView.getComputedStyle(a,null); - return !ret || ret.getPropertyValue("color") == ""; - } - - if (prop == "opacity" && jQuery.browser.msie) { - ret = jQuery.attr(elem.style, "opacity"); - return ret == "" ? "1" : ret; - } - - if (prop.match(/float/i)) - prop = styleFloat; - - if (!force && elem.style[prop]) - ret = elem.style[prop]; - - else if (document.defaultView && document.defaultView.getComputedStyle) { - - if (prop.match(/float/i)) - prop = "float"; - - prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase(); - var cur = document.defaultView.getComputedStyle(elem, null); - - if ( cur && !color(elem) ) - ret = cur.getPropertyValue(prop); - - // If the element isn't reporting its values properly in Safari - // then some display: none elements are involved - else { - // Locate all of the parent display: none elements - for ( var a = elem; a && color(a); a = a.parentNode ) - stack.unshift(a); - - // Go through and make them visible, but in reverse - // (It would be better if we knew the exact display type that they had) - for ( a = 0; a < stack.length; a++ ) - if ( color(stack[a]) ) { - swap[a] = stack[a].style.display; - stack[a].style.display = "block"; - } - - // Since we flip the display style, we have to handle that - // one special, otherwise get the value - ret = prop == "display" && swap[stack.length-1] != null ? - "none" : - document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop) || ""; - - // Finally, revert the display styles back - for ( a = 0; a < swap.length; a++ ) - if ( swap[a] != null ) - stack[a].style.display = swap[a]; - } - - if ( prop == "opacity" && ret == "" ) - ret = "1"; - - } else if (elem.currentStyle) { - var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();}); - ret = elem.currentStyle[prop] || elem.currentStyle[newProp]; - - // From the awesome hack by Dean Edwards - // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 - - // If we're not dealing with a regular pixel number - // but a number that has a weird ending, we need to convert it to pixels - if ( !/^\d+(px)?$/i.test(ret) && /^\d/.test(ret) ) { - var style = elem.style.left; - var runtimeStyle = elem.runtimeStyle.left; - elem.runtimeStyle.left = elem.currentStyle.left; - elem.style.left = ret || 0; - ret = elem.style.pixelLeft + "px"; - elem.style.left = style; - elem.runtimeStyle.left = runtimeStyle; - } - } - - return ret; - }, - - clean: function(a, doc) { - var r = []; - doc = doc || document; - - jQuery.each( a, function(i,arg){ - if ( !arg ) return; - - if ( arg.constructor == Number ) - arg = arg.toString(); - - // Convert html string into DOM nodes - if ( typeof arg == "string" ) { - // Fix "XHTML"-style tags in all browsers - arg = arg.replace(/(<(\w+)[^>]*?)\/>/g, function(m, all, tag){ - return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i)? m : all+">"; - }); - - // Trim whitespace, otherwise indexOf won't work as expected - var s = jQuery.trim(arg).toLowerCase(), div = doc.createElement("div"), tb = []; - - var wrap = - // option or optgroup - !s.indexOf("", ""] || - - !s.indexOf("", ""] || - - s.match(/^<(thead|tbody|tfoot|colg|cap)/) && - [1, "", "
"] || - - !s.indexOf("", ""] || - - // matched above - (!s.indexOf("", ""] || - - !s.indexOf("", ""] || - - // IE can't serialize and