Annotation of embedaddon/strongswan/src/libradius/radius_client.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2009 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 "radius_client.h"
17: #include "radius_config.h"
18:
19: #include <unistd.h>
20: #include <errno.h>
21:
22: #include <utils/debug.h>
23: #include <networking/host.h>
24: #include <collections/linked_list.h>
25: #include <threading/condvar.h>
26: #include <threading/mutex.h>
27:
28: typedef struct private_radius_client_t private_radius_client_t;
29:
30: /**
31: * Private data of an radius_client_t object.
32: */
33: struct private_radius_client_t {
34:
35: /**
36: * Public radius_client_t interface.
37: */
38: radius_client_t public;
39:
40: /**
41: * Selected RADIUS server configuration
42: */
43: radius_config_t *config;
44:
45: /**
46: * RADIUS servers State attribute
47: */
48: chunk_t state;
49:
50: /**
51: * EAP MSK, from MPPE keys
52: */
53: chunk_t msk;
54: };
55:
56: /**
57: * Save the state attribute to include in further request
58: */
59: static void save_state(private_radius_client_t *this, radius_message_t *msg)
60: {
61: enumerator_t *enumerator;
62: int type;
63: chunk_t data;
64:
65: enumerator = msg->create_enumerator(msg);
66: while (enumerator->enumerate(enumerator, &type, &data))
67: {
68: if (type == RAT_STATE)
69: {
70: free(this->state.ptr);
71: this->state = chunk_clone(data);
72: enumerator->destroy(enumerator);
73: return;
74: }
75: }
76: enumerator->destroy(enumerator);
77: /* no state attribute found, remove state */
78: chunk_free(&this->state);
79: }
80:
81: METHOD(radius_client_t, request, radius_message_t*,
82: private_radius_client_t *this, radius_message_t *req)
83: {
84: radius_socket_t *socket;
85: radius_message_t *res;
86: chunk_t data;
87:
88: /* add our NAS-Identifier */
89: req->add(req, RAT_NAS_IDENTIFIER,
90: this->config->get_nas_identifier(this->config));
91: /* add State attribute, if server sent one */
92: if (this->state.ptr)
93: {
94: req->add(req, RAT_STATE, this->state);
95: }
96: socket = this->config->get_socket(this->config);
97: DBG1(DBG_CFG, "sending RADIUS %N to server '%s'", radius_message_code_names,
98: req->get_code(req), this->config->get_name(this->config));
99:
100: res = socket->request(socket, req);
101: if (res)
102: {
103: DBG1(DBG_CFG, "received RADIUS %N from server '%s'",
104: radius_message_code_names, res->get_code(res),
105: this->config->get_name(this->config));
106: data = res->get_encoding(res);
107: DBG3(DBG_CFG, "%B", &data);
108:
109: save_state(this, res);
110: if (res->get_code(res) == RMC_ACCESS_ACCEPT)
111: {
112: chunk_clear(&this->msk);
113: this->msk = socket->decrypt_msk(socket, req, res);
114: }
115: this->config->put_socket(this->config, socket, TRUE);
116: return res;
117: }
118: this->config->put_socket(this->config, socket, FALSE);
119: return NULL;
120: }
121:
122: METHOD(radius_client_t, get_msk, chunk_t,
123: private_radius_client_t *this)
124: {
125: return this->msk;
126: }
127:
128: METHOD(radius_client_t, destroy, void,
129: private_radius_client_t *this)
130: {
131: this->config->destroy(this->config);
132: chunk_clear(&this->msk);
133: free(this->state.ptr);
134: free(this);
135: }
136:
137: /**
138: * See header
139: */
140: radius_client_t *radius_client_create(radius_config_t *config)
141: {
142: private_radius_client_t *this;
143:
144: INIT(this,
145: .public = {
146: .request = _request,
147: .get_msk = _get_msk,
148: .destroy = _destroy,
149: },
150: .config = config,
151: );
152:
153: return &this->public;
154: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>