ldap_ld_free(ld, 1, NULL, NULL);
return rc;
}
+ if ( ldap_url_check_ext( ld->ld_options.ldo_defludp )) {
+ rc = LDAP_NOT_SUPPORTED;
+ ld->ld_errno = rc;
+ ldap_ld_free(ld, 1, NULL, NULL);
+ return rc;
+ }
+
#ifdef LDAP_CONNECTIONLESS
if (ldap_is_ldapc_url(url))
LDAP_IS_UDP(ld) = 1;
ldap_ld_free(ld, 1, NULL, NULL);
return rc;
}
+ if ( ldap_url_check_ext( ld->ld_options.ldo_defludp )) {
+ rc = LDAP_NOT_SUPPORTED;
+ ld->ld_errno = rc;
+ ldap_ld_free(ld, 1, NULL, NULL);
+ return rc;
+ }
}
LDAP_MUTEX_LOCK( &ld->ld_conn_mutex );
goto done;
}
- if( srv->lud_crit_exts ) {
- int ok = 0;
-#ifdef HAVE_TLS
- /* If StartTLS is the only critical ext, OK. */
- if ( find_tls_ext( srv ) == 2 && srv->lud_crit_exts == 1 )
- ok = 1;
-#endif
- if ( !ok ) {
- /* we do not support any other extensions */
- ld->ld_errno = LDAP_NOT_SUPPORTED;
- rc = -1;
- goto done;
- }
+ /* check for unrecognized critical extensions */
+ if( srv->lud_crit_exts &&
+ ( rc = ldap_url_check_ext( srv ))) {
+ ld->ld_errno = LDAP_NOT_SUPPORTED;
+ rc = -1;
+ goto done;
}
/* check connection for re-bind in progress */
return ldap_url_parse_ext( url_in, ludpp, LDAP_PVT_URL_PARSE_HISTORIC );
}
+typedef struct lurl_critext {
+ struct berval oid;
+ struct berval names[2];
+} lurl_critext;
+
+lurl_critext lurl_extensions[] = {
+#ifdef HAVE_TLS
+ {BER_BVC(LDAP_EXOP_START_TLS), {BER_BVC("StartTLS"), BER_BVC("X-StartTLS")}},
+#endif
+ {0, NULL}
+};
+
+/* return error if there are any unrecognized critical URL extensions */
+int
+ldap_url_check_ext( LDAPURLDesc *ludp )
+{
+ int i, j;
+
+ for (; ludp; ludp=ludp->lud_next ) {
+ if ( !ludp->lud_crit_exts )
+ continue;
+
+ for ( i=0; ludp->lud_exts[i]; i++ )
+ {
+ char *eq, *ext;
+ int ok = 0, n;
+
+ ext = ludp->lud_exts[i];
+ if ( ext[0] != '!' ) /* don't care about non-critical */
+ continue;
+ ext++;
+
+ eq = strchr( ext, '=' );
+ if ( eq )
+ n = eq - ext;
+ else
+ n = strlen( ext );
+
+ for ( j=0; lurl_extensions[j].oid.bv_len; j++ ) {
+ if (( n == lurl_extensions[j].oid.bv_len &&
+ !strncmp( ext, lurl_extensions[j].oid.bv_val, n )) ||
+ ( n == lurl_extensions[j].names[0].bv_len &&
+ !strncasecmp( ext, lurl_extensions[j].names[0].bv_val, n )) ||
+ ( n == lurl_extensions[j].names[1].bv_len &&
+ !strncasecmp( ext, lurl_extensions[j].names[1].bv_val, n ))) {
+ ok = 1;
+ break;
+ }
+ }
+ if ( !ok )
+ return LDAP_URL_ERR_BADEXTS;
+ }
+ }
+ return LDAP_URL_SUCCESS;
+}
+
LDAPURLDesc *
ldap_url_dup ( LDAPURLDesc *ludp )
{