From d298e35514621b2a15e4fbe35e2b4ec095b56f6d Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Mon, 31 Jan 2000 01:49:44 +0000 Subject: [PATCH] Add SLAP_SYNTAX_BINARY flag to indicate binary storage is used for attributes of the syntax. Such attribute values be transferred using binary syntax unless ber2str/str2ber routines are provided. Used in conjunction with ";binary" attribute description option and/or the Binary syntax. --- servers/slapd/attr.c | 4 +- servers/slapd/back-ldbm/tools.c | 2 +- servers/slapd/proto-slap.h | 17 +++- servers/slapd/schema.c | 16 +++- servers/slapd/schema_init.c | 148 +++++++++++++++++--------------- servers/slapd/slap.h | 3 + 6 files changed, 111 insertions(+), 79 deletions(-) diff --git a/servers/slapd/attr.c b/servers/slapd/attr.c index 7b1aecd735..3dc8604e14 100644 --- a/servers/slapd/attr.c +++ b/servers/slapd/attr.c @@ -75,7 +75,9 @@ Attribute *attr_dup( Attribute *a ) } tmp->a_type = ch_strdup( a->a_type ); -#ifdef SLAPD_SCHEMA_COMPAT +#ifdef SLAPD_SCHEMA_NOT_COMPAT + tmp->a_at = a->a_at; +#else tmp->a_syntax = a->a_syntax; #endif tmp->a_next = NULL; diff --git a/servers/slapd/back-ldbm/tools.c b/servers/slapd/back-ldbm/tools.c index 96207e310f..afc9ee8ecd 100644 --- a/servers/slapd/back-ldbm/tools.c +++ b/servers/slapd/back-ldbm/tools.c @@ -197,7 +197,7 @@ int ldbm_tool_index_attr( char* type ) { static DBCache *db = NULL; - int indexmask, syntaxmask; + int indexmask; char * at_cn; #ifndef SLAPD_SCHEMA_COMPAT AttributeType *at; diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index f7b1a1e2dc..a10cb5e23d 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -468,7 +468,7 @@ LIBSLAPD_F (int) oc_add LDAP_P((LDAP_OBJECT_CLASS *oc, const char **err)); LIBSLAPD_F (Syntax *) syn_find LDAP_P((const char *synname)); LIBSLAPD_F (Syntax *) syn_find_desc LDAP_P((const char *syndesc, int *slen)); -LIBSLAPD_F (int) syn_add LDAP_P((LDAP_SYNTAX *syn, +LIBSLAPD_F (int) syn_add LDAP_P((LDAP_SYNTAX *syn, int flags, slap_syntax_validate_func *validate, slap_syntax_transform_func *ber2str, slap_syntax_transform_func *str2ber, @@ -479,9 +479,11 @@ LIBSLAPD_F (int) mr_add LDAP_P((LDAP_MATCHING_RULE *mr, slap_mr_convert_func *convert, slap_mr_normalize_func *normalize, slap_mr_match_func *match, + slap_mr_indexer_func *indexer, + slap_mr_filter_func *filter, const char **err)); -LIBSLAPD_F (int) register_syntax LDAP_P((char *desc, +LIBSLAPD_F (int) register_syntax LDAP_P((char *desc, int flags, slap_syntax_validate_func *validate, slap_syntax_transform_func *ber2str, slap_syntax_transform_func *str2ber )); @@ -489,11 +491,12 @@ LIBSLAPD_F (int) register_syntax LDAP_P((char *desc, LIBSLAPD_F (int) register_matching_rule LDAP_P((char * desc, slap_mr_convert_func *convert, slap_mr_normalize_func *normalize, - slap_mr_match_func *match )); + slap_mr_match_func *match, + slap_mr_indexer_func *indexer, + slap_mr_filter_func *filter )); LIBSLAPD_F (void) schema_info LDAP_P((Connection *conn, Operation *op, char **attrs, int attrsonly)); -LIBSLAPD_F (int) schema_init LDAP_P((void)); LIBSLAPD_F (int) is_entry_objectclass LDAP_P(( Entry *, const char* objectclass )); @@ -501,6 +504,12 @@ LIBSLAPD_F (int) is_entry_objectclass LDAP_P(( #define is_entry_referral(e) is_entry_objectclass((e), "REFERRAL") +/* + * schema_init.c + */ +LIBSLAPD_F (int) schema_init LDAP_P((void)); + + /* * schemaparse.c */ diff --git a/servers/slapd/schema.c b/servers/slapd/schema.c index 5ce6f905e2..faf08c7812 100644 --- a/servers/slapd/schema.c +++ b/servers/slapd/schema.c @@ -677,6 +677,7 @@ syn_insert( int syn_add( LDAP_SYNTAX *syn, + int flags, slap_syntax_validate_func *validate, slap_syntax_transform_func *ber2str, slap_syntax_transform_func *str2ber, @@ -689,6 +690,7 @@ syn_add( ssyn = (Syntax *) ch_calloc( 1, sizeof(Syntax) ); memcpy( &ssyn->ssyn_syn, syn, sizeof(LDAP_SYNTAX)); + ssyn->ssyn_flags = flags; ssyn->ssyn_validate = validate; ssyn->ssyn_ber2str = ber2str; ssyn->ssyn_str2ber = str2ber; @@ -793,6 +795,8 @@ mr_add( slap_mr_convert_func *convert, slap_mr_normalize_func *normalize, slap_mr_match_func *match, + slap_mr_indexer_func *indexer, + slap_mr_filter_func *filter, const char **err ) { @@ -806,6 +810,8 @@ mr_add( smr->smr_convert = convert; smr->smr_normalize = normalize; smr->smr_match = match; + smr->smr_indexer = indexer; + smr->smr_filter = filter; if ( smr->smr_syntax_oid ) { if ( (syn = syn_find(smr->smr_syntax_oid)) ) { @@ -824,7 +830,7 @@ mr_add( int register_syntax( - char * desc, + char * desc, int flags, slap_syntax_validate_func *validate, slap_syntax_transform_func *ber2str, slap_syntax_transform_func *str2ber ) @@ -840,7 +846,7 @@ register_syntax( return( -1 ); } - code = syn_add( syn, validate, ber2str, str2ber, &err ); + code = syn_add( syn, flags, validate, ber2str, str2ber, &err ); if ( code ) { Debug( LDAP_DEBUG_ANY, "Error in register_syntax: %s %s in %s\n", scherr2str(code), err, desc ); @@ -855,7 +861,9 @@ register_matching_rule( char * desc, slap_mr_convert_func *convert, slap_mr_normalize_func *normalize, - slap_mr_match_func *match ) + slap_mr_match_func *match, + slap_mr_indexer_func *indexer, + slap_mr_filter_func *filter ) { LDAP_MATCHING_RULE *mr; int code; @@ -868,7 +876,7 @@ register_matching_rule( return( -1 ); } - code = mr_add( mr, convert, normalize, match, &err ); + code = mr_add( mr, convert, normalize, match, indexer, filter, &err ); if ( code ) { Debug( LDAP_DEBUG_ANY, "Error in register_syntax: %s for %s in %s\n", scherr2str(code), err, desc ); diff --git a/servers/slapd/schema_init.c b/servers/slapd/schema_init.c index 933885b3e6..6a1ab47db0 100644 --- a/servers/slapd/schema_init.c +++ b/servers/slapd/schema_init.c @@ -257,6 +257,7 @@ caseIgnoreIA5Match( struct syntax_defs_rec { char *sd_desc; + int sd_flags; slap_syntax_validate_func *sd_validate; slap_syntax_transform_func *sd_ber2str; slap_syntax_transform_func *sd_str2ber; @@ -264,96 +265,102 @@ struct syntax_defs_rec { struct syntax_defs_rec syntax_defs[] = { {"( 1.3.6.1.4.1.1466.115.121.1.3 DESC 'AttributeTypeDescription' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.4 DESC 'Audio' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.5 DESC 'Binary' )", + SLAP_SYNTAX_BINARY, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'BitString' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.7 DESC 'Boolean' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.8 DESC 'Certificate' )", + SLAP_SYNTAX_BINARY, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.9 DESC 'CertificateList' )", + SLAP_SYNTAX_BINARY, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.10 DESC 'CertificatePair' )", + SLAP_SYNTAX_BINARY, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'DN' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'DeliveryMethod' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'DirectoryString' )", - UTF8StringValidate, NULL, NULL}, + 0, UTF8StringValidate, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.16 DESC 'DITContentRuleDescription' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.17 DESC 'DITStructureRuleDescription' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.21 DESC 'EnhancedGuide' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'FacsimileTelephoneNumber' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'GeneralizedTime' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.25 DESC 'Guide' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5String' )", - IA5StringValidate, NULL, NULL}, + 0, IA5StringValidate, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'Integer' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.30 DESC 'MatchingRuleDescription' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.31 DESC 'MatchingRuleUseDescription' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.32 DESC 'MailPreference' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'NameAndOptionalUID' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.35 DESC 'NameFormDescription' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'NumericString' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.37 DESC 'ObjectClassDescription' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.39 DESC 'OtherMailbox' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'OctetString' )", - octetStringValidate, NULL, NULL}, + 0, octetStringValidate, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'PostalAddress' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.42 DESC 'ProtocolInformation' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.43 DESC 'PresentationAddress' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'PrintableString' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.49 DESC 'SupportedAlgorithm' )", - NULL, NULL, NULL}, + SLAP_SYNTAX_BINARY, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'TelephoneNumber' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.51 DESC 'TeletexTerminalIdentifier' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'TelexNumber' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.53 DESC 'UTCTime' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.54 DESC 'LDAPSyntaxDescription' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.58 DESC 'SubstringAssertion' )", - NULL, NULL, NULL}, + 0, NULL, NULL, NULL}, - {NULL, NULL, NULL} + {NULL, 0, NULL, NULL, NULL} }; struct mrule_defs_rec { - char *mrd_desc; - slap_mr_convert_func *mrd_convert; - slap_mr_normalize_func *mrd_normalize; - slap_mr_match_func *mrd_match; + char * mrd_desc; + slap_mr_convert_func * mrd_convert; + slap_mr_normalize_func * mrd_normalize; + slap_mr_match_func * mrd_match; + slap_mr_indexer_func * mrd_indexer; + slap_mr_filter_func * mrd_filter; }; /* @@ -414,108 +421,108 @@ struct mrule_defs_rec { struct mrule_defs_rec mrule_defs[] = { {"( 2.5.13.0 NAME 'objectIdentifierMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )", - NULL, NULL, objectIdentifierMatch}, + NULL, NULL, objectIdentifierMatch, NULL, NULL}, {"( 2.5.13.1 NAME 'distinguishedNameMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", - NULL, NULL, distinguishedNameMatch}, + NULL, NULL, distinguishedNameMatch, NULL, NULL}, {"( 2.5.13.2 NAME 'caseIgnoreMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", - NULL, UTF8StringNormalize, caseIgnoreMatch}, + NULL, UTF8StringNormalize, caseIgnoreMatch, NULL, NULL}, {"( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", - NULL, UTF8StringNormalize, caseIgnoreOrderingMatch}, + NULL, UTF8StringNormalize, caseIgnoreOrderingMatch, NULL, NULL}, {"( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", - NULL, UTF8StringNormalize, caseIgnoreSubstringsMatch}, + NULL, UTF8StringNormalize, caseIgnoreSubstringsMatch, NULL, NULL}, /* Next three are not in the RFC's, but are needed for compatibility */ {"( 2.5.13.5 NAME 'caseExactMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", - NULL, UTF8StringNormalize, caseExactMatch}, + NULL, UTF8StringNormalize, caseExactMatch, NULL, NULL}, {"( 2.5.13.6 NAME 'caseExactOrderingMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", - NULL, UTF8StringNormalize, caseExactOrderingMatch}, + NULL, UTF8StringNormalize, caseExactOrderingMatch, NULL, NULL}, {"( 2.5.13.7 NAME 'caseExactSubstringsMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", - NULL, UTF8StringNormalize, caseExactSubstringsMatch}, + NULL, UTF8StringNormalize, caseExactSubstringsMatch, NULL, NULL}, {"( 2.5.13.8 NAME 'numericStringMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )", - NULL, NULL, numericStringMatch}, + NULL, NULL, numericStringMatch, NULL, NULL}, {"( 2.5.13.10 NAME 'numericStringSubstringsMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", - NULL, NULL, numericStringSubstringsMatch}, + NULL, NULL, numericStringSubstringsMatch, NULL, NULL}, {"( 2.5.13.11 NAME 'caseIgnoreListMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )", - NULL, NULL, caseIgnoreListMatch}, + NULL, NULL, caseIgnoreListMatch, NULL, NULL}, {"( 2.5.13.14 NAME 'integerMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", - NULL, NULL, integerMatch}, + NULL, NULL, integerMatch, NULL, NULL}, {"( 2.5.13.16 NAME 'bitStringMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )", - NULL, NULL, bitStringMatch}, + NULL, NULL, bitStringMatch, NULL, NULL}, {"( 2.5.13.17 NAME 'octetStringMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )", - NULL, NULL, octetStringMatch}, + NULL, NULL, octetStringMatch, NULL, NULL}, {"( 2.5.13.20 NAME 'telephoneNumberMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )", - NULL, NULL, telephoneNumberMatch}, + NULL, NULL, telephoneNumberMatch, NULL, NULL}, {"( 2.5.13.21 NAME 'telephoneNumberSubstringsMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", - NULL, NULL, telephoneNumberSubstringsMatch}, + NULL, NULL, telephoneNumberSubstringsMatch, NULL, NULL}, {"( 2.5.13.22 NAME 'presentationAddressMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.43 )", - NULL, NULL, presentationAddressMatch}, + NULL, NULL, presentationAddressMatch, NULL, NULL}, {"( 2.5.13.23 NAME 'uniqueMemberMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )", - NULL, NULL, uniqueMemberMatch}, + NULL, NULL, uniqueMemberMatch, NULL, NULL}, {"( 2.5.13.24 NAME 'protocolInformationMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.42 )", - NULL, NULL, protocolInformationMatch}, + NULL, NULL, protocolInformationMatch, NULL, NULL}, {"( 2.5.13.27 NAME 'generalizedTimeMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )", - NULL, NULL, generalizedTimeMatch}, + NULL, NULL, generalizedTimeMatch, NULL, NULL}, {"( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )", - NULL, NULL, generalizedTimeOrderingMatch}, + NULL, NULL, generalizedTimeOrderingMatch, NULL, NULL}, {"( 2.5.13.29 NAME 'integerFirstComponentMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", - NULL, NULL, integerFirstComponentMatch}, + NULL, NULL, integerFirstComponentMatch, NULL, NULL}, {"( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )", - NULL, NULL, objectIdentifierFirstComponentMatch}, + NULL, NULL, objectIdentifierFirstComponentMatch, NULL, NULL}, {"( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", - NULL, IA5StringNormalize, caseExactIA5Match}, + NULL, IA5StringNormalize, caseExactIA5Match, NULL, NULL}, {"( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", - NULL, IA5StringNormalize, caseIgnoreIA5Match}, + NULL, IA5StringNormalize, caseIgnoreIA5Match, NULL, NULL}, {"( 1.3.6.1.4.1.1466.109.114.3 NAME 'caseIgnoreIA5SubstringsMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", - NULL, IA5StringNormalize, caseIgnoreIA5SubstringsMatch}, + NULL, IA5StringNormalize, caseIgnoreIA5SubstringsMatch, NULL, NULL}, {NULL, NULL, NULL, NULL} }; @@ -533,6 +540,7 @@ schema_init( void ) for ( i=0; syntax_defs[i].sd_desc != NULL; i++ ) { res = register_syntax( syntax_defs[i].sd_desc, + syntax_defs[i].sd_flags, syntax_defs[i].sd_validate, syntax_defs[i].sd_ber2str, syntax_defs[i].sd_str2ber ); @@ -549,7 +557,9 @@ schema_init( void ) mrule_defs[i].mrd_desc, mrule_defs[i].mrd_convert, mrule_defs[i].mrd_normalize, - mrule_defs[i].mrd_match ); + mrule_defs[i].mrd_match, + mrule_defs[i].mrd_indexer, + mrule_defs[i].mrd_filter ); if ( res ) { fprintf( stderr, diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 834006c5b9..8323344a4d 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -148,6 +148,9 @@ typedef struct slap_syntax { LDAP_SYNTAX ssyn_syn; int ssyn_flags; +#define SLAP_SYNTAX_NONE 0 +#define SLAP_SYNTAX_BINARY 1 + slap_syntax_validate_func *ssyn_validate; /* convert to and from binary */ -- 2.39.5