Annotation of embedaddon/strongswan/src/libstrongswan/plugins/ldap/ldap_fetcher.c, revision 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>