Annotation of embedaddon/strongswan/src/manager/controller/ikesa_controller.c, revision 1.1.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 "ikesa_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_ikesa_controller_t private_ikesa_controller_t;
26:
27: /**
28: * private data of the task manager
29: */
30: struct private_ikesa_controller_t {
31:
32: /**
33: * public functions
34: */
35: ikesa_controller_t public;
36:
37: /**
38: * manager instance
39: */
40: manager_t *manager;
41: };
42:
43: /**
44: * read XML of a childsa element and fill template
45: */
46: static void process_childsa(private_ikesa_controller_t *this, char *id,
47: enumerator_t *e, fast_request_t *r)
48: {
49: xml_t *xml;
50: enumerator_t *e1, *e2;
51: char *name, *value, *reqid = "", *section = "";
52: int num = 0;
53:
54: while (e->enumerate(e, &xml, &name, &value))
55: {
56: if (streq(name, "reqid"))
57: {
58: reqid = value;
59: }
60: else if (streq(name, "local") || streq(name, "remote"))
61: {
62: section = name;
63: e1 = xml->children(xml);
64: while (e1->enumerate(e1, &xml, &name, &value))
65: {
66: if (streq(name, "networks"))
67: {
68: e2 = xml->children(xml);
69: while (e2->enumerate(e2, &xml, &name, &value))
70: {
71: if (streq(name, "network"))
72: {
73: r->setf(r, "ikesas.%s.childsas.%s.%s.networks.%d=%s",
74: id, reqid, section, ++num, value);
75: }
76: }
77: e2->destroy(e2);
78: }
79: else
80: {
81: r->setf(r, "ikesas.%s.childsas.%s.%s.%s=%s",
82: id, reqid, section, name, value);
83: }
84: }
85: e1->destroy(e1);
86: }
87: else
88: {
89: r->setf(r, "ikesas.%s.childsas.%s.%s=%s",
90: id, reqid, name, value);
91: }
92: }
93: }
94:
95: /**
96: * read XML of a ikesa element and fill template
97: */
98: static void process_ikesa(private_ikesa_controller_t *this,
99: enumerator_t *e, fast_request_t *r)
100: {
101: xml_t *xml;
102: enumerator_t *e1, *e2;
103: char *name, *value, *id = "", *section = "";
104:
105: while (e->enumerate(e, &xml, &name, &value))
106: {
107: if (streq(name, "id"))
108: {
109: id = value;
110: }
111: else if (streq(name, "local") || streq(name, "remote"))
112: {
113: section = name;
114: e1 = xml->children(xml);
115: while (e1->enumerate(e1, &xml, &name, &value))
116: {
117: r->setf(r, "ikesas.%s.%s.%s=%s", id, section, name, value);
118: }
119: e1->destroy(e1);
120: }
121: else if (streq(name, "childsalist"))
122: {
123: e1 = xml->children(xml);
124: while (e1->enumerate(e1, &xml, &name, &value))
125: {
126: if (streq(name, "childsa"))
127: {
128: e2 = xml->children(xml);
129: process_childsa(this, id, e2, r);
130: e2->destroy(e2);
131: }
132: }
133: e1->destroy(e1);
134: }
135: else
136: {
137: r->setf(r, "ikesas.%s.%s=%s", id, name, value);
138: }
139: }
140: }
141:
142: static void list(private_ikesa_controller_t *this, fast_request_t *r)
143: {
144: gateway_t *gateway;
145: xml_t *xml;
146: enumerator_t *e1, *e2;
147: char *name, *value;
148:
149: gateway = this->manager->select_gateway(this->manager, 0);
150: e1 = gateway->query_ikesalist(gateway);
151: if (e1 == NULL)
152: {
153: r->set(r, "title", "Error");
154: r->set(r, "error", "querying the gateway failed");
155: r->render(r, "templates/error.cs");
156: }
157: else
158: {
159: r->set(r, "title", "IKE SA overview");
160:
161: while (e1->enumerate(e1, &xml, &name, &value))
162: {
163: if (streq(name, "ikesa"))
164: {
165: e2 = xml->children(xml);
166: process_ikesa(this, e2, r);
167: e2->destroy(e2);
168: }
169: }
170: e1->destroy(e1);
171:
172: r->render(r, "templates/ikesa/list.cs");
173: }
174: }
175:
176: METHOD(fast_controller_t, get_name, char*,
177: private_ikesa_controller_t *this)
178: {
179: return "ikesa";
180: }
181:
182: METHOD(fast_controller_t, handle, void,
183: private_ikesa_controller_t *this, fast_request_t *request, char *action,
184: char *p2, char *p3, char *p4, char *p5)
185: {
186: if (!this->manager->logged_in(this->manager))
187: {
188: return request->redirect(request, "auth/login");
189: }
190: if (this->manager->select_gateway(this->manager, 0) == NULL)
191: {
192: return request->redirect(request, "gateway/list");
193: }
194: if (action)
195: {
196: if (streq(action, "list"))
197: {
198: return list(this, request);
199: }
200: }
201: return request->redirect(request, "ikesa/list");
202: }
203:
204: METHOD(fast_controller_t, destroy, void,
205: private_ikesa_controller_t *this)
206: {
207: free(this);
208: }
209:
210: /*
211: * see header file
212: */
213: fast_controller_t *ikesa_controller_create(fast_context_t *context, void *param)
214: {
215: private_ikesa_controller_t *this;
216:
217: INIT(this,
218: .public = {
219: .controller = {
220: .get_name = _get_name,
221: .handle = _handle,
222: .destroy = _destroy,
223: },
224: },
225: .manager = (manager_t*)context,
226: );
227:
228: return &this->public.controller;
229: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>