]> git.sur5r.net Git - openldap/commitdiff
Check for critical client controls.
authorKurt Zeilenga <kurt@openldap.org>
Fri, 6 Jul 2001 03:13:42 +0000 (03:13 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Fri, 6 Jul 2001 03:13:42 +0000 (03:13 +0000)
libraries/libldap/abandon.c
libraries/libldap/add.c
libraries/libldap/compare.c
libraries/libldap/controls.c
libraries/libldap/delete.c
libraries/libldap/ldap-int.h
libraries/libldap/modify.c
libraries/libldap/modrdn.c
libraries/libldap/sasl.c
libraries/libldap/search.c
libraries/libldap/unbind.c

index fbb184722a5357553da576b82ea5873972c6a6ca..8220e47a99672fe6accb95c81a7cfc3e57717545 100644 (file)
@@ -56,8 +56,13 @@ ldap_abandon_ext(
        LDAPControl **sctrls,
        LDAPControl **cctrls )
 {
+       int rc;
        Debug( LDAP_DEBUG_TRACE, "ldap_abandon_ext %d\n", msgid, 0, 0 );
 
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
        return do_abandon( ld, msgid, msgid, sctrls, cctrls );
 }
 
@@ -77,7 +82,7 @@ int
 ldap_abandon( LDAP *ld, int msgid )
 {
        Debug( LDAP_DEBUG_TRACE, "ldap_abandon %d\n", msgid, 0, 0 );
-       return do_abandon( ld, msgid, msgid, NULL, NULL ) == LDAP_SUCCESS
+       return ldap_abandon_ext( ld, msgid, NULL, NULL ) == LDAP_SUCCESS
                ? 0 : -1;
 }
 
index 5ae74605276966a7786d2d4eb8e1d388b73a0afc..a8281f4c0eb6fb5a8cb059850c533187ae9b26d7 100644 (file)
@@ -105,6 +105,10 @@ ldap_add_ext(
        assert( dn != NULL );
        assert( msgidp != NULL );
 
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
        /* create a message to send */
        if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
                ld->ld_errno = LDAP_NO_MEMORY;
index a48dda120f335884d2fe9494fac39122e6656991..2b890b1fe9d7af4f47646f54b9bb5f93b162121c 100644 (file)
@@ -51,6 +51,7 @@ ldap_compare_ext(
        LDAPControl **cctrls,
        int     *msgidp )
 {
+       int rc;
        BerElement      *ber;
 
        Debug( LDAP_DEBUG_TRACE, "ldap_compare\n", 0, 0, 0 );
@@ -61,6 +62,10 @@ ldap_compare_ext(
        assert( attr != NULL );
        assert( msgidp != NULL );
 
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
        /* create a message to send */
        if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
                return( LDAP_NO_MEMORY );
index 58ca93e81a39720707543ae07a6c757f65449c98..6dcf7364ecbc63d34f64d9e463107875f4a7e150 100644 (file)
@@ -441,3 +441,34 @@ ldap_create_control(
        *ctrlp = ctrl;
        return LDAP_SUCCESS;
 }
+
+/*
+ * check for critical client controls and bitch if present
+ * if we ever support critical controls, we'll have to
+ * find a means for maintaining per API call control
+ * information.
+ */
+int ldap_int_client_controls( LDAP *ld, LDAPControl **ctrls )
+{
+       LDAPControl *const *c;
+
+       assert( ld != NULL );
+
+       if( ctrls == NULL ) {
+               /* use default server controls */
+               ctrls = ld->ld_cctrls;
+       }
+
+       if( ctrls == NULL || *ctrls == NULL ) {
+               return LDAP_SUCCESS;
+       }
+
+       for( c = ctrls ; *c != NULL; c++ ) {
+               if( (*c)->ldctl_iscritical ) {
+                       ld->ld_errno = LDAP_NOT_SUPPORTED;
+                       return ld->ld_errno;
+               }
+       }
+
+       return LDAP_SUCCESS;
+}
index 714acc5a5a2e966fbe2ac6c914178c354d3bee1b..8397b735cc393b07f7090a3527c5f48f2f837902 100644 (file)
@@ -45,6 +45,7 @@ ldap_delete_ext(
        LDAPControl **cctrls,
        int *msgidp )
 {
+       int rc;
        BerElement      *ber;
 
        Debug( LDAP_DEBUG_TRACE, "ldap_delete\n", 0, 0, 0 );
@@ -54,6 +55,10 @@ ldap_delete_ext(
        assert( dn != NULL );
        assert( msgidp != NULL );
 
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
        /* create a message to send */
        if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
                ld->ld_errno = LDAP_NO_MEMORY;
index dc4e2b8dda45b20362039e682efe6148b2d26235..a90b72e31bd99f2957b1eb65488e0d689fd923fe 100644 (file)
@@ -367,6 +367,9 @@ LDAP_F (int) ldap_int_put_controls LDAP_P((
        LDAPControl *const *ctrls,
        BerElement *ber ));
 
+LDAP_F (int) ldap_int_client_controls LDAP_P((
+       LDAP *ld,
+       LDAPControl **ctrlp ));
 
 /*
  * in dsparse.c
index da8b0e602795b5eb3a4cc54dc1698bde04759e62..8ef0098c70b8b6d09bd892816e64a831cabc722c 100644 (file)
@@ -73,6 +73,10 @@ ldap_modify_ext( LDAP *ld,
 
        Debug( LDAP_DEBUG_TRACE, "ldap_modify_ext\n", 0, 0, 0 );
 
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
        /* create a message to send */
        if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
                return( LDAP_NO_MEMORY );
index 13678ef0411c7e825636475fef631b49c50a8442..54a3303a9f01ed1a67c211e4ebe8eaa2c62209c7 100644 (file)
@@ -70,6 +70,10 @@ ldap_rename(
 
        Debug( LDAP_DEBUG_TRACE, "ldap_rename\n", 0, 0, 0 );
 
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
        /* create a message to send */
        if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
                return( LDAP_NO_MEMORY );
index 12cb3816638676ba485978f53ffef7c5731fa1a6..8945d957331159d1a61b272e67128582f27ca23b 100644 (file)
@@ -67,6 +67,10 @@ ldap_sasl_bind(
        assert( LDAP_VALID( ld ) );
        assert( msgidp != NULL );
 
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
        if( msgidp == NULL ) {
                ld->ld_errno = LDAP_PARAM_ERROR;
                return ld->ld_errno;
index 2d2071030261cf7545a8e2f6dfd624717a169639..5adb5b8ed2d7aa976264eb91664b6c5df1d1f745 100644 (file)
@@ -91,6 +91,7 @@ ldap_search_ext(
        int sizelimit,
        int *msgidp )
 {
+       int rc;
        BerElement      *ber;
        int timelimit;
 
@@ -99,6 +100,10 @@ ldap_search_ext(
        assert( ld != NULL );
        assert( LDAP_VALID( ld ) );
 
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
        /*
         * if timeout is provided, both tv_sec and tv_usec must
         * be non-zero
index 24312af2382a6e953d84ba0a6b1933d7ff645b5c..0d5f3fe46ac3204488e8d7443cc2514fbb3e6a83 100644 (file)
@@ -34,6 +34,12 @@ ldap_unbind_ext(
        LDAPControl **sctrls,
        LDAPControl **cctrls )
 {
+       int rc;
+
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
        return ldap_ld_free( ld, 1, sctrls, cctrls );
 }