From deec44b89a0f1ed00e12f2a2030a63b69a48fa35 Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Tue, 5 Jul 2005 12:00:14 +0000 Subject: [PATCH] fix further ITS#3830 issues; allow to specify a matching rule for non-DN match --- doc/man/man5/slapd.access.5 | 6 ++-- servers/slapd/acl.c | 2 +- servers/slapd/aclparse.c | 60 +++++++++++++++++++++++++++++++++++-- servers/slapd/slap.h | 1 + 4 files changed, 63 insertions(+), 6 deletions(-) diff --git a/doc/man/man5/slapd.access.5 b/doc/man/man5/slapd.access.5 index 15df671a0e..8eea8a1b8d 100644 --- a/doc/man/man5/slapd.access.5 +++ b/doc/man/man5/slapd.access.5 @@ -82,7 +82,7 @@ It can have the forms .nf [dn[.]=] filter= - attrs=[ val[.]=] + attrs=[ val[/matchingRule][.]=] .fi .LP with @@ -190,13 +190,13 @@ form is given, is implied, i.e. all attributes are addressed. .LP Using the form -.B attrs= val[.]= +.B attrs= val[/matchingRule][.]= specifies access to a particular value of a single attribute. In this case, only a single attribute type may be given. The .B .B exact (the default) uses the attribute's equality matching rule to compare the -value. If the +value, unless a different (and compatible) matching rule is specified. If the .B is .BR regex , diff --git a/servers/slapd/acl.c b/servers/slapd/acl.c index 9fb688e869..40de548d29 100644 --- a/servers/slapd/acl.c +++ b/servers/slapd/acl.c @@ -906,7 +906,7 @@ slap_acl_get( if ( a->acl_attrs[0].an_desc->ad_type->sat_syntax != slap_schema.si_syn_distinguishedName ) { if (value_match( &match, desc, - desc->ad_type->sat_equality, 0, + /* desc->ad_type->sat_equality */ a->acl_attrval_mr, 0, val, &a->acl_attrval, &text ) != LDAP_SUCCESS || match ) continue; diff --git a/servers/slapd/aclparse.c b/servers/slapd/aclparse.c index 0bb49173d0..b1760206ff 100644 --- a/servers/slapd/aclparse.c +++ b/servers/slapd/aclparse.c @@ -452,6 +452,8 @@ parse_acl( } } else if ( strncasecmp( left, "val", 3 ) == 0 ) { + char *mr; + if ( !BER_BVISEMPTY( &a->acl_attrval ) ) { fprintf( stderr, "%s: line %d: attr val already specified in to clause.\n", @@ -465,8 +467,34 @@ parse_acl( fname, lineno ); acl_usage(); } + ber_str2bv( right, 0, 1, &a->acl_attrval ); a->acl_attrval_style = ACL_STYLE_BASE; + + mr = strchr( left, '/' ); + if ( mr != NULL ) { + mr[ 0 ] = '\0'; + mr++; + + a->acl_attrval_mr = mr_find( mr ); + if ( a->acl_attrval_mr == NULL ) { + fprintf( stderr, "%s: line %d: " + "invalid matching rule \"%s\".\n", + fname, lineno, mr ); + acl_usage(); + } + + if( !mr_usable_with_at( a->acl_attrval_mr, a->acl_attrs[ 0 ].an_desc->ad_type ) ) + { + fprintf( stderr, "%s: line %d: " + "matching rule \"%s\" use " + "with attr \"%s\" not appropriate.\n", + fname, lineno, mr, + a->acl_attrs[ 0 ].an_name.bv_val ); + acl_usage(); + } + } + if ( style != NULL ) { if ( strcasecmp( style, "regex" ) == 0 ) { int e = regcomp( &a->acl_attrval_re, a->acl_attrval.bv_val, @@ -491,6 +519,8 @@ parse_acl( } else if ( a->acl_attrs[0].an_desc->ad_type-> sat_syntax == slap_schema.si_syn_distinguishedName ) { + struct berval bv; + if ( !strcasecmp( style, "baseObject" ) || !strcasecmp( style, "base" ) ) { @@ -515,6 +545,18 @@ parse_acl( a->acl_attrval_style = ACL_STYLE_BASE; } + bv = a->acl_attrval; + rc = dnNormalize( 0, NULL, NULL, &bv, &a->acl_attrval, NULL ); + if ( rc != LDAP_SUCCESS ) { + fprintf( stderr, + "%s: line %d: unable to normalize DN \"%s\" " + "for attributeType \"%s\" (%d).\n", + fname, lineno, bv.bv_val, + a->acl_attrs[0].an_desc->ad_cname.bv_val, rc ); + acl_usage(); + } + ber_memfree( bv.bv_val ); + } else { fprintf( stderr, "%s: line %d: unknown val.