refactored strongswan manager
removed buggy request parsing code, use ClearSilvers CGI kit instead fixed CHILD_SA listing in manager (needs better design) using secure XML communication through unix sockets removed images with questionable (non-GPL) license
This commit is contained in:
@@ -23,8 +23,6 @@
|
||||
#include "auth_controller.h"
|
||||
#include "../manager.h"
|
||||
|
||||
#include <template.h>
|
||||
|
||||
#include <library.h>
|
||||
|
||||
|
||||
@@ -46,39 +44,34 @@ struct private_auth_controller_t {
|
||||
manager_t *manager;
|
||||
};
|
||||
|
||||
static void login(private_auth_controller_t *this,
|
||||
request_t *request, response_t *response)
|
||||
static void login(private_auth_controller_t *this, request_t *request)
|
||||
{
|
||||
template_t *t = template_create("templates/auth/login.cs");
|
||||
t->set(t, "action", "check");
|
||||
t->set(t, "title", "Login");
|
||||
t->render(t, response);
|
||||
t->destroy(t);
|
||||
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,
|
||||
request_t *request, response_t *response)
|
||||
static void check(private_auth_controller_t *this, request_t *request)
|
||||
{
|
||||
char *username, *password;
|
||||
|
||||
username = request->get_post_data(request, "username");
|
||||
password = request->get_post_data(request, "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))
|
||||
{
|
||||
response->redirect(response, "status/ikesalist");
|
||||
request->redirect(request, "status/ikesalist");
|
||||
}
|
||||
else
|
||||
{
|
||||
response->redirect(response, "auth/login");
|
||||
request->redirect(request, "auth/login");
|
||||
}
|
||||
}
|
||||
|
||||
static void logout(private_auth_controller_t *this,
|
||||
request_t *request, response_t *response)
|
||||
static void logout(private_auth_controller_t *this, request_t *request)
|
||||
{
|
||||
this->manager->logout(this->manager);
|
||||
response->redirect(response, "auth/login");
|
||||
request->redirect(request, "auth/login");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -93,24 +86,24 @@ static char* get_name(private_auth_controller_t *this)
|
||||
* Implementation of controller_t.handle
|
||||
*/
|
||||
static void handle(private_auth_controller_t *this,
|
||||
request_t *request, response_t *response, char *action)
|
||||
request_t *request, char *action)
|
||||
{
|
||||
if (action)
|
||||
{
|
||||
if (streq(action, "login"))
|
||||
{
|
||||
return login(this, request, response);
|
||||
return login(this, request);
|
||||
}
|
||||
else if (streq(action, "check"))
|
||||
{
|
||||
return check(this, request, response);
|
||||
return check(this, request);
|
||||
}
|
||||
else if (streq(action, "logout"))
|
||||
{
|
||||
return logout(this, request, response);
|
||||
return logout(this, request);
|
||||
}
|
||||
}
|
||||
response->redirect(response, "auth/login");
|
||||
request->redirect(request, "auth/login");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -129,7 +122,7 @@ controller_t *auth_controller_create(context_t *context, void *param)
|
||||
private_auth_controller_t *this = malloc_thing(private_auth_controller_t);
|
||||
|
||||
this->public.controller.get_name = (char*(*)(controller_t*))get_name;
|
||||
this->public.controller.handle = (void(*)(controller_t*,request_t*,response_t*,char*,char*,char*,char*,char*))handle;
|
||||
this->public.controller.handle = (void(*)(controller_t*,request_t*,char*,char*,char*,char*,char*))handle;
|
||||
this->public.controller.destroy = (void(*)(controller_t*))destroy;
|
||||
|
||||
this->manager = (manager_t*)context;
|
||||
|
||||
@@ -24,8 +24,6 @@
|
||||
#include "../manager.h"
|
||||
#include "../gateway.h"
|
||||
|
||||
#include <template.h>
|
||||
|
||||
#include <library.h>
|
||||
|
||||
|
||||
@@ -48,50 +46,47 @@ struct private_gateway_controller_t {
|
||||
|
||||
};
|
||||
|
||||
static void list(private_gateway_controller_t *this,
|
||||
request_t *request, response_t *response)
|
||||
static void list(private_gateway_controller_t *this, request_t *request)
|
||||
{
|
||||
template_t *t;
|
||||
enumerator_t *enumerator;
|
||||
char *name, *address;
|
||||
int id, port;
|
||||
|
||||
t = template_create("templates/gateway/list.cs");
|
||||
enumerator = this->manager->create_gateway_enumerator(this->manager);
|
||||
while (enumerator->enumerate(enumerator, &id, &name, &port, &address))
|
||||
{
|
||||
t->setf(t, "gateways.%d.name=%s", id, name);
|
||||
request->setf(request, "gateways.%d.name=%s", id, name);
|
||||
if (port)
|
||||
{
|
||||
t->setf(t, "gateways.%d.address=tcp://%s:%d", id, address, port);
|
||||
request->setf(request, "gateways.%d.address=tcp://%s:%d",
|
||||
id, address, port);
|
||||
}
|
||||
else
|
||||
{
|
||||
t->setf(t, "gateways.%d.address=unix://%s", id, address);
|
||||
request->setf(request, "gateways.%d.address=unix://%s",
|
||||
id, IPSEC_PIDDIR"/charon.xml");
|
||||
}
|
||||
}
|
||||
enumerator->destroy(enumerator);
|
||||
t->set(t, "action", "select");
|
||||
t->set(t, "title", "Choose gateway");
|
||||
t->render(t, response);
|
||||
t->destroy(t);
|
||||
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,
|
||||
request_t *request, response_t *response)
|
||||
static void _select(private_gateway_controller_t *this, request_t *request)
|
||||
{
|
||||
char *id;
|
||||
|
||||
id = request->get_post_data(request, "gateway");
|
||||
id = request->get_query_data(request, "gateway");
|
||||
if (id)
|
||||
{
|
||||
if (this->manager->select_gateway(this->manager, atoi(id)))
|
||||
{
|
||||
response->redirect(response, "status/ikesalist");
|
||||
request->redirect(request, "status/ikesalist");
|
||||
return;
|
||||
}
|
||||
}
|
||||
response->printf(response, "selecting gateway failed: %s", id);
|
||||
request->redirect(request, "gateway/list");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -106,24 +101,24 @@ static char* get_name(private_gateway_controller_t *this)
|
||||
* Implementation of controller_t.handle
|
||||
*/
|
||||
static void handle(private_gateway_controller_t *this,
|
||||
request_t *request, response_t *response, char *action)
|
||||
request_t *request, char *action)
|
||||
{
|
||||
if (!this->manager->logged_in(this->manager))
|
||||
{
|
||||
return response->redirect(response, "auth/login");
|
||||
return request->redirect(request, "auth/login");
|
||||
}
|
||||
if (action)
|
||||
{
|
||||
if (streq(action, "list"))
|
||||
{
|
||||
return list(this, request, response);
|
||||
return list(this, request);
|
||||
}
|
||||
else if (streq(action, "select"))
|
||||
{
|
||||
return _select(this, request, response);
|
||||
return _select(this, request);
|
||||
}
|
||||
}
|
||||
response->redirect(response, "gateway/list");
|
||||
request->redirect(request, "gateway/list");
|
||||
}
|
||||
|
||||
|
||||
@@ -143,7 +138,7 @@ controller_t *gateway_controller_create(context_t *context, void *param)
|
||||
private_gateway_controller_t *this = malloc_thing(private_gateway_controller_t);
|
||||
|
||||
this->public.controller.get_name = (char*(*)(controller_t*))get_name;
|
||||
this->public.controller.handle = (void(*)(controller_t*,request_t*,response_t*,char*,char*,char*,char*,char*))handle;
|
||||
this->public.controller.handle = (void(*)(controller_t*,request_t*,char*,char*,char*,char*,char*))handle;
|
||||
this->public.controller.destroy = (void(*)(controller_t*))destroy;
|
||||
|
||||
this->manager = (manager_t*)context;
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include "../manager.h"
|
||||
#include "../gateway.h"
|
||||
|
||||
#include <template.h>
|
||||
#include <xml.h>
|
||||
|
||||
#include <library.h>
|
||||
@@ -48,124 +47,137 @@ struct private_status_controller_t {
|
||||
manager_t *manager;
|
||||
};
|
||||
|
||||
static void ikesalist(private_status_controller_t *this,
|
||||
request_t *request, response_t *response)
|
||||
/**
|
||||
* read XML of a childsa element and fill template
|
||||
*/
|
||||
static void process_childsa(private_status_controller_t *this, char *id,
|
||||
enumerator_t *e, request_t *r)
|
||||
{
|
||||
char *str;
|
||||
gateway_t *gateway;
|
||||
xml_t *node;
|
||||
enumerator_t *e1, *e2, *e3, *e4, *e5, *e6, *e7, *e8;
|
||||
char *name, *value, *id = "", *section;
|
||||
|
||||
gateway = this->manager->select_gateway(this->manager, 0);
|
||||
str = gateway->request(gateway, "<message type=\"request\" id=\"1\">"
|
||||
"<query>"
|
||||
"<ikesalist/>"
|
||||
"</query>"
|
||||
"</message>");
|
||||
if (str == NULL)
|
||||
{
|
||||
response->printf(response, "gateway did not respond");
|
||||
return;
|
||||
}
|
||||
xml_t *xml;
|
||||
enumerator_t *e1, *e2;
|
||||
char *name, *value, *reqid = "", *section = "";
|
||||
int num = 0;
|
||||
|
||||
node = xml_create(str);
|
||||
if (node == NULL)
|
||||
while (e->enumerate(e, &xml, &name, &value))
|
||||
{
|
||||
response->printf(response, "parsing XML failed");
|
||||
return;
|
||||
}
|
||||
|
||||
template_t *t = template_create("templates/status/ikesalist.cs");
|
||||
|
||||
e1 = node->children(node);
|
||||
while (e1->enumerate(e1, &node, &name, &value))
|
||||
{
|
||||
if (streq(name, "message"))
|
||||
if (streq(name, "reqid"))
|
||||
{
|
||||
e2 = node->children(node);
|
||||
while (e2->enumerate(e2, &node, &name, &value))
|
||||
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, "query"))
|
||||
if (streq(name, "networks"))
|
||||
{
|
||||
e3 = node->children(node);
|
||||
while (e3->enumerate(e3, &node, &name, &value))
|
||||
e2 = xml->children(xml);
|
||||
while (e2->enumerate(e2, &xml, &name, &value))
|
||||
{
|
||||
if (streq(name, "ikesalist"))
|
||||
if (streq(name, "network"))
|
||||
{
|
||||
e4 = node->children(node);
|
||||
while (e4->enumerate(e4, &node, &name, &value))
|
||||
{
|
||||
if (streq(name, "ikesa"))
|
||||
{
|
||||
e5 = node->children(node);
|
||||
while (e5->enumerate(e5, &node, &name, &value))
|
||||
{
|
||||
if (streq(name, "id"))
|
||||
{
|
||||
id = value;
|
||||
}
|
||||
else if(streq(name, "local") ||
|
||||
streq(name, "remote"))
|
||||
{
|
||||
section = name;
|
||||
e6 = node->children(node);
|
||||
while (e6->enumerate(e6, &node, &name, &value))
|
||||
{
|
||||
t->setf(t, "ikesas.%s.%s.%s=%s", id, section, name, value);
|
||||
}
|
||||
e6->destroy(e6);
|
||||
}
|
||||
else if (streq(name, "childsalist"))
|
||||
{
|
||||
e6 = node->children(node);
|
||||
while (e6->enumerate(e6, &node, &name, &value))
|
||||
{
|
||||
if (streq(name, "childsa"))
|
||||
{
|
||||
e7 = node->children(node);
|
||||
while (e7->enumerate(e7, &node, &name, &value))
|
||||
{
|
||||
if (streq(name, "local") ||
|
||||
streq(name, "remote"))
|
||||
{
|
||||
section = name;
|
||||
e8 = node->children(node);
|
||||
while (e8->enumerate(e8, &node, &name, &value))
|
||||
{
|
||||
t->setf(t, "ikesas.%s.childsas.%s.%s=%s", id, section, name, value);
|
||||
}
|
||||
e8->destroy(e8);
|
||||
}
|
||||
}
|
||||
e7->destroy(e7);
|
||||
}
|
||||
}
|
||||
e6->destroy(e6);
|
||||
}
|
||||
else
|
||||
{
|
||||
t->setf(t, "ikesas.%s.%s=%s", id, name, value);
|
||||
}
|
||||
}
|
||||
e5->destroy(e5);
|
||||
}
|
||||
}
|
||||
e4->destroy(e4);
|
||||
r->setf(r, "ikesas.%s.childsas.%s.%s.networks.%d=%s",
|
||||
id, reqid, section, ++num, value);
|
||||
}
|
||||
}
|
||||
e3->destroy(e3);
|
||||
e2->destroy(e2);
|
||||
}
|
||||
else
|
||||
{
|
||||
r->setf(r, "ikesas.%s.childsas.%s.%s.%s=%s",
|
||||
id, reqid, section, name, value);
|
||||
}
|
||||
}
|
||||
e2->destroy(e2);
|
||||
e1->destroy(e1);
|
||||
}
|
||||
else
|
||||
{
|
||||
r->setf(r, "ikesas.%s.childsas.%s.%s=%s",
|
||||
id, reqid, name, value);
|
||||
}
|
||||
}
|
||||
e1->destroy(e1);
|
||||
}
|
||||
|
||||
t->set(t, "title", "IKE SA overview");
|
||||
t->render(t, response);
|
||||
t->destroy(t);
|
||||
free(str);
|
||||
/**
|
||||
* read XML of a ikesa element and fill template
|
||||
*/
|
||||
static void process_ikesa(private_status_controller_t *this,
|
||||
enumerator_t *e, 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 ikesalist(private_status_controller_t *this, 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/status/ikesalist.cs");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -180,24 +192,24 @@ static char* get_name(private_status_controller_t *this)
|
||||
* Implementation of controller_t.handle
|
||||
*/
|
||||
static void handle(private_status_controller_t *this,
|
||||
request_t *request, response_t *response, char *action)
|
||||
request_t *request, char *action)
|
||||
{
|
||||
if (!this->manager->logged_in(this->manager))
|
||||
{
|
||||
return response->redirect(response, "auth/login");
|
||||
return request->redirect(request, "auth/login");
|
||||
}
|
||||
if (this->manager->select_gateway(this->manager, 0) == NULL)
|
||||
{
|
||||
return response->redirect(response, "gateway/list");
|
||||
return request->redirect(request, "gateway/list");
|
||||
}
|
||||
if (action)
|
||||
{
|
||||
if (streq(action, "ikesalist"))
|
||||
{
|
||||
return ikesalist(this, request, response);
|
||||
return ikesalist(this, request);
|
||||
}
|
||||
}
|
||||
return response->redirect(response, "status/ikesalist");
|
||||
return request->redirect(request, "status/ikesalist");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -216,7 +228,7 @@ controller_t *status_controller_create(context_t *context, void *param)
|
||||
private_status_controller_t *this = malloc_thing(private_status_controller_t);
|
||||
|
||||
this->public.controller.get_name = (char*(*)(controller_t*))get_name;
|
||||
this->public.controller.handle = (void(*)(controller_t*,request_t*,response_t*,char*,char*,char*,char*,char*))handle;
|
||||
this->public.controller.handle = (void(*)(controller_t*,request_t*,char*,char*,char*,char*,char*))handle;
|
||||
this->public.controller.destroy = (void(*)(controller_t*))destroy;
|
||||
|
||||
this->manager = (manager_t*)context;
|
||||
|
||||
Reference in New Issue
Block a user