Annotation of embedaddon/strongswan/src/manager/controller/config_controller.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2007 Martin Willi
! 3: * HSR Hochschule fuer Technik Rapperswil
! 4: *
! 5: * This program is free software; you can redistribute it and/or modify it
! 6: * under the terms of the GNU General Public License as published by the
! 7: * Free Software Foundation; either version 2 of the License, or (at your
! 8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 9: *
! 10: * This program is distributed in the hope that it will be useful, but
! 11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 13: * for more details.
! 14: */
! 15:
! 16: #include "config_controller.h"
! 17: #include "../manager.h"
! 18: #include "../gateway.h"
! 19:
! 20: #include <xml.h>
! 21:
! 22: #include <library.h>
! 23:
! 24:
! 25: typedef struct private_config_controller_t private_config_controller_t;
! 26:
! 27: /**
! 28: * private data of the task manager
! 29: */
! 30: struct private_config_controller_t {
! 31:
! 32: /**
! 33: * public functions
! 34: */
! 35: config_controller_t public;
! 36:
! 37: /**
! 38: * manager instance
! 39: */
! 40: manager_t *manager;
! 41: };
! 42:
! 43: /**
! 44: * read XML of a peerconfig element and fill template
! 45: */
! 46: static void process_peerconfig(private_config_controller_t *this,
! 47: enumerator_t *e, fast_request_t *r)
! 48: {
! 49: xml_t *xml;
! 50: enumerator_t *e1, *e2, *e3;
! 51: char *name, *value, *config = "", *child = "", *section = "";
! 52:
! 53: while (e->enumerate(e, &xml, &name, &value))
! 54: {
! 55: if (streq(name, "name"))
! 56: {
! 57: config = value;
! 58: }
! 59: else if (streq(name, "ikeconfig"))
! 60: {
! 61: e1 = xml->children(xml);
! 62: while (e1->enumerate(e1, &xml, &name, &value))
! 63: {
! 64: if (streq(name, "local") || streq(name, "remote"))
! 65: {
! 66: if (streq(value, "0.0.0.0") || streq(value, "::"))
! 67: {
! 68: value = "%any";
! 69: }
! 70: r->setf(r, "peercfgs.%s.ikecfg.%s=%s", config, name, value);
! 71: }
! 72: }
! 73: e1->destroy(e1);
! 74: }
! 75: else if (streq(name, "childconfiglist"))
! 76: {
! 77: e1 = xml->children(xml);
! 78: while (e1->enumerate(e1, &xml, &name, &value))
! 79: {
! 80: if (streq(name, "childconfig"))
! 81: {
! 82: int num = 0;
! 83:
! 84: e2 = xml->children(xml);
! 85: while (e2->enumerate(e2, &xml, &name, &value))
! 86: {
! 87: if (streq(name, "name"))
! 88: {
! 89: child = value;
! 90: }
! 91: else if (streq(name, "local") || streq(name, "remote"))
! 92: {
! 93: section = name;
! 94: e3 = xml->children(xml);
! 95: while (e3->enumerate(e3, &xml, &name, &value))
! 96: {
! 97: if (streq(name, "network"))
! 98: {
! 99: r->setf(r, "peercfgs.%s.childcfgs.%s.%s.networks.%d=%s",
! 100: config, child, section, ++num, value);
! 101: }
! 102: }
! 103: e3->destroy(e3);
! 104: }
! 105: }
! 106: e2->destroy(e2);
! 107: }
! 108: }
! 109: e1->destroy(e1);
! 110: }
! 111: else
! 112: {
! 113: r->setf(r, "peercfgs.%s.%s=%s", config, name, value);
! 114: }
! 115: }
! 116: }
! 117:
! 118: static void list(private_config_controller_t *this, fast_request_t *r)
! 119: {
! 120: gateway_t *gateway;
! 121: xml_t *xml;
! 122: enumerator_t *e1, *e2;
! 123: char *name, *value;
! 124:
! 125: gateway = this->manager->select_gateway(this->manager, 0);
! 126: e1 = gateway->query_configlist(gateway);
! 127: if (e1 == NULL)
! 128: {
! 129: r->set(r, "title", "Error");
! 130: r->set(r, "error", "querying the gateway failed");
! 131: r->render(r, "templates/error.cs");
! 132: }
! 133: else
! 134: {
! 135: r->set(r, "title", "Configuration overview");
! 136:
! 137: while (e1->enumerate(e1, &xml, &name, &value))
! 138: {
! 139: if (streq(name, "peerconfig"))
! 140: {
! 141: e2 = xml->children(xml);
! 142: process_peerconfig(this, e2, r);
! 143: e2->destroy(e2);
! 144: }
! 145: }
! 146: e1->destroy(e1);
! 147:
! 148: r->render(r, "templates/config/list.cs");
! 149: }
! 150: }
! 151:
! 152: METHOD(fast_controller_t, get_name, char*,
! 153: private_config_controller_t *this)
! 154: {
! 155: return "config";
! 156: }
! 157:
! 158: METHOD(fast_controller_t, handle, void,
! 159: private_config_controller_t *this, fast_request_t *request, char *action,
! 160: char *p2, char *p3, char *p4, char *p5)
! 161: {
! 162: if (!this->manager->logged_in(this->manager))
! 163: {
! 164: return request->redirect(request, "auth/login");
! 165: }
! 166: if (this->manager->select_gateway(this->manager, 0) == NULL)
! 167: {
! 168: return request->redirect(request, "gateway/list");
! 169: }
! 170: if (action)
! 171: {
! 172: if (streq(action, "list"))
! 173: {
! 174: return list(this, request);
! 175: }
! 176: }
! 177: return request->redirect(request, "config/list");
! 178: }
! 179:
! 180: METHOD(fast_controller_t, destroy, void,
! 181: private_config_controller_t *this)
! 182: {
! 183: free(this);
! 184: }
! 185:
! 186: /*
! 187: * see header file
! 188: */
! 189: fast_controller_t *config_controller_create(fast_context_t *context,
! 190: void *param)
! 191: {
! 192: private_config_controller_t *this;
! 193:
! 194: INIT(this,
! 195: .public = {
! 196: .controller = {
! 197: .get_name = _get_name,
! 198: .handle = _handle,
! 199: .destroy = _destroy,
! 200: },
! 201: },
! 202: .manager = (manager_t*)context,
! 203: );
! 204:
! 205: return &this->public.controller;
! 206: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>