Annotation of embedaddon/strongswan/src/libstrongswan/plugins/ldap/ldap_fetcher.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2008 Martin Willi
3: * Copyright (C) 2007 Andreas Steffen
4: * HSR Hochschule fuer Technik Rapperswil
5: *
6: * This program is free software; you can redistribute it and/or modify it
7: * under the terms of the GNU General Public License as published by the
8: * Free Software Foundation; either version 2 of the License, or (at your
9: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
10: *
11: * This program is distributed in the hope that it will be useful, but
12: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14: * for more details.
15: */
16:
17: #ifndef LDAP_DEPRECATED
18: #define LDAP_DEPRECATED 1
19: #endif /* LDAP_DEPRECATED */
20: #include <ldap.h>
21:
22: #include <errno.h>
23:
24: #include <library.h>
25: #include <utils/debug.h>
26:
27: #include "ldap_fetcher.h"
28:
29: #define DEFAULT_TIMEOUT 10
30:
31: typedef struct private_ldap_fetcher_t private_ldap_fetcher_t;
32:
33: /**
34: * Private Data of a ldap_fetcher_t object.
35: */
36: struct private_ldap_fetcher_t {
37: /**
38: * Public data
39: */
40: ldap_fetcher_t public;
41:
42: /**
43: * timeout to use for fetches
44: */
45: u_int timeout;
46: };
47:
48: /**
49: * Parses the result returned by an ldap query
50: */
51: static bool parse(LDAP *ldap, LDAPMessage *result, chunk_t *response)
52: {
53: LDAPMessage *entry = ldap_first_entry(ldap, result);
54: bool success = FALSE;
55:
56: if (entry)
57: {
58: BerElement *ber = NULL;
59: char *attr;
60:
61: attr = ldap_first_attribute(ldap, entry, &ber);
62: if (attr)
63: {
64: struct berval **values = ldap_get_values_len(ldap, entry, attr);
65:
66: if (values)
67: {
68: if (values[0])
69: {
70: *response = chunk_alloc(values[0]->bv_len);
71: memcpy(response->ptr, values[0]->bv_val, response->len);
72: success = TRUE;
73: }
74: else
75: {
76: DBG1(DBG_LIB, "LDAP response contains no values");
77: }
78: ldap_value_free_len(values);
79: }
80: else
81: {
82: DBG1(DBG_LIB, "getting LDAP values failed: %s",
83: ldap_err2string(ldap_result2error(ldap, entry, 0)));
84: }
85: ldap_memfree(attr);
86: }
87: else
88: {
89: DBG1(DBG_LIB, "finding LDAP attributes failed: %s",
90: ldap_err2string(ldap_result2error(ldap, entry, 0)));
91: }
92: ber_free(ber, 0);
93: }
94: else
95: {
96: DBG1(DBG_LIB, "finding first LDAP entry failed");
97: }
98: return success;
99: }
100:
101:
102: METHOD(fetcher_t, fetch, status_t,
103: private_ldap_fetcher_t *this, char *url, void *userdata)
104: {
105: LDAP *ldap;
106: LDAPURLDesc *lurl;
107: LDAPMessage *msg;
108: int res;
109: int ldap_version = LDAP_VERSION3;
110: struct timeval timeout;
111: status_t status = FAILED;
112: chunk_t *result = userdata;
113:
114: if (!strpfx(url, "ldap"))
115: {
116: return NOT_SUPPORTED;
117: }
118: if (ldap_url_parse(url, &lurl) != LDAP_SUCCESS)
119: {
120: return NOT_SUPPORTED;
121: }
122: ldap = ldap_init(lurl->lud_host, lurl->lud_port);
123: if (ldap == NULL)
124: {
125: DBG1(DBG_LIB, "LDAP initialization failed: %s", strerror(errno));
126: ldap_free_urldesc(lurl);
127: return FAILED;
128: }
129:
130: timeout.tv_sec = this->timeout;
131: timeout.tv_usec = 0;
132:
133: ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version);
134: ldap_set_option(ldap, LDAP_OPT_NETWORK_TIMEOUT, &timeout);
135:
136: DBG2(DBG_LIB, "sending LDAP request to '%s'...", url);
137:
138: res = ldap_simple_bind_s(ldap, NULL, NULL);
139: if (res == LDAP_SUCCESS)
140: {
141: res = ldap_search_st(ldap, lurl->lud_dn, lurl->lud_scope,
142: lurl->lud_filter, lurl->lud_attrs,
143: 0, &timeout, &msg);
144:
145: if (res == LDAP_SUCCESS)
146: {
147: if (parse(ldap, msg, result))
148: {
149: status = SUCCESS;
150: }
151: ldap_msgfree(msg);
152: }
153: else
154: {
155: DBG1(DBG_LIB, "LDAP search failed: %s", ldap_err2string(res));
156: }
157: }
158: else
159: {
160: DBG1(DBG_LIB, "LDAP bind to '%s' failed: %s", url,
161: ldap_err2string(res));
162: }
163: ldap_unbind_s(ldap);
164: ldap_free_urldesc(lurl);
165: return status;
166: }
167:
168:
169: METHOD(fetcher_t, set_option, bool,
170: private_ldap_fetcher_t *this, fetcher_option_t option, ...)
171: {
172: va_list args;
173:
174: va_start(args, option);
175: switch (option)
176: {
177: case FETCH_TIMEOUT:
178: this->timeout = va_arg(args, u_int);
179: break;
180: default:
181: va_end(args);
182: return FALSE;
183: }
184: va_end(args);
185: return TRUE;
186: }
187:
188: METHOD(fetcher_t, destroy, void,
189: private_ldap_fetcher_t *this)
190: {
191: free(this);
192: }
193:
194: /*
195: * Described in header.
196: */
197: ldap_fetcher_t *ldap_fetcher_create()
198: {
199: private_ldap_fetcher_t *this;
200:
201: INIT(this,
202: .public = {
203: .interface = {
204: .fetch = _fetch,
205: .set_option = _set_option,
206: .destroy = _destroy,
207: },
208: },
209: .timeout = DEFAULT_TIMEOUT,
210: );
211:
212: return &this->public;
213: }
214:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>