]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-meta/config.c
Happy New Year
[openldap] / servers / slapd / back-meta / config.c
index 1768ab799dff337aae6da3e423f8f6d1789f96a0..048a915b8dda1ac9135787f47c0b388cba82ddf5 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1999-2013 The OpenLDAP Foundation.
+ * Copyright 1999-2018 The OpenLDAP Foundation.
  * Portions Copyright 2001-2003 Pierangelo Masarati.
  * Portions Copyright 1999-2003 Howard Chu.
  * All rights reserved.
@@ -35,7 +35,9 @@
 #include "../back-ldap/back-ldap.h"
 #include "back-meta.h"
 
+#ifdef LDAP_DEVEL
 #define SLAP_AUTH_DN   1
+#endif
 
 static ConfigDriver meta_back_cf_gen;
 static ConfigLDAPadd meta_ldadd;
@@ -1790,7 +1792,7 @@ meta_back_cf_gen( ConfigArgs *c )
                case LDAP_BACK_CFG_IDASSERT_AUTHZFROM: {
                        BerVarray *bvp;
 
-                       bvp = &mt->mt_idassert_authz; break;
+                       bvp = &mt->mt_idassert_authz;
                        if ( c->valx < 0 ) {
                                if ( *bvp != NULL ) {
                                        ber_bvarray_free( *bvp );
@@ -1825,13 +1827,63 @@ meta_back_cf_gen( ConfigArgs *c )
 
                case LDAP_BACK_CFG_SUFFIXM:     /* unused */
                case LDAP_BACK_CFG_REWRITE:
-                       if ( mt->mt_rwmap.rwm_bva_rewrite ) {
-                               ber_bvarray_free( mt->mt_rwmap.rwm_bva_rewrite );
-                               mt->mt_rwmap.rwm_bva_rewrite = NULL;
-                       }
-                       if ( mt->mt_rwmap.rwm_rw )
+               {
+                       if ( c->valx >= 0 ) {
+                               int i;
+
+                               for ( i = 0; !BER_BVISNULL( &mt->mt_rwmap.rwm_bva_rewrite[ i ] ); i++ );
+
+                               if ( c->valx >= i ) {
+                                       rc = 1;
+                                       break;
+                               }
+
+                               ber_memfree( mt->mt_rwmap.rwm_bva_rewrite[ c->valx ].bv_val );
+                               for ( i = c->valx; !BER_BVISNULL( &mt->mt_rwmap.rwm_bva_rewrite[ i + 1 ] ); i++ )
+                               {
+                                       mt->mt_rwmap.rwm_bva_rewrite[ i ] = mt->mt_rwmap.rwm_bva_rewrite[ i + 1 ];
+                               }
+                               BER_BVZERO( &mt->mt_rwmap.rwm_bva_rewrite[ i ] );
+
                                rewrite_info_delete( &mt->mt_rwmap.rwm_rw );
-                       break;
+                               assert( mt->mt_rwmap.rwm_rw == NULL );
+
+                               rc = meta_rwi_init( &mt->mt_rwmap.rwm_rw );
+
+                               for ( i = 0; !BER_BVISNULL( &mt->mt_rwmap.rwm_bva_rewrite[ i ] ); i++ )
+                               {
+                                       ConfigArgs ca = { 0 };
+
+                                       ca.line = mt->mt_rwmap.rwm_bva_rewrite[ i ].bv_val;
+                                       init_config_argv( &ca );
+                                       config_parse_ldif( &ca );
+
+                                       if ( !strcasecmp( ca.argv[0], "suffixmassage" )) {
+                                               rc = meta_suffixm_config( &ca, ca.argc, ca.argv, mt );
+                                       } else {
+                                               rc = rewrite_parse( mt->mt_rwmap.rwm_rw,
+                                                                   c->fname, c->lineno, ca.argc, ca.argv );
+                                       }
+
+
+                                       ch_free( ca.tline );
+                                       ch_free( ca.argv );
+
+                                       assert( rc == 0 );
+                               }
+
+                       } else if ( mt->mt_rwmap.rwm_rw != NULL ) {
+                               if ( mt->mt_rwmap.rwm_bva_rewrite ) {
+                                       ber_bvarray_free( mt->mt_rwmap.rwm_bva_rewrite );
+                                       mt->mt_rwmap.rwm_bva_rewrite = NULL;
+                               }
+                               if ( mt->mt_rwmap.rwm_rw )
+                                       rewrite_info_delete( &mt->mt_rwmap.rwm_rw );
+
+                               meta_rwi_init( &mt->mt_rwmap.rwm_rw );
+                       }
+               }
+               break;
 
                case LDAP_BACK_CFG_MAP:
                        if ( mt->mt_rwmap.rwm_bva_map ) {
@@ -2448,7 +2500,7 @@ meta_back_cf_gen( ConfigArgs *c )
                        return 1;
                }
                mc->mc_flags &= ~LDAP_BACK_F_CANCEL_MASK2;
-               mc->mc_flags |= t_f_mode[i].mask;
+               mc->mc_flags |= cancel_mode[i].mask;
                break;
 
        case LDAP_BACK_CFG_TIMEOUT:
@@ -2657,6 +2709,7 @@ idassert-authzFrom        "dn:<rootdn>"
 
                        /* re-parse all rewrite rules, up to the one
                         * that needs to be added */
+                       ca.be = c->be;
                        ca.fname = c->fname;
                        ca.lineno = c->lineno;
                        for ( i = 0; i < ix; i++ ) {