diff options
Diffstat (limited to 'rubbos/app/httpd-2.0.64/srclib/apr-util/ldap/apr_ldap_url.c')
-rw-r--r-- | rubbos/app/httpd-2.0.64/srclib/apr-util/ldap/apr_ldap_url.c | 723 |
1 files changed, 0 insertions, 723 deletions
diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/ldap/apr_ldap_url.c b/rubbos/app/httpd-2.0.64/srclib/apr-util/ldap/apr_ldap_url.c deleted file mode 100644 index 11037cb7..00000000 --- a/rubbos/app/httpd-2.0.64/srclib/apr-util/ldap/apr_ldap_url.c +++ /dev/null @@ -1,723 +0,0 @@ -/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* Portions Copyright 1998-2002 The OpenLDAP Foundation - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted only as authorized by the OpenLDAP - * Public License. A copy of this license is available at - * http://www.OpenLDAP.org/license.html or in file LICENSE in the - * top-level directory of the distribution. - * - * OpenLDAP is a registered trademark of the OpenLDAP Foundation. - * - * Individual files and/or contributed packages may be copyright by - * other parties and subject to additional restrictions. - * - * This work is derived from the University of Michigan LDAP v3.3 - * distribution. Information concerning this software is available - * at: http://www.umich.edu/~dirsvcs/ldap/ - * - * This work also contains materials derived from public sources. - * - * Additional information about OpenLDAP can be obtained at: - * http://www.openldap.org/ - */ - -/* - * Portions Copyright (c) 1992-1996 Regents of the University of Michigan. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that this notice is preserved and that due credit is given - * to the University of Michigan at Ann Arbor. The name of the University - * may not be used to endorse or promote products derived from this - * software without specific prior written permission. This software - * is provided ``as is'' without express or implied warranty. - */ - -/* apr_ldap_url.c -- LDAP URL (RFC 2255) related routines - * - * Win32 and perhaps other non-OpenLDAP based ldap libraries may be - * missing ldap_url_* APIs. We focus here on the one significant - * aspect, which is parsing. We have [for the time being] omitted - * the ldap_url_search APIs. - * - * LDAP URLs look like this: - * ldap[is]://host:port[/[dn[?[attributes][?[scope][?[filter][?exts]]]]]] - * - * where: - * attributes is a comma separated list - * scope is one of these three strings: base one sub (default=base) - * filter is an string-represented filter as in RFC 2254 - * - * e.g., ldap://host:port/dc=com?o,cn?base?o=openldap?extension - * - * Tolerates URLs that look like: <ldapurl> and <URL:ldapurl> - */ - -#include "apr_ldap.h" - -#if APR_HAS_LDAP - -#if !APR_HAS_LDAP_URL_PARSE - -#include "apr_general.h" -#include "apr_strings.h" - -#ifndef LDAPS_PORT -#define LDAPS_PORT 636 /* ldaps:/// default LDAP over TLS port */ -#endif - -#define LDAP_URL_PREFIX "ldap://" -#define LDAP_URL_PREFIX_LEN (sizeof(LDAP_URL_PREFIX)-1) -#define LDAPS_URL_PREFIX "ldaps://" -#define LDAPS_URL_PREFIX_LEN (sizeof(LDAPS_URL_PREFIX)-1) -#define LDAPI_URL_PREFIX "ldapi://" -#define LDAPI_URL_PREFIX_LEN (sizeof(LDAPI_URL_PREFIX)-1) -#define LDAP_URL_URLCOLON "URL:" -#define LDAP_URL_URLCOLON_LEN (sizeof(LDAP_URL_URLCOLON)-1) - -#define LDAP_STRDUP(x) strdup(x) -#define LDAP_CALLOC(n, s) calloc(n, s) -#define LDAP_MALLOC(n) malloc(n) -#define LDAP_REALLOC(x, n) realloc(x, n) -#define LDAP_FREE(x) free(x) -#define LDAP_VFREE(a) ldap_charray_free(a) - -#define ldap_utf8_strchr(x, s) strchr(x, *s) -#define ldap_utf8_strtok(x, s, l) apr_strtok(x, s, l) - -/* local functions */ -static const char* skip_url_prefix(const char *url, int *enclosedp, - const char **scheme); - -static void ldap_pvt_hex_unescape(char *s); - -static int ldap_pvt_unhex(int c); - -static void ldap_charray_free(char **a); - -static char **ldap_str2charray(const char *str, const char *brkstr); - -APU_DECLARE(int) apr_ldap_is_ldap_url(const char *url) -{ - int enclosed; - const char * scheme; - - if( url == NULL ) { - return 0; - } - - if( skip_url_prefix( url, &enclosed, &scheme ) == NULL ) { - return 0; - } - - return 1; -} - -APU_DECLARE(int) apr_ldap_is_ldaps_url(const char *url) -{ - int enclosed; - const char * scheme; - - if( url == NULL ) { - return 0; - } - - if( skip_url_prefix( url, &enclosed, &scheme ) == NULL ) { - return 0; - } - - return strcmp(scheme, "ldaps") == 0; -} - -APU_DECLARE(int) apr_ldap_is_ldapi_url(const char *url) -{ - int enclosed; - const char * scheme; - - if( url == NULL ) { - return 0; - } - - if( skip_url_prefix( url, &enclosed, &scheme ) == NULL ) { - return 0; - } - - return strcmp(scheme, "ldapi") == 0; -} - -static const char *skip_url_prefix(const char *url, int *enclosedp, - const char **scheme) -{ - /* - * return non-zero if this looks like a LDAP URL; zero if not - * if non-zero returned, *urlp will be moved past "ldap://" part of URL - */ - const char *p; - - if ( url == NULL ) { - return( NULL ); - } - - p = url; - - /* skip leading '<' (if any) */ - if ( *p == '<' ) { - *enclosedp = 1; - ++p; - } else { - *enclosedp = 0; - } - - /* skip leading "URL:" (if any) */ - if ( strncasecmp( p, LDAP_URL_URLCOLON, LDAP_URL_URLCOLON_LEN ) == 0 ) { - p += LDAP_URL_URLCOLON_LEN; - } - - /* check for "ldap://" prefix */ - if ( strncasecmp( p, LDAP_URL_PREFIX, LDAP_URL_PREFIX_LEN ) == 0 ) { - /* skip over "ldap://" prefix and return success */ - p += LDAP_URL_PREFIX_LEN; - *scheme = "ldap"; - return( p ); - } - - /* check for "ldaps://" prefix */ - if ( strncasecmp( p, LDAPS_URL_PREFIX, LDAPS_URL_PREFIX_LEN ) == 0 ) { - /* skip over "ldaps://" prefix and return success */ - p += LDAPS_URL_PREFIX_LEN; - *scheme = "ldaps"; - return( p ); - } - - /* check for "ldapi://" prefix */ - if ( strncasecmp( p, LDAPI_URL_PREFIX, LDAPI_URL_PREFIX_LEN ) == 0 ) { - /* skip over "ldapi://" prefix and return success */ - p += LDAPI_URL_PREFIX_LEN; - *scheme = "ldapi"; - return( p ); - } - - return( NULL ); -} - - -static int str2scope(const char *p) -{ - if ( strcasecmp( p, "one" ) == 0 ) { - return LDAP_SCOPE_ONELEVEL; - - } else if ( strcasecmp( p, "onetree" ) == 0 ) { - return LDAP_SCOPE_ONELEVEL; - - } else if ( strcasecmp( p, "base" ) == 0 ) { - return LDAP_SCOPE_BASE; - - } else if ( strcasecmp( p, "sub" ) == 0 ) { - return LDAP_SCOPE_SUBTREE; - - } else if ( strcasecmp( p, "subtree" ) == 0 ) { - return LDAP_SCOPE_SUBTREE; - } - - return( -1 ); -} - - -static int ldap_url_parse_ext(const char *url_in, - apr_ldap_url_desc_t **ludpp) -{ -/* - * Pick apart the pieces of an LDAP URL. - */ - apr_ldap_url_desc_t *ludp; - char *p, *q, *r; - int i, enclosed; - const char *scheme = NULL; - const char *url_tmp; - char *url; - - if( url_in == NULL || ludpp == NULL ) { - return LDAP_URL_ERR_PARAM; - } - - *ludpp = NULL; /* pessimistic */ - - url_tmp = skip_url_prefix( url_in, &enclosed, &scheme ); - - if ( url_tmp == NULL ) { - return LDAP_URL_ERR_BADSCHEME; - } - - /* make working copy of the remainder of the URL */ - url = LDAP_STRDUP( url_tmp ); - if ( url == NULL ) { - return LDAP_URL_ERR_MEM; - } - - if ( enclosed ) { - p = &url[strlen(url)-1]; - - if( *p != '>' ) { - LDAP_FREE( url ); - return LDAP_URL_ERR_BADENCLOSURE; - } - - *p = '\0'; - } - - /* allocate return struct */ - ludp = (apr_ldap_url_desc_t *)LDAP_CALLOC( 1, sizeof( apr_ldap_url_desc_t )); - - if ( ludp == NULL ) { - LDAP_FREE( url ); - return LDAP_URL_ERR_MEM; - } - - ludp->lud_next = NULL; - ludp->lud_host = NULL; - ludp->lud_port = LDAP_PORT; - ludp->lud_dn = NULL; - ludp->lud_attrs = NULL; - ludp->lud_filter = NULL; - ludp->lud_scope = -1; - ludp->lud_filter = NULL; - ludp->lud_exts = NULL; - - ludp->lud_scheme = LDAP_STRDUP( scheme ); - - if ( ludp->lud_scheme == NULL ) { - LDAP_FREE( url ); - apr_ldap_free_urldesc( ludp ); - return LDAP_URL_ERR_MEM; - } - - if( strcasecmp( ludp->lud_scheme, "ldaps" ) == 0 ) { - ludp->lud_port = LDAPS_PORT; - } - - /* scan forward for '/' that marks end of hostport and begin. of dn */ - p = strchr( url, '/' ); - - if( p != NULL ) { - /* terminate hostport; point to start of dn */ - *p++ = '\0'; - } - - /* IPv6 syntax with [ip address]:port */ - if ( *url == '[' ) { - r = strchr( url, ']' ); - if ( r == NULL ) { - LDAP_FREE( url ); - apr_ldap_free_urldesc( ludp ); - return LDAP_URL_ERR_BADURL; - } - *r++ = '\0'; - q = strchr( r, ':' ); - } else { - q = strchr( url, ':' ); - } - - if ( q != NULL ) { - *q++ = '\0'; - ldap_pvt_hex_unescape( q ); - - if( *q == '\0' ) { - LDAP_FREE( url ); - apr_ldap_free_urldesc( ludp ); - return LDAP_URL_ERR_BADURL; - } - - ludp->lud_port = atoi( q ); - } - - ldap_pvt_hex_unescape( url ); - - /* If [ip address]:port syntax, url is [ip and we skip the [ */ - ludp->lud_host = LDAP_STRDUP( url + ( *url == '[' ) ); - - if( ludp->lud_host == NULL ) { - LDAP_FREE( url ); - apr_ldap_free_urldesc( ludp ); - return LDAP_URL_ERR_MEM; - } - - /* - * Kludge. ldap://111.222.333.444:389??cn=abc,o=company - * - * On early Novell releases, search references/referrals were returned - * in this format, i.e., the dn was kind of in the scope position, - * but the required slash is missing. The whole thing is illegal syntax, - * but we need to account for it. Fortunately it can't be confused with - * anything real. - */ - if( (p == NULL) && (q != NULL) && ((q = strchr( q, '?')) != NULL)) { - q++; - /* ? immediately followed by question */ - if( *q == '?') { - q++; - if( *q != '\0' ) { - /* parse dn part */ - ldap_pvt_hex_unescape( q ); - ludp->lud_dn = LDAP_STRDUP( q ); - } else { - ludp->lud_dn = LDAP_STRDUP( "" ); - } - - if( ludp->lud_dn == NULL ) { - LDAP_FREE( url ); - apr_ldap_free_urldesc( ludp ); - return LDAP_URL_ERR_MEM; - } - } - } - - if( p == NULL ) { - LDAP_FREE( url ); - *ludpp = ludp; - return LDAP_URL_SUCCESS; - } - - /* scan forward for '?' that may marks end of dn */ - q = strchr( p, '?' ); - - if( q != NULL ) { - /* terminate dn part */ - *q++ = '\0'; - } - - if( *p != '\0' ) { - /* parse dn part */ - ldap_pvt_hex_unescape( p ); - ludp->lud_dn = LDAP_STRDUP( p ); - } else { - ludp->lud_dn = LDAP_STRDUP( "" ); - } - - if( ludp->lud_dn == NULL ) { - LDAP_FREE( url ); - apr_ldap_free_urldesc( ludp ); - return LDAP_URL_ERR_MEM; - } - - if( q == NULL ) { - /* no more */ - LDAP_FREE( url ); - *ludpp = ludp; - return LDAP_URL_SUCCESS; - } - - /* scan forward for '?' that may marks end of attributes */ - p = q; - q = strchr( p, '?' ); - - if( q != NULL ) { - /* terminate attributes part */ - *q++ = '\0'; - } - - if( *p != '\0' ) { - /* parse attributes */ - ldap_pvt_hex_unescape( p ); - ludp->lud_attrs = ldap_str2charray( p, "," ); - - if( ludp->lud_attrs == NULL ) { - LDAP_FREE( url ); - apr_ldap_free_urldesc( ludp ); - return LDAP_URL_ERR_BADATTRS; - } - } - - if ( q == NULL ) { - /* no more */ - LDAP_FREE( url ); - *ludpp = ludp; - return LDAP_URL_SUCCESS; - } - - /* scan forward for '?' that may marks end of scope */ - p = q; - q = strchr( p, '?' ); - - if( q != NULL ) { - /* terminate the scope part */ - *q++ = '\0'; - } - - if( *p != '\0' ) { - /* parse the scope */ - ldap_pvt_hex_unescape( p ); - ludp->lud_scope = str2scope( p ); - - if( ludp->lud_scope == -1 ) { - LDAP_FREE( url ); - apr_ldap_free_urldesc( ludp ); - return LDAP_URL_ERR_BADSCOPE; - } - } - - if ( q == NULL ) { - /* no more */ - LDAP_FREE( url ); - *ludpp = ludp; - return LDAP_URL_SUCCESS; - } - - /* scan forward for '?' that may marks end of filter */ - p = q; - q = strchr( p, '?' ); - - if( q != NULL ) { - /* terminate the filter part */ - *q++ = '\0'; - } - - if( *p != '\0' ) { - /* parse the filter */ - ldap_pvt_hex_unescape( p ); - - if( ! *p ) { - /* missing filter */ - LDAP_FREE( url ); - apr_ldap_free_urldesc( ludp ); - return LDAP_URL_ERR_BADFILTER; - } - - LDAP_FREE( ludp->lud_filter ); - ludp->lud_filter = LDAP_STRDUP( p ); - - if( ludp->lud_filter == NULL ) { - LDAP_FREE( url ); - apr_ldap_free_urldesc( ludp ); - return LDAP_URL_ERR_MEM; - } - } - - if ( q == NULL ) { - /* no more */ - LDAP_FREE( url ); - *ludpp = ludp; - return LDAP_URL_SUCCESS; - } - - /* scan forward for '?' that may marks end of extensions */ - p = q; - q = strchr( p, '?' ); - - if( q != NULL ) { - /* extra '?' */ - LDAP_FREE( url ); - apr_ldap_free_urldesc( ludp ); - return LDAP_URL_ERR_BADURL; - } - - /* parse the extensions */ - ludp->lud_exts = ldap_str2charray( p, "," ); - - if( ludp->lud_exts == NULL ) { - LDAP_FREE( url ); - apr_ldap_free_urldesc( ludp ); - return LDAP_URL_ERR_BADEXTS; - } - - for( i=0; ludp->lud_exts[i] != NULL; i++ ) { - ldap_pvt_hex_unescape( ludp->lud_exts[i] ); - - if( *ludp->lud_exts[i] == '!' ) { - /* count the number of critical extensions */ - ludp->lud_crit_exts++; - } - } - - if( i == 0 ) { - /* must have 1 or more */ - LDAP_FREE( url ); - apr_ldap_free_urldesc( ludp ); - return LDAP_URL_ERR_BADEXTS; - } - - /* no more */ - *ludpp = ludp; - LDAP_FREE( url ); - return LDAP_URL_SUCCESS; -} - -APU_DECLARE(int) apr_ldap_url_parse(const char *url_in, - apr_ldap_url_desc_t **ludpp) -{ - int rc = ldap_url_parse_ext( url_in, ludpp ); - - if( rc != LDAP_URL_SUCCESS ) { - return rc; - } - - if ((*ludpp)->lud_scope == -1) { - (*ludpp)->lud_scope = LDAP_SCOPE_BASE; - } - - if ((*ludpp)->lud_host != NULL && *(*ludpp)->lud_host == '\0') { - LDAP_FREE( (*ludpp)->lud_host ); - (*ludpp)->lud_host = NULL; - } - - return rc; -} - -APU_DECLARE(void) apr_ldap_free_urldesc(apr_ldap_url_desc_t *ludp) -{ - if ( ludp == NULL ) { - return; - } - - if ( ludp->lud_scheme != NULL ) { - LDAP_FREE( ludp->lud_scheme ); - } - - if ( ludp->lud_host != NULL ) { - LDAP_FREE( ludp->lud_host ); - } - - if ( ludp->lud_dn != NULL ) { - LDAP_FREE( ludp->lud_dn ); - } - - if ( ludp->lud_filter != NULL ) { - LDAP_FREE( ludp->lud_filter); - } - - if ( ludp->lud_attrs != NULL ) { - LDAP_VFREE( ludp->lud_attrs ); - } - - if ( ludp->lud_exts != NULL ) { - LDAP_VFREE( ludp->lud_exts ); - } - - LDAP_FREE( ludp ); -} - - -static void ldap_pvt_hex_unescape(char *s) -{ - /* - * Remove URL hex escapes from s... done in place. The basic concept for - * this routine is borrowed from the WWW library HTUnEscape() routine. - */ - char *p; - - for ( p = s; *s != '\0'; ++s ) { - if ( *s == '%' ) { - if ( *++s == '\0' ) { - break; - } - *p = ldap_pvt_unhex( *s ) << 4; - if ( *++s == '\0' ) { - break; - } - *p++ += ldap_pvt_unhex( *s ); - } else { - *p++ = *s; - } - } - - *p = '\0'; -} - - -static int ldap_pvt_unhex(int c) -{ - return( c >= '0' && c <= '9' ? c - '0' - : c >= 'A' && c <= 'F' ? c - 'A' + 10 - : c - 'a' + 10 ); -} - - -static void ldap_charray_free(char **a) -{ - char **p; - - if ( a == NULL ) { - return; - } - - for ( p = a; *p != NULL; p++ ) { - if ( *p != NULL ) { - LDAP_FREE( *p ); - } - } - - LDAP_FREE( (char *) a ); -} - -static char **ldap_str2charray(const char *str_in, const char *brkstr) -{ - char **res; - char *str, *s; - char *lasts; - int i; - - /* protect the input string from strtok */ - str = LDAP_STRDUP( str_in ); - if( str == NULL ) { - return NULL; - } - - i = 1; - for ( s = str; *s; s++ ) { - if ( ldap_utf8_strchr( brkstr, s ) != NULL ) { - i++; - } - } - - res = (char **) LDAP_MALLOC( (i + 1) * sizeof(char *) ); - - if( res == NULL ) { - LDAP_FREE( str ); - return NULL; - } - - i = 0; - - for ( s = ldap_utf8_strtok( str, brkstr, &lasts ); - s != NULL; - s = ldap_utf8_strtok( NULL, brkstr, &lasts ) ) - { - res[i] = LDAP_STRDUP( s ); - - if(res[i] == NULL) { - for( --i ; i >= 0 ; i-- ) { - LDAP_FREE( res[i] ); - } - LDAP_FREE( res ); - LDAP_FREE( str ); - return NULL; - } - - i++; - } - - res[i] = NULL; - - LDAP_FREE( str ); - return( res ); -} - -#endif /* !APR_HAS_LDAP_URL_PARSE */ - -#endif /* APR_HAS_LDAP */ |