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>