Annotation of embedaddon/strongswan/src/libimcv/imv/imv_session.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2013-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.h"
! 17:
! 18: #include <tncif_identity.h>
! 19:
! 20: #include <utils/debug.h>
! 21:
! 22: typedef struct private_imv_session_t private_imv_session_t;
! 23:
! 24: /**
! 25: * Private data of a imv_session_t object.
! 26: */
! 27: struct private_imv_session_t {
! 28:
! 29: /**
! 30: * Public imv_session_t interface.
! 31: */
! 32: imv_session_t public;
! 33:
! 34: /**
! 35: * Unique Session ID
! 36: */
! 37: int session_id;
! 38:
! 39: /**
! 40: * Unique Product ID
! 41: */
! 42: int pid;
! 43:
! 44: /**
! 45: * Unique Device ID
! 46: */
! 47: int did;
! 48:
! 49: /**
! 50: * TNCCS connection ID
! 51: */
! 52: TNC_ConnectionID conn_id;
! 53:
! 54: /**
! 55: * Session creation time
! 56: */
! 57: time_t created;
! 58:
! 59: /**
! 60: * List of Access Requestor identities
! 61: */
! 62: linked_list_t *ar_identities;
! 63:
! 64: /**
! 65: * OS information
! 66: */
! 67: imv_os_info_t *os_info;
! 68:
! 69: /**
! 70: * Device ID
! 71: */
! 72: chunk_t device_id;
! 73:
! 74: /**
! 75: * Is Device ID trusted?
! 76: */
! 77: bool trusted;
! 78:
! 79: /**
! 80: * Have the workitems been generated?
! 81: */
! 82: bool policy_started;
! 83:
! 84: /**
! 85: * List of worklist items
! 86: */
! 87: linked_list_t *workitems;
! 88:
! 89: /**
! 90: * Reference count
! 91: */
! 92: refcount_t ref;
! 93:
! 94: };
! 95:
! 96: METHOD(imv_session_t, set_session_id, void,
! 97: private_imv_session_t *this, int session_id, int pid, int did)
! 98: {
! 99: this->session_id = session_id;
! 100: this->pid = pid;
! 101: this->did = did;
! 102: }
! 103:
! 104: METHOD(imv_session_t, get_session_id, int,
! 105: private_imv_session_t *this, int *pid, int *did)
! 106: {
! 107: if (pid)
! 108: {
! 109: *pid = this->pid;
! 110: }
! 111: if (did)
! 112: {
! 113: *did = this->did;
! 114: }
! 115: return this->session_id;
! 116: }
! 117:
! 118: METHOD(imv_session_t, get_connection_id, TNC_ConnectionID,
! 119: private_imv_session_t *this)
! 120: {
! 121: return this->conn_id;
! 122: }
! 123:
! 124: METHOD(imv_session_t, set_creation_time, void,
! 125: private_imv_session_t *this, time_t created)
! 126: {
! 127: this->created = created;
! 128: }
! 129:
! 130: METHOD(imv_session_t, get_creation_time, time_t,
! 131: private_imv_session_t *this)
! 132: {
! 133: return this->created;
! 134: }
! 135:
! 136: METHOD(imv_session_t, create_ar_identities_enumerator, enumerator_t*,
! 137: private_imv_session_t *this)
! 138: {
! 139: return this->ar_identities->create_enumerator(this->ar_identities);
! 140: }
! 141:
! 142: METHOD(imv_session_t, get_os_info, imv_os_info_t*,
! 143: private_imv_session_t *this)
! 144: {
! 145: return this->os_info;
! 146: }
! 147:
! 148: METHOD(imv_session_t, set_device_id, void,
! 149: private_imv_session_t *this, chunk_t device_id)
! 150: {
! 151: if (device_id.len == 0)
! 152: {
! 153: device_id = chunk_from_str("unknown");
! 154: }
! 155: if (this->device_id.len)
! 156: {
! 157: if (chunk_equals(device_id, this->device_id))
! 158: {
! 159: return;
! 160: }
! 161: free(this->device_id.ptr);
! 162: }
! 163: this->device_id = chunk_clone(device_id);
! 164: }
! 165:
! 166: METHOD(imv_session_t, get_device_id, bool,
! 167: private_imv_session_t *this, chunk_t *device_id)
! 168: {
! 169: if (this->device_id.len == 0)
! 170: {
! 171: return FALSE;
! 172: }
! 173: if (device_id)
! 174: {
! 175: *device_id = this->device_id;
! 176: }
! 177: return TRUE;
! 178: }
! 179:
! 180: METHOD(imv_session_t, set_device_trust, void,
! 181: private_imv_session_t *this, bool trusted)
! 182: {
! 183: this->trusted = trusted;
! 184: }
! 185:
! 186: METHOD(imv_session_t, get_device_trust, bool,
! 187: private_imv_session_t *this)
! 188: {
! 189: return this->trusted;
! 190: }
! 191:
! 192: METHOD(imv_session_t, set_policy_started, void,
! 193: private_imv_session_t *this, bool start)
! 194: {
! 195: this->policy_started = start;
! 196: }
! 197:
! 198: METHOD(imv_session_t, get_policy_started, bool,
! 199: private_imv_session_t *this)
! 200: {
! 201: return this->policy_started;
! 202: }
! 203:
! 204: METHOD(imv_session_t, insert_workitem, void,
! 205: private_imv_session_t *this, imv_workitem_t *workitem)
! 206: {
! 207: this->workitems->insert_last(this->workitems, workitem);
! 208: }
! 209:
! 210: METHOD(imv_session_t, remove_workitem, void,
! 211: private_imv_session_t *this, enumerator_t *enumerator)
! 212: {
! 213: this->workitems->remove_at(this->workitems, enumerator);
! 214: }
! 215:
! 216: METHOD(imv_session_t, create_workitem_enumerator, enumerator_t*,
! 217: private_imv_session_t *this)
! 218: {
! 219: return this->workitems->create_enumerator(this->workitems);
! 220: }
! 221:
! 222: METHOD(imv_session_t, get_workitem_count, int,
! 223: private_imv_session_t *this, TNC_IMVID imv_id)
! 224: {
! 225: enumerator_t *enumerator;
! 226: imv_workitem_t *workitem;
! 227: int count = 0;
! 228:
! 229: enumerator = this->workitems->create_enumerator(this->workitems);
! 230: while (enumerator->enumerate(enumerator, &workitem))
! 231: {
! 232: if (workitem->get_imv_id(workitem) == imv_id)
! 233: {
! 234: count++;
! 235: }
! 236: }
! 237: enumerator->destroy(enumerator);
! 238:
! 239: return count;
! 240: }
! 241:
! 242: METHOD(imv_session_t, get_ref, imv_session_t*,
! 243: private_imv_session_t *this)
! 244: {
! 245: ref_get(&this->ref);
! 246:
! 247: return &this->public;
! 248: }
! 249:
! 250: METHOD(imv_session_t, destroy, void,
! 251: private_imv_session_t *this)
! 252: {
! 253: if (ref_put(&this->ref))
! 254: {
! 255: this->workitems->destroy_offset(this->workitems,
! 256: offsetof(imv_workitem_t, destroy));
! 257: this->os_info->destroy(this->os_info);
! 258: this->ar_identities->destroy_offset(this->ar_identities,
! 259: offsetof(tncif_identity_t, destroy));
! 260: free(this->device_id.ptr);
! 261: free(this);
! 262: }
! 263: }
! 264:
! 265: /**
! 266: * See header
! 267: */
! 268: imv_session_t *imv_session_create(TNC_ConnectionID conn_id,
! 269: linked_list_t *ar_identities)
! 270: {
! 271: private_imv_session_t *this;
! 272:
! 273: INIT(this,
! 274: .public = {
! 275: .set_session_id = _set_session_id,
! 276: .get_session_id = _get_session_id,
! 277: .get_connection_id = _get_connection_id,
! 278: .set_creation_time = _set_creation_time,
! 279: .get_creation_time = _get_creation_time,
! 280: .create_ar_identities_enumerator = _create_ar_identities_enumerator,
! 281: .get_os_info = _get_os_info,
! 282: .set_device_id = _set_device_id,
! 283: .get_device_id = _get_device_id,
! 284: .set_device_trust = _set_device_trust,
! 285: .get_device_trust = _get_device_trust,
! 286: .set_policy_started = _set_policy_started,
! 287: .get_policy_started = _get_policy_started,
! 288: .insert_workitem = _insert_workitem,
! 289: .remove_workitem = _remove_workitem,
! 290: .create_workitem_enumerator = _create_workitem_enumerator,
! 291: .get_workitem_count = _get_workitem_count,
! 292: .get_ref = _get_ref,
! 293: .destroy = _destroy,
! 294: },
! 295: .conn_id = conn_id,
! 296: .ar_identities = ar_identities,
! 297: .os_info = imv_os_info_create(),
! 298: .workitems = linked_list_create(),
! 299: .ref = 1,
! 300: );
! 301:
! 302: return &this->public;
! 303: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>