mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-02-17 14:00:30 +08:00
Updated numericString syntax routines
OC checks usage checks
This commit is contained in:
parent
3370175733
commit
0a420009ee
@ -214,23 +214,23 @@ oc_add_sups(
|
||||
int code;
|
||||
ObjectClass *soc1;
|
||||
int nsups;
|
||||
char **sups1;
|
||||
char **sups1;
|
||||
int add_sups = 0;
|
||||
|
||||
if ( sups ) {
|
||||
if ( !soc->soc_sups ) {
|
||||
/* We are at the first recursive level */
|
||||
add_sups = 1;
|
||||
nsups = 0;
|
||||
nsups = 1;
|
||||
sups1 = sups;
|
||||
while ( *sups1 ) {
|
||||
nsups++;
|
||||
sups1++;
|
||||
}
|
||||
nsups++;
|
||||
soc->soc_sups = (ObjectClass **)ch_calloc(nsups,
|
||||
sizeof(ObjectClass *));
|
||||
}
|
||||
|
||||
nsups = 0;
|
||||
sups1 = sups;
|
||||
while ( *sups1 ) {
|
||||
@ -240,6 +240,18 @@ oc_add_sups(
|
||||
return SLAP_SCHERR_CLASS_NOT_FOUND;
|
||||
}
|
||||
|
||||
/* check object class usage
|
||||
* abstract classes can only sup abstract classes
|
||||
* structural classes can not sup auxiliary classes
|
||||
* auxiliary classes can not sup structural classes
|
||||
*/
|
||||
if( soc->soc_kind != soc1->soc_kind
|
||||
&& soc1->soc_kind != LDAP_SCHEMA_ABSTRACT )
|
||||
{
|
||||
*err = *sups1;
|
||||
return SLAP_SCHERR_CLASS_BAD_USAGE;
|
||||
}
|
||||
|
||||
if ( add_sups )
|
||||
soc->soc_sups[nsups] = soc1;
|
||||
|
||||
@ -256,6 +268,7 @@ oc_add_sups(
|
||||
sups1++;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -349,6 +362,7 @@ oc_add(
|
||||
} else {
|
||||
code = oc_add_sups( soc, soc->soc_sup_oids, err );
|
||||
}
|
||||
|
||||
if ( code != 0 ) return code;
|
||||
|
||||
code = oc_create_required( soc, soc->soc_at_oids_must, err );
|
||||
|
@ -27,12 +27,12 @@
|
||||
/* recycled matching routines */
|
||||
#define bitStringMatch octetStringMatch
|
||||
#define integerMatch caseIgnoreIA5Match
|
||||
#define numericStringMatch caseIgnoreMatch
|
||||
#define objectIdentifierMatch numericStringMatch
|
||||
#define telephoneNumberMatch numericStringMatch
|
||||
#define numericStringMatch caseIgnoreIA5Match
|
||||
#define objectIdentifierMatch caseIgnoreIA5Match
|
||||
#define telephoneNumberMatch caseIgnoreIA5Match
|
||||
#define telephoneNumberSubstringsMatch caseIgnoreIA5SubstringsMatch
|
||||
#define generalizedTimeMatch numericStringMatch
|
||||
#define generalizedTimeOrderingMatch numericStringMatch
|
||||
#define generalizedTimeMatch caseIgnoreIA5Match
|
||||
#define generalizedTimeOrderingMatch caseIgnoreIA5Match
|
||||
#define uniqueMemberMatch dnMatch
|
||||
|
||||
/* approx matching rules */
|
||||
@ -2594,7 +2594,7 @@ caseIgnoreIA5Match(
|
||||
{
|
||||
int match = value->bv_len - ((struct berval *) assertedValue)->bv_len;
|
||||
|
||||
if( match == 0 ) {
|
||||
if( match == 0 && value->bv_len ) {
|
||||
match = strncasecmp( value->bv_val,
|
||||
((struct berval *) assertedValue)->bv_val,
|
||||
value->bv_len );
|
||||
@ -3167,32 +3167,39 @@ int caseIgnoreIA5SubstringsFilter(
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
static int
|
||||
numericStringValidate(
|
||||
Syntax *syntax,
|
||||
struct berval *in )
|
||||
{
|
||||
ber_len_t i;
|
||||
|
||||
/* disallow empty numeric strings */
|
||||
|
||||
for(i=0; i < in->bv_len; i++) {
|
||||
if( !SLAP_NUMERIC(in->bv_val[i]) ) {
|
||||
return LDAP_INVALID_SYNTAX;
|
||||
}
|
||||
}
|
||||
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
static int
|
||||
numericStringNormalize(
|
||||
Syntax *syntax,
|
||||
struct berval *val,
|
||||
struct berval **normalized )
|
||||
{
|
||||
/* similiar to IA5StringNormalize except removes all spaces */
|
||||
/* removal all spaces */
|
||||
struct berval *newval;
|
||||
char *p, *q;
|
||||
|
||||
newval = ch_malloc( sizeof( struct berval ) );
|
||||
newval->bv_val = ch_malloc( val->bv_len + 1 );
|
||||
|
||||
p = val->bv_val;
|
||||
|
||||
/* Ignore initial whitespace */
|
||||
while ( ASCII_SPACE( *p ) ) {
|
||||
p++;
|
||||
}
|
||||
|
||||
if( *p == '\0' ) {
|
||||
ch_free( newval );
|
||||
return LDAP_INVALID_SYNTAX;
|
||||
}
|
||||
|
||||
newval->bv_val = ch_strdup( p );
|
||||
p = q = newval->bv_val;
|
||||
q = newval->bv_val;
|
||||
|
||||
while ( *p ) {
|
||||
if ( ASCII_SPACE( *p ) ) {
|
||||
@ -3203,16 +3210,9 @@ numericStringNormalize(
|
||||
}
|
||||
}
|
||||
|
||||
assert( *newval->bv_val );
|
||||
assert( newval->bv_val < p );
|
||||
assert( q <= p );
|
||||
|
||||
/* cannot start with a space */
|
||||
assert( !ASCII_SPACE(*newval->bv_val) );
|
||||
|
||||
/* cannot end with a space */
|
||||
assert( !ASCII_SPACE( q[-1] ) );
|
||||
|
||||
/* null terminate */
|
||||
*q = '\0';
|
||||
|
||||
@ -3758,7 +3758,7 @@ struct syntax_defs_rec syntax_defs[] = {
|
||||
{"( 1.3.6.1.4.1.1466.115.121.1.35 DESC 'Name Form Description' )",
|
||||
0, NULL, NULL, NULL},
|
||||
{"( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'Numeric String' )",
|
||||
0, IA5StringValidate, numericStringNormalize, NULL},
|
||||
0, numericStringValidate, numericStringNormalize, NULL},
|
||||
{"( 1.3.6.1.4.1.1466.115.121.1.37 DESC 'Object Class Description' )",
|
||||
0, NULL, NULL, NULL},
|
||||
{"( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )",
|
||||
|
@ -1,4 +1,3 @@
|
||||
/* schemaparse.c - routines to parse config file objectclass definitions */
|
||||
/* $OpenLDAP$ */
|
||||
/*
|
||||
* Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
|
||||
@ -25,7 +24,9 @@ static char *const err2text[] = {
|
||||
"Success",
|
||||
"Out of memory",
|
||||
"ObjectClass not found",
|
||||
"ObjectClass inappropriate SUPerior",
|
||||
"AttributeType not found",
|
||||
"AttributeType inappropriate USAGE",
|
||||
"Duplicate objectClass",
|
||||
"Duplicate attributeType",
|
||||
"Duplicate ldapSyntax",
|
||||
|
@ -101,11 +101,12 @@ LDAP_BEGIN_DECL
|
||||
#define AD_LEADCHAR(c) ( ATTR_CHAR(c) )
|
||||
#define AD_CHAR(c) ( ATTR_CHAR(c) || (c) == ';' )
|
||||
|
||||
#define SLAP_NUMERIC(c) ( ASCII_DIGIT(c) || ASCII_SPACE(c) )
|
||||
|
||||
#define SLAP_PRINTABLE(c) ( ASCII_ALNUM(c) || (c) == '\'' || \
|
||||
(c) == '(' || (c) == ')' || (c) == '+' || (c) == ',' || \
|
||||
(c) == '-' || (c) == '.' || (c) == '/' || (c) == ':' || \
|
||||
(c) == '?' || (c) == ' ' )
|
||||
|
||||
#define SLAP_PRINTABLES(c) ( SLAP_PRINTABLE(c) || (c) == '$' )
|
||||
|
||||
/* must match in schema_init.c */
|
||||
@ -201,16 +202,18 @@ typedef struct slap_ssf_set {
|
||||
*/
|
||||
#define SLAP_SCHERR_OUTOFMEM 1
|
||||
#define SLAP_SCHERR_CLASS_NOT_FOUND 2
|
||||
#define SLAP_SCHERR_ATTR_NOT_FOUND 3
|
||||
#define SLAP_SCHERR_DUP_CLASS 4
|
||||
#define SLAP_SCHERR_DUP_ATTR 5
|
||||
#define SLAP_SCHERR_DUP_SYNTAX 6
|
||||
#define SLAP_SCHERR_DUP_RULE 7
|
||||
#define SLAP_SCHERR_NO_NAME 8
|
||||
#define SLAP_SCHERR_ATTR_INCOMPLETE 9
|
||||
#define SLAP_SCHERR_MR_NOT_FOUND 10
|
||||
#define SLAP_SCHERR_SYN_NOT_FOUND 11
|
||||
#define SLAP_SCHERR_MR_INCOMPLETE 12
|
||||
#define SLAP_SCHERR_CLASS_BAD_USAGE 3
|
||||
#define SLAP_SCHERR_ATTR_NOT_FOUND 4
|
||||
#define SLAP_SCHERR_ATTR_BAD_USAGE 5
|
||||
#define SLAP_SCHERR_DUP_CLASS 6
|
||||
#define SLAP_SCHERR_DUP_ATTR 7
|
||||
#define SLAP_SCHERR_DUP_SYNTAX 8
|
||||
#define SLAP_SCHERR_DUP_RULE 9
|
||||
#define SLAP_SCHERR_NO_NAME 10
|
||||
#define SLAP_SCHERR_ATTR_INCOMPLETE 11
|
||||
#define SLAP_SCHERR_MR_NOT_FOUND 12
|
||||
#define SLAP_SCHERR_SYN_NOT_FOUND 13
|
||||
#define SLAP_SCHERR_MR_INCOMPLETE 14
|
||||
|
||||
typedef struct slap_oid_macro {
|
||||
struct berval som_oid;
|
||||
|
Loading…
Reference in New Issue
Block a user