]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/controls.c
add logs; fix bug in group/dn selection logic
[openldap] / servers / slapd / controls.c
index 1900312250e856026279a1b2e7cc95c3ee3255e9..8840f35ad185d6766ac4c27ac76f91cd3dc0af9a 100644 (file)
@@ -35,6 +35,8 @@ static SLAP_CTRL_PARSE_FN parsePagedResults;
 static SLAP_CTRL_PARSE_FN parseValuesReturnFilter;
 static SLAP_CTRL_PARSE_FN parsePermissiveModify;
 static SLAP_CTRL_PARSE_FN parseDomainScope;
+static SLAP_CTRL_PARSE_FN parseTreeDelete;
+static SLAP_CTRL_PARSE_FN parseSearchOptions;
 
 #ifdef LDAP_CONTROL_SUBENTRIES
 static SLAP_CTRL_PARSE_FN parseSubentries;
@@ -102,13 +104,23 @@ static struct slap_control control_defs[] = {
                SLAP_CTRL_MODIFY, NULL,
                parsePermissiveModify, LDAP_SLIST_ENTRY_INITIALIZER(next) },
 #endif
+#ifdef LDAP_CONTROL_X_TREE_DELETE
+       { LDAP_CONTROL_X_TREE_DELETE,
+               SLAP_CTRL_DELETE, NULL,
+               parseTreeDelete, LDAP_SLIST_ENTRY_INITIALIZER(next) },
+#endif
+#ifdef LDAP_CONTORL_X_SEARCH_OPTIONS
+       { LDAP_CONTORL_X_SEARCH_OPTIONS,
+               SLAP_CTRL_FRONTEND|SLAP_CTRL_SEARCH, NULL,
+               parseSearchOptions, LDAP_SLIST_ENTRY_INITIALIZER(next) },
+#endif
 #ifdef LDAP_CONTROL_SUBENTRIES
        { LDAP_CONTROL_SUBENTRIES,
                SLAP_CTRL_SEARCH, NULL,
                parseSubentries, LDAP_SLIST_ENTRY_INITIALIZER(next) },
 #endif
        { LDAP_CONTROL_NOOP,
-               SLAP_CTRL_ACCESS, NULL,
+               SLAP_CTRL_HIDE|SLAP_CTRL_ACCESS, NULL,
                parseNoOp, LDAP_SLIST_ENTRY_INITIALIZER(next) },
        { LDAP_CONTROL_SYNC,
                SLAP_CTRL_HIDE|SLAP_CTRL_SEARCH, NULL,
@@ -702,7 +714,7 @@ static int parseProxyAuthz (
        LDAPControl *ctrl )
 {
        int             rc;
-       struct berval   dn = { 0, NULL };
+       struct berval   dn = BER_BVNULL;
 
        if ( op->o_proxy_authz != SLAP_NO_CONTROL ) {
                rs->sr_text = "proxy authorization control specified multiple times";
@@ -750,8 +762,7 @@ static int parseProxyAuthz (
                return LDAP_SUCCESS;
        }
 
-       rc = slap_sasl_getdn( op->o_conn, op,
-                       ctrl->ldctl_value.bv_val, ctrl->ldctl_value.bv_len,
+       rc = slap_sasl_getdn( op->o_conn, op, &ctrl->ldctl_value,
                        NULL, &dn, SLAP_GETDN_AUTHZID );
 
        if( rc != LDAP_SUCCESS || !dn.bv_len ) {
@@ -828,7 +839,7 @@ static int parsePagedResults (
        ber_tag_t tag;
        ber_int_t size;
        BerElement *ber;
-       struct berval cookie = { 0, NULL };
+       struct berval cookie = BER_BVNULL;
 
        if ( op->o_pagedresults != SLAP_NO_CONTROL ) {
                rs->sr_text = "paged results control specified multiple times";
@@ -877,19 +888,20 @@ static int parsePagedResults (
 
                AC_MEMCPY( &reqcookie, cookie.bv_val, sizeof( reqcookie ));
 
-               if( reqcookie > op->o_pagedresults_state.ps_cookie ) {
+               if ( reqcookie > op->o_pagedresults_state.ps_cookie ) {
                        /* bad cookie */
                        rs->sr_text = "paged results cookie is invalid";
                        return LDAP_PROTOCOL_ERROR;
 
-               } else if( reqcookie < op->o_pagedresults_state.ps_cookie ) {
+               } else if ( reqcookie < op->o_pagedresults_state.ps_cookie ) {
                        rs->sr_text = "paged results cookie is invalid or old";
                        return LDAP_UNWILLING_TO_PERFORM;
                }
+
        } else {
                /* Initial request.  Initialize state. */
                op->o_pagedresults_state.ps_cookie = 0;
-               op->o_pagedresults_state.ps_id = NOID;
+               op->o_pagedresults_state.ps_count = 0;
        }
 
        op->o_pagedresults_size = size;
@@ -907,7 +919,7 @@ static int parseAssert (
        LDAPControl *ctrl )
 {
        BerElement      *ber;
-       struct berval   fstr = { 0, NULL };
+       struct berval   fstr = BER_BVNULL;
        const char *err_msg = "";
 
        if ( op->o_assert != SLAP_NO_CONTROL ) {
@@ -1082,7 +1094,7 @@ int parseValuesReturnFilter (
        LDAPControl *ctrl )
 {
        BerElement      *ber;
-       struct berval   fstr = { 0, NULL };
+       struct berval   fstr = BER_BVNULL;
        const char *err_msg = "";
 
        if ( op->o_valuesreturnfilter != SLAP_NO_CONTROL ) {
@@ -1215,6 +1227,78 @@ static int parseDomainScope (
 }
 #endif
 
+#ifdef LDAP_CONTROL_X_TREE_DELETE
+static int parseTreeDelete (
+       Operation *op,
+       SlapReply *rs,
+       LDAPControl *ctrl )
+{
+       if ( op->o_tree_delete != SLAP_NO_CONTROL ) {
+               rs->sr_text = "treeDelete control specified multiple times";
+               return LDAP_PROTOCOL_ERROR;
+       }
+
+       if ( ctrl->ldctl_value.bv_len ) {
+               rs->sr_text = "treeDelete control value not empty";
+               return LDAP_PROTOCOL_ERROR;
+       }
+
+       op->o_tree_delete = ctrl->ldctl_iscritical
+               ? SLAP_CRITICAL_CONTROL
+               : SLAP_NONCRITICAL_CONTROL;
+
+       return LDAP_SUCCESS;
+}
+#endif
+
+#ifdef LDAP_CONTORL_X_SEARCH_OPTIONS
+static int parseSearchOptions (
+       Operation *op,
+       SlapReply *rs,
+       LDAPControl *ctrl )
+{
+       BerElement *ber;
+       ber_int_t search_flags;
+
+       if ( ctrl->ldctl_value.bv_len == 0 ) {
+               rs->sr_text = "searchOptions control value not empty";
+               return LDAP_PROTOCOL_ERROR;
+       }
+
+       ber = ber_init( &ctrl->ldctl_value );
+       if( ber == NULL ) {
+               rs->sr_text = "internal error";
+               return LDAP_OTHER;
+       }
+
+       if ( (tag = ber_scanf( ber, "{i}", &search_flags )) == LBER_ERROR ) {
+               rs->sr_text = "searchOptions control decoding error";
+               return LDAP_PROTOCOL_ERROR;
+       }
+
+       (void) ber_free( ber, 1 );
+
+       if ( search_flags & LDAP_SEARCH_FLAG_DOMAIN_SCOPE ) {
+               if ( op->o_domain_scope != SLAP_NO_CONTROL ) {
+                       rs->sr_text = "searchOptions control specified multiple times or with domainScope control";
+                       return LDAP_PROTOCOL_ERROR;
+               }
+
+               op->o_domain_scope = ctrl->ldctl_iscritical
+                       ? SLAP_CRITICAL_CONTROL
+                       : SLAP_NONCRITICAL_CONTROL;
+       }
+
+       if ( search_flags & ~(LDAP_SEARCH_FLAG_DOMAIN_SCOPE) ) {
+               /* Other search flags not recognised so far */
+               rs->sr_text = "searchOptions contained invalid flag";
+               return LDAP_UNAVAILABLE_CRITICAL_EXTENSION;
+       }
+
+       return LDAP_SUCCESS;
+}
+#endif
+
 static int parseLDAPsync (
        Operation *op,
        SlapReply *rs,