Annotation of embedaddon/strongswan/src/libimcv/imv/imv_session_manager.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2014-2015 Andreas Steffen
                      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 "imv_session_manager.h"
                     17: 
                     18: #include <tncif_names.h>
                     19: #include <tncif_identity.h>
                     20: 
                     21: #include <threading/mutex.h>
                     22: 
                     23: typedef struct private_imv_session_manager_t private_imv_session_manager_t;
                     24: 
                     25: /**
                     26:  * Private data of a imv_session_manager_t object.
                     27:  */
                     28: struct private_imv_session_manager_t {
                     29: 
                     30:        /**
                     31:         * Public imv_session_manager_t interface.
                     32:         */
                     33:        imv_session_manager_t public;
                     34: 
                     35:        /**
                     36:         * Session list
                     37:         */
                     38:        linked_list_t *sessions;
                     39: 
                     40:        /**
                     41:         * mutex used to lock session list
                     42:         */
                     43:        mutex_t *mutex;
                     44: 
                     45: };
                     46: 
                     47: METHOD(imv_session_manager_t, add_session, imv_session_t*,
                     48:        private_imv_session_manager_t *this, TNC_ConnectionID conn_id,
                     49:        linked_list_t *ar_identities)
                     50: {
                     51:        enumerator_t *enumerator;
                     52:        tncif_identity_t *tnc_id;
                     53:        imv_session_t *current, *session = NULL;
                     54: 
                     55:        this->mutex->lock(this->mutex);
                     56: 
                     57:        /* check if a session has already been assigned */
                     58:        enumerator = this->sessions->create_enumerator(this->sessions);
                     59:        while (enumerator->enumerate(enumerator, &current))
                     60:        {
                     61:                if (conn_id == current->get_connection_id(current))
                     62:                {
                     63:                        session = current;
                     64:                        break;
                     65:                }
                     66:        }
                     67:        enumerator->destroy(enumerator);
                     68: 
                     69:        /* session already exists */
                     70:        if (session)
                     71:        {
                     72:                ar_identities->destroy_offset(ar_identities,
                     73:                                                           offsetof(tncif_identity_t, destroy));
                     74:                this->mutex->unlock(this->mutex);
                     75:                return session->get_ref(session);
                     76:        }
                     77: 
                     78:        /* Output list of Access Requestor identities */
                     79:        enumerator = ar_identities->create_enumerator(ar_identities);
                     80:        while (enumerator->enumerate(enumerator, &tnc_id))
                     81:        {
                     82:                pen_type_t id_type, subject_type, auth_type;
                     83:                uint32_t tcg_id_type, tcg_subject_type, tcg_auth_type;
                     84:                chunk_t id_value;
                     85: 
                     86:                id_type = tnc_id->get_identity_type(tnc_id);
                     87:                id_value = tnc_id->get_identity_value(tnc_id);
                     88:                subject_type = tnc_id->get_subject_type(tnc_id);
                     89:                auth_type = tnc_id->get_auth_type(tnc_id);
                     90: 
                     91:                tcg_id_type = (subject_type.vendor_id == PEN_TCG) ?
                     92:                                                        id_type.type : TNC_SUBJECT_UNKNOWN;
                     93:                tcg_subject_type = (subject_type.vendor_id == PEN_TCG) ?
                     94:                                                        subject_type.type : TNC_SUBJECT_UNKNOWN;
                     95:                tcg_auth_type =    (auth_type.vendor_id == PEN_TCG) ?
                     96:                                                        auth_type.type : TNC_AUTH_UNKNOWN;
                     97: 
                     98:                DBG2(DBG_IMV, "  %N AR identity '%.*s' of type %N authenticated by %N",
                     99:                         TNC_Subject_names, tcg_subject_type,
                    100:                         id_value.len, id_value.ptr,
                    101:                         TNC_Identity_names, tcg_id_type,
                    102:                         TNC_Authentication_names, tcg_auth_type);
                    103:        }
                    104:        enumerator->destroy(enumerator);
                    105: 
                    106:        /* create a new session entry */
                    107:        session = imv_session_create(conn_id, ar_identities);
                    108:        this->sessions->insert_last(this->sessions, session);
                    109: 
                    110:        this->mutex->unlock(this->mutex);
                    111: 
                    112:        return session;
                    113: }
                    114: 
                    115: METHOD(imv_session_manager_t, remove_session, void,
                    116:        private_imv_session_manager_t *this, imv_session_t *session)
                    117: {
                    118:        enumerator_t *enumerator;
                    119:        imv_session_t *current;
                    120: 
                    121:        this->mutex->lock(this->mutex);
                    122:        enumerator = this->sessions->create_enumerator(this->sessions);
                    123:        while (enumerator->enumerate(enumerator, &current))
                    124:        {
                    125:                if (current == session)
                    126:                {
                    127:                        this->sessions->remove_at(this->sessions, enumerator);
                    128:                        break;
                    129:                }
                    130:        }
                    131:        enumerator->destroy(enumerator);
                    132:        this->mutex->unlock(this->mutex);
                    133: }
                    134: 
                    135: METHOD(imv_session_manager_t, destroy, void,
                    136:        private_imv_session_manager_t *this)
                    137: {
                    138:        this->sessions->destroy_offset(this->sessions,
                    139:                                                        offsetof(imv_session_t, destroy));
                    140:        this->mutex->destroy(this->mutex);
                    141:        free(this);
                    142: }
                    143: 
                    144: /**
                    145:  * See header
                    146:  */
                    147: imv_session_manager_t *imv_session_manager_create(void)
                    148: {
                    149:        private_imv_session_manager_t *this;
                    150: 
                    151:        INIT(this,
                    152:                .public = {
                    153:                        .add_session = _add_session,
                    154:                        .remove_session = _remove_session,
                    155:                        .destroy = _destroy,
                    156:                },
                    157:                .sessions = linked_list_create(),
                    158:                .mutex = mutex_create(MUTEX_TYPE_DEFAULT),
                    159:        );
                    160: 
                    161:        return &this->public;
                    162: }
                    163: 

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