Annotation of embedaddon/strongswan/src/libcharon/sa/xauth/xauth_manager.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2011 Martin Willi
3: * Copyright (C) 2011 revosec AG
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: #define _GNU_SOURCE /* for stdndup() */
17: #include <string.h>
18:
19: #include "xauth_manager.h"
20:
21: #include <collections/linked_list.h>
22: #include <threading/rwlock.h>
23:
24: typedef struct private_xauth_manager_t private_xauth_manager_t;
25: typedef struct xauth_entry_t xauth_entry_t;
26:
27: /**
28: * XAuth constructor entry
29: */
30: struct xauth_entry_t {
31:
32: /**
33: * Xauth backend name
34: */
35: char *name;
36:
37: /**
38: * Role of the method, XAUTH_SERVER or XAUTH_PEER
39: */
40: xauth_role_t role;
41:
42: /**
43: * constructor function to create instance
44: */
45: xauth_constructor_t constructor;
46: };
47:
48: /**
49: * private data of xauth_manager
50: */
51: struct private_xauth_manager_t {
52:
53: /**
54: * public functions
55: */
56: xauth_manager_t public;
57:
58: /**
59: * list of eap_entry_t's
60: */
61: linked_list_t *methods;
62:
63: /**
64: * rwlock to lock methods
65: */
66: rwlock_t *lock;
67: };
68:
69: METHOD(xauth_manager_t, add_method, void,
70: private_xauth_manager_t *this, char *name, xauth_role_t role,
71: xauth_constructor_t constructor)
72: {
73: xauth_entry_t *entry;
74:
75: INIT(entry,
76: .name = name,
77: .role = role,
78: .constructor = constructor,
79: );
80:
81: this->lock->write_lock(this->lock);
82: this->methods->insert_last(this->methods, entry);
83: this->lock->unlock(this->lock);
84: }
85:
86: METHOD(xauth_manager_t, remove_method, void,
87: private_xauth_manager_t *this, xauth_constructor_t constructor)
88: {
89: enumerator_t *enumerator;
90: xauth_entry_t *entry;
91:
92: this->lock->write_lock(this->lock);
93: enumerator = this->methods->create_enumerator(this->methods);
94: while (enumerator->enumerate(enumerator, &entry))
95: {
96: if (constructor == entry->constructor)
97: {
98: this->methods->remove_at(this->methods, enumerator);
99: free(entry);
100: }
101: }
102: enumerator->destroy(enumerator);
103: this->lock->unlock(this->lock);
104: }
105:
106: METHOD(xauth_manager_t, create_instance, xauth_method_t*,
107: private_xauth_manager_t *this, char *name, xauth_role_t role,
108: identification_t *server, identification_t *peer)
109: {
110: enumerator_t *enumerator;
111: xauth_entry_t *entry;
112: xauth_method_t *method = NULL;
113: char *profile = NULL;
114:
115: if (name)
116: {
117: profile = strchr(name, ':');
118: if (profile)
119: {
120: name = strndup(name, profile - name);
121: profile++;
122: }
123: }
124:
125: this->lock->read_lock(this->lock);
126: enumerator = this->methods->create_enumerator(this->methods);
127: while (enumerator->enumerate(enumerator, &entry))
128: {
129: if (!name && streq(entry->name, "noauth"))
130: { /* xauth-noauth has to be configured explicitly */
131: continue;
132: }
133: if (role == entry->role && (!name || streq(name, entry->name)))
134: {
135: method = entry->constructor(server, peer, profile);
136: if (method)
137: {
138: break;
139: }
140: }
141: }
142: enumerator->destroy(enumerator);
143: this->lock->unlock(this->lock);
144: if (profile)
145: {
146: free(name);
147: }
148: return method;
149: }
150:
151: METHOD(xauth_manager_t, destroy, void,
152: private_xauth_manager_t *this)
153: {
154: this->methods->destroy_function(this->methods, free);
155: this->lock->destroy(this->lock);
156: free(this);
157: }
158:
159: /*
160: * See header
161: */
162: xauth_manager_t *xauth_manager_create()
163: {
164: private_xauth_manager_t *this;
165:
166: INIT(this,
167: .public = {
168: .add_method = _add_method,
169: .remove_method = _remove_method,
170: .create_instance = _create_instance,
171: .destroy = _destroy,
172: },
173: .methods = linked_list_create(),
174: .lock = rwlock_create(RWLOCK_TYPE_DEFAULT),
175: );
176:
177: return &this->public;
178: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>