From f83b4345dd8ac334631319bcce83436e9207d834 Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Fri, 13 Feb 2009 01:12:56 +0000 Subject: [PATCH] more about ITS#5940 --- servers/slapd/config.c | 7 +- servers/slapd/config.h | 2 + servers/slapd/overlays/rwm.c | 168 ++++++++++++++++++++++++++++++++--- 3 files changed, 162 insertions(+), 15 deletions(-) diff --git a/servers/slapd/config.c b/servers/slapd/config.c index 16e335e404..f03a11be8e 100644 --- a/servers/slapd/config.c +++ b/servers/slapd/config.c @@ -86,7 +86,6 @@ int slapi_plugins_used = 0; static int fp_getline(FILE *fp, ConfigArgs *c); static void fp_getline_init(ConfigArgs *c); -static int fp_parse_line(ConfigArgs *c); static char *strtok_quote(char *line, char *sep, char **quote_ptr); static char *strtok_quote_ldif(char **line); @@ -716,7 +715,7 @@ read_config_file(const char *fname, int depth, ConfigArgs *cf, ConfigTable *cft) c->argc = 0; ch_free( c->tline ); - if ( fp_parse_line( c ) ) { + if ( config_fp_parse_line( c ) ) { rc = 1; goto done; } @@ -1955,8 +1954,8 @@ fp_getline( FILE *fp, ConfigArgs *c ) return(line[0] ? 1 : 0); } -static int -fp_parse_line(ConfigArgs *c) +int +config_fp_parse_line(ConfigArgs *c) { char *token; static char *const hide[] = { diff --git a/servers/slapd/config.h b/servers/slapd/config.h index ae2faf1033..4dc902dac9 100644 --- a/servers/slapd/config.h +++ b/servers/slapd/config.h @@ -171,6 +171,8 @@ typedef struct config_args_s { #define value_dn values.v_dn.vdn_dn #define value_ndn values.v_dn.vdn_ndn +int config_fp_parse_line(ConfigArgs *c); + int config_register_schema(ConfigTable *ct, ConfigOCs *co); int config_del_vals(ConfigTable *cf, ConfigArgs *c); int config_get_vals(ConfigTable *ct, ConfigArgs *c); diff --git a/servers/slapd/overlays/rwm.c b/servers/slapd/overlays/rwm.c index 8f81e040b5..b07b7e18a4 100644 --- a/servers/slapd/overlays/rwm.c +++ b/servers/slapd/overlays/rwm.c @@ -1950,6 +1950,7 @@ slap_rewrite_unparse( BerVarray in, BerVarray *out ) static int rwm_bva_rewrite_add( struct ldaprwmap *rwmap, + int idx, const char *argv[] ) { char *line; @@ -1963,19 +1964,25 @@ rwm_bva_rewrite_add( AC_MEMCPY( &bv.bv_val[ len ], &bv.bv_val[ len + 1 ], bv.bv_len - ( len + 1 ) ); bv.bv_val[ bv.bv_len - 1 ] = '"'; - ber_bvarray_add( &rwmap->rwm_bva_rewrite, &bv ); + + if ( idx == -1 ) { + ber_bvarray_add( &rwmap->rwm_bva_rewrite, &bv ); + + } else { + rwmap->rwm_bva_rewrite[ idx ] = bv; + } } return 0; } static int -rwm_info_init( struct ldaprwmap *rwmap ) +rwm_info_init( struct rewrite_info ** rwm_rw ) { char *rargv[ 3 ]; - rwmap->rwm_rw = rewrite_info_init( REWRITE_MODE_USE_DEFAULT ); - if ( rwmap->rwm_rw == NULL ) { + *rwm_rw = rewrite_info_init( REWRITE_MODE_USE_DEFAULT ); + if ( *rwm_rw == NULL ) { return -1; } @@ -1984,12 +1991,12 @@ rwm_info_init( struct ldaprwmap *rwmap ) rargv[ 0 ] = "rewriteContext"; rargv[ 1 ] = "searchFilter"; rargv[ 2 ] = NULL; - rewrite_parse( rwmap->rwm_rw, "", 1, 2, rargv ); + rewrite_parse( *rwm_rw, "", 1, 2, rargv ); rargv[ 0 ] = "rewriteContext"; rargv[ 1 ] = "default"; rargv[ 2 ] = NULL; - rewrite_parse( rwmap->rwm_rw, "", 2, 2, rargv ); + rewrite_parse( *rwm_rw, "", 2, 2, rargv ); return 0; } @@ -2061,7 +2068,48 @@ rwm_cf_gen( ConfigArgs *c ) switch ( c->type ) { case RWM_CF_REWRITE: if ( c->valx >= 0 ) { - rc = 1; + ConfigArgs ca = { 0 }; + int i; + + for ( i = 0; !BER_BVISNULL( &rwmap->rwm_bva_rewrite[ i ] ); i++ ) + /* count'em */ ; + + if ( i >= c->valx ) { + rc = 1; + break; + } + + ber_memfree( rwmap->rwm_bva_rewrite[ c->valx ].bv_val ); + for ( i = c->valx; !BER_BVISNULL( &rwmap->rwm_bva_rewrite[ i + 1 ] ); i++ ) + { + rwmap->rwm_bva_rewrite[ i ] = rwmap->rwm_bva_rewrite[ i + 1 ]; + } + BER_BVZERO( &rwmap->rwm_bva_rewrite[ i ] ); + + rewrite_info_delete( &rwmap->rwm_rw ); + assert( rwmap->rwm_rw == NULL ); + + rc = rwm_info_init( &rwmap->rwm_rw ); + + for ( i = 0; !BER_BVISNULL( &rwmap->rwm_bva_rewrite[ i ] ); i++ ) + { + ca.line = rwmap->rwm_bva_rewrite[ i ].bv_val; + ca.argc = 0; + config_fp_parse_line( &ca ); + + if ( strcasecmp( ca.argv[ 0 ], "suffixmassage" ) == 0 ) { + rc = rwm_suffixmassage_config( &db, c->fname, c->lineno, + ca.argc, ca.argv ); + + } else { + rc = rwm_rw_config( &db, c->fname, c->lineno, + ca.argc, ca.argv ); + } + + ch_free( ca.tline ); + + assert( rc == 0 ); + } } else if ( rwmap->rwm_rw != NULL ) { rewrite_info_delete( &rwmap->rwm_rw ); @@ -2070,7 +2118,7 @@ rwm_cf_gen( ConfigArgs *c ) ber_bvarray_free( rwmap->rwm_bva_rewrite ); rwmap->rwm_bva_rewrite = NULL; - rc = rwm_info_init( rwmap ); + rc = rwm_info_init( &rwmap->rwm_rw ); } break; @@ -2116,7 +2164,105 @@ rwm_cf_gen( ConfigArgs *c ) switch ( c->type ) { case RWM_CF_REWRITE: if ( c->valx >= 0 ) { - return 1; + struct rewrite_info *rwm_rw = rwmap->rwm_rw; + ConfigArgs ca = { 0 }; + int i, last; + + for ( last = 0; !BER_BVISNULL( &rwmap->rwm_bva_rewrite[ last ] ); last++ ) + /* count'em */ ; + + if ( c->valx > last ) { + c->valx = last; + } + + rwmap->rwm_rw = NULL; + rc = rwm_info_init( &rwmap->rwm_rw ); + + for ( i = 0; i < c->valx; i++ ) { + ca.line = rwmap->rwm_bva_rewrite[ i ].bv_val; + ca.argc = 0; + config_fp_parse_line( &ca ); + + argv0 = ca.argv[ 0 ]; + ca.argv[ 0 ] += STRLENOF( "rwm-" ); + + if ( strcasecmp( ca.argv[ 0 ], "suffixmassage" ) == 0 ) { + rc = rwm_suffixmassage_config( &db, c->fname, c->lineno, + ca.argc, ca.argv ); + + } else { + rc = rwm_rw_config( &db, c->fname, c->lineno, + ca.argc, ca.argv ); + } + + ca.argv[ 0 ] = argv0; + + ch_free( ca.tline ); + + assert( rc == 0 ); + } + + argv0 = c->argv[ idx0 ]; + if ( strncasecmp( argv0, "rwm-", STRLENOF( "rwm-" ) ) != 0 ) { + return 1; + } + c->argv[ idx0 ] += STRLENOF( "rwm-" ); + if ( strcasecmp( c->argv[ idx0 ], "suffixmassage" ) == 0 ) { + rc = rwm_suffixmassage_config( &db, c->fname, c->lineno, + c->argc - idx0, &c->argv[ idx0 ] ); + + } else { + rc = rwm_rw_config( &db, c->fname, c->lineno, + c->argc - idx0, &c->argv[ idx0 ] ); + } + c->argv[ idx0 ] = argv0; + if ( rc != 0 ) { + rewrite_info_delete( &rwmap->rwm_rw ); + assert( rwmap->rwm_rw == NULL ); + + rwmap->rwm_rw = rwm_rw; + return 1; + } + + for ( i = c->valx; !BER_BVISNULL( &rwmap->rwm_bva_rewrite[ i ] ); i++ ) + { + ca.line = rwmap->rwm_bva_rewrite[ i ].bv_val; + ca.argc = 0; + config_fp_parse_line( &ca ); + + argv0 = ca.argv[ 0 ]; + ca.argv[ 0 ] += STRLENOF( "rwm-" ); + + if ( strcasecmp( ca.argv[ 0 ], "suffixmassage" ) == 0 ) { + rc = rwm_suffixmassage_config( &db, c->fname, c->lineno, + ca.argc, ca.argv ); + + } else { + rc = rwm_rw_config( &db, c->fname, c->lineno, + ca.argc, ca.argv ); + } + + ca.argv[ 0 ] = argv0; + + ch_free( ca.tline ); + + assert( rc == 0 ); + } + + rwmap->rwm_bva_rewrite = ch_realloc( rwmap->rwm_bva_rewrite, + ( last + 2 )*sizeof( struct berval ) ); + + for ( i = last - 1; i >= c->valx; i-- ) + { + rwmap->rwm_bva_rewrite[ i + 1 ] = rwmap->rwm_bva_rewrite[ i ]; + } + + rwm_bva_rewrite_add( rwmap, c->valx, &c->argv[ idx0 ] ); + + rewrite_info_delete( &rwm_rw ); + assert( rwm_rw == NULL ); + + break; } argv0 = c->argv[ idx0 ]; @@ -2137,7 +2283,7 @@ rwm_cf_gen( ConfigArgs *c ) return 1; } else { - rwm_bva_rewrite_add( rwmap, &c->argv[ idx0 ] ); + rwm_bva_rewrite_add( rwmap, -1, &c->argv[ idx0 ] ); } break; @@ -2203,7 +2349,7 @@ rwm_db_init( rwmap = (struct ldaprwmap *)ch_calloc( 1, sizeof( struct ldaprwmap ) ); - rc = rwm_info_init( rwmap ); + rc = rwm_info_init( &rwmap->rwm_rw ); error_return:; on->on_bi.bi_private = (void *)rwmap; -- 2.39.5