⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 apr_ldap_url.c

📁 Apache官方在今天放出产品系列2.2的最新版本2.2.11的源码包 最流行的HTTP服务器软件之一
💻 C
📖 第 1 页 / 共 2 页
字号:
        r = strchr( url, ']' );        if ( r == NULL ) {            result->reason = "Bad LDAP URL while parsing IPV6 syntax.";            result->rc = APR_LDAP_URL_ERR_BADURL;            return APR_EGENERAL;        }        *r++ = '\0';        q = strrchr( r, ':' );    } else {        q = strrchr( url, ':' );    }    if ( q != NULL ) {        apr_ldap_pvt_hex_unescape( ++q );        if( *q == '\0' ) {            result->reason = "Bad LDAP URL while parsing.";            result->rc = APR_LDAP_URL_ERR_BADURL;            return APR_EGENERAL;        }        ludp->lud_port = atoi( q );    }    apr_ldap_pvt_hex_unescape( url );    /* If [ip address]:port syntax, url is [ip and we skip the [ */    ludp->lud_host = (char *)apr_pstrdup(pool, url + ( *url == '[' ));    if( ludp->lud_host == NULL ) {        result->reason = "Out of memory parsing LDAP URL.";        result->rc = APR_LDAP_URL_ERR_MEM;        return APR_EGENERAL;    }    /*     * 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 */                apr_ldap_pvt_hex_unescape( q );                ludp->lud_dn = (char *)apr_pstrdup(pool, q);            } else {                ludp->lud_dn = (char *)apr_pstrdup(pool, "");            }            if( ludp->lud_dn == NULL ) {                result->reason = "Out of memory parsing LDAP URL.";                result->rc = APR_LDAP_URL_ERR_MEM;                return APR_EGENERAL;            }        }    }    if( p == NULL ) {        *ludpp = ludp;        return APR_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 */        apr_ldap_pvt_hex_unescape( p );        ludp->lud_dn = (char *)apr_pstrdup(pool, p);    } else {        ludp->lud_dn = (char *)apr_pstrdup(pool, "");    }    if( ludp->lud_dn == NULL ) {        result->reason = "Out of memory parsing LDAP URL.";        result->rc = APR_LDAP_URL_ERR_MEM;        return APR_EGENERAL;    }    if( q == NULL ) {        /* no more */        *ludpp = ludp;        return APR_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 */        apr_ldap_pvt_hex_unescape( p );        ludp->lud_attrs = apr_ldap_str2charray(pool, p, ",");        if( ludp->lud_attrs == NULL ) {            result->reason = "Bad attributes encountered while parsing LDAP URL.";            result->rc = APR_LDAP_URL_ERR_BADATTRS;            return APR_EGENERAL;        }    }    if ( q == NULL ) {        /* no more */        *ludpp = ludp;        return APR_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 */        apr_ldap_pvt_hex_unescape( p );        ludp->lud_scope = str2scope( p );        if( ludp->lud_scope == -1 ) {            result->reason = "Bad scope encountered while parsing LDAP URL.";            result->rc = APR_LDAP_URL_ERR_BADSCOPE;            return APR_EGENERAL;        }    }    if ( q == NULL ) {        /* no more */        *ludpp = ludp;        return APR_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 */        apr_ldap_pvt_hex_unescape( p );        if( ! *p ) {            /* missing filter */            result->reason = "Bad filter encountered while parsing LDAP URL.";            result->rc = APR_LDAP_URL_ERR_BADFILTER;            return APR_EGENERAL;        }        ludp->lud_filter = (char *)apr_pstrdup(pool, p);        if( ludp->lud_filter == NULL ) {            result->reason = "Out of memory parsing LDAP URL.";            result->rc = APR_LDAP_URL_ERR_MEM;            return APR_EGENERAL;        }    }    if ( q == NULL ) {        /* no more */        *ludpp = ludp;        return APR_SUCCESS;    }    /* scan forward for '?' that may marks end of extensions */    p = q;    q = strchr( p, '?' );    if( q != NULL ) {        /* extra '?' */        result->reason = "Bad URL encountered while parsing LDAP URL.";        result->rc = APR_LDAP_URL_ERR_BADURL;        return APR_EGENERAL;    }    /* parse the extensions */    ludp->lud_exts = apr_ldap_str2charray(pool, p, ",");    if( ludp->lud_exts == NULL ) {        result->reason = "Bad extensions encountered while parsing LDAP URL.";        result->rc = APR_LDAP_URL_ERR_BADEXTS;        return APR_EGENERAL;    }    for( i=0; ludp->lud_exts[i] != NULL; i++ ) {        apr_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 */        result->reason = "Bad extensions encountered while parsing LDAP URL.";        result->rc = APR_LDAP_URL_ERR_BADEXTS;        return APR_EGENERAL;    }    /* no more */    *ludpp = ludp;    return APR_SUCCESS;}/** * Parse the URL provided into an apr_ldap_url_desc_t object. * * APR_SUCCESS is returned on success, APR_EGENERAL on failure. * The LDAP result code and reason string is returned in the * apr_ldap_err_t structure. */APU_DECLARE(int) apr_ldap_url_parse(apr_pool_t *pool,                                    const char *url_in,                                    apr_ldap_url_desc_t **ludpp,                                    apr_ldap_err_t **result_err){    int rc = apr_ldap_url_parse_ext(pool, url_in, ludpp, result_err);    if( rc != APR_SUCCESS ) {        return rc;    }    if ((*ludpp)->lud_scope == -1) {        (*ludpp)->lud_scope = LDAP_SCOPE_BASE;    }    if ((*ludpp)->lud_host != NULL && *(*ludpp)->lud_host == '\0') {        (*ludpp)->lud_host = NULL;    }    return rc;}static void apr_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 = apr_ldap_pvt_unhex( *s ) << 4;            if ( *++s == '\0' ) {                break;            }            *p++ += apr_ldap_pvt_unhex( *s );        } else {            *p++ = *s;        }    }    *p = '\0';}static int apr_ldap_pvt_unhex(int c){    return( c >= '0' && c <= '9' ? c - '0'        : c >= 'A' && c <= 'F' ? c - 'A' + 10        : c - 'a' + 10 );}/** * Convert a string to a character array */static char **apr_ldap_str2charray(apr_pool_t *pool,                                   const char *str_in,                                   const char *brkstr){    char    **res;    char    *str, *s;    char    *lasts;    int i;    /* protect the input string from strtok */    str = (char *)apr_pstrdup(pool, str_in);    if( str == NULL ) {        return NULL;    }    i = 1;    for ( s = str; *s; s++ ) {        /* Warning: this strchr was previously ldap_utf8_strchr(), check         * whether this particular code has any charset issues.         */        if ( strchr( brkstr, *s ) != NULL ) {            i++;        }    }    res = (char **) apr_pcalloc(pool, (i + 1) * sizeof(char *));    if( res == NULL ) {        return NULL;    }    i = 0;    for ( s = (char *)apr_strtok( str, brkstr, &lasts );          s != NULL;          s = (char *)apr_strtok( NULL, brkstr, &lasts ) ) {        res[i] = (char *)apr_pstrdup(pool, s);        if(res[i] == NULL) {            return NULL;        }        i++;    }    res[i] = NULL;    return( res );}#endif /* APR_HAS_LDAP */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -