Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
openldap
OpenLDAP
Commits
840f3644
Commit
840f3644
authored
Feb 28, 2003
by
Kurt Zeilenga
Browse files
SLAP_NVALUES: a couple of basic normalizers... but not working yet.
parent
ca0ee4d9
Changes
4
Hide whitespace changes
Inline
Side-by-side
servers/slapd/modify.c
View file @
840f3644
...
...
@@ -607,6 +607,20 @@ int slap_mods_check(
}
}
/*
* a rough single value check... an additional check is needed
* to catch add of single value to existing single valued attribute
*/
if
((
ml
->
sml_op
==
LDAP_MOD_ADD
||
ml
->
sml_op
==
LDAP_MOD_REPLACE
)
&&
nvals
>
1
&&
is_at_single_value
(
ad
->
ad_type
))
{
snprintf
(
textbuf
,
textlen
,
"%s: multiple values provided"
,
ml
->
sml_type
.
bv_val
);
*
text
=
textbuf
;
return
LDAP_CONSTRAINT_VIOLATION
;
}
#ifdef SLAP_NVALUES
if
(
nvals
&&
ad
->
ad_type
->
sat_equality
&&
ad
->
ad_type
->
sat_equality
->
smr_normalize
)
...
...
@@ -639,20 +653,6 @@ int slap_mods_check(
ml
->
sml_nvalues
[
nvals
].
bv_len
=
0
;
}
#endif
/*
* a rough single value check... an additional check is needed
* to catch add of single value to existing single valued attribute
*/
if
((
ml
->
sml_op
==
LDAP_MOD_ADD
||
ml
->
sml_op
==
LDAP_MOD_REPLACE
)
&&
nvals
>
1
&&
is_at_single_value
(
ad
->
ad_type
))
{
snprintf
(
textbuf
,
textlen
,
"%s: multiple value provided"
,
ml
->
sml_type
.
bv_val
);
*
text
=
textbuf
;
return
LDAP_CONSTRAINT_VIOLATION
;
}
}
}
...
...
servers/slapd/schema_init.c
View file @
840f3644
...
...
@@ -32,6 +32,9 @@
/* TO BE DELETED */
#define SLAP_MR_DN_FOLD (0)
#define SLAP_MR_ASSOCIATED(mr, with) \
((mr) == (with) || (mr)->smr_associated == (with))
#define xUTF8StringNormalize NULL
#define xIA5StringNormalize NULL
#define xtelephoneNumberNormalize NULL
...
...
@@ -40,6 +43,23 @@
#define xnumericStringNormalize NULL
#define xnameUIDNormalize NULL
/* (new) normalization routines */
#define caseExactIA5Normalize IA5StringNormalize
#define caseIgnoreIA5Normalize IA5StringNormalize
#define caseExactNormalize UTF8StringNormalize
#define caseIgnoreNormalize UTF8StringNormalize
#define distinguishedNameNormalize NULL
#define integerNormalize NULL
#define integerFirstComponentNormalize NULL
#define numericStringNormalize NULL
#define objectIdentifierNormalize NULL
#define objectIdentifierFirstComponentNormalize NULL
#define generalizedTimeNormalize NULL
#define uniqueMemberNormalize NULL
#define bitStringNormalize NULL
#define telephoneNumberNormalize NULL
#define distinguishedNameMatch dnMatch
#define distinguishedNameIndexer octetStringIndexer
#define distinguishedNameFilter octetStringFilter
...
...
@@ -117,22 +137,6 @@
/* validatation routines */
#define berValidate blobValidate
/* (new) normalization routines */
#define caseExactNormalize NULL
#define caseExactIA5Normalize NULL
#define caseIgnoreNormalize NULL
#define caseIgnoreIA5Normalize NULL
#define distinguishedNameNormalize NULL
#define integerNormalize NULL
#define integerFirstComponentNormalize NULL
#define numericStringNormalize NULL
#define objectIdentifierNormalize NULL
#define objectIdentifierFirstComponentNormalize NULL
#define generalizedTimeNormalize NULL
#define uniqueMemberNormalize NULL
#define bitStringNormalize NULL
#define telephoneNumberNormalize NULL
/* approx matching rules */
#ifdef SLAP_NVALUES
#define directoryStringApproxMatchOID NULL
...
...
@@ -150,6 +154,23 @@
#ifndef SLAP_NVALUES
/* (new) normalization routines */
#define caseExactNormalize NULL
#define caseExactIA5Normalize NULL
#define caseIgnoreNormalize NULL
#define caseIgnoreIA5Normalize NULL
#define distinguishedNameNormalize NULL
#define integerNormalize NULL
#define integerFirstComponentNormalize NULL
#define numericStringNormalize NULL
#define objectIdentifierNormalize NULL
#define objectIdentifierFirstComponentNormalize NULL
#define generalizedTimeNormalize NULL
#define uniqueMemberNormalize NULL
#define bitStringNormalize NULL
#define telephoneNumberNormalize NULL
/* matching routines */
#define bitStringMatch octetStringMatch
#define bitStringIndexer octetStringIndexer
...
...
@@ -569,9 +590,10 @@ LDAP/X.500 string syntax / matching rules have a few oddities. This
comment attempts to detail how slapd(8) treats them.
Summary:
StringSyntax X.500 LDAP Matching
StringSyntax X.500 LDAP Matching
/Comments
DirectoryString CHOICE UTF8 i/e + ignore insignificant spaces
PrintableString subset subset i/e + ignore insignificant spaces
PrintableString subset subset i/e + ignore insignificant spaces
NumericString subset subset ignore all spaces
IA5String ASCII ASCII i/e + ignore insignificant spaces
TeletexString T.61 T.61 i/e + ignore insignificant spaces
...
...
@@ -588,6 +610,7 @@ Directory String -
must be non-empty.
In LDAPv3, a directory string is a UTF-8 encoded UCS string.
A directory string cannot be zero length.
For matching, there are both case ignore and exact rules. Both
also require that "insignificant" spaces be ignored.
...
...
@@ -643,7 +666,10 @@ UTF8StringValidate(
int
len
;
unsigned
char
*
u
=
in
->
bv_val
;
if
(
!
in
->
bv_len
)
return
LDAP_INVALID_SYNTAX
;
if
(
in
->
bv_len
==
0
&&
syntax
==
slap_schema
.
si_syn_directoryString
)
{
/* directory strings cannot be empty */
return
LDAP_INVALID_SYNTAX
;
}
for
(
count
=
in
->
bv_len
;
count
>
0
;
count
-=
len
,
u
+=
len
)
{
/* get the length indicated by the first byte */
...
...
@@ -683,12 +709,79 @@ UTF8StringValidate(
if
(
LDAP_UTF8_OFFSET
(
u
)
!=
len
)
return
LDAP_INVALID_SYNTAX
;
}
if
(
count
!=
0
)
return
LDAP_INVALID_SYNTAX
;
if
(
count
!=
0
)
{
return
LDAP_INVALID_SYNTAX
;
}
return
LDAP_SUCCESS
;
}
#ifndef SLAP_NVALUES
#ifdef SLAP_NVALUES
static
int
UTF8StringNormalize
(
slap_mask_t
use
,
Syntax
*
syntax
,
MatchingRule
*
mr
,
struct
berval
*
val
,
struct
berval
*
normalized
)
{
struct
berval
tmp
,
nvalue
;
int
flags
;
int
i
,
wasspace
;
if
(
val
->
bv_val
==
NULL
)
{
/* assume we're dealing with a syntax (e.g., UTF8String)
* which allows empty strings
*/
normalized
->
bv_len
=
0
;
normalized
->
bv_val
=
NULL
;
return
LDAP_SUCCESS
;
}
flags
=
SLAP_MR_ASSOCIATED
(
mr
,
slap_schema
.
si_mr_caseExactMatch
)
?
LDAP_UTF8_CASEFOLD
:
LDAP_UTF8_NOCASEFOLD
;
flags
|=
(
use
&
SLAP_MR_EQUALITY_APPROX
==
SLAP_MR_EQUALITY_APPROX
)
?
LDAP_UTF8_APPROX
:
0
;
val
=
UTF8bvnormalize
(
val
,
&
tmp
,
flags
);
if
(
val
==
NULL
)
{
return
LDAP_OTHER
;
}
/* collapse spaces (in place) */
nvalue
.
bv_len
=
0
;
nvalue
.
bv_val
=
tmp
.
bv_val
;
wasspace
=
1
;
/* trim leading spaces */
for
(
i
=
0
;
i
<
tmp
.
bv_len
;
i
++
)
{
if
(
ASCII_SPACE
(
tmp
.
bv_val
[
i
]
))
{
if
(
wasspace
++
==
0
)
{
/* trim repeated spaces */
nvalue
.
bv_val
[
nvalue
.
bv_len
++
]
=
tmp
.
bv_val
[
i
];
}
}
else
{
wasspace
=
0
;
nvalue
.
bv_val
[
nvalue
.
bv_len
++
]
=
tmp
.
bv_val
[
i
];
}
}
if
(
nvalue
.
bv_len
)
{
if
(
wasspace
)
{
/* last character was a space, trim it */
--
nvalue
.
bv_len
;
}
nvalue
.
bv_val
[
nvalue
.
bv_len
]
=
'\0'
;
}
else
{
/* string of all spaces is treated as one space */
nvalue
.
bv_val
[
0
]
=
' '
;
nvalue
.
bv_val
[
1
]
=
'\0'
;
nvalue
.
bv_len
=
1
;
}
return
LDAP_SUCCESS
;
}
#else
static
int
xUTF8StringNormalize
(
...
...
@@ -2288,15 +2381,26 @@ IA5StringValidate(
return
LDAP_SUCCESS
;
}
#ifndef SLAP_NVALUES
#ifdef SLAP_NVALUES
static
int
IA5StringNormalize
(
slap_mask_t
use
,
Syntax
*
syntax
,
MatchingRule
*
mr
,
struct
berval
*
val
,
struct
berval
*
normalized
)
#else
static
int
xIA5StringNormalize
(
Syntax
*
syntax
,
struct
berval
*
val
,
struct
berval
*
normalized
)
#endif
{
char
*
p
,
*
q
;
#ifdef SLAP_NVALUES
int
casefold
=
!
SLAP_MR_ASSOCIATED
(
mr
,
slap_schema
.
si_mr_caseExactIA5Match
);
#endif
assert
(
val
->
bv_len
);
...
...
@@ -2318,6 +2422,13 @@ xIA5StringNormalize(
while
(
ASCII_SPACE
(
*
p
)
)
{
p
++
;
}
#ifdef SLAP_NVALUES
}
else
if
(
casefold
)
{
/* Most IA5 rules require casefolding */
*
q
++
=
TOLOWER
(
*
p
++
);
#endif
}
else
{
*
q
++
=
*
p
++
;
}
...
...
@@ -2351,6 +2462,8 @@ xIA5StringNormalize(
return
LDAP_SUCCESS
;
}
#ifndef SLAP_NVALUES
static
int
caseExactIA5Match
(
int
*
matchp
,
...
...
@@ -4839,7 +4952,7 @@ static slap_mrule_defs_rec mrule_defs[] = {
"SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )"
,
SLAP_MR_ORDERING
,
NULL
,
NULL
,
generalizedTime
OrderingMatch
,
generalizedTimeOrderingMatch
,
generalizedTime
Normalize
,
generalizedTimeOrderingMatch
,
NULL
,
NULL
,
NULL
},
...
...
servers/slapd/schema_prep.c
View file @
840f3644
...
...
@@ -796,6 +796,8 @@ static struct slap_schema_mr_map {
char
*
ssmm_name
;
size_t
ssmm_offset
;
}
mr_map
[]
=
{
{
"caseExactIA5Match"
,
offsetof
(
struct
slap_internal_schema
,
si_mr_caseExactIA5Match
)
},
{
"caseExactMatch"
,
offsetof
(
struct
slap_internal_schema
,
si_mr_caseExactMatch
)
},
{
"caseExactSubstringsMatch"
,
...
...
@@ -814,12 +816,14 @@ static struct slap_schema_syn_map {
char
*
sssm_name
;
size_t
sssm_offset
;
}
syn_map
[]
=
{
{
"1.3.6.1.4.1.1466.115.121.1.
40
"
,
offsetof
(
struct
slap_internal_schema
,
si_syn_
octet
String
)
},
{
"1.3.6.1.4.1.1466.115.121.1.
15
"
,
offsetof
(
struct
slap_internal_schema
,
si_syn_
directory
String
)
},
{
"1.3.6.1.4.1.1466.115.121.1.12"
,
offsetof
(
struct
slap_internal_schema
,
si_syn_distinguishedName
)
},
{
"1.3.6.1.4.1.1466.115.121.1.27"
,
offsetof
(
struct
slap_internal_schema
,
si_syn_integer
)
},
{
"1.3.6.1.4.1.1466.115.121.1.40"
,
offsetof
(
struct
slap_internal_schema
,
si_syn_octetString
)
},
{
NULL
,
0
}
};
...
...
servers/slapd/slap.h
View file @
840f3644
...
...
@@ -792,13 +792,15 @@ struct slap_internal_schema {
MatchingRule
*
si_mr_distinguishedNameMatch
;
MatchingRule
*
si_mr_caseExactMatch
;
MatchingRule
*
si_mr_caseExactSubstringsMatch
;
MatchingRule
*
si_mr_caseExactIA5Match
;
MatchingRule
*
si_mr_integerMatch
;
MatchingRule
*
si_mr_integerFirstComponentMatch
;
/* Syntaxes */
Syntax
*
si_syn_
octet
String
;
Syntax
*
si_syn_
directory
String
;
Syntax
*
si_syn_distinguishedName
;
Syntax
*
si_syn_integer
;
Syntax
*
si_syn_octetString
;
};
typedef
struct
slap_attr_assertion
{
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment