]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/controls.c
ACIs almost entirely factored out of slapd
[openldap] / servers / slapd / controls.c
index 81ae77143ae0e6d897799df1b6137e71480c96dd..3bfbdf179e22a8fb4fc3fda508cff74ddb34bf84 100644 (file)
@@ -32,9 +32,6 @@ static SLAP_CTRL_PARSE_FN parseProxyAuthz;
 static SLAP_CTRL_PARSE_FN parseManageDIT;
 #endif
 static SLAP_CTRL_PARSE_FN parseManageDSAit;
-#ifdef LDAP_CONTROL_MODIFY_INCREMENT
-static SLAP_CTRL_PARSE_FN parseModifyIncrement;
-#endif
 static SLAP_CTRL_PARSE_FN parseNoOp;
 static SLAP_CTRL_PARSE_FN parsePagedResults;
 #ifdef LDAP_DEVEL
@@ -104,15 +101,15 @@ static char *proxy_authz_extops[] = {
 static struct slap_control control_defs[] = {
        {  LDAP_CONTROL_ASSERT,
                (int)offsetof(struct slap_control_ids, sc_assert),
-               SLAP_CTRL_HIDE|SLAP_CTRL_ACCESS, NULL,
+               SLAP_CTRL_ACCESS, NULL,
                parseAssert, LDAP_SLIST_ENTRY_INITIALIZER(next) },
        { LDAP_CONTROL_PRE_READ,
                (int)offsetof(struct slap_control_ids, sc_preRead),
-               SLAP_CTRL_HIDE|SLAP_CTRL_DELETE|SLAP_CTRL_MODIFY|SLAP_CTRL_RENAME, NULL,
+               SLAP_CTRL_DELETE|SLAP_CTRL_MODIFY|SLAP_CTRL_RENAME, NULL,
                parsePreRead, LDAP_SLIST_ENTRY_INITIALIZER(next) },
        { LDAP_CONTROL_POST_READ,
                (int)offsetof(struct slap_control_ids, sc_postRead),
-               SLAP_CTRL_HIDE|SLAP_CTRL_ADD|SLAP_CTRL_MODIFY|SLAP_CTRL_RENAME, NULL,
+               SLAP_CTRL_ADD|SLAP_CTRL_MODIFY|SLAP_CTRL_RENAME, NULL,
                parsePostRead, LDAP_SLIST_ENTRY_INITIALIZER(next) },
        { LDAP_CONTROL_VALUESRETURNFILTER,
                (int)offsetof(struct slap_control_ids, sc_valuesReturnFilter),
@@ -162,12 +159,6 @@ static struct slap_control control_defs[] = {
                (int)offsetof(struct slap_control_ids, sc_noOp),
                SLAP_CTRL_HIDE|SLAP_CTRL_ACCESS, NULL,
                parseNoOp, LDAP_SLIST_ENTRY_INITIALIZER(next) },
-#ifdef LDAP_CONTROL_MODIFY_INCREMENT
-       { LDAP_CONTROL_MODIFY_INCREMENT,
-               (int)offsetof(struct slap_control_ids, sc_modifyIncrement),
-               SLAP_CTRL_HIDE|SLAP_CTRL_MODIFY, NULL,
-               parseModifyIncrement, LDAP_SLIST_ENTRY_INITIALIZER(next) },
-#endif
 #ifdef LDAP_DEVEL
        { LDAP_CONTROL_MANAGEDIT,
                (int)offsetof(struct slap_control_ids, sc_manageDIT),
@@ -441,6 +432,95 @@ void slap_free_ctrls(
        op->o_tmpfree( ctrls, op->o_tmpmemctx );
 }
 
+int slap_parse_ctrl(
+       Operation *op,
+       SlapReply *rs,
+       LDAPControl *control,
+       const char **text )
+{
+       struct slap_control *sc;
+
+       sc = find_ctrl( control->ldctl_oid );
+       if( sc != NULL ) {
+               /* recognized control */
+               slap_mask_t tagmask;
+               switch( op->o_tag ) {
+               case LDAP_REQ_ADD:
+                       tagmask = SLAP_CTRL_ADD;
+                       break;
+               case LDAP_REQ_BIND:
+                       tagmask = SLAP_CTRL_BIND;
+                       break;
+               case LDAP_REQ_COMPARE:
+                       tagmask = SLAP_CTRL_COMPARE;
+                       break;
+               case LDAP_REQ_DELETE:
+                       tagmask = SLAP_CTRL_DELETE;
+                       break;
+               case LDAP_REQ_MODIFY:
+                       tagmask = SLAP_CTRL_MODIFY;
+                       break;
+               case LDAP_REQ_RENAME:
+                       tagmask = SLAP_CTRL_RENAME;
+                       break;
+               case LDAP_REQ_SEARCH:
+                       tagmask = SLAP_CTRL_SEARCH;
+                       break;
+               case LDAP_REQ_UNBIND:
+                       tagmask = SLAP_CTRL_UNBIND;
+                       break;
+               case LDAP_REQ_ABANDON:
+                       tagmask = SLAP_CTRL_ABANDON;
+                       break;
+               case LDAP_REQ_EXTENDED:
+                       tagmask=~0L;
+                       assert( op->ore_reqoid.bv_val != NULL );
+                       if( sc->sc_extendedops != NULL ) {
+                               int i;
+                               for( i=0; sc->sc_extendedops[i] != NULL; i++ ) {
+                                       if( strcmp( op->ore_reqoid.bv_val,
+                                               sc->sc_extendedops[i] ) == 0 )
+                                       {
+                                               tagmask=0L;
+                                               break;
+                                       }
+                               }
+                       }
+                       break;
+               default:
+                       *text = "controls internal error";
+                       return LDAP_OTHER;
+               }
+
+               if (( sc->sc_mask & tagmask ) == tagmask ) {
+                       /* available extension */
+                       int     rc;
+
+                       if( !sc->sc_parse ) {
+                               *text = "not yet implemented";
+                               return LDAP_OTHER;
+                       }
+
+                       rc = sc->sc_parse( op, rs, control );
+                       if ( rc ) {
+                               assert( rc != LDAP_UNAVAILABLE_CRITICAL_EXTENSION );
+                               return rc;
+                       }
+
+               } else if( control->ldctl_iscritical ) {
+                       /* unavailable CRITICAL control */
+                       *text = "critical extension is unavailable";
+                       return LDAP_UNAVAILABLE_CRITICAL_EXTENSION;
+               }
+       } else if( control->ldctl_iscritical ) {
+               /* unrecognized CRITICAL control */
+               *text = "critical extension is not recognized";
+               return LDAP_UNAVAILABLE_CRITICAL_EXTENSION;
+       }
+
+       return LDAP_SUCCESS;
+}
+
 int get_ctrls(
        Operation *op,
        SlapReply *rs,
@@ -451,7 +531,6 @@ int get_ctrls(
        ber_len_t len;
        char *opaque;
        BerElement *ber = op->o_ber;
-       struct slap_control *sc;
        struct berval bv;
 
        len = ber_pvt_ber_remaining(ber);
@@ -591,87 +670,8 @@ int get_ctrls(
                        "=> get_ctrls: oid=\"%s\" (%scritical)\n",
                        c->ldctl_oid, c->ldctl_iscritical ? "" : "non", 0 );
 
-               sc = find_ctrl( c->ldctl_oid );
-               if( sc != NULL ) {
-                       /* recognized control */
-                       slap_mask_t tagmask;
-                       switch( op->o_tag ) {
-                       case LDAP_REQ_ADD:
-                               tagmask = SLAP_CTRL_ADD;
-                               break;
-                       case LDAP_REQ_BIND:
-                               tagmask = SLAP_CTRL_BIND;
-                               break;
-                       case LDAP_REQ_COMPARE:
-                               tagmask = SLAP_CTRL_COMPARE;
-                               break;
-                       case LDAP_REQ_DELETE:
-                               tagmask = SLAP_CTRL_DELETE;
-                               break;
-                       case LDAP_REQ_MODIFY:
-                               tagmask = SLAP_CTRL_MODIFY;
-                               break;
-                       case LDAP_REQ_RENAME:
-                               tagmask = SLAP_CTRL_RENAME;
-                               break;
-                       case LDAP_REQ_SEARCH:
-                               tagmask = SLAP_CTRL_SEARCH;
-                               break;
-                       case LDAP_REQ_UNBIND:
-                               tagmask = SLAP_CTRL_UNBIND;
-                               break;
-                       case LDAP_REQ_ABANDON:
-                               tagmask = SLAP_CTRL_ABANDON;
-                               break;
-                       case LDAP_REQ_EXTENDED:
-                               tagmask=~0L;
-                               assert( op->ore_reqoid.bv_val != NULL );
-                               if( sc->sc_extendedops != NULL ) {
-                                       int i;
-                                       for( i=0; sc->sc_extendedops[i] != NULL; i++ ) {
-                                               if( strcmp( op->ore_reqoid.bv_val,
-                                                       sc->sc_extendedops[i] ) == 0 )
-                                               {
-                                                       tagmask=0L;
-                                                       break;
-                                               }
-                                       }
-                               }
-                               break;
-                       default:
-                               rs->sr_err = LDAP_OTHER;
-                               rs->sr_text = "controls internal error";
-                               goto return_results;
-                       }
-
-                       if (( sc->sc_mask & tagmask ) == tagmask ) {
-                               /* available extension */
-                               int     rc;
-
-                               if( !sc->sc_parse ) {
-                                       rs->sr_err = LDAP_OTHER;
-                                       rs->sr_text = "not yet implemented";
-                                       goto return_results;
-                               }
-
-                               rc = sc->sc_parse( op, rs, c );
-                               if ( rc ) {
-                                       assert( rc != LDAP_UNAVAILABLE_CRITICAL_EXTENSION );
-                                       rs->sr_err = rc;
-                                       goto return_results;
-                               }
-
-                       } else if( c->ldctl_iscritical ) {
-                               /* unavailable CRITICAL control */
-                               rs->sr_err = LDAP_UNAVAILABLE_CRITICAL_EXTENSION;
-                               rs->sr_text = "critical extension is unavailable";
-                               goto return_results;
-                       }
-
-               } else if( c->ldctl_iscritical ) {
-                       /* unrecognized CRITICAL control */
-                       rs->sr_err = LDAP_UNAVAILABLE_CRITICAL_EXTENSION;
-                       rs->sr_text = "critical extension is not recognized";
+               rs->sr_err = slap_parse_ctrl( op, rs, c, &rs->sr_text );
+               if ( rs->sr_err != LDAP_SUCCESS ) {
                        goto return_results;
                }
        }
@@ -694,34 +694,6 @@ return_results:
        return rs->sr_err;
 }
 
-#ifdef LDAP_CONTROL_MODIFY_INCREMENT
-static int parseModifyIncrement (
-       Operation *op,
-       SlapReply *rs,
-       LDAPControl *ctrl )
-{
-#if 0
-       if ( op->o_modifyIncrement != SLAP_CONTROL_NONE ) {
-               rs->sr_text = "modifyIncrement control specified multiple times";
-               return LDAP_PROTOCOL_ERROR;
-       }
-#endif
-
-       if ( ctrl->ldctl_value.bv_len ) {
-               rs->sr_text = "modifyIncrement control value not empty";
-               return LDAP_PROTOCOL_ERROR;
-       }
-
-#if 0
-       op->o_modifyIncrement = ctrl->ldctl_iscritical
-               ? SLAP_CONTROL_CRITICAL
-               : SLAP_CONTROL_NONCRITICAL;
-#endif
-
-       return LDAP_SUCCESS;
-}
-#endif
-
 #ifdef LDAP_DEVEL
 static int parseManageDIT (
        Operation *op,