Annotation of embedaddon/strongswan/src/manager/controller/config_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 "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>