]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sock/config.c
ITS#8051 add DN qualifier
[openldap] / servers / slapd / back-sock / config.c
index 2d72f648049f10c73397bd04ddb4cb7395919f7c..00fb06b072f61c10f6a98f29a0fbc9056eb57e8b 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2007-2013 The OpenLDAP Foundation.
+ * Copyright 2007-2018 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -36,11 +36,12 @@ static slap_response sock_over_response;
 enum {
        BS_EXT = 1,
        BS_OPS,
-       BS_RESP
+       BS_RESP,
+       BS_SUFFIX
 };
 
 /* The number of overlay-only config attrs */
-#define NUM_OV_ATTRS   2
+#define NUM_OV_ATTRS   3
 
 static ConfigTable bscfg[] = {
        { "sockops", "ops", 2, 0, 0, ARG_MAGIC|BS_OPS,
@@ -53,6 +54,11 @@ static ConfigTable bscfg[] = {
                        "DESC 'Response types to forward' "
                        "EQUALITY caseIgnoreMatch "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
+       { "socksuffix", "DN", 2, 0, 0, ARG_DN|ARG_QUOTE|ARG_MAGIC|BS_SUFFIX,
+               bs_cf_gen, "( OLcfgDbAt:7.5 NAME 'olcOvSocketSuffix' "
+                       "DESC 'DN suffixes to match' "
+                       "EQUALITY distinguishedNameMatch "
+                       "SYNTAX OMsDN )", NULL, NULL },
 
        { "socketpath", "pathname", 2, 2, 0, ARG_STRING|ARG_OFFSET,
                (void *)offsetof(struct sockinfo, si_sockpath),
@@ -86,7 +92,8 @@ static ConfigOCs osocs[] = {
                "SUP olcOverlayConfig "
                "MUST olcDbSocketPath "
                "MAY ( olcDbSocketExtensions $ "
-                       " olcOvSocketOps $ olcOvSocketResps ) )",
+                       " olcOvSocketOps $ olcOvSocketResps $ "
+                       " olcOvSocketSuffix ) )",
                        Cft_Overlay, bscfg },
        { NULL, 0, NULL }
 };
@@ -150,6 +157,10 @@ bs_cf_gen( ConfigArgs *c )
                        return mask_to_verbs( ov_ops, si->si_ops, &c->rvalue_vals );
                case BS_RESP:
                        return mask_to_verbs( ov_resps, si->si_resps, &c->rvalue_vals );
+               case BS_SUFFIX:
+                       value_add( &c->rvalue_vals, si->si_suffix );
+                       value_add( &c->rvalue_nvals, si->si_nsuffix );
+                       return 0;
                }
        } else if ( c->op == LDAP_MOD_DELETE ) {
                switch( c->type ) {
@@ -186,6 +197,23 @@ bs_cf_gen( ConfigArgs *c )
                                        si->si_resps ^= dels;
                        }
                        return rc;
+               case BS_SUFFIX:
+                       if ( c->valx < 0 ) {
+                               ber_bvarray_free( si->si_suffix );
+                               ber_bvarray_free( si->si_nsuffix );
+                               si->si_suffix = NULL;
+                               si->si_nsuffix = NULL;
+                       } else {
+                               int i = c->valx;
+                               ch_free( si->si_suffix[i].bv_val );
+                               ch_free( si->si_nsuffix[i].bv_val );
+                               do {
+                                       si->si_suffix[i] = si->si_suffix[i+1];
+                                       si->si_nsuffix[i] = si->si_nsuffix[i+1];
+                                       i++;
+                               } while ( !BER_BVISNULL( &si->si_suffix[i] ));
+                       }
+                       return 0;
                }
 
        } else {
@@ -196,6 +224,10 @@ bs_cf_gen( ConfigArgs *c )
                        return verbs_to_mask( c->argc, c->argv, ov_ops, &si->si_ops );
                case BS_RESP:
                        return verbs_to_mask( c->argc, c->argv, ov_resps, &si->si_resps );
+               case BS_SUFFIX:
+                       ber_bvarray_add( &si->si_suffix, &c->value_dn );
+                       ber_bvarray_add( &si->si_nsuffix, &c->value_ndn );
+                       return 0;
                }
        }
        return 1;
@@ -268,6 +300,18 @@ static int sock_over_op(
        if ( !(si->si_ops & sockopflags[which]))
                return SLAP_CB_CONTINUE;
 
+       if ( si->si_nsuffix ) {
+               int i, ok = 0;
+               for ( i=0; !BER_BVISNULL( &si->si_nsuffix[i] ); i++ ) {
+                       if ( dnIsSuffix( &op->o_req_ndn, &si->si_nsuffix[i] )) {
+                               ok = 1;
+                               break;
+                       }
+               }
+               if ( !ok )
+                       return SLAP_CB_CONTINUE;
+       }
+
        op->o_bd->be_private = si;
        sc = op->o_callback;
        op->o_callback = NULL;
@@ -357,12 +401,14 @@ sock_over_db_init(
 {
        slap_overinst   *on = (slap_overinst *)be->bd_info;
        void *private = be->be_private;
+       void *cf_ocs = be->be_cf_ocs;
        int rc;
 
        be->be_private = NULL;
        rc = sock_back_db_init( be, cr );
        on->on_bi.bi_private = be->be_private;
        be->be_private = private;
+       be->be_cf_ocs = cf_ocs;
        return rc;
 }