X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-ldap%2Fconfig.c;h=fdba1d3cf62be951f32690f9151dc4394ddb112c;hb=26d6e699aac1f2adc77f2aad3e299b5475941dfc;hp=ca7c01df92fa44ce68e3d39e1e533779db26e60e;hpb=6018fe9671dcbb90e3845bc14851858c5d9fdf2a;p=openldap diff --git a/servers/slapd/back-ldap/config.c b/servers/slapd/back-ldap/config.c index ca7c01df92..fdba1d3cf6 100644 --- a/servers/slapd/back-ldap/config.c +++ b/servers/slapd/back-ldap/config.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2003-2011 The OpenLDAP Foundation. + * Copyright 2003-2013 The OpenLDAP Foundation. * Portions Copyright 1999-2003 Howard Chu. * Portions Copyright 2000-2003 Pierangelo Masarati. * All rights reserved. @@ -71,6 +71,7 @@ enum { LDAP_BACK_CFG_ST_REQUEST, LDAP_BACK_CFG_NOREFS, LDAP_BACK_CFG_NOUNDEFFILTER, + LDAP_BACK_CFG_ONERR, LDAP_BACK_CFG_REWRITE, @@ -325,6 +326,14 @@ static ConfigTable ldapcfg[] = { "SYNTAX OMsBoolean " "SINGLE-VALUE )", NULL, NULL }, + { "onerr", "CONTINUE|report|stop", 2, 2, 0, + ARG_MAGIC|LDAP_BACK_CFG_ONERR, + ldap_back_cf_gen, "( OLcfgDbAt:3.108 " + "NAME 'olcDbOnErr' " + "DESC 'error handling' " + "SYNTAX OMsDirectoryString " + "SINGLE-VALUE )", + NULL, NULL }, { "idassert-passThru", "authzRule", 2, 2, 0, ARG_MAGIC|LDAP_BACK_CFG_IDASSERT_PASSTHRU, ldap_back_cf_gen, "( OLcfgDbAt:3.27 " @@ -383,6 +392,7 @@ static ConfigOCs ldapocs[] = { #endif /* SLAP_CONTROL_X_SESSION_TRACKING */ "$ olcDbNoRefs " "$ olcDbNoUndefFilter " + "$ olcDbOnErr " ") )", Cft_Database, ldapcfg}, { NULL, 0, NULL } @@ -472,6 +482,13 @@ static slap_verbmasks cancel_mode[] = { { BER_BVNULL, 0 } }; +static slap_verbmasks onerr_mode[] = { + { BER_BVC( "stop" ), LDAP_BACK_F_ONERR_STOP }, + { BER_BVC( "report" ), LDAP_BACK_F_ONERR_STOP }, /* same behavior */ + { BER_BVC( "continue" ), LDAP_BACK_F_NONE }, + { BER_BVNULL, 0 } +}; + /* see enum in slap.h */ static slap_cf_aux_table timeout_table[] = { { BER_BVC("bind="), SLAP_OP_BIND * sizeof( time_t ), 'u', 0, NULL }, @@ -640,7 +657,7 @@ slap_retry_info_destroy( ri->ri_num = NULL; } -static int +int slap_idassert_authzfrom_parse( ConfigArgs *c, slap_idassert_t *si ) { struct berval bv; @@ -759,7 +776,7 @@ slap_idassert_passthru_parse( ConfigArgs *c, slap_idassert_t *si ) return 0; } -static int +int slap_idassert_parse( ConfigArgs *c, slap_idassert_t *si ) { int i; @@ -931,22 +948,6 @@ slap_idassert_parse( ConfigArgs *c, slap_idassert_t *si ) } /* NOTE: temporary, until back-meta is ported to back-config */ -int -slap_idassert_authzfrom_parse_cf( const char *fname, int lineno, const char *arg, slap_idassert_t *si ) -{ - ConfigArgs c = { 0 }; - char *argv[ 3 ]; - - snprintf( c.log, sizeof( c.log ), "%s: line %d", fname, lineno ); - c.argc = 2; - c.argv = argv; - argv[ 0 ] = "idassert-authzFrom"; - argv[ 1 ] = (char *)arg; - argv[ 2 ] = NULL; - - return slap_idassert_authzfrom_parse( &c, si ); -} - int slap_idassert_passthru_parse_cf( const char *fname, int lineno, const char *arg, slap_idassert_t *si ) { @@ -963,18 +964,6 @@ slap_idassert_passthru_parse_cf( const char *fname, int lineno, const char *arg, return slap_idassert_passthru_parse( &c, si ); } -int -slap_idassert_parse_cf( const char *fname, int lineno, int argc, char *argv[], slap_idassert_t *si ) -{ - ConfigArgs c = { 0 }; - - snprintf( c.log, sizeof( c.log ), "%s: line %d", fname, lineno ); - c.argc = argc; - c.argv = argv; - - return slap_idassert_parse( &c, si ); -} - static int ldap_back_cf_gen( ConfigArgs *c ) { @@ -1406,6 +1395,15 @@ ldap_back_cf_gen( ConfigArgs *c ) c->value_int = LDAP_BACK_NOUNDEFFILTER( li ); break; + case LDAP_BACK_CFG_ONERR: + enum_to_verb( onerr_mode, li->li_flags & LDAP_BACK_F_ONERR_STOP, &bv ); + if ( BER_BVISNULL( &bv )) { + rc = 1; + } else { + value_add_one( &c->rvalue_vals, &bv ); + } + break; + default: /* FIXME: we need to handle all... */ assert( 0 ); @@ -1569,6 +1567,10 @@ ldap_back_cf_gen( ConfigArgs *c ) li->li_flags &= ~LDAP_BACK_F_NOUNDEFFILTER; break; + case LDAP_BACK_CFG_ONERR: + li->li_flags &= ~LDAP_BACK_F_ONERR_STOP; + break; + default: /* FIXME: we need to handle all... */ assert( 0 ); @@ -2235,6 +2237,20 @@ done_url:; } break; + case LDAP_BACK_CFG_ONERR: + /* onerr? */ + i = verb_to_mask( c->argv[1], onerr_mode ); + if ( BER_BVISNULL( &onerr_mode[i].word ) ) { + snprintf( c->cr_msg, sizeof( c->cr_msg ), + "%s unknown argument \"%s\"", + c->argv[0], c->argv[1] ); + Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); + return 1; + } + li->li_flags &= ~LDAP_BACK_F_ONERR_STOP; + li->li_flags |= onerr_mode[i].mask; + break; + case LDAP_BACK_CFG_REWRITE: snprintf( c->cr_msg, sizeof( c->cr_msg ), "rewrite/remap capabilities have been moved "