mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-22 07:39:35 -05:00
generic first component matching routines
Need to add specific routines for schema attribute types
This commit is contained in:
parent
c661a77268
commit
a0bcff1630
3 changed files with 67 additions and 104 deletions
|
|
@ -31,8 +31,6 @@
|
||||||
#define SLAP_NVALUES 1
|
#define SLAP_NVALUES 1
|
||||||
|
|
||||||
/* not yet implemented */
|
/* not yet implemented */
|
||||||
#define integerFirstComponentNormalize NULL
|
|
||||||
#define objectIdentifierFirstComponentNormalize NULL
|
|
||||||
#define uniqueMemberMatch NULL
|
#define uniqueMemberMatch NULL
|
||||||
|
|
||||||
#define OpenLDAPaciMatch NULL
|
#define OpenLDAPaciMatch NULL
|
||||||
|
|
@ -1645,16 +1643,14 @@ IA5StringNormalize(
|
||||||
void *ctx )
|
void *ctx )
|
||||||
{
|
{
|
||||||
char *p, *q;
|
char *p, *q;
|
||||||
int casefold = SLAP_MR_ASSOCIATED( mr, slap_schema.si_mr_caseExactIA5Match );
|
int casefold = SLAP_MR_ASSOCIATED(mr, slap_schema.si_mr_caseExactIA5Match);
|
||||||
|
|
||||||
assert( val->bv_len );
|
assert( val->bv_len );
|
||||||
|
|
||||||
p = val->bv_val;
|
p = val->bv_val;
|
||||||
|
|
||||||
/* Ignore initial whitespace */
|
/* Ignore initial whitespace */
|
||||||
while ( ASCII_SPACE( *p ) ) {
|
while ( ASCII_SPACE( *p ) ) p++;
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
normalized->bv_val = ber_strdup_x( p, ctx );
|
normalized->bv_val = ber_strdup_x( p, ctx );
|
||||||
p = q = normalized->bv_val;
|
p = q = normalized->bv_val;
|
||||||
|
|
@ -1685,16 +1681,12 @@ IA5StringNormalize(
|
||||||
* position. One is enough because the above loop collapsed
|
* position. One is enough because the above loop collapsed
|
||||||
* all whitespace to a single space.
|
* all whitespace to a single space.
|
||||||
*/
|
*/
|
||||||
|
if ( ASCII_SPACE( q[-1] ) ) --q;
|
||||||
if ( ASCII_SPACE( q[-1] ) ) {
|
|
||||||
--q;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* null terminate */
|
/* null terminate */
|
||||||
*q = '\0';
|
*q = '\0';
|
||||||
|
|
||||||
normalized->bv_len = q - normalized->bv_val;
|
normalized->bv_len = q - normalized->bv_val;
|
||||||
|
|
||||||
if( normalized->bv_len == 0 ) {
|
if( normalized->bv_len == 0 ) {
|
||||||
normalized->bv_val = sl_realloc( normalized->bv_val, 2, ctx );
|
normalized->bv_val = sl_realloc( normalized->bv_val, 2, ctx );
|
||||||
normalized->bv_val[0] = ' ';
|
normalized->bv_val[0] = ' ';
|
||||||
|
|
@ -1769,95 +1761,6 @@ numericStringNormalize(
|
||||||
return LDAP_SUCCESS;
|
return LDAP_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef SLAP_NVALUES
|
|
||||||
static int
|
|
||||||
objectIdentifierFirstComponentMatch(
|
|
||||||
int *matchp,
|
|
||||||
slap_mask_t flags,
|
|
||||||
Syntax *syntax,
|
|
||||||
MatchingRule *mr,
|
|
||||||
struct berval *value,
|
|
||||||
void *assertedValue )
|
|
||||||
{
|
|
||||||
int rc = LDAP_SUCCESS;
|
|
||||||
int match;
|
|
||||||
struct berval *asserted = (struct berval *) assertedValue;
|
|
||||||
ber_len_t i, j;
|
|
||||||
struct berval oid;
|
|
||||||
|
|
||||||
if( value->bv_len == 0 || value->bv_val[0] != '(' /*')'*/ ) {
|
|
||||||
return LDAP_INVALID_SYNTAX;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* trim leading white space */
|
|
||||||
for( i=1; ASCII_SPACE(value->bv_val[i]) && i < value->bv_len; i++ ) {
|
|
||||||
/* empty */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* grab next word */
|
|
||||||
oid.bv_val = &value->bv_val[i];
|
|
||||||
j = value->bv_len - i;
|
|
||||||
for( i=0; !ASCII_SPACE(oid.bv_val[i]) && i < j; i++ ) {
|
|
||||||
/* empty */
|
|
||||||
}
|
|
||||||
oid.bv_len = i;
|
|
||||||
|
|
||||||
/* insert attributeTypes, objectclass check here */
|
|
||||||
if( OID_LEADCHAR(asserted->bv_val[0]) ) {
|
|
||||||
rc = objectIdentifierMatch( &match, flags, syntax, mr, &oid, asserted );
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if ( !strcmp( syntax->ssyn_oid, SLAP_SYNTAX_MATCHINGRULES_OID ) ) {
|
|
||||||
MatchingRule *asserted_mr = mr_bvfind( asserted );
|
|
||||||
MatchingRule *stored_mr = mr_bvfind( &oid );
|
|
||||||
|
|
||||||
if( asserted_mr == NULL ) {
|
|
||||||
rc = SLAPD_COMPARE_UNDEFINED;
|
|
||||||
} else {
|
|
||||||
match = asserted_mr != stored_mr;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if ( !strcmp( syntax->ssyn_oid,
|
|
||||||
SLAP_SYNTAX_ATTRIBUTETYPES_OID ) )
|
|
||||||
{
|
|
||||||
AttributeType *asserted_at = at_bvfind( asserted );
|
|
||||||
AttributeType *stored_at = at_bvfind( &oid );
|
|
||||||
|
|
||||||
if( asserted_at == NULL ) {
|
|
||||||
rc = SLAPD_COMPARE_UNDEFINED;
|
|
||||||
} else {
|
|
||||||
match = asserted_at != stored_at;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if ( !strcmp( syntax->ssyn_oid,
|
|
||||||
SLAP_SYNTAX_OBJECTCLASSES_OID ) )
|
|
||||||
{
|
|
||||||
ObjectClass *asserted_oc = oc_bvfind( asserted );
|
|
||||||
ObjectClass *stored_oc = oc_bvfind( &oid );
|
|
||||||
|
|
||||||
if( asserted_oc == NULL ) {
|
|
||||||
rc = SLAPD_COMPARE_UNDEFINED;
|
|
||||||
} else {
|
|
||||||
match = asserted_oc != stored_oc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef NEW_LOGGING
|
|
||||||
LDAP_LOG( CONFIG, ENTRY,
|
|
||||||
"objectIdentifierFirstComponentMatch: %d\n %s\n %s\n",
|
|
||||||
match, value->bv_val, asserted->bv_val );
|
|
||||||
#else
|
|
||||||
Debug( LDAP_DEBUG_ARGS, "objectIdentifierFirstComponentMatch "
|
|
||||||
"%d\n\t\"%s\"\n\t\"%s\"\n",
|
|
||||||
match, value->bv_val, asserted->bv_val );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if( rc == LDAP_SUCCESS ) *matchp = match;
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
integerBitAndMatch(
|
integerBitAndMatch(
|
||||||
int *matchp,
|
int *matchp,
|
||||||
|
|
@ -2610,6 +2513,61 @@ bootParameterValidate(
|
||||||
return LDAP_SUCCESS;
|
return LDAP_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
firstComponentNormalize(
|
||||||
|
slap_mask_t usage,
|
||||||
|
Syntax *syntax,
|
||||||
|
MatchingRule *mr,
|
||||||
|
struct berval *val,
|
||||||
|
struct berval *normalized,
|
||||||
|
void *ctx )
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
struct berval oid;
|
||||||
|
ber_len_t len;
|
||||||
|
|
||||||
|
if( val->bv_len < 3 ) return LDAP_INVALID_SYNTAX;
|
||||||
|
|
||||||
|
if( val->bv_val[0] != '(' /*')'*/ &&
|
||||||
|
val->bv_val[0] != '{' /*'}'*/ )
|
||||||
|
{
|
||||||
|
return LDAP_INVALID_SYNTAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* trim leading white space */
|
||||||
|
for( len=1;
|
||||||
|
len < val->bv_len && ASCII_SPACE(val->bv_val[len]);
|
||||||
|
len++ )
|
||||||
|
{
|
||||||
|
/* empty */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* grab next word */
|
||||||
|
oid.bv_val = &val->bv_val[len];
|
||||||
|
len = val->bv_len - len;
|
||||||
|
for( oid.bv_len=0;
|
||||||
|
!ASCII_SPACE(oid.bv_val[oid.bv_len]) && oid.bv_len < len;
|
||||||
|
oid.bv_len++ )
|
||||||
|
{
|
||||||
|
/* empty */
|
||||||
|
}
|
||||||
|
|
||||||
|
if( mr == slap_schema.si_mr_objectIdentifierFirstComponentMatch ) {
|
||||||
|
rc = numericoidValidate( NULL, &oid );
|
||||||
|
} else if( mr == slap_schema.si_mr_integerFirstComponentMatch ) {
|
||||||
|
rc = integerValidate( NULL, &oid );
|
||||||
|
} else {
|
||||||
|
rc = LDAP_INVALID_SYNTAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if( rc == LDAP_SUCCESS ) {
|
||||||
|
ber_dupbv_x( normalized, &oid, ctx );
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
#define X_BINARY "X-BINARY-TRANSFER-REQUIRED 'TRUE' "
|
#define X_BINARY "X-BINARY-TRANSFER-REQUIRED 'TRUE' "
|
||||||
#define X_NOT_H_R "X-NOT-HUMAN-READABLE 'TRUE' "
|
#define X_NOT_H_R "X-NOT-HUMAN-READABLE 'TRUE' "
|
||||||
|
|
||||||
|
|
@ -3021,7 +2979,7 @@ static slap_mrule_defs_rec mrule_defs[] = {
|
||||||
"SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
|
"SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
|
||||||
SLAP_MR_EQUALITY | SLAP_MR_EXT,
|
SLAP_MR_EQUALITY | SLAP_MR_EXT,
|
||||||
integerFirstComponentMatchSyntaxes,
|
integerFirstComponentMatchSyntaxes,
|
||||||
NULL, integerFirstComponentNormalize, integerMatch,
|
NULL, firstComponentNormalize, integerMatch,
|
||||||
octetStringIndexer, octetStringFilter,
|
octetStringIndexer, octetStringFilter,
|
||||||
NULL },
|
NULL },
|
||||||
|
|
||||||
|
|
@ -3029,7 +2987,7 @@ static slap_mrule_defs_rec mrule_defs[] = {
|
||||||
"SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
|
"SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
|
||||||
SLAP_MR_EQUALITY | SLAP_MR_EXT,
|
SLAP_MR_EQUALITY | SLAP_MR_EXT,
|
||||||
objectIdentifierFirstComponentMatchSyntaxes,
|
objectIdentifierFirstComponentMatchSyntaxes,
|
||||||
NULL, objectIdentifierFirstComponentNormalize, octetStringMatch,
|
NULL, firstComponentNormalize, octetStringMatch,
|
||||||
octetStringIndexer, octetStringFilter,
|
octetStringIndexer, octetStringFilter,
|
||||||
NULL },
|
NULL },
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -803,8 +803,12 @@ static struct slap_schema_mr_map {
|
||||||
offsetof(struct slap_internal_schema, si_mr_distinguishedNameMatch) },
|
offsetof(struct slap_internal_schema, si_mr_distinguishedNameMatch) },
|
||||||
{ "integerMatch",
|
{ "integerMatch",
|
||||||
offsetof(struct slap_internal_schema, si_mr_integerMatch) },
|
offsetof(struct slap_internal_schema, si_mr_integerMatch) },
|
||||||
{ "integerFirstComponentMatch", offsetof(struct slap_internal_schema,
|
{ "integerFirstComponentMatch",
|
||||||
|
offsetof(struct slap_internal_schema,
|
||||||
si_mr_integerFirstComponentMatch) },
|
si_mr_integerFirstComponentMatch) },
|
||||||
|
{ "objectIdentifierFirstComponentMatch",
|
||||||
|
offsetof(struct slap_internal_schema,
|
||||||
|
si_mr_objectIdentifierFirstComponentMatch) },
|
||||||
{ NULL, 0 }
|
{ NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -801,6 +801,7 @@ struct slap_internal_schema {
|
||||||
MatchingRule *si_mr_caseExactIA5Match;
|
MatchingRule *si_mr_caseExactIA5Match;
|
||||||
MatchingRule *si_mr_integerMatch;
|
MatchingRule *si_mr_integerMatch;
|
||||||
MatchingRule *si_mr_integerFirstComponentMatch;
|
MatchingRule *si_mr_integerFirstComponentMatch;
|
||||||
|
MatchingRule *si_mr_objectIdentifierFirstComponentMatch;
|
||||||
|
|
||||||
/* Syntaxes */
|
/* Syntaxes */
|
||||||
Syntax *si_syn_directoryString;
|
Syntax *si_syn_directoryString;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue