Annotation of embedaddon/strongswan/src/libcharon/plugins/medsrv/medsrv_config.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2008 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 <string.h>
                     17: 
                     18: #include "medsrv_config.h"
                     19: 
                     20: #include <daemon.h>
                     21: 
                     22: typedef struct private_medsrv_config_t private_medsrv_config_t;
                     23: 
                     24: /**
                     25:  * Private data of an medsrv_config_t object
                     26:  */
                     27: struct private_medsrv_config_t {
                     28: 
                     29:        /**
                     30:         * Public part
                     31:         */
                     32:        medsrv_config_t public;
                     33: 
                     34:        /**
                     35:         * database connection
                     36:         */
                     37:        database_t *db;
                     38: 
                     39:        /**
                     40:         * rekey time
                     41:         */
                     42:        int rekey;
                     43: 
                     44:        /**
                     45:         * dpd delay
                     46:         */
                     47:        int dpd;
                     48: 
                     49:        /**
                     50:         * default ike config
                     51:         */
                     52:        ike_cfg_t *ike;
                     53: };
                     54: 
                     55: METHOD(backend_t, get_peer_cfg_by_name, peer_cfg_t*,
                     56:        private_medsrv_config_t *this, char *name)
                     57: {
                     58:        return NULL;
                     59: }
                     60: 
                     61: METHOD(backend_t, create_ike_cfg_enumerator, enumerator_t*,
                     62:        private_medsrv_config_t *this, host_t *me, host_t *other)
                     63: {
                     64:        return enumerator_create_single(this->ike, NULL);
                     65: }
                     66: 
                     67: METHOD(backend_t, create_peer_cfg_enumerator, enumerator_t*,
                     68:        private_medsrv_config_t *this, identification_t *me,
                     69:        identification_t *other)
                     70: {
                     71:        enumerator_t *e;
                     72: 
                     73:        if (!me || !other || other->get_type(other) != ID_KEY_ID)
                     74:        {
                     75:                return NULL;
                     76:        }
                     77:        e = this->db->query(this->db,
                     78:                        "SELECT CONCAT(peer.alias, CONCAT('@', user.login)) FROM "
                     79:                        "peer JOIN user ON peer.user = user.id "
                     80:                        "WHERE peer.keyid = ?", DB_BLOB, other->get_encoding(other),
                     81:                        DB_TEXT);
                     82:        if (e)
                     83:        {
                     84:                peer_cfg_t *peer_cfg;
                     85:                auth_cfg_t *auth;
                     86:                char *name;
                     87: 
                     88:                if (e->enumerate(e, &name))
                     89:                {
                     90:                        peer_cfg_create_t peer = {
                     91:                                .cert_policy = CERT_NEVER_SEND,
                     92:                                .unique = UNIQUE_REPLACE,
                     93:                                .keyingtries = 1,
                     94:                                .rekey_time = this->rekey * 60,
                     95:                                .jitter_time = this->rekey * 5,
                     96:                                .over_time = this->rekey * 3,
                     97:                                .dpd = this->dpd,
                     98:                                .mediation = TRUE,
                     99:                        };
                    100:                        peer_cfg = peer_cfg_create(name, this->ike->get_ref(this->ike),
                    101:                                                                           &peer);
                    102:                        e->destroy(e);
                    103: 
                    104:                        auth = auth_cfg_create();
                    105:                        auth->add(auth, AUTH_RULE_AUTH_CLASS, AUTH_CLASS_PUBKEY);
                    106:                        auth->add(auth, AUTH_RULE_IDENTITY, me->clone(me));
                    107:                        peer_cfg->add_auth_cfg(peer_cfg, auth, TRUE);
                    108:                        auth = auth_cfg_create();
                    109:                        auth->add(auth, AUTH_RULE_AUTH_CLASS, AUTH_CLASS_PUBKEY);
                    110:                        auth->add(auth, AUTH_RULE_IDENTITY, other->clone(other));
                    111:                        peer_cfg->add_auth_cfg(peer_cfg, auth, FALSE);
                    112: 
                    113:                        return enumerator_create_single(peer_cfg, (void*)peer_cfg->destroy);
                    114:                }
                    115:                e->destroy(e);
                    116:        }
                    117:        return NULL;
                    118: }
                    119: 
                    120: METHOD(medsrv_config_t, destroy, void,
                    121:        private_medsrv_config_t *this)
                    122: {
                    123:        this->ike->destroy(this->ike);
                    124:        free(this);
                    125: }
                    126: 
                    127: /**
                    128:  * Described in header.
                    129:  */
                    130: medsrv_config_t *medsrv_config_create(database_t *db)
                    131: {
                    132:        private_medsrv_config_t *this;
                    133:        ike_cfg_create_t ike = {
                    134:                .version = IKEV2,
                    135:                .local = "0.0.0.0",
                    136:                .local_port = charon->socket->get_port(charon->socket, FALSE),
                    137:                .remote = "0.0.0.0",
                    138:                .remote_port = IKEV2_UDP_PORT,
                    139:                .no_certreq = TRUE,
                    140:        };
                    141: 
                    142:        INIT(this,
                    143:                .public = {
                    144:                        .backend = {
                    145:                                .create_peer_cfg_enumerator = _create_peer_cfg_enumerator,
                    146:                                .create_ike_cfg_enumerator = _create_ike_cfg_enumerator,
                    147:                                .get_peer_cfg_by_name = _get_peer_cfg_by_name,
                    148:                        },
                    149:                        .destroy = _destroy,
                    150:                },
                    151:                .db = db,
                    152:                .rekey = lib->settings->get_time(lib->settings, "medsrv.rekey", 1200),
                    153:                .dpd = lib->settings->get_time(lib->settings, "medsrv.dpd", 300),
                    154:                .ike = ike_cfg_create(&ike),
                    155:        );
                    156:        this->ike->add_proposal(this->ike, proposal_create_default(PROTO_IKE));
                    157:        this->ike->add_proposal(this->ike, proposal_create_default_aead(PROTO_IKE));
                    158: 
                    159:        return &this->public;
                    160: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>