1 /* schema_init.c - init builtin schema */
4 * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
5 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
13 #include <ac/string.h>
14 #include <ac/socket.h>
22 #include "lutil_md5.h"
23 /* We should replace MD5 with a faster hash */
24 #define HASH_BYTES LUTIL_MD5_BYTES
25 #define HASH_CONTEXT lutil_MD5_CTX
26 #define HASH_Init(c) lutil_MD5Init(c)
27 #define HASH_Update(c,buf,len) lutil_MD5Update(c,buf,len)
28 #define HASH_Final(d,c) lutil_MD5Final(d,c)
30 #include "lutil_hash.h"
31 /* We should replace MD5 with a faster hash */
32 #define HASH_BYTES LUTIL_HASH_BYTES
33 #define HASH_CONTEXT lutil_HASH_CTX
34 #define HASH_Init(c) lutil_HASHInit(c)
35 #define HASH_Update(c,buf,len) lutil_HASHUpdate(c,buf,len)
36 #define HASH_Final(d,c) lutil_HASHFinal(d,c)
39 /* recycled validatation routines */
40 #define berValidate blobValidate
42 /* unimplemented pretters */
44 #define integerPretty NULL
46 /* recycled matching routines */
47 #define bitStringMatch octetStringMatch
48 #define integerMatch caseIgnoreIA5Match
49 #define numericStringMatch caseIgnoreMatch
50 #define objectIdentifierMatch numericStringMatch
51 #define telephoneNumberMatch numericStringMatch
52 #define telephoneNumberSubstringsMatch caseIgnoreIA5SubstringsMatch
53 #define generalizedTimeMatch numericStringMatch
54 #define generalizedTimeOrderingMatch numericStringMatch
55 #define uniqueMemberMatch dnMatch
57 /* approx matching rules */
58 #define directoryStringApproxMatchOID "1.3.6.1.4.1.4203.666.4.4"
59 #define directoryStringApproxMatch approxMatch
60 #define directoryStringApproxIndexer approxIndexer
61 #define directoryStringApproxFilter approxFilter
62 #define IA5StringApproxMatchOID "1.3.6.1.4.1.4203.666.4.5"
63 #define IA5StringApproxMatch approxMatch
64 #define IA5StringApproxIndexer approxIndexer
65 #define IA5StringApproxFilter approxFilter
67 /* orderring matching rules */
68 #define caseIgnoreOrderingMatch caseIgnoreMatch
69 #define caseExactOrderingMatch caseExactMatch
71 /* unimplemented matching routines */
72 #define caseIgnoreListMatch NULL
73 #define caseIgnoreListSubstringsMatch NULL
74 #define presentationAddressMatch NULL
75 #define protocolInformationMatch NULL
76 #define integerFirstComponentMatch NULL
78 #define OpenLDAPaciMatch NULL
79 #define authPasswordMatch NULL
81 /* recycled indexing/filtering routines */
82 #define dnIndexer caseIgnoreIndexer
83 #define dnFilter caseIgnoreFilter
84 #define integerIndexer caseIgnoreIA5Indexer
85 #define integerFilter caseIgnoreIA5Filter
87 static char *strcasechr( const char *str, int c )
89 char *lower = strchr( str, TOLOWER(c) );
90 char *upper = strchr( str, TOUPPER(c) );
92 if( lower && upper ) {
93 return lower < upper ? lower : upper;
107 struct berval *value,
108 void *assertedValue )
110 int match = value->bv_len - ((struct berval *) assertedValue)->bv_len;
113 match = memcmp( value->bv_val,
114 ((struct berval *) assertedValue)->bv_val,
122 /* Index generation function */
123 int octetStringIndexer(
128 struct berval *prefix,
129 struct berval **values,
130 struct berval ***keysp )
134 struct berval **keys;
135 HASH_CONTEXT HASHcontext;
136 unsigned char HASHdigest[HASH_BYTES];
137 struct berval digest;
138 digest.bv_val = HASHdigest;
139 digest.bv_len = sizeof(HASHdigest);
141 /* we should have at least one value at this point */
142 assert( values != NULL && values[0] != NULL );
144 for( i=0; values[i] != NULL; i++ ) {
145 /* just count them */
148 keys = ch_malloc( sizeof( struct berval * ) * (i+1) );
150 slen = strlen( syntax->ssyn_oid );
151 mlen = strlen( mr->smr_oid );
153 for( i=0; values[i] != NULL; i++ ) {
154 HASH_Init( &HASHcontext );
155 if( prefix != NULL && prefix->bv_len > 0 ) {
156 HASH_Update( &HASHcontext,
157 prefix->bv_val, prefix->bv_len );
159 HASH_Update( &HASHcontext,
160 syntax->ssyn_oid, slen );
161 HASH_Update( &HASHcontext,
163 HASH_Update( &HASHcontext,
164 values[i]->bv_val, values[i]->bv_len );
165 HASH_Final( HASHdigest, &HASHcontext );
167 keys[i] = ber_bvdup( &digest );
177 /* Index generation function */
178 int octetStringFilter(
183 struct berval *prefix,
185 struct berval ***keysp )
188 struct berval **keys;
189 HASH_CONTEXT HASHcontext;
190 unsigned char HASHdigest[HASH_BYTES];
191 struct berval *value = (struct berval *) assertValue;
192 struct berval digest;
193 digest.bv_val = HASHdigest;
194 digest.bv_len = sizeof(HASHdigest);
196 slen = strlen( syntax->ssyn_oid );
197 mlen = strlen( mr->smr_oid );
199 keys = ch_malloc( sizeof( struct berval * ) * 2 );
201 HASH_Init( &HASHcontext );
202 if( prefix != NULL && prefix->bv_len > 0 ) {
203 HASH_Update( &HASHcontext,
204 prefix->bv_val, prefix->bv_len );
206 HASH_Update( &HASHcontext,
207 syntax->ssyn_oid, slen );
208 HASH_Update( &HASHcontext,
210 HASH_Update( &HASHcontext,
211 value->bv_val, value->bv_len );
212 HASH_Final( HASHdigest, &HASHcontext );
214 keys[0] = ber_bvdup( &digest );
230 if( in->bv_len == 0 ) return LDAP_SUCCESS;
232 dn = ch_strdup( in->bv_val );
234 rc = dn_validate( dn ) == NULL
235 ? LDAP_INVALID_SYNTAX : LDAP_SUCCESS;
245 struct berval **normalized )
247 struct berval *out = ber_bvdup( val );
249 if( out->bv_len != 0 ) {
251 #ifdef USE_DN_NORMALIZE
252 dn = dn_normalize( out->bv_val );
254 dn = dn_validate( out->bv_val );
259 return LDAP_INVALID_SYNTAX;
263 out->bv_len = strlen( dn );
276 struct berval *value,
277 void *assertedValue )
280 struct berval *asserted = (struct berval *) assertedValue;
282 match = value->bv_len - asserted->bv_len;
285 #ifdef USE_DN_NORMALIZE
286 match = strcmp( value->bv_val, asserted->bv_val );
288 match = strcasecmp( value->bv_val, asserted->bv_val );
292 Debug( LDAP_DEBUG_ARGS, "dnMatch %d\n\t\"%s\"\n\t\"%s\"\n",
293 match, value->bv_val, asserted->bv_val );
307 if( in->bv_len == 0 ) return LDAP_SUCCESS;
309 dn = ber_bvdup( in );
311 if( dn->bv_val[dn->bv_len-1] == '\'' ) {
312 /* assume presence of optional UID */
315 for(i=dn->bv_len-2; i>2; i--) {
316 if( dn->bv_val[i] != '0' && dn->bv_val[i] != '1' ) {
320 if( dn->bv_val[i] != '\'' ) {
321 return LDAP_INVALID_SYNTAX;
323 if( dn->bv_val[i-1] != 'B' ) {
324 return LDAP_INVALID_SYNTAX;
326 if( dn->bv_val[i-2] != '#' ) {
327 return LDAP_INVALID_SYNTAX;
330 /* trim the UID to allow use of dn_validate */
331 dn->bv_val[i-2] = '\0';
334 rc = dn_validate( dn->bv_val ) == NULL
335 ? LDAP_INVALID_SYNTAX : LDAP_SUCCESS;
345 struct berval **normalized )
347 struct berval *out = ber_bvdup( val );
349 if( out->bv_len != 0 ) {
353 ber_len_t uidlen = 0;
355 if( out->bv_val[out->bv_len-1] == '\'' ) {
356 /* assume presence of optional UID */
357 uid = strrchr( out->bv_val, '#' );
361 return LDAP_INVALID_SYNTAX;
364 uidlen = out->bv_len - (out->bv_val - uid);
365 /* temporarily trim the UID */
369 #ifdef USE_DN_NORMALIZE
370 dn = dn_normalize( out->bv_val );
372 dn = dn_validate( out->bv_val );
377 return LDAP_INVALID_SYNTAX;
383 /* restore the separator */
386 SAFEMEMCPY( &dn[dnlen], uid, uidlen );
390 out->bv_len = dnlen + uidlen;
402 /* any value allowed */
411 /* any value allowed */
422 /* very unforgiving validation, requires no normalization
423 * before simplistic matching
425 if( in->bv_len < 3 ) {
426 return LDAP_INVALID_SYNTAX;
428 if( in->bv_val[0] != 'B' ||
429 in->bv_val[1] != '\'' ||
430 in->bv_val[in->bv_len-1] != '\'' )
432 return LDAP_INVALID_SYNTAX;
435 for( i=in->bv_len-2; i>1; i-- ) {
436 if( in->bv_val[i] != '0' && in->bv_val[i] != '1' ) {
437 return LDAP_INVALID_SYNTAX;
445 * Handling boolean syntax and matching is quite rigid.
446 * A more flexible approach would be to allow a variety
447 * of strings to be normalized and prettied into TRUE
455 /* very unforgiving validation, requires no normalization
456 * before simplistic matching
459 if( in->bv_len == 4 ) {
460 if( !memcmp( in->bv_val, "TRUE", 4 ) ) {
463 } else if( in->bv_len == 5 ) {
464 if( !memcmp( in->bv_val, "FALSE", 5 ) ) {
469 return LDAP_INVALID_SYNTAX;
478 struct berval *value,
479 void *assertedValue )
481 /* simplistic matching allowed by rigid validation */
482 struct berval *asserted = (struct berval *) assertedValue;
483 *matchp = value->bv_len != asserted->bv_len;
490 struct berval *right,
491 struct berval *left )
495 ldap_unicode_t ru, lu;
496 ldap_unicode_t ruu, luu;
499 r < right->bv_len && l < left->bv_len;
503 * XXYYZ: we convert to ucs4 even though -llunicode
504 * expects ucs2 in an unsigned long
506 ru = ldap_utf8_to_ucs4( &right->bv_val[r] );
507 if( ru == LDAP_UCS4_INVALID ) {
511 lu = ldap_utf8_to_ucs4( &left->bv_val[l] );
512 if( lu == LDAP_UCS4_INVALID ) {
516 ruu = uctoupper( ru );
517 luu = uctoupper( lu );
521 } else if( luu > ruu ) {
525 rlen = LDAP_UTF8_CHARLEN( &right->bv_val[r] );
526 llen = LDAP_UTF8_CHARLEN( &left->bv_val[l] );
529 if( r < right->bv_len ) {
534 if( l < left->bv_len ) {
542 /* case insensitive UTF8 strncmp with offset for second string */
545 struct berval *right,
553 ldap_unicode_t ru, lu;
554 ldap_unicode_t ruu, luu;
556 rslen = len < right->bv_len ? len : right->bv_len;
557 lslen = len + offset < left->bv_len ? len : left->bv_len;
559 for( r = 0, l = offset;
560 r < rslen && l < lslen;
564 * XXYYZ: we convert to ucs4 even though -llunicode
565 * expects ucs2 in an unsigned long
567 ru = ldap_utf8_to_ucs4( &right->bv_val[r] );
568 if( ru == LDAP_UCS4_INVALID ) {
572 lu = ldap_utf8_to_ucs4( &left->bv_val[l] );
573 if( lu == LDAP_UCS4_INVALID ) {
577 ruu = uctoupper( ru );
578 luu = uctoupper( lu );
582 } else if( luu > ruu ) {
586 rlen = LDAP_UTF8_CHARLEN( &right->bv_val[r] );
587 llen = LDAP_UTF8_CHARLEN( &left->bv_val[l] );
603 static char *UTF8casechr( const char *str, const char *c )
605 char *p, *lower, *upper;
606 ldap_ucs4_t tch, ch = ldap_utf8_to_ucs4(c);
608 tch = uctolower ( ch );
609 for( p = (char *) str; *p != '\0'; LDAP_UTF8_INCR(p) ) {
610 if( ldap_utf8_to_ucs4( p ) == tch ) {
614 lower = *p != '\0' ? p : NULL;
616 tch = uctoupper ( ch );
617 for( p = (char *) str; *p != '\0'; LDAP_UTF8_INCR(p) ) {
618 if( ldap_utf8_to_ucs4( p ) == tch ) {
622 upper = *p != '\0' ? p : NULL;
624 if( lower && upper ) {
625 return lower < upper ? lower : upper;
626 } else if ( lower ) {
641 unsigned char *u = in->bv_val;
643 if( !in->bv_len ) return LDAP_INVALID_SYNTAX;
645 for( count = in->bv_len; count > 0; count-=len, u+=len ) {
646 /* get the length indicated by the first byte */
647 len = LDAP_UTF8_CHARLEN( u );
649 /* should not be zero */
650 if( len == 0 ) return LDAP_INVALID_SYNTAX;
652 /* make sure len corresponds with the offset
653 to the next character */
654 if( LDAP_UTF8_OFFSET( u ) != len ) return LDAP_INVALID_SYNTAX;
657 if( count != 0 ) return LDAP_INVALID_SYNTAX;
666 struct berval **normalized )
668 struct berval *newval;
671 newval = ch_malloc( sizeof( struct berval ) );
675 /* Ignore initial whitespace */
676 while ( ldap_utf8_isspace( p ) ) {
682 return LDAP_INVALID_SYNTAX;
685 newval->bv_val = ch_strdup( p );
686 p = q = newval->bv_val;
692 if ( ldap_utf8_isspace( p ) ) {
693 len = LDAP_UTF8_COPY(q,p);
698 /* Ignore the extra whitespace */
699 while ( ldap_utf8_isspace( p ) ) {
703 len = LDAP_UTF8_COPY(q,p);
710 assert( *newval->bv_val );
711 assert( newval->bv_val < p );
714 /* cannot start with a space */
715 assert( !ldap_utf8_isspace(newval->bv_val) );
718 * If the string ended in space, backup the pointer one
719 * position. One is enough because the above loop collapsed
720 * all whitespace to a single space.
727 /* cannot end with a space */
728 assert( !ldap_utf8_isspace( LDAP_UTF8_PREV(q) ) );
733 newval->bv_len = q - newval->bv_val;
734 *normalized = newval;
739 #if defined(SLAPD_APPROX_MULTISTRING)
741 #if defined(SLAPD_APPROX_INITIALS)
742 #define SLAPD_APPROX_DELIMITER "._ "
743 #define SLAPD_APPROX_WORDLEN 2
745 #define SLAPD_APPROX_DELIMITER " "
746 #define SLAPD_APPROX_WORDLEN 1
755 struct berval *value,
756 void *assertedValue )
758 char *val, *assertv, **values, **words, *c;
759 int i, count, len, nextchunk=0, nextavail=0;
762 /* Isolate how many words there are */
763 val = ch_strdup( value->bv_val );
764 for( c=val,count=1; *c; c++ ) {
765 c = strpbrk( c, SLAPD_APPROX_DELIMITER );
766 if ( c == NULL ) break;
771 /* Get a phonetic copy of each word */
772 words = (char **)ch_malloc( count * sizeof(char *) );
773 values = (char **)ch_malloc( count * sizeof(char *) );
774 for( c=val,i=0; i<count; i++,c+=strlen(c)+1 ) {
776 values[i] = phonetic(c);
780 /* Work through the asserted value's words, to see if at least some
781 of the words are there, in the same order. */
782 assertv = ch_strdup( ((struct berval *)assertedValue)->bv_val );
784 while ( nextchunk < ((struct berval *)assertedValue)->bv_len ) {
785 len = strcspn( assertv + nextchunk, SLAPD_APPROX_DELIMITER);
790 #if defined(SLAPD_APPROX_INITIALS)
791 else if( len == 1 ) {
792 /* Single letter words need to at least match one word's initial */
793 for( i=nextavail; i<count; i++ )
794 if( !strncasecmp( assertv+nextchunk, words[i], 1 )) {
801 /* Isolate the next word in the asserted value and phonetic it */
802 assertv[nextchunk+len] = '\0';
803 val = phonetic( assertv + nextchunk );
805 /* See if this phonetic chunk is in the remaining words of *value */
806 for( i=nextavail; i<count; i++ ){
807 if( !strcmp( val, values[i] ) ){
814 /* This chunk in the asserted value was NOT within the *value. */
820 /* Go on to the next word in the asserted value */
824 /* If some of the words were seen, call it a match */
825 if( nextavail > 0 ) {
834 for( i=0; i<count; i++ ) {
835 ch_free( values[i] );
851 struct berval *prefix,
852 struct berval **values,
853 struct berval ***keysp )
856 int i,j, len, wordcount, keycount=0;
857 struct berval **newkeys, **keys=NULL;
860 for( j=0; values[j] != NULL; j++ ) {
862 /* Isolate how many words there are. There will be a key for each */
863 val = ch_strdup( values[j]->bv_val );
864 for( wordcount=0,c=val; *c; c++) {
865 len = strcspn(c, SLAPD_APPROX_DELIMITER);
866 if( len >= SLAPD_APPROX_WORDLEN ) wordcount++;
868 if (*c == '\0') break;
872 /* Allocate/increase storage to account for new keys */
873 newkeys = (struct berval **)ch_malloc( (keycount + wordcount + 1)
874 * sizeof(struct berval *) );
875 memcpy( newkeys, keys, keycount * sizeof(struct berval *) );
876 if( keys ) ch_free( keys );
879 /* Get a phonetic copy of each word */
880 for( c=val,i=0; i<wordcount; c+=len+1 ) {
882 if( len < SLAPD_APPROX_WORDLEN ) continue;
883 keys[keycount] = (struct berval *)ch_malloc( sizeof(struct berval) );
884 keys[keycount]->bv_val = phonetic( c );
885 keys[keycount]->bv_len = strlen( keys[keycount]->bv_val );
892 keys[keycount] = NULL;
905 struct berval *prefix,
907 struct berval ***keysp )
911 struct berval **keys;
914 /* Isolate how many words there are. There will be a key for each */
915 val = ch_strdup( ((struct berval *)assertValue)->bv_val );
916 for( count=0,c=val; *c; c++) {
917 len = strcspn(c, SLAPD_APPROX_DELIMITER);
918 if( len >= SLAPD_APPROX_WORDLEN ) count++;
920 if (*c == '\0') break;
924 /* Allocate storage for new keys */
925 keys = (struct berval **)ch_malloc( (count + 1) * sizeof(struct berval *) );
927 /* Get a phonetic copy of each word */
928 for( c=val,i=0; i<count; c+=len+1 ) {
930 if( len < SLAPD_APPROX_WORDLEN ) continue;
931 keys[i] = (struct berval *)ch_malloc( sizeof(struct berval) );
932 keys[i]->bv_val = phonetic( c );
933 keys[i]->bv_len = strlen( keys[i]->bv_val );
947 /* No other form of Approximate Matching is defined */
955 struct berval *value,
956 void *assertedValue )
958 char *vapprox, *avapprox;
960 vapprox = phonetic( value->bv_val );
961 avapprox = phonetic( ((struct berval *)assertedValue)->bv_val);
963 *matchp = strcmp( vapprox, avapprox );
977 struct berval *prefix,
978 struct berval **values,
979 struct berval ***keysp )
982 struct berval **keys;
985 for( i=0; values[i] != NULL; i++ ) {
986 /* just count them */
990 keys = (struct berval **)ch_malloc( sizeof( struct berval * ) * (i+1) );
992 /* Copy each value and run it through phonetic() */
993 for( i=0; values[i] != NULL; i++ ) {
994 keys[i] = ch_malloc( sizeof( struct berval * ) );
995 keys[i]->bv_val = phonetic( values[i]->bv_val );
996 keys[i]->bv_len = strlen( keys[i]->bv_val );
1001 return LDAP_SUCCESS;
1011 struct berval *prefix,
1013 struct berval ***keysp )
1015 struct berval **keys;
1018 keys = (struct berval **)ch_malloc( sizeof( struct berval * ) * 2 );
1020 /* Copy the value and run it through phonetic() */
1021 keys[0] = ch_malloc( sizeof( struct berval * ) );
1022 keys[0]->bv_val = phonetic( ((struct berval *)assertValue)->bv_val );
1023 keys[0]->bv_len = strlen( keys[0]->bv_val );
1027 return LDAP_SUCCESS;
1038 struct berval *value,
1039 void *assertedValue )
1041 int match = value->bv_len - ((struct berval *) assertedValue)->bv_len;
1044 match = strncmp( value->bv_val,
1045 ((struct berval *) assertedValue)->bv_val,
1050 return LDAP_SUCCESS;
1054 caseExactSubstringsMatch(
1059 struct berval *value,
1060 void *assertedValue )
1063 SubstringsAssertion *sub = assertedValue;
1064 struct berval left = *value;
1068 /* Add up asserted input length */
1069 if( sub->sa_initial ) {
1070 inlen += sub->sa_initial->bv_len;
1073 for(i=0; sub->sa_any[i] != NULL; i++) {
1074 inlen += sub->sa_any[i]->bv_len;
1077 if( sub->sa_final ) {
1078 inlen += sub->sa_final->bv_len;
1081 if( sub->sa_initial ) {
1082 if( inlen > left.bv_len ) {
1087 match = strncmp( sub->sa_initial->bv_val, left.bv_val,
1088 sub->sa_initial->bv_len );
1094 left.bv_val += sub->sa_initial->bv_len;
1095 left.bv_len -= sub->sa_initial->bv_len;
1096 inlen -= sub->sa_initial->bv_len;
1099 if( sub->sa_final ) {
1100 if( inlen > left.bv_len ) {
1105 match = strncmp( sub->sa_final->bv_val,
1106 &left.bv_val[left.bv_len - sub->sa_final->bv_len],
1107 sub->sa_final->bv_len );
1113 left.bv_len -= sub->sa_final->bv_len;
1114 inlen -= sub->sa_final->bv_len;
1118 for(i=0; sub->sa_any[i]; i++) {
1123 if( inlen > left.bv_len ) {
1124 /* not enough length */
1129 if( sub->sa_any[i]->bv_len == 0 ) {
1133 p = strchr( left.bv_val, *sub->sa_any[i]->bv_val );
1140 idx = p - left.bv_val;
1141 assert( idx < left.bv_len );
1143 if( idx >= left.bv_len ) {
1144 /* this shouldn't happen */
1151 if( sub->sa_any[i]->bv_len > left.bv_len ) {
1152 /* not enough left */
1157 match = strncmp( left.bv_val,
1158 sub->sa_any[i]->bv_val,
1159 sub->sa_any[i]->bv_len );
1167 left.bv_val += sub->sa_any[i]->bv_len;
1168 left.bv_len -= sub->sa_any[i]->bv_len;
1169 inlen -= sub->sa_any[i]->bv_len;
1175 return LDAP_SUCCESS;
1178 /* Index generation function */
1179 int caseExactIndexer(
1184 struct berval *prefix,
1185 struct berval **values,
1186 struct berval ***keysp )
1190 struct berval **keys;
1191 HASH_CONTEXT HASHcontext;
1192 unsigned char HASHdigest[HASH_BYTES];
1193 struct berval digest;
1194 digest.bv_val = HASHdigest;
1195 digest.bv_len = sizeof(HASHdigest);
1197 /* we should have at least one value at this point */
1198 assert( values != NULL && values[0] != NULL );
1200 for( i=0; values[i] != NULL; i++ ) {
1201 /* just count them */
1204 keys = ch_malloc( sizeof( struct berval * ) * (i+1) );
1206 slen = strlen( syntax->ssyn_oid );
1207 mlen = strlen( mr->smr_oid );
1209 for( i=0; values[i] != NULL; i++ ) {
1210 struct berval *value = values[i];
1212 HASH_Init( &HASHcontext );
1213 if( prefix != NULL && prefix->bv_len > 0 ) {
1214 HASH_Update( &HASHcontext,
1215 prefix->bv_val, prefix->bv_len );
1217 HASH_Update( &HASHcontext,
1218 syntax->ssyn_oid, slen );
1219 HASH_Update( &HASHcontext,
1220 mr->smr_oid, mlen );
1221 HASH_Update( &HASHcontext,
1222 value->bv_val, value->bv_len );
1223 HASH_Final( HASHdigest, &HASHcontext );
1225 keys[i] = ber_bvdup( &digest );
1230 return LDAP_SUCCESS;
1233 /* Index generation function */
1234 int caseExactFilter(
1239 struct berval *prefix,
1241 struct berval ***keysp )
1244 struct berval **keys;
1245 HASH_CONTEXT HASHcontext;
1246 unsigned char HASHdigest[HASH_BYTES];
1247 struct berval *value;
1248 struct berval digest;
1249 digest.bv_val = HASHdigest;
1250 digest.bv_len = sizeof(HASHdigest);
1252 slen = strlen( syntax->ssyn_oid );
1253 mlen = strlen( mr->smr_oid );
1255 value = (struct berval *) assertValue;
1257 keys = ch_malloc( sizeof( struct berval * ) * 2 );
1259 HASH_Init( &HASHcontext );
1260 if( prefix != NULL && prefix->bv_len > 0 ) {
1261 HASH_Update( &HASHcontext,
1262 prefix->bv_val, prefix->bv_len );
1264 HASH_Update( &HASHcontext,
1265 syntax->ssyn_oid, slen );
1266 HASH_Update( &HASHcontext,
1267 mr->smr_oid, mlen );
1268 HASH_Update( &HASHcontext,
1269 value->bv_val, value->bv_len );
1270 HASH_Final( HASHdigest, &HASHcontext );
1272 keys[0] = ber_bvdup( &digest );
1276 return LDAP_SUCCESS;
1279 /* Substrings Index generation function */
1280 int caseExactSubstringsIndexer(
1285 struct berval *prefix,
1286 struct berval **values,
1287 struct berval ***keysp )
1291 struct berval **keys;
1292 HASH_CONTEXT HASHcontext;
1293 unsigned char HASHdigest[HASH_BYTES];
1294 struct berval digest;
1295 digest.bv_val = HASHdigest;
1296 digest.bv_len = sizeof(HASHdigest);
1298 /* we should have at least one value at this point */
1299 assert( values != NULL && values[0] != NULL );
1302 for( i=0; values[i] != NULL; i++ ) {
1303 /* count number of indices to generate */
1304 if( values[i]->bv_len < SLAP_INDEX_SUBSTR_MINLEN ) {
1308 if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
1309 if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
1310 nkeys += SLAP_INDEX_SUBSTR_MAXLEN -
1311 ( SLAP_INDEX_SUBSTR_MINLEN - 1);
1313 nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MINLEN - 1 );
1317 if( flags & SLAP_INDEX_SUBSTR_ANY ) {
1318 if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
1319 nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
1323 if( flags & SLAP_INDEX_SUBSTR_FINAL ) {
1324 if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
1325 nkeys += SLAP_INDEX_SUBSTR_MAXLEN -
1326 ( SLAP_INDEX_SUBSTR_MINLEN - 1);
1328 nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MINLEN - 1 );
1334 /* no keys to generate */
1336 return LDAP_SUCCESS;
1339 keys = ch_malloc( sizeof( struct berval * ) * (nkeys+1) );
1341 slen = strlen( syntax->ssyn_oid );
1342 mlen = strlen( mr->smr_oid );
1345 for( i=0; values[i] != NULL; i++ ) {
1347 struct berval *value;
1350 if( value->bv_len < SLAP_INDEX_SUBSTR_MINLEN ) continue;
1352 if( ( flags & SLAP_INDEX_SUBSTR_ANY ) &&
1353 ( value->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) )
1355 char pre = SLAP_INDEX_SUBSTR_PREFIX;
1356 max = value->bv_len - ( SLAP_INDEX_SUBSTR_MAXLEN - 1);
1358 for( j=0; j<max; j++ ) {
1359 HASH_Init( &HASHcontext );
1360 if( prefix != NULL && prefix->bv_len > 0 ) {
1361 HASH_Update( &HASHcontext,
1362 prefix->bv_val, prefix->bv_len );
1365 HASH_Update( &HASHcontext,
1366 &pre, sizeof( pre ) );
1367 HASH_Update( &HASHcontext,
1368 syntax->ssyn_oid, slen );
1369 HASH_Update( &HASHcontext,
1370 mr->smr_oid, mlen );
1371 HASH_Update( &HASHcontext,
1373 SLAP_INDEX_SUBSTR_MAXLEN );
1374 HASH_Final( HASHdigest, &HASHcontext );
1376 keys[nkeys++] = ber_bvdup( &digest );
1380 max = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
1381 ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
1383 for( j=SLAP_INDEX_SUBSTR_MINLEN; j<=max; j++ ) {
1386 if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
1387 pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX;
1388 HASH_Init( &HASHcontext );
1389 if( prefix != NULL && prefix->bv_len > 0 ) {
1390 HASH_Update( &HASHcontext,
1391 prefix->bv_val, prefix->bv_len );
1393 HASH_Update( &HASHcontext,
1394 &pre, sizeof( pre ) );
1395 HASH_Update( &HASHcontext,
1396 syntax->ssyn_oid, slen );
1397 HASH_Update( &HASHcontext,
1398 mr->smr_oid, mlen );
1399 HASH_Update( &HASHcontext,
1401 HASH_Final( HASHdigest, &HASHcontext );
1403 keys[nkeys++] = ber_bvdup( &digest );
1406 if( flags & SLAP_INDEX_SUBSTR_FINAL ) {
1407 pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX;
1408 HASH_Init( &HASHcontext );
1409 if( prefix != NULL && prefix->bv_len > 0 ) {
1410 HASH_Update( &HASHcontext,
1411 prefix->bv_val, prefix->bv_len );
1413 HASH_Update( &HASHcontext,
1414 &pre, sizeof( pre ) );
1415 HASH_Update( &HASHcontext,
1416 syntax->ssyn_oid, slen );
1417 HASH_Update( &HASHcontext,
1418 mr->smr_oid, mlen );
1419 HASH_Update( &HASHcontext,
1420 &value->bv_val[value->bv_len-j], j );
1421 HASH_Final( HASHdigest, &HASHcontext );
1423 keys[nkeys++] = ber_bvdup( &digest );
1437 return LDAP_SUCCESS;
1440 int caseExactSubstringsFilter(
1445 struct berval *prefix,
1447 struct berval ***keysp )
1449 SubstringsAssertion *sa = assertValue;
1451 ber_len_t nkeys = 0;
1452 size_t slen, mlen, klen;
1453 struct berval **keys;
1454 HASH_CONTEXT HASHcontext;
1455 unsigned char HASHdigest[HASH_BYTES];
1456 struct berval *value;
1457 struct berval digest;
1459 if( flags & SLAP_INDEX_SUBSTR_INITIAL && sa->sa_initial != NULL &&
1460 sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
1465 if( flags & SLAP_INDEX_SUBSTR_ANY && sa->sa_any != NULL ) {
1467 for( i=0; sa->sa_any[i] != NULL; i++ ) {
1468 if( sa->sa_any[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
1469 /* don't bother accounting for stepping */
1470 nkeys += sa->sa_any[i]->bv_len -
1471 ( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
1476 if( flags & SLAP_INDEX_SUBSTR_FINAL && sa->sa_final != NULL &&
1477 sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
1484 return LDAP_SUCCESS;
1487 digest.bv_val = HASHdigest;
1488 digest.bv_len = sizeof(HASHdigest);
1490 slen = strlen( syntax->ssyn_oid );
1491 mlen = strlen( mr->smr_oid );
1493 keys = ch_malloc( sizeof( struct berval * ) * (nkeys+1) );
1496 if( flags & SLAP_INDEX_SUBSTR_INITIAL && sa->sa_initial != NULL &&
1497 sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
1499 pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX;
1500 value = sa->sa_initial;
1502 klen = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
1503 ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
1505 HASH_Init( &HASHcontext );
1506 if( prefix != NULL && prefix->bv_len > 0 ) {
1507 HASH_Update( &HASHcontext,
1508 prefix->bv_val, prefix->bv_len );
1510 HASH_Update( &HASHcontext,
1511 &pre, sizeof( pre ) );
1512 HASH_Update( &HASHcontext,
1513 syntax->ssyn_oid, slen );
1514 HASH_Update( &HASHcontext,
1515 mr->smr_oid, mlen );
1516 HASH_Update( &HASHcontext,
1517 value->bv_val, klen );
1518 HASH_Final( HASHdigest, &HASHcontext );
1520 keys[nkeys++] = ber_bvdup( &digest );
1523 if( flags & SLAP_INDEX_SUBSTR_ANY && sa->sa_any != NULL ) {
1525 pre = SLAP_INDEX_SUBSTR_PREFIX;
1526 klen = SLAP_INDEX_SUBSTR_MAXLEN;
1528 for( i=0; sa->sa_any[i] != NULL; i++ ) {
1529 if( sa->sa_any[i]->bv_len < SLAP_INDEX_SUBSTR_MAXLEN ) {
1533 value = sa->sa_any[i];
1536 j <= value->bv_len - SLAP_INDEX_SUBSTR_MAXLEN;
1537 j += SLAP_INDEX_SUBSTR_STEP )
1539 HASH_Init( &HASHcontext );
1540 if( prefix != NULL && prefix->bv_len > 0 ) {
1541 HASH_Update( &HASHcontext,
1542 prefix->bv_val, prefix->bv_len );
1544 HASH_Update( &HASHcontext,
1545 &pre, sizeof( pre ) );
1546 HASH_Update( &HASHcontext,
1547 syntax->ssyn_oid, slen );
1548 HASH_Update( &HASHcontext,
1549 mr->smr_oid, mlen );
1550 HASH_Update( &HASHcontext,
1551 &value->bv_val[j], klen );
1552 HASH_Final( HASHdigest, &HASHcontext );
1554 keys[nkeys++] = ber_bvdup( &digest );
1559 if( flags & SLAP_INDEX_SUBSTR_FINAL && sa->sa_final != NULL &&
1560 sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
1562 pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX;
1563 value = sa->sa_final;
1565 klen = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
1566 ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
1568 HASH_Init( &HASHcontext );
1569 if( prefix != NULL && prefix->bv_len > 0 ) {
1570 HASH_Update( &HASHcontext,
1571 prefix->bv_val, prefix->bv_len );
1573 HASH_Update( &HASHcontext,
1574 &pre, sizeof( pre ) );
1575 HASH_Update( &HASHcontext,
1576 syntax->ssyn_oid, slen );
1577 HASH_Update( &HASHcontext,
1578 mr->smr_oid, mlen );
1579 HASH_Update( &HASHcontext,
1580 &value->bv_val[value->bv_len-klen], klen );
1581 HASH_Final( HASHdigest, &HASHcontext );
1583 keys[nkeys++] = ber_bvdup( &digest );
1594 return LDAP_SUCCESS;
1603 struct berval *value,
1604 void *assertedValue )
1607 *matchp = UTF8casecmp( value, (struct berval *) assertedValue );
1609 int match = value->bv_len - ((struct berval *) assertedValue)->bv_len;
1612 match = strncasecmp( value->bv_val,
1613 ((struct berval *) assertedValue)->bv_val,
1619 return LDAP_SUCCESS;
1623 caseIgnoreSubstringsMatch(
1628 struct berval *value,
1629 void *assertedValue )
1632 SubstringsAssertion *sub = assertedValue;
1633 struct berval left = *value;
1637 /* Add up asserted input length */
1638 if( sub->sa_initial ) {
1639 inlen += sub->sa_initial->bv_len;
1642 for(i=0; sub->sa_any[i] != NULL; i++) {
1643 inlen += sub->sa_any[i]->bv_len;
1646 if( sub->sa_final ) {
1647 inlen += sub->sa_final->bv_len;
1650 if( sub->sa_initial ) {
1651 if( inlen > left.bv_len ) {
1657 match = UTF8oncasecmp( sub->sa_initial, &left,
1658 sub->sa_initial->bv_len, 0 );
1660 match = strncasecmp( sub->sa_initial->bv_val, left.bv_val,
1661 sub->sa_initial->bv_len );
1668 left.bv_val += sub->sa_initial->bv_len;
1669 left.bv_len -= sub->sa_initial->bv_len;
1670 inlen -= sub->sa_initial->bv_len;
1673 if( sub->sa_final ) {
1674 if( inlen > left.bv_len ) {
1680 match = UTF8oncasecmp( sub->sa_final, &left,
1681 sub->sa_final->bv_len,
1682 left.bv_len - sub->sa_final->bv_len );
1684 match = strncasecmp( sub->sa_final->bv_val,
1685 &left.bv_val[left.bv_len - sub->sa_final->bv_len],
1686 sub->sa_final->bv_len );
1693 left.bv_len -= sub->sa_final->bv_len;
1694 inlen -= sub->sa_final->bv_len;
1698 for(i=0; sub->sa_any[i]; i++) {
1703 if( inlen > left.bv_len ) {
1704 /* not enough length */
1709 if( sub->sa_any[i]->bv_len == 0 ) {
1714 p = UTF8casechr( left.bv_val, sub->sa_any[i]->bv_val );
1716 p = strcasechr( left.bv_val, *sub->sa_any[i]->bv_val );
1724 idx = p - left.bv_val;
1725 assert( idx < left.bv_len );
1727 if( idx >= left.bv_len ) {
1728 /* this shouldn't happen */
1735 if( sub->sa_any[i]->bv_len > left.bv_len ) {
1736 /* not enough left */
1742 match = UTF8oncasecmp( &left, sub->sa_any[i],
1743 sub->sa_any[i]->bv_len, 0 );
1746 int len = LDAP_UTF8_CHARLEN( left.bv_val );
1752 match = strncasecmp( left.bv_val,
1753 sub->sa_any[i]->bv_val,
1754 sub->sa_any[i]->bv_len );
1764 left.bv_val += sub->sa_any[i]->bv_len;
1765 left.bv_len -= sub->sa_any[i]->bv_len;
1766 inlen -= sub->sa_any[i]->bv_len;
1772 return LDAP_SUCCESS;
1775 /* Index generation function */
1776 int caseIgnoreIndexer(
1781 struct berval *prefix,
1782 struct berval **values,
1783 struct berval ***keysp )
1787 struct berval **keys;
1788 HASH_CONTEXT HASHcontext;
1789 unsigned char HASHdigest[HASH_BYTES];
1790 struct berval digest;
1791 digest.bv_val = HASHdigest;
1792 digest.bv_len = sizeof(HASHdigest);
1794 /* we should have at least one value at this point */
1795 assert( values != NULL && values[0] != NULL );
1797 for( i=0; values[i] != NULL; i++ ) {
1798 /* just count them */
1801 keys = ch_malloc( sizeof( struct berval * ) * (i+1) );
1803 slen = strlen( syntax->ssyn_oid );
1804 mlen = strlen( mr->smr_oid );
1806 for( i=0; values[i] != NULL; i++ ) {
1807 struct berval *value = ber_bvdup( values[i] );
1808 ldap_pvt_str2upper( value->bv_val );
1810 HASH_Init( &HASHcontext );
1811 if( prefix != NULL && prefix->bv_len > 0 ) {
1812 HASH_Update( &HASHcontext,
1813 prefix->bv_val, prefix->bv_len );
1815 HASH_Update( &HASHcontext,
1816 syntax->ssyn_oid, slen );
1817 HASH_Update( &HASHcontext,
1818 mr->smr_oid, mlen );
1819 HASH_Update( &HASHcontext,
1820 value->bv_val, value->bv_len );
1821 HASH_Final( HASHdigest, &HASHcontext );
1823 ber_bvfree( value );
1825 keys[i] = ber_bvdup( &digest );
1830 return LDAP_SUCCESS;
1833 /* Index generation function */
1834 int caseIgnoreFilter(
1839 struct berval *prefix,
1841 struct berval ***keysp )
1844 struct berval **keys;
1845 HASH_CONTEXT HASHcontext;
1846 unsigned char HASHdigest[HASH_BYTES];
1847 struct berval *value;
1848 struct berval digest;
1849 digest.bv_val = HASHdigest;
1850 digest.bv_len = sizeof(HASHdigest);
1852 slen = strlen( syntax->ssyn_oid );
1853 mlen = strlen( mr->smr_oid );
1855 value = ber_bvdup( (struct berval *) assertValue );
1856 ldap_pvt_str2upper( value->bv_val );
1858 keys = ch_malloc( sizeof( struct berval * ) * 2 );
1860 HASH_Init( &HASHcontext );
1861 if( prefix != NULL && prefix->bv_len > 0 ) {
1862 HASH_Update( &HASHcontext,
1863 prefix->bv_val, prefix->bv_len );
1865 HASH_Update( &HASHcontext,
1866 syntax->ssyn_oid, slen );
1867 HASH_Update( &HASHcontext,
1868 mr->smr_oid, mlen );
1869 HASH_Update( &HASHcontext,
1870 value->bv_val, value->bv_len );
1871 HASH_Final( HASHdigest, &HASHcontext );
1873 keys[0] = ber_bvdup( &digest );
1876 ber_bvfree( value );
1880 return LDAP_SUCCESS;
1883 /* Substrings Index generation function */
1884 int caseIgnoreSubstringsIndexer(
1889 struct berval *prefix,
1890 struct berval **values,
1891 struct berval ***keysp )
1895 struct berval **keys;
1896 HASH_CONTEXT HASHcontext;
1897 unsigned char HASHdigest[HASH_BYTES];
1898 struct berval digest;
1899 digest.bv_val = HASHdigest;
1900 digest.bv_len = sizeof(HASHdigest);
1902 /* we should have at least one value at this point */
1903 assert( values != NULL && values[0] != NULL );
1906 for( i=0; values[i] != NULL; i++ ) {
1907 /* count number of indices to generate */
1908 if( values[i]->bv_len < SLAP_INDEX_SUBSTR_MINLEN ) {
1912 if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
1913 if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
1914 nkeys += SLAP_INDEX_SUBSTR_MAXLEN -
1915 ( SLAP_INDEX_SUBSTR_MINLEN - 1);
1917 nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MINLEN - 1 );
1921 if( flags & SLAP_INDEX_SUBSTR_ANY ) {
1922 if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
1923 nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
1927 if( flags & SLAP_INDEX_SUBSTR_FINAL ) {
1928 if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
1929 nkeys += SLAP_INDEX_SUBSTR_MAXLEN -
1930 ( SLAP_INDEX_SUBSTR_MINLEN - 1);
1932 nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MINLEN - 1 );
1938 /* no keys to generate */
1940 return LDAP_SUCCESS;
1943 keys = ch_malloc( sizeof( struct berval * ) * (nkeys+1) );
1945 slen = strlen( syntax->ssyn_oid );
1946 mlen = strlen( mr->smr_oid );
1949 for( i=0; values[i] != NULL; i++ ) {
1951 struct berval *value;
1953 if( values[i]->bv_len < SLAP_INDEX_SUBSTR_MINLEN ) continue;
1955 value = ber_bvdup( values[i] );
1956 ldap_pvt_str2upper( value->bv_val );
1958 if( ( flags & SLAP_INDEX_SUBSTR_ANY ) &&
1959 ( value->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) )
1961 char pre = SLAP_INDEX_SUBSTR_PREFIX;
1962 max = value->bv_len - ( SLAP_INDEX_SUBSTR_MAXLEN - 1);
1964 for( j=0; j<max; j++ ) {
1965 HASH_Init( &HASHcontext );
1966 if( prefix != NULL && prefix->bv_len > 0 ) {
1967 HASH_Update( &HASHcontext,
1968 prefix->bv_val, prefix->bv_len );
1971 HASH_Update( &HASHcontext,
1972 &pre, sizeof( pre ) );
1973 HASH_Update( &HASHcontext,
1974 syntax->ssyn_oid, slen );
1975 HASH_Update( &HASHcontext,
1976 mr->smr_oid, mlen );
1977 HASH_Update( &HASHcontext,
1979 SLAP_INDEX_SUBSTR_MAXLEN );
1980 HASH_Final( HASHdigest, &HASHcontext );
1982 keys[nkeys++] = ber_bvdup( &digest );
1986 max = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
1987 ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
1989 for( j=SLAP_INDEX_SUBSTR_MINLEN; j<=max; j++ ) {
1992 if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
1993 pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX;
1994 HASH_Init( &HASHcontext );
1995 if( prefix != NULL && prefix->bv_len > 0 ) {
1996 HASH_Update( &HASHcontext,
1997 prefix->bv_val, prefix->bv_len );
1999 HASH_Update( &HASHcontext,
2000 &pre, sizeof( pre ) );
2001 HASH_Update( &HASHcontext,
2002 syntax->ssyn_oid, slen );
2003 HASH_Update( &HASHcontext,
2004 mr->smr_oid, mlen );
2005 HASH_Update( &HASHcontext,
2007 HASH_Final( HASHdigest, &HASHcontext );
2009 keys[nkeys++] = ber_bvdup( &digest );
2012 if( flags & SLAP_INDEX_SUBSTR_FINAL ) {
2013 pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX;
2014 HASH_Init( &HASHcontext );
2015 if( prefix != NULL && prefix->bv_len > 0 ) {
2016 HASH_Update( &HASHcontext,
2017 prefix->bv_val, prefix->bv_len );
2019 HASH_Update( &HASHcontext,
2020 &pre, sizeof( pre ) );
2021 HASH_Update( &HASHcontext,
2022 syntax->ssyn_oid, slen );
2023 HASH_Update( &HASHcontext,
2024 mr->smr_oid, mlen );
2025 HASH_Update( &HASHcontext,
2026 &value->bv_val[value->bv_len-j], j );
2027 HASH_Final( HASHdigest, &HASHcontext );
2029 keys[nkeys++] = ber_bvdup( &digest );
2034 ber_bvfree( value );
2045 return LDAP_SUCCESS;
2048 int caseIgnoreSubstringsFilter(
2053 struct berval *prefix,
2055 struct berval ***keysp )
2057 SubstringsAssertion *sa = assertValue;
2059 ber_len_t nkeys = 0;
2060 size_t slen, mlen, klen;
2061 struct berval **keys;
2062 HASH_CONTEXT HASHcontext;
2063 unsigned char HASHdigest[HASH_BYTES];
2064 struct berval *value;
2065 struct berval digest;
2067 if((flags & SLAP_INDEX_SUBSTR_INITIAL) && sa->sa_initial != NULL &&
2068 sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
2073 if((flags & SLAP_INDEX_SUBSTR_ANY) && sa->sa_any != NULL ) {
2075 for( i=0; sa->sa_any[i] != NULL; i++ ) {
2076 if( sa->sa_any[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
2077 /* don't bother accounting for stepping */
2078 nkeys += sa->sa_any[i]->bv_len -
2079 ( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
2084 if((flags & SLAP_INDEX_SUBSTR_FINAL) && sa->sa_final != NULL &&
2085 sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
2092 return LDAP_SUCCESS;
2095 digest.bv_val = HASHdigest;
2096 digest.bv_len = sizeof(HASHdigest);
2098 slen = strlen( syntax->ssyn_oid );
2099 mlen = strlen( mr->smr_oid );
2101 keys = ch_malloc( sizeof( struct berval * ) * (nkeys+1) );
2104 if((flags & SLAP_INDEX_SUBSTR_INITIAL) && sa->sa_initial != NULL &&
2105 sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
2107 pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX;
2108 value = ber_bvdup( sa->sa_initial );
2109 ldap_pvt_str2upper( value->bv_val );
2111 klen = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
2112 ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
2114 HASH_Init( &HASHcontext );
2115 if( prefix != NULL && prefix->bv_len > 0 ) {
2116 HASH_Update( &HASHcontext,
2117 prefix->bv_val, prefix->bv_len );
2119 HASH_Update( &HASHcontext,
2120 &pre, sizeof( pre ) );
2121 HASH_Update( &HASHcontext,
2122 syntax->ssyn_oid, slen );
2123 HASH_Update( &HASHcontext,
2124 mr->smr_oid, mlen );
2125 HASH_Update( &HASHcontext,
2126 value->bv_val, klen );
2127 HASH_Final( HASHdigest, &HASHcontext );
2129 ber_bvfree( value );
2130 keys[nkeys++] = ber_bvdup( &digest );
2133 if((flags & SLAP_INDEX_SUBSTR_ANY) && sa->sa_any != NULL ) {
2135 pre = SLAP_INDEX_SUBSTR_PREFIX;
2136 klen = SLAP_INDEX_SUBSTR_MAXLEN;
2138 for( i=0; sa->sa_any[i] != NULL; i++ ) {
2139 if( sa->sa_any[i]->bv_len < SLAP_INDEX_SUBSTR_MAXLEN ) {
2143 value = ber_bvdup( sa->sa_any[i] );
2144 ldap_pvt_str2upper( value->bv_val );
2147 j <= value->bv_len - SLAP_INDEX_SUBSTR_MAXLEN;
2148 j += SLAP_INDEX_SUBSTR_STEP )
2150 HASH_Init( &HASHcontext );
2151 if( prefix != NULL && prefix->bv_len > 0 ) {
2152 HASH_Update( &HASHcontext,
2153 prefix->bv_val, prefix->bv_len );
2155 HASH_Update( &HASHcontext,
2156 &pre, sizeof( pre ) );
2157 HASH_Update( &HASHcontext,
2158 syntax->ssyn_oid, slen );
2159 HASH_Update( &HASHcontext,
2160 mr->smr_oid, mlen );
2161 HASH_Update( &HASHcontext,
2162 &value->bv_val[j], klen );
2163 HASH_Final( HASHdigest, &HASHcontext );
2165 keys[nkeys++] = ber_bvdup( &digest );
2168 ber_bvfree( value );
2172 if((flags & SLAP_INDEX_SUBSTR_FINAL) && sa->sa_final != NULL &&
2173 sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
2175 pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX;
2176 value = ber_bvdup( sa->sa_final );
2177 ldap_pvt_str2upper( value->bv_val );
2179 klen = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
2180 ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
2182 HASH_Init( &HASHcontext );
2183 if( prefix != NULL && prefix->bv_len > 0 ) {
2184 HASH_Update( &HASHcontext,
2185 prefix->bv_val, prefix->bv_len );
2187 HASH_Update( &HASHcontext,
2188 &pre, sizeof( pre ) );
2189 HASH_Update( &HASHcontext,
2190 syntax->ssyn_oid, slen );
2191 HASH_Update( &HASHcontext,
2192 mr->smr_oid, mlen );
2193 HASH_Update( &HASHcontext,
2194 &value->bv_val[value->bv_len-klen], klen );
2195 HASH_Final( HASHdigest, &HASHcontext );
2197 ber_bvfree( value );
2198 keys[nkeys++] = ber_bvdup( &digest );
2209 return LDAP_SUCCESS;
2215 struct berval *val )
2219 if( val->bv_len == 0 ) return 0;
2221 if( OID_LEADCHAR(val->bv_val[0]) ) {
2223 for(i=1; i < val->bv_len; i++) {
2224 if( OID_SEPARATOR( val->bv_val[i] ) ) {
2225 if( dot++ ) return 1;
2226 } else if ( OID_CHAR( val->bv_val[i] ) ) {
2229 return LDAP_INVALID_SYNTAX;
2233 return !dot ? LDAP_SUCCESS : LDAP_INVALID_SYNTAX;
2235 } else if( DESC_LEADCHAR(val->bv_val[0]) ) {
2236 for(i=1; i < val->bv_len; i++) {
2237 if( !DESC_CHAR(val->bv_val[i] ) ) {
2238 return LDAP_INVALID_SYNTAX;
2242 return LDAP_SUCCESS;
2245 return LDAP_INVALID_SYNTAX;
2251 struct berval *val )
2255 if( !val->bv_len ) return LDAP_INVALID_SYNTAX;
2257 if( val->bv_val[0] == '+' || val->bv_val[0] == '-' ) {
2258 if( val->bv_len < 2 ) return LDAP_INVALID_SYNTAX;
2259 } else if( !ASCII_DIGIT(val->bv_val[0]) ) {
2260 return LDAP_INVALID_SYNTAX;
2263 for(i=1; i < val->bv_len; i++) {
2264 if( !ASCII_DIGIT(val->bv_val[i]) ) return LDAP_INVALID_SYNTAX;
2267 return LDAP_SUCCESS;
2274 struct berval **normalized )
2277 struct berval *newval;
2283 negative = ( *p == '-' );
2284 if( *p == '-' || *p == '+' ) p++;
2286 /* Ignore leading zeros */
2287 while ( *p == '0' ) p++;
2289 newval = (struct berval *) ch_malloc( sizeof(struct berval) );
2292 newval->bv_val = ch_strdup("0");
2297 newval->bv_val = ch_malloc( val->bv_len + 1 );
2301 newval->bv_val[newval->bv_len++] = '-';
2304 for( ; *p != '\0'; p++ ) {
2305 newval->bv_val[newval->bv_len++] = *p;
2309 *normalized = newval;
2310 return LDAP_SUCCESS;
2314 countryStringValidate(
2316 struct berval *val )
2320 if( val->bv_len != 2 ) return LDAP_INVALID_SYNTAX;
2322 if( !SLAP_PRINTABLE(val->bv_val[0]) ) {
2323 return LDAP_INVALID_SYNTAX;
2325 if( !SLAP_PRINTABLE(val->bv_val[1]) ) {
2326 return LDAP_INVALID_SYNTAX;
2329 return LDAP_SUCCESS;
2333 printableStringValidate(
2335 struct berval *val )
2339 if( !val->bv_len ) return LDAP_INVALID_SYNTAX;
2341 for(i=0; i < val->bv_len; i++) {
2342 if( !SLAP_PRINTABLE(val->bv_val[i]) ) {
2343 return LDAP_INVALID_SYNTAX;
2347 return LDAP_SUCCESS;
2351 printablesStringValidate(
2353 struct berval *val )
2357 if( !val->bv_len ) return LDAP_INVALID_SYNTAX;
2359 for(i=0; i < val->bv_len; i++) {
2360 if( !SLAP_PRINTABLES(val->bv_val[i]) ) {
2361 return LDAP_INVALID_SYNTAX;
2365 return LDAP_SUCCESS;
2371 struct berval *val )
2375 if( !val->bv_len ) return LDAP_INVALID_SYNTAX;
2377 for(i=0; i < val->bv_len; i++) {
2378 if( !isascii(val->bv_val[i]) ) return LDAP_INVALID_SYNTAX;
2381 return LDAP_SUCCESS;
2388 struct berval **normalized )
2390 struct berval *newval;
2393 newval = ch_malloc( sizeof( struct berval ) );
2397 /* Ignore initial whitespace */
2398 while ( ASCII_SPACE( *p ) ) {
2404 return LDAP_INVALID_SYNTAX;
2407 newval->bv_val = ch_strdup( p );
2408 p = q = newval->bv_val;
2411 if ( ASCII_SPACE( *p ) ) {
2414 /* Ignore the extra whitespace */
2415 while ( ASCII_SPACE( *p ) ) {
2423 assert( *newval->bv_val );
2424 assert( newval->bv_val < p );
2427 /* cannot start with a space */
2428 assert( !ASCII_SPACE(*newval->bv_val) );
2431 * If the string ended in space, backup the pointer one
2432 * position. One is enough because the above loop collapsed
2433 * all whitespace to a single space.
2436 if ( ASCII_SPACE( q[-1] ) ) {
2440 /* cannot end with a space */
2441 assert( !ASCII_SPACE( q[-1] ) );
2443 /* null terminate */
2446 newval->bv_len = q - newval->bv_val;
2447 *normalized = newval;
2449 return LDAP_SUCCESS;
2458 struct berval *value,
2459 void *assertedValue )
2461 int match = value->bv_len - ((struct berval *) assertedValue)->bv_len;
2464 match = strncmp( value->bv_val,
2465 ((struct berval *) assertedValue)->bv_val,
2470 return LDAP_SUCCESS;
2474 caseExactIA5SubstringsMatch(
2479 struct berval *value,
2480 void *assertedValue )
2483 SubstringsAssertion *sub = assertedValue;
2484 struct berval left = *value;
2488 /* Add up asserted input length */
2489 if( sub->sa_initial ) {
2490 inlen += sub->sa_initial->bv_len;
2493 for(i=0; sub->sa_any[i] != NULL; i++) {
2494 inlen += sub->sa_any[i]->bv_len;
2497 if( sub->sa_final ) {
2498 inlen += sub->sa_final->bv_len;
2501 if( sub->sa_initial ) {
2502 if( inlen > left.bv_len ) {
2507 match = strncmp( sub->sa_initial->bv_val, left.bv_val,
2508 sub->sa_initial->bv_len );
2514 left.bv_val += sub->sa_initial->bv_len;
2515 left.bv_len -= sub->sa_initial->bv_len;
2516 inlen -= sub->sa_initial->bv_len;
2519 if( sub->sa_final ) {
2520 if( inlen > left.bv_len ) {
2525 match = strncmp( sub->sa_final->bv_val,
2526 &left.bv_val[left.bv_len - sub->sa_final->bv_len],
2527 sub->sa_final->bv_len );
2533 left.bv_len -= sub->sa_final->bv_len;
2534 inlen -= sub->sa_final->bv_len;
2538 for(i=0; sub->sa_any[i]; i++) {
2543 if( inlen > left.bv_len ) {
2544 /* not enough length */
2549 if( sub->sa_any[i]->bv_len == 0 ) {
2553 p = strchr( left.bv_val, *sub->sa_any[i]->bv_val );
2560 idx = p - left.bv_val;
2561 assert( idx < left.bv_len );
2563 if( idx >= left.bv_len ) {
2564 /* this shouldn't happen */
2571 if( sub->sa_any[i]->bv_len > left.bv_len ) {
2572 /* not enough left */
2577 match = strncmp( left.bv_val,
2578 sub->sa_any[i]->bv_val,
2579 sub->sa_any[i]->bv_len );
2587 left.bv_val += sub->sa_any[i]->bv_len;
2588 left.bv_len -= sub->sa_any[i]->bv_len;
2589 inlen -= sub->sa_any[i]->bv_len;
2595 return LDAP_SUCCESS;
2598 /* Index generation function */
2599 int caseExactIA5Indexer(
2604 struct berval *prefix,
2605 struct berval **values,
2606 struct berval ***keysp )
2610 struct berval **keys;
2611 HASH_CONTEXT HASHcontext;
2612 unsigned char HASHdigest[HASH_BYTES];
2613 struct berval digest;
2614 digest.bv_val = HASHdigest;
2615 digest.bv_len = sizeof(HASHdigest);
2617 /* we should have at least one value at this point */
2618 assert( values != NULL && values[0] != NULL );
2620 for( i=0; values[i] != NULL; i++ ) {
2621 /* just count them */
2624 keys = ch_malloc( sizeof( struct berval * ) * (i+1) );
2626 slen = strlen( syntax->ssyn_oid );
2627 mlen = strlen( mr->smr_oid );
2629 for( i=0; values[i] != NULL; i++ ) {
2630 struct berval *value = values[i];
2632 HASH_Init( &HASHcontext );
2633 if( prefix != NULL && prefix->bv_len > 0 ) {
2634 HASH_Update( &HASHcontext,
2635 prefix->bv_val, prefix->bv_len );
2637 HASH_Update( &HASHcontext,
2638 syntax->ssyn_oid, slen );
2639 HASH_Update( &HASHcontext,
2640 mr->smr_oid, mlen );
2641 HASH_Update( &HASHcontext,
2642 value->bv_val, value->bv_len );
2643 HASH_Final( HASHdigest, &HASHcontext );
2645 keys[i] = ber_bvdup( &digest );
2650 return LDAP_SUCCESS;
2653 /* Index generation function */
2654 int caseExactIA5Filter(
2659 struct berval *prefix,
2661 struct berval ***keysp )
2664 struct berval **keys;
2665 HASH_CONTEXT HASHcontext;
2666 unsigned char HASHdigest[HASH_BYTES];
2667 struct berval *value;
2668 struct berval digest;
2669 digest.bv_val = HASHdigest;
2670 digest.bv_len = sizeof(HASHdigest);
2672 slen = strlen( syntax->ssyn_oid );
2673 mlen = strlen( mr->smr_oid );
2675 value = (struct berval *) assertValue;
2677 keys = ch_malloc( sizeof( struct berval * ) * 2 );
2679 HASH_Init( &HASHcontext );
2680 if( prefix != NULL && prefix->bv_len > 0 ) {
2681 HASH_Update( &HASHcontext,
2682 prefix->bv_val, prefix->bv_len );
2684 HASH_Update( &HASHcontext,
2685 syntax->ssyn_oid, slen );
2686 HASH_Update( &HASHcontext,
2687 mr->smr_oid, mlen );
2688 HASH_Update( &HASHcontext,
2689 value->bv_val, value->bv_len );
2690 HASH_Final( HASHdigest, &HASHcontext );
2692 keys[0] = ber_bvdup( &digest );
2696 return LDAP_SUCCESS;
2699 /* Substrings Index generation function */
2700 int caseExactIA5SubstringsIndexer(
2705 struct berval *prefix,
2706 struct berval **values,
2707 struct berval ***keysp )
2711 struct berval **keys;
2712 HASH_CONTEXT HASHcontext;
2713 unsigned char HASHdigest[HASH_BYTES];
2714 struct berval digest;
2715 digest.bv_val = HASHdigest;
2716 digest.bv_len = sizeof(HASHdigest);
2718 /* we should have at least one value at this point */
2719 assert( values != NULL && values[0] != NULL );
2722 for( i=0; values[i] != NULL; i++ ) {
2723 /* count number of indices to generate */
2724 if( values[i]->bv_len < SLAP_INDEX_SUBSTR_MINLEN ) {
2728 if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
2729 if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
2730 nkeys += SLAP_INDEX_SUBSTR_MAXLEN -
2731 ( SLAP_INDEX_SUBSTR_MINLEN - 1);
2733 nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MINLEN - 1 );
2737 if( flags & SLAP_INDEX_SUBSTR_ANY ) {
2738 if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
2739 nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
2743 if( flags & SLAP_INDEX_SUBSTR_FINAL ) {
2744 if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
2745 nkeys += SLAP_INDEX_SUBSTR_MAXLEN -
2746 ( SLAP_INDEX_SUBSTR_MINLEN - 1);
2748 nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MINLEN - 1 );
2754 /* no keys to generate */
2756 return LDAP_SUCCESS;
2759 keys = ch_malloc( sizeof( struct berval * ) * (nkeys+1) );
2761 slen = strlen( syntax->ssyn_oid );
2762 mlen = strlen( mr->smr_oid );
2765 for( i=0; values[i] != NULL; i++ ) {
2767 struct berval *value;
2770 if( value->bv_len < SLAP_INDEX_SUBSTR_MINLEN ) continue;
2772 if( ( flags & SLAP_INDEX_SUBSTR_ANY ) &&
2773 ( value->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) )
2775 char pre = SLAP_INDEX_SUBSTR_PREFIX;
2776 max = value->bv_len - ( SLAP_INDEX_SUBSTR_MAXLEN - 1);
2778 for( j=0; j<max; j++ ) {
2779 HASH_Init( &HASHcontext );
2780 if( prefix != NULL && prefix->bv_len > 0 ) {
2781 HASH_Update( &HASHcontext,
2782 prefix->bv_val, prefix->bv_len );
2785 HASH_Update( &HASHcontext,
2786 &pre, sizeof( pre ) );
2787 HASH_Update( &HASHcontext,
2788 syntax->ssyn_oid, slen );
2789 HASH_Update( &HASHcontext,
2790 mr->smr_oid, mlen );
2791 HASH_Update( &HASHcontext,
2793 SLAP_INDEX_SUBSTR_MAXLEN );
2794 HASH_Final( HASHdigest, &HASHcontext );
2796 keys[nkeys++] = ber_bvdup( &digest );
2800 max = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
2801 ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
2803 for( j=SLAP_INDEX_SUBSTR_MINLEN; j<=max; j++ ) {
2806 if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
2807 pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX;
2808 HASH_Init( &HASHcontext );
2809 if( prefix != NULL && prefix->bv_len > 0 ) {
2810 HASH_Update( &HASHcontext,
2811 prefix->bv_val, prefix->bv_len );
2813 HASH_Update( &HASHcontext,
2814 &pre, sizeof( pre ) );
2815 HASH_Update( &HASHcontext,
2816 syntax->ssyn_oid, slen );
2817 HASH_Update( &HASHcontext,
2818 mr->smr_oid, mlen );
2819 HASH_Update( &HASHcontext,
2821 HASH_Final( HASHdigest, &HASHcontext );
2823 keys[nkeys++] = ber_bvdup( &digest );
2826 if( flags & SLAP_INDEX_SUBSTR_FINAL ) {
2827 pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX;
2828 HASH_Init( &HASHcontext );
2829 if( prefix != NULL && prefix->bv_len > 0 ) {
2830 HASH_Update( &HASHcontext,
2831 prefix->bv_val, prefix->bv_len );
2833 HASH_Update( &HASHcontext,
2834 &pre, sizeof( pre ) );
2835 HASH_Update( &HASHcontext,
2836 syntax->ssyn_oid, slen );
2837 HASH_Update( &HASHcontext,
2838 mr->smr_oid, mlen );
2839 HASH_Update( &HASHcontext,
2840 &value->bv_val[value->bv_len-j], j );
2841 HASH_Final( HASHdigest, &HASHcontext );
2843 keys[nkeys++] = ber_bvdup( &digest );
2857 return LDAP_SUCCESS;
2860 int caseExactIA5SubstringsFilter(
2865 struct berval *prefix,
2867 struct berval ***keysp )
2869 SubstringsAssertion *sa = assertValue;
2871 ber_len_t nkeys = 0;
2872 size_t slen, mlen, klen;
2873 struct berval **keys;
2874 HASH_CONTEXT HASHcontext;
2875 unsigned char HASHdigest[HASH_BYTES];
2876 struct berval *value;
2877 struct berval digest;
2879 if( flags & SLAP_INDEX_SUBSTR_INITIAL && sa->sa_initial != NULL &&
2880 sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
2885 if( flags & SLAP_INDEX_SUBSTR_ANY && sa->sa_any != NULL ) {
2887 for( i=0; sa->sa_any[i] != NULL; i++ ) {
2888 if( sa->sa_any[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
2889 /* don't bother accounting for stepping */
2890 nkeys += sa->sa_any[i]->bv_len -
2891 ( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
2896 if( flags & SLAP_INDEX_SUBSTR_FINAL && sa->sa_final != NULL &&
2897 sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
2904 return LDAP_SUCCESS;
2907 digest.bv_val = HASHdigest;
2908 digest.bv_len = sizeof(HASHdigest);
2910 slen = strlen( syntax->ssyn_oid );
2911 mlen = strlen( mr->smr_oid );
2913 keys = ch_malloc( sizeof( struct berval * ) * (nkeys+1) );
2916 if( flags & SLAP_INDEX_SUBSTR_INITIAL && sa->sa_initial != NULL &&
2917 sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
2919 pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX;
2920 value = sa->sa_initial;
2922 klen = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
2923 ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
2925 HASH_Init( &HASHcontext );
2926 if( prefix != NULL && prefix->bv_len > 0 ) {
2927 HASH_Update( &HASHcontext,
2928 prefix->bv_val, prefix->bv_len );
2930 HASH_Update( &HASHcontext,
2931 &pre, sizeof( pre ) );
2932 HASH_Update( &HASHcontext,
2933 syntax->ssyn_oid, slen );
2934 HASH_Update( &HASHcontext,
2935 mr->smr_oid, mlen );
2936 HASH_Update( &HASHcontext,
2937 value->bv_val, klen );
2938 HASH_Final( HASHdigest, &HASHcontext );
2940 keys[nkeys++] = ber_bvdup( &digest );
2943 if( flags & SLAP_INDEX_SUBSTR_ANY && sa->sa_any != NULL ) {
2945 pre = SLAP_INDEX_SUBSTR_PREFIX;
2946 klen = SLAP_INDEX_SUBSTR_MAXLEN;
2948 for( i=0; sa->sa_any[i] != NULL; i++ ) {
2949 if( sa->sa_any[i]->bv_len < SLAP_INDEX_SUBSTR_MAXLEN ) {
2953 value = sa->sa_any[i];
2956 j <= value->bv_len - SLAP_INDEX_SUBSTR_MAXLEN;
2957 j += SLAP_INDEX_SUBSTR_STEP )
2959 HASH_Init( &HASHcontext );
2960 if( prefix != NULL && prefix->bv_len > 0 ) {
2961 HASH_Update( &HASHcontext,
2962 prefix->bv_val, prefix->bv_len );
2964 HASH_Update( &HASHcontext,
2965 &pre, sizeof( pre ) );
2966 HASH_Update( &HASHcontext,
2967 syntax->ssyn_oid, slen );
2968 HASH_Update( &HASHcontext,
2969 mr->smr_oid, mlen );
2970 HASH_Update( &HASHcontext,
2971 &value->bv_val[j], klen );
2972 HASH_Final( HASHdigest, &HASHcontext );
2974 keys[nkeys++] = ber_bvdup( &digest );
2979 if( flags & SLAP_INDEX_SUBSTR_FINAL && sa->sa_final != NULL &&
2980 sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
2982 pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX;
2983 value = sa->sa_final;
2985 klen = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
2986 ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
2988 HASH_Init( &HASHcontext );
2989 if( prefix != NULL && prefix->bv_len > 0 ) {
2990 HASH_Update( &HASHcontext,
2991 prefix->bv_val, prefix->bv_len );
2993 HASH_Update( &HASHcontext,
2994 &pre, sizeof( pre ) );
2995 HASH_Update( &HASHcontext,
2996 syntax->ssyn_oid, slen );
2997 HASH_Update( &HASHcontext,
2998 mr->smr_oid, mlen );
2999 HASH_Update( &HASHcontext,
3000 &value->bv_val[value->bv_len-klen], klen );
3001 HASH_Final( HASHdigest, &HASHcontext );
3003 keys[nkeys++] = ber_bvdup( &digest );
3014 return LDAP_SUCCESS;
3023 struct berval *value,
3024 void *assertedValue )
3026 int match = value->bv_len - ((struct berval *) assertedValue)->bv_len;
3029 match = strncasecmp( value->bv_val,
3030 ((struct berval *) assertedValue)->bv_val,
3035 return LDAP_SUCCESS;
3039 caseIgnoreIA5SubstringsMatch(
3044 struct berval *value,
3045 void *assertedValue )
3048 SubstringsAssertion *sub = assertedValue;
3049 struct berval left = *value;
3053 /* Add up asserted input length */
3054 if( sub->sa_initial ) {
3055 inlen += sub->sa_initial->bv_len;
3058 for(i=0; sub->sa_any[i] != NULL; i++) {
3059 inlen += sub->sa_any[i]->bv_len;
3062 if( sub->sa_final ) {
3063 inlen += sub->sa_final->bv_len;
3066 if( sub->sa_initial ) {
3067 if( inlen > left.bv_len ) {
3072 match = strncasecmp( sub->sa_initial->bv_val, left.bv_val,
3073 sub->sa_initial->bv_len );
3079 left.bv_val += sub->sa_initial->bv_len;
3080 left.bv_len -= sub->sa_initial->bv_len;
3081 inlen -= sub->sa_initial->bv_len;
3084 if( sub->sa_final ) {
3085 if( inlen > left.bv_len ) {
3090 match = strncasecmp( sub->sa_final->bv_val,
3091 &left.bv_val[left.bv_len - sub->sa_final->bv_len],
3092 sub->sa_final->bv_len );
3098 left.bv_len -= sub->sa_final->bv_len;
3099 inlen -= sub->sa_final->bv_len;
3103 for(i=0; sub->sa_any[i]; i++) {
3108 if( inlen > left.bv_len ) {
3109 /* not enough length */
3114 if( sub->sa_any[i]->bv_len == 0 ) {
3118 p = strcasechr( left.bv_val, *sub->sa_any[i]->bv_val );
3125 idx = p - left.bv_val;
3126 assert( idx < left.bv_len );
3128 if( idx >= left.bv_len ) {
3129 /* this shouldn't happen */
3136 if( sub->sa_any[i]->bv_len > left.bv_len ) {
3137 /* not enough left */
3142 match = strncasecmp( left.bv_val,
3143 sub->sa_any[i]->bv_val,
3144 sub->sa_any[i]->bv_len );
3153 left.bv_val += sub->sa_any[i]->bv_len;
3154 left.bv_len -= sub->sa_any[i]->bv_len;
3155 inlen -= sub->sa_any[i]->bv_len;
3161 return LDAP_SUCCESS;
3164 /* Index generation function */
3165 int caseIgnoreIA5Indexer(
3170 struct berval *prefix,
3171 struct berval **values,
3172 struct berval ***keysp )
3176 struct berval **keys;
3177 HASH_CONTEXT HASHcontext;
3178 unsigned char HASHdigest[HASH_BYTES];
3179 struct berval digest;
3180 digest.bv_val = HASHdigest;
3181 digest.bv_len = sizeof(HASHdigest);
3183 /* we should have at least one value at this point */
3184 assert( values != NULL && values[0] != NULL );
3186 for( i=0; values[i] != NULL; i++ ) {
3187 /* just count them */
3190 keys = ch_malloc( sizeof( struct berval * ) * (i+1) );
3192 slen = strlen( syntax->ssyn_oid );
3193 mlen = strlen( mr->smr_oid );
3195 for( i=0; values[i] != NULL; i++ ) {
3196 struct berval *value = ber_bvdup( values[i] );
3197 ldap_pvt_str2upper( value->bv_val );
3199 HASH_Init( &HASHcontext );
3200 if( prefix != NULL && prefix->bv_len > 0 ) {
3201 HASH_Update( &HASHcontext,
3202 prefix->bv_val, prefix->bv_len );
3204 HASH_Update( &HASHcontext,
3205 syntax->ssyn_oid, slen );
3206 HASH_Update( &HASHcontext,
3207 mr->smr_oid, mlen );
3208 HASH_Update( &HASHcontext,
3209 value->bv_val, value->bv_len );
3210 HASH_Final( HASHdigest, &HASHcontext );
3212 ber_bvfree( value );
3214 keys[i] = ber_bvdup( &digest );
3219 return LDAP_SUCCESS;
3222 /* Index generation function */
3223 int caseIgnoreIA5Filter(
3228 struct berval *prefix,
3230 struct berval ***keysp )
3233 struct berval **keys;
3234 HASH_CONTEXT HASHcontext;
3235 unsigned char HASHdigest[HASH_BYTES];
3236 struct berval *value;
3237 struct berval digest;
3238 digest.bv_val = HASHdigest;
3239 digest.bv_len = sizeof(HASHdigest);
3241 slen = strlen( syntax->ssyn_oid );
3242 mlen = strlen( mr->smr_oid );
3244 value = ber_bvdup( (struct berval *) assertValue );
3245 ldap_pvt_str2upper( value->bv_val );
3247 keys = ch_malloc( sizeof( struct berval * ) * 2 );
3249 HASH_Init( &HASHcontext );
3250 if( prefix != NULL && prefix->bv_len > 0 ) {
3251 HASH_Update( &HASHcontext,
3252 prefix->bv_val, prefix->bv_len );
3254 HASH_Update( &HASHcontext,
3255 syntax->ssyn_oid, slen );
3256 HASH_Update( &HASHcontext,
3257 mr->smr_oid, mlen );
3258 HASH_Update( &HASHcontext,
3259 value->bv_val, value->bv_len );
3260 HASH_Final( HASHdigest, &HASHcontext );
3262 keys[0] = ber_bvdup( &digest );
3265 ber_bvfree( value );
3269 return LDAP_SUCCESS;
3272 /* Substrings Index generation function */
3273 int caseIgnoreIA5SubstringsIndexer(
3278 struct berval *prefix,
3279 struct berval **values,
3280 struct berval ***keysp )
3284 struct berval **keys;
3285 HASH_CONTEXT HASHcontext;
3286 unsigned char HASHdigest[HASH_BYTES];
3287 struct berval digest;
3288 digest.bv_val = HASHdigest;
3289 digest.bv_len = sizeof(HASHdigest);
3291 /* we should have at least one value at this point */
3292 assert( values != NULL && values[0] != NULL );
3295 for( i=0; values[i] != NULL; i++ ) {
3296 /* count number of indices to generate */
3297 if( values[i]->bv_len < SLAP_INDEX_SUBSTR_MINLEN ) {
3301 if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
3302 if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
3303 nkeys += SLAP_INDEX_SUBSTR_MAXLEN -
3304 ( SLAP_INDEX_SUBSTR_MINLEN - 1);
3306 nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MINLEN - 1 );
3310 if( flags & SLAP_INDEX_SUBSTR_ANY ) {
3311 if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
3312 nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
3316 if( flags & SLAP_INDEX_SUBSTR_FINAL ) {
3317 if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
3318 nkeys += SLAP_INDEX_SUBSTR_MAXLEN -
3319 ( SLAP_INDEX_SUBSTR_MINLEN - 1);
3321 nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MINLEN - 1 );
3327 /* no keys to generate */
3329 return LDAP_SUCCESS;
3332 keys = ch_malloc( sizeof( struct berval * ) * (nkeys+1) );
3334 slen = strlen( syntax->ssyn_oid );
3335 mlen = strlen( mr->smr_oid );
3338 for( i=0; values[i] != NULL; i++ ) {
3340 struct berval *value;
3342 if( values[i]->bv_len < SLAP_INDEX_SUBSTR_MINLEN ) continue;
3344 value = ber_bvdup( values[i] );
3345 ldap_pvt_str2upper( value->bv_val );
3347 if( ( flags & SLAP_INDEX_SUBSTR_ANY ) &&
3348 ( value->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) )
3350 char pre = SLAP_INDEX_SUBSTR_PREFIX;
3351 max = value->bv_len - ( SLAP_INDEX_SUBSTR_MAXLEN - 1);
3353 for( j=0; j<max; j++ ) {
3354 HASH_Init( &HASHcontext );
3355 if( prefix != NULL && prefix->bv_len > 0 ) {
3356 HASH_Update( &HASHcontext,
3357 prefix->bv_val, prefix->bv_len );
3360 HASH_Update( &HASHcontext,
3361 &pre, sizeof( pre ) );
3362 HASH_Update( &HASHcontext,
3363 syntax->ssyn_oid, slen );
3364 HASH_Update( &HASHcontext,
3365 mr->smr_oid, mlen );
3366 HASH_Update( &HASHcontext,
3368 SLAP_INDEX_SUBSTR_MAXLEN );
3369 HASH_Final( HASHdigest, &HASHcontext );
3371 keys[nkeys++] = ber_bvdup( &digest );
3375 max = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
3376 ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
3378 for( j=SLAP_INDEX_SUBSTR_MINLEN; j<=max; j++ ) {
3381 if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
3382 pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX;
3383 HASH_Init( &HASHcontext );
3384 if( prefix != NULL && prefix->bv_len > 0 ) {
3385 HASH_Update( &HASHcontext,
3386 prefix->bv_val, prefix->bv_len );
3388 HASH_Update( &HASHcontext,
3389 &pre, sizeof( pre ) );
3390 HASH_Update( &HASHcontext,
3391 syntax->ssyn_oid, slen );
3392 HASH_Update( &HASHcontext,
3393 mr->smr_oid, mlen );
3394 HASH_Update( &HASHcontext,
3396 HASH_Final( HASHdigest, &HASHcontext );
3398 keys[nkeys++] = ber_bvdup( &digest );
3401 if( flags & SLAP_INDEX_SUBSTR_FINAL ) {
3402 pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX;
3403 HASH_Init( &HASHcontext );
3404 if( prefix != NULL && prefix->bv_len > 0 ) {
3405 HASH_Update( &HASHcontext,
3406 prefix->bv_val, prefix->bv_len );
3408 HASH_Update( &HASHcontext,
3409 &pre, sizeof( pre ) );
3410 HASH_Update( &HASHcontext,
3411 syntax->ssyn_oid, slen );
3412 HASH_Update( &HASHcontext,
3413 mr->smr_oid, mlen );
3414 HASH_Update( &HASHcontext,
3415 &value->bv_val[value->bv_len-j], j );
3416 HASH_Final( HASHdigest, &HASHcontext );
3418 keys[nkeys++] = ber_bvdup( &digest );
3423 ber_bvfree( value );
3434 return LDAP_SUCCESS;
3437 int caseIgnoreIA5SubstringsFilter(
3442 struct berval *prefix,
3444 struct berval ***keysp )
3446 SubstringsAssertion *sa = assertValue;
3448 ber_len_t nkeys = 0;
3449 size_t slen, mlen, klen;
3450 struct berval **keys;
3451 HASH_CONTEXT HASHcontext;
3452 unsigned char HASHdigest[HASH_BYTES];
3453 struct berval *value;
3454 struct berval digest;
3456 if((flags & SLAP_INDEX_SUBSTR_INITIAL) && sa->sa_initial != NULL &&
3457 sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
3462 if((flags & SLAP_INDEX_SUBSTR_ANY) && sa->sa_any != NULL ) {
3464 for( i=0; sa->sa_any[i] != NULL; i++ ) {
3465 if( sa->sa_any[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
3466 /* don't bother accounting for stepping */
3467 nkeys += sa->sa_any[i]->bv_len -
3468 ( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
3473 if((flags & SLAP_INDEX_SUBSTR_FINAL) && sa->sa_final != NULL &&
3474 sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
3481 return LDAP_SUCCESS;
3484 digest.bv_val = HASHdigest;
3485 digest.bv_len = sizeof(HASHdigest);
3487 slen = strlen( syntax->ssyn_oid );
3488 mlen = strlen( mr->smr_oid );
3490 keys = ch_malloc( sizeof( struct berval * ) * (nkeys+1) );
3493 if((flags & SLAP_INDEX_SUBSTR_INITIAL) && sa->sa_initial != NULL &&
3494 sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
3496 pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX;
3497 value = ber_bvdup( sa->sa_initial );
3498 ldap_pvt_str2upper( value->bv_val );
3500 klen = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
3501 ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
3503 HASH_Init( &HASHcontext );
3504 if( prefix != NULL && prefix->bv_len > 0 ) {
3505 HASH_Update( &HASHcontext,
3506 prefix->bv_val, prefix->bv_len );
3508 HASH_Update( &HASHcontext,
3509 &pre, sizeof( pre ) );
3510 HASH_Update( &HASHcontext,
3511 syntax->ssyn_oid, slen );
3512 HASH_Update( &HASHcontext,
3513 mr->smr_oid, mlen );
3514 HASH_Update( &HASHcontext,
3515 value->bv_val, klen );
3516 HASH_Final( HASHdigest, &HASHcontext );
3518 ber_bvfree( value );
3519 keys[nkeys++] = ber_bvdup( &digest );
3522 if((flags & SLAP_INDEX_SUBSTR_ANY) && sa->sa_any != NULL ) {
3524 pre = SLAP_INDEX_SUBSTR_PREFIX;
3525 klen = SLAP_INDEX_SUBSTR_MAXLEN;
3527 for( i=0; sa->sa_any[i] != NULL; i++ ) {
3528 if( sa->sa_any[i]->bv_len < SLAP_INDEX_SUBSTR_MAXLEN ) {
3532 value = ber_bvdup( sa->sa_any[i] );
3533 ldap_pvt_str2upper( value->bv_val );
3536 j <= value->bv_len - SLAP_INDEX_SUBSTR_MAXLEN;
3537 j += SLAP_INDEX_SUBSTR_STEP )
3539 HASH_Init( &HASHcontext );
3540 if( prefix != NULL && prefix->bv_len > 0 ) {
3541 HASH_Update( &HASHcontext,
3542 prefix->bv_val, prefix->bv_len );
3544 HASH_Update( &HASHcontext,
3545 &pre, sizeof( pre ) );
3546 HASH_Update( &HASHcontext,
3547 syntax->ssyn_oid, slen );
3548 HASH_Update( &HASHcontext,
3549 mr->smr_oid, mlen );
3550 HASH_Update( &HASHcontext,
3551 &value->bv_val[j], klen );
3552 HASH_Final( HASHdigest, &HASHcontext );
3554 keys[nkeys++] = ber_bvdup( &digest );
3557 ber_bvfree( value );
3561 if((flags & SLAP_INDEX_SUBSTR_FINAL) && sa->sa_final != NULL &&
3562 sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
3564 pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX;
3565 value = ber_bvdup( sa->sa_final );
3566 ldap_pvt_str2upper( value->bv_val );
3568 klen = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
3569 ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
3571 HASH_Init( &HASHcontext );
3572 if( prefix != NULL && prefix->bv_len > 0 ) {
3573 HASH_Update( &HASHcontext,
3574 prefix->bv_val, prefix->bv_len );
3576 HASH_Update( &HASHcontext,
3577 &pre, sizeof( pre ) );
3578 HASH_Update( &HASHcontext,
3579 syntax->ssyn_oid, slen );
3580 HASH_Update( &HASHcontext,
3581 mr->smr_oid, mlen );
3582 HASH_Update( &HASHcontext,
3583 &value->bv_val[value->bv_len-klen], klen );
3584 HASH_Final( HASHdigest, &HASHcontext );
3586 ber_bvfree( value );
3587 keys[nkeys++] = ber_bvdup( &digest );
3598 return LDAP_SUCCESS;
3602 numericStringNormalize(
3605 struct berval **normalized )
3607 /* similiar to IA5StringNormalize except removes all spaces */
3608 struct berval *newval;
3611 newval = ch_malloc( sizeof( struct berval ) );
3615 /* Ignore initial whitespace */
3616 while ( ASCII_SPACE( *p ) ) {
3622 return LDAP_INVALID_SYNTAX;
3625 newval->bv_val = ch_strdup( p );
3626 p = q = newval->bv_val;
3629 if ( ASCII_SPACE( *p ) ) {
3630 /* Ignore whitespace */
3637 assert( *newval->bv_val );
3638 assert( newval->bv_val < p );
3641 /* cannot start with a space */
3642 assert( !ASCII_SPACE(*newval->bv_val) );
3644 /* cannot end with a space */
3645 assert( !ASCII_SPACE( q[-1] ) );
3647 /* null terminate */
3650 newval->bv_len = q - newval->bv_val;
3651 *normalized = newval;
3653 return LDAP_SUCCESS;
3657 objectIdentifierFirstComponentMatch(
3662 struct berval *value,
3663 void *assertedValue )
3665 int rc = LDAP_SUCCESS;
3667 struct berval *asserted = (struct berval *) assertedValue;
3671 if( value->bv_len == 0 || value->bv_val[0] != '(' /*')'*/ ) {
3672 return LDAP_INVALID_SYNTAX;
3675 /* trim leading white space */
3676 for( i=1; ASCII_SPACE(value->bv_val[i]) && i < value->bv_len; i++ ) {
3680 /* grab next word */
3681 oid.bv_val = &value->bv_val[i];
3682 oid.bv_len = value->bv_len - i;
3683 for( i=1; ASCII_SPACE(value->bv_val[i]) && i < oid.bv_len; i++ ) {
3688 /* insert attributeTypes, objectclass check here */
3689 if( OID_LEADCHAR(asserted->bv_val[0]) ) {
3690 rc = objectIdentifierMatch( &match, flags, syntax, mr, &oid, asserted );
3693 char *stored = ch_malloc( oid.bv_len + 1 );
3694 AC_MEMCPY( stored, oid.bv_val, oid.bv_len );
3695 stored[oid.bv_len] = '\0';
3697 if ( !strcmp( syntax->ssyn_oid, SLAP_SYNTAX_MATCHINGRULES_OID ) ) {
3698 MatchingRule *asserted_mr = mr_find( asserted->bv_val );
3699 MatchingRule *stored_mr = mr_find( stored );
3701 if( asserted_mr == NULL ) {
3702 rc = SLAPD_COMPARE_UNDEFINED;
3704 match = asserted_mr != stored_mr;
3707 } else if ( !strcmp( syntax->ssyn_oid,
3708 SLAP_SYNTAX_ATTRIBUTETYPES_OID ) )
3710 AttributeType *asserted_at = at_find( asserted->bv_val );
3711 AttributeType *stored_at = at_find( stored );
3713 if( asserted_at == NULL ) {
3714 rc = SLAPD_COMPARE_UNDEFINED;
3716 match = asserted_at != stored_at;
3719 } else if ( !strcmp( syntax->ssyn_oid,
3720 SLAP_SYNTAX_OBJECTCLASSES_OID ) )
3722 ObjectClass *asserted_oc = oc_find( asserted->bv_val );
3723 ObjectClass *stored_oc = oc_find( stored );
3725 if( asserted_oc == NULL ) {
3726 rc = SLAPD_COMPARE_UNDEFINED;
3728 match = asserted_oc != stored_oc;
3735 Debug( LDAP_DEBUG_ARGS, "objectIdentifierFirstComponentMatch "
3736 "%d\n\t\"%s\"\n\t\"%s\"\n",
3737 match, value->bv_val, asserted->bv_val );
3739 if( rc == LDAP_SUCCESS ) *matchp = match;
3744 check_time_syntax (struct berval *val,
3748 static int ceiling[9] = { 99, 99, 11, 30, 23, 59, 59, 12, 59 };
3749 static int mdays[2][12] = {
3750 /* non-leap years */
3751 { 30, 27, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30 },
3753 { 30, 28, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30 }
3756 int part, c, tzoffset, leapyear = 0 ;
3758 if( val->bv_len == 0 ) {
3759 return LDAP_INVALID_SYNTAX;
3762 p = (char *)val->bv_val;
3763 e = p + val->bv_len;
3765 /* Ignore initial whitespace */
3766 while ( ( p < e ) && ASCII_SPACE( *p ) ) {
3770 if (e - p < 13 - (2 * start)) {
3771 return LDAP_INVALID_SYNTAX;
3774 for (part = 0; part < 9; part++) {
3778 for (part = start; part < 7; part++) {
3780 if ((part == 6) && (c == 'Z' || c == '+' || c == '-')) {
3787 return LDAP_INVALID_SYNTAX;
3789 if (c < 0 || c > 9) {
3790 return LDAP_INVALID_SYNTAX;
3796 return LDAP_INVALID_SYNTAX;
3798 if (c < 0 || c > 9) {
3799 return LDAP_INVALID_SYNTAX;
3804 if (part == 2 || part == 3) {
3807 if (parts[part] < 0) {
3808 return LDAP_INVALID_SYNTAX;
3810 if (parts[part] > ceiling[part]) {
3811 return LDAP_INVALID_SYNTAX;
3815 /* leapyear check for the Gregorian calendar (year>1581) */
3816 if (((parts[1] % 4 == 0) && (parts[1] != 0)) ||
3817 ((parts[0] % 4 == 0) && (parts[1] == 0)))
3822 if (parts[3] > mdays[leapyear][parts[2]]) {
3823 return LDAP_INVALID_SYNTAX;
3828 tzoffset = 0; /* UTC */
3829 } else if (c != '+' && c != '-') {
3830 return LDAP_INVALID_SYNTAX;
3834 } else /* c == '+' */ {
3839 return LDAP_INVALID_SYNTAX;
3842 for (part = 7; part < 9; part++) {
3844 if (c < 0 || c > 9) {
3845 return LDAP_INVALID_SYNTAX;
3850 if (c < 0 || c > 9) {
3851 return LDAP_INVALID_SYNTAX;
3855 if (parts[part] < 0 || parts[part] > ceiling[part]) {
3856 return LDAP_INVALID_SYNTAX;
3861 /* Ignore trailing whitespace */
3862 while ( ( p < e ) && ASCII_SPACE( *p ) ) {
3866 return LDAP_INVALID_SYNTAX;
3869 switch ( tzoffset ) {
3870 case -1: /* negativ offset to UTC, ie west of Greenwich */
3871 parts[4] += parts[7];
3872 parts[5] += parts[8];
3873 for (part = 6; --part > 0; ) { /* offset is just hhmm, no seconds */
3877 c = mdays[leapyear][parts[2]];
3879 if (parts[part] > c) {
3880 parts[part] -= c + 1;
3885 case 1: /* positive offset to UTC, ie east of Greenwich */
3886 parts[4] -= parts[7];
3887 parts[5] -= parts[8];
3888 for (part = 6; --part > 0; ) {
3892 /* first arg to % needs to be non negativ */
3893 c = mdays[leapyear][(parts[2] - 1 + 12) % 12];
3895 if (parts[part] < 0) {
3896 parts[part] += c + 1;
3901 case 0: /* already UTC */
3905 return LDAP_SUCCESS;
3912 struct berval **normalized )
3917 rc = check_time_syntax(val, 1, parts);
3918 if (rc != LDAP_SUCCESS) {
3923 out = ch_malloc( sizeof(struct berval) );
3925 return LBER_ERROR_MEMORY;
3928 out->bv_val = ch_malloc( 14 );
3929 if ( out->bv_val == NULL ) {
3931 return LBER_ERROR_MEMORY;
3934 sprintf( out->bv_val, "%02ld%02ld%02ld%02ld%02ld%02ldZ",
3935 parts[1], parts[2] + 1, parts[3] + 1,
3936 parts[4], parts[5], parts[6] );
3940 return LDAP_SUCCESS;
3950 return check_time_syntax(in, 1, parts);
3954 generalizedTimeValidate(
3960 return check_time_syntax(in, 0, parts);
3964 generalizedTimeNormalize(
3967 struct berval **normalized )
3972 rc = check_time_syntax(val, 0, parts);
3973 if (rc != LDAP_SUCCESS) {
3978 out = ch_malloc( sizeof(struct berval) );
3980 return LBER_ERROR_MEMORY;
3983 out->bv_val = ch_malloc( 16 );
3984 if ( out->bv_val == NULL ) {
3986 return LBER_ERROR_MEMORY;
3989 sprintf( out->bv_val, "%02ld%02ld%02ld%02ld%02ld%02ld%02ldZ",
3990 parts[0], parts[1], parts[2] + 1, parts[3] + 1,
3991 parts[4], parts[5], parts[6] );
3995 return LDAP_SUCCESS;
3999 nisNetgroupTripleValidate(
4001 struct berval *val )
4006 if ( val->bv_len == 0 ) {
4007 return LDAP_INVALID_SYNTAX;
4010 p = (char *)val->bv_val;
4011 e = p + val->bv_len;
4014 /* syntax does not allow leading white space */
4015 /* Ignore initial whitespace */
4016 while ( ( p < e ) && ASCII_SPACE( *p ) ) {
4021 if ( *p != '(' /*')'*/ ) {
4022 return LDAP_INVALID_SYNTAX;
4025 for ( p++; ( p < e ) && ( *p != ')' ); p++ ) {
4029 return LDAP_INVALID_SYNTAX;
4032 } else if ( !ATTR_CHAR( *p ) ) {
4033 return LDAP_INVALID_SYNTAX;
4037 if ( ( commas != 2 ) || ( *p != /*'('*/ ')' ) ) {
4038 return LDAP_INVALID_SYNTAX;
4044 /* syntax does not allow trailing white space */
4045 /* Ignore trailing whitespace */
4046 while ( ( p < e ) && ASCII_SPACE( *p ) ) {
4052 return LDAP_INVALID_SYNTAX;
4055 return LDAP_SUCCESS;
4059 bootParameterValidate(
4061 struct berval *val )
4065 if ( val->bv_len == 0 ) {
4066 return LDAP_INVALID_SYNTAX;
4069 p = (char *)val->bv_val;
4070 e = p + val->bv_len;
4073 for (; ( p < e ) && ( *p != '=' ); p++ ) {
4074 if ( !ATTR_CHAR( *p ) ) {
4075 return LDAP_INVALID_SYNTAX;
4080 return LDAP_INVALID_SYNTAX;
4084 for ( p++; ( p < e ) && ( *p != ':' ); p++ ) {
4085 if ( !ATTR_CHAR( *p ) ) {
4086 return LDAP_INVALID_SYNTAX;
4091 return LDAP_INVALID_SYNTAX;
4095 for ( p++; p < e; p++ ) {
4096 if ( !ATTR_CHAR( *p ) ) {
4097 return LDAP_INVALID_SYNTAX;
4101 return LDAP_SUCCESS;
4104 struct syntax_defs_rec {
4107 slap_syntax_validate_func *sd_validate;
4108 slap_syntax_transform_func *sd_normalize;
4109 slap_syntax_transform_func *sd_pretty;
4110 #ifdef SLAPD_BINARY_CONVERSION
4111 slap_syntax_transform_func *sd_ber2str;
4112 slap_syntax_transform_func *sd_str2ber;
4116 #define X_BINARY "X-BINARY-TRANSFER-REQUIRED 'TRUE' "
4117 #define X_NOT_H_R "X-NOT-HUMAN-READABLE 'TRUE' "
4119 struct syntax_defs_rec syntax_defs[] = {
4120 {"( 1.3.6.1.4.1.1466.115.121.1.1 DESC 'ACI Item' " X_BINARY X_NOT_H_R ")",
4121 SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, NULL, NULL, NULL},
4122 {"( 1.3.6.1.4.1.1466.115.121.1.2 DESC 'Access Point' " X_NOT_H_R ")",
4123 0, NULL, NULL, NULL},
4124 {"( 1.3.6.1.4.1.1466.115.121.1.3 DESC 'Attribute Type Description' )",
4125 0, NULL, NULL, NULL},
4126 {"( 1.3.6.1.4.1.1466.115.121.1.4 DESC 'Audio' " X_NOT_H_R ")",
4127 SLAP_SYNTAX_BLOB, blobValidate, NULL, NULL},
4128 {"( 1.3.6.1.4.1.1466.115.121.1.5 DESC 'Binary' " X_NOT_H_R ")",
4129 SLAP_SYNTAX_BER, berValidate, NULL, NULL},
4130 {"( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'Bit String' )",
4131 0, bitStringValidate, NULL, NULL },
4132 {"( 1.3.6.1.4.1.1466.115.121.1.7 DESC 'Boolean' )",
4133 0, booleanValidate, NULL, NULL},
4134 {"( 1.3.6.1.4.1.1466.115.121.1.8 DESC 'Certificate' "
4135 X_BINARY X_NOT_H_R ")",
4136 SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL},
4137 {"( 1.3.6.1.4.1.1466.115.121.1.9 DESC 'Certificate List' "
4138 X_BINARY X_NOT_H_R ")",
4139 SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL},
4140 {"( 1.3.6.1.4.1.1466.115.121.1.10 DESC 'Certificate Pair' "
4141 X_BINARY X_NOT_H_R ")",
4142 SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL},
4143 {"( 1.3.6.1.4.1.1466.115.121.1.11 DESC 'Country String' )",
4144 0, countryStringValidate, IA5StringNormalize, NULL},
4145 {"( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'Distinguished Name' )",
4146 0, dnValidate, dnNormalize, dnPretty},
4147 {"( 1.3.6.1.4.1.1466.115.121.1.13 DESC 'Data Quality' )",
4148 0, NULL, NULL, NULL},
4149 {"( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'Delivery Method' )",
4150 0, NULL, NULL, NULL},
4151 {"( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'Directory String' )",
4152 0, UTF8StringValidate, UTF8StringNormalize, NULL},
4153 {"( 1.3.6.1.4.1.1466.115.121.1.16 DESC 'DIT Content Rule Description' )",
4154 0, NULL, NULL, NULL},
4155 {"( 1.3.6.1.4.1.1466.115.121.1.17 DESC 'DIT Structure Rule Description' )",
4156 0, NULL, NULL, NULL},
4157 {"( 1.3.6.1.4.1.1466.115.121.1.19 DESC 'DSA Quality' )",
4158 0, NULL, NULL, NULL},
4159 {"( 1.3.6.1.4.1.1466.115.121.1.20 DESC 'DSE Type' )",
4160 0, NULL, NULL, NULL},
4161 {"( 1.3.6.1.4.1.1466.115.121.1.21 DESC 'Enhanced Guide' )",
4162 0, NULL, NULL, NULL},
4163 {"( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'Facsimile Telephone Number' )",
4164 0, printablesStringValidate, IA5StringNormalize, NULL},
4165 {"( 1.3.6.1.4.1.1466.115.121.1.23 DESC 'Fax' " X_NOT_H_R ")",
4166 SLAP_SYNTAX_BLOB, NULL, NULL, NULL},
4167 {"( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'Generalized Time' )",
4168 0, generalizedTimeValidate, generalizedTimeNormalize, NULL},
4169 {"( 1.3.6.1.4.1.1466.115.121.1.25 DESC 'Guide' )",
4170 0, NULL, NULL, NULL},
4171 {"( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5 String' )",
4172 0, IA5StringValidate, IA5StringNormalize, NULL},
4173 {"( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'Integer' )",
4174 0, integerValidate, integerNormalize, integerPretty},
4175 {"( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' " X_NOT_H_R ")",
4176 SLAP_SYNTAX_BLOB, blobValidate, NULL, NULL},
4177 {"( 1.3.6.1.4.1.1466.115.121.1.29 DESC 'Master And Shadow Access Points' )",
4178 0, NULL, NULL, NULL},
4179 {"( 1.3.6.1.4.1.1466.115.121.1.30 DESC 'Matching Rule Description' )",
4180 0, NULL, NULL, NULL},
4181 {"( 1.3.6.1.4.1.1466.115.121.1.31 DESC 'Matching Rule Use Description' )",
4182 0, NULL, NULL, NULL},
4183 {"( 1.3.6.1.4.1.1466.115.121.1.32 DESC 'Mail Preference' )",
4184 0, NULL, NULL, NULL},
4185 {"( 1.3.6.1.4.1.1466.115.121.1.33 DESC 'MHS OR Address' )",
4186 0, NULL, NULL, NULL},
4187 {"( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'Name And Optional UID' )",
4188 0, nameUIDValidate, nameUIDNormalize, NULL},
4189 {"( 1.3.6.1.4.1.1466.115.121.1.35 DESC 'Name Form Description' )",
4190 0, NULL, NULL, NULL},
4191 {"( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'Numeric String' )",
4192 0, IA5StringValidate, numericStringNormalize, NULL},
4193 {"( 1.3.6.1.4.1.1466.115.121.1.37 DESC 'Object Class Description' )",
4194 0, NULL, NULL, NULL},
4195 {"( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )",
4196 0, oidValidate, NULL, NULL},
4197 {"( 1.3.6.1.4.1.1466.115.121.1.39 DESC 'Other Mailbox' )",
4198 0, IA5StringValidate, IA5StringNormalize, NULL},
4199 {"( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'Octet String' )",
4200 0, blobValidate, NULL, NULL},
4201 {"( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'Postal Address' )",
4202 0, blobValidate, NULL, NULL},
4203 {"( 1.3.6.1.4.1.1466.115.121.1.42 DESC 'Protocol Information' )",
4204 0, NULL, NULL, NULL},
4205 {"( 1.3.6.1.4.1.1466.115.121.1.43 DESC 'Presentation Address' )",
4206 0, NULL, NULL, NULL},
4207 {"( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'Printable String' )",
4208 0, printableStringValidate, IA5StringNormalize, NULL},
4209 {"( 1.3.6.1.4.1.1466.115.121.1.49 DESC 'Supported Algorithm' "
4210 X_BINARY X_NOT_H_R ")",
4211 SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL},
4212 {"( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'Telephone Number' )",
4213 0, printableStringValidate, IA5StringNormalize, NULL},
4214 {"( 1.3.6.1.4.1.1466.115.121.1.51 DESC 'Teletex Terminal Identifier' )",
4215 0, NULL, NULL, NULL},
4216 {"( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'Telex Number' )",
4217 0, printableStringValidate, IA5StringNormalize, NULL},
4218 {"( 1.3.6.1.4.1.1466.115.121.1.53 DESC 'UTC Time' )",
4219 0, utcTimeValidate, utcTimeNormalize, NULL},
4220 {"( 1.3.6.1.4.1.1466.115.121.1.54 DESC 'LDAP Syntax Description' )",
4221 0, NULL, NULL, NULL},
4222 {"( 1.3.6.1.4.1.1466.115.121.1.55 DESC 'Modify Rights' )",
4223 0, NULL, NULL, NULL},
4224 {"( 1.3.6.1.4.1.1466.115.121.1.56 DESC 'LDAP Schema Definition' )",
4225 0, NULL, NULL, NULL},
4226 {"( 1.3.6.1.4.1.1466.115.121.1.57 DESC 'LDAP Schema Description' )",
4227 0, NULL, NULL, NULL},
4228 {"( 1.3.6.1.4.1.1466.115.121.1.58 DESC 'Substring Assertion' )",
4229 0, NULL, NULL, NULL},
4231 /* RFC 2307 NIS Syntaxes */
4232 {"( 1.3.6.1.1.1.0.0 DESC 'RFC2307 NIS Netgroup Triple' )",
4233 0, nisNetgroupTripleValidate, NULL, NULL},
4234 {"( 1.3.6.1.1.1.0.1 DESC 'RFC2307 Boot Parameter' )",
4235 0, bootParameterValidate, NULL, NULL},
4237 /* OpenLDAP Experimental Syntaxes */
4238 {"( 1.3.6.1.4.1.4203.666.2.1 DESC 'OpenLDAP Experimental ACI' )",
4239 0, IA5StringValidate /* THIS WILL CHANGE FOR NEW ACI SYNTAX */,
4241 {"( 1.3.6.1.4.1.4203.666.2.2 DESC 'OpenLDAP authPassword' )",
4242 0, NULL, NULL, NULL},
4244 /* OpenLDAP Void Syntax */
4245 {"( 1.3.6.1.4.1.4203.1.1.1 DESC 'OpenLDAP void' )" ,
4246 SLAP_SYNTAX_HIDE, inValidate, NULL, NULL},
4247 {NULL, 0, NULL, NULL, NULL}
4250 struct mrule_defs_rec {
4252 slap_mask_t mrd_usage;
4253 slap_mr_convert_func * mrd_convert;
4254 slap_mr_normalize_func * mrd_normalize;
4255 slap_mr_match_func * mrd_match;
4256 slap_mr_indexer_func * mrd_indexer;
4257 slap_mr_filter_func * mrd_filter;
4259 char * mrd_associated;
4263 * Other matching rules in X.520 that we do not use (yet):
4265 * 2.5.13.9 numericStringOrderingMatch
4266 * 2.5.13.15 integerOrderingMatch
4267 * 2.5.13.18 octetStringOrderingMatch
4268 * 2.5.13.19 octetStringSubstringsMatch
4269 * 2.5.13.25 uTCTimeMatch
4270 * 2.5.13.26 uTCTimeOrderingMatch
4271 * 2.5.13.31 directoryStringFirstComponentMatch
4272 * 2.5.13.32 wordMatch
4273 * 2.5.13.33 keywordMatch
4274 * 2.5.13.34 certificateExactMatch
4275 * 2.5.13.35 certificateMatch
4276 * 2.5.13.36 certificatePairExactMatch
4277 * 2.5.13.37 certificatePairMatch
4278 * 2.5.13.38 certificateListExactMatch
4279 * 2.5.13.39 certificateListMatch
4280 * 2.5.13.40 algorithmIdentifierMatch
4281 * 2.5.13.41 storedPrefixMatch
4282 * 2.5.13.42 attributeCertificateMatch
4283 * 2.5.13.43 readerAndKeyIDMatch
4284 * 2.5.13.44 attributeIntegrityMatch
4287 struct mrule_defs_rec mrule_defs[] = {
4289 * EQUALITY matching rules must be listed after associated APPROX
4290 * matching rules. So, we list all APPROX matching rules first.
4292 {"( " directoryStringApproxMatchOID " NAME 'directoryStringApproxMatch' "
4293 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
4294 SLAP_MR_EQUALITY_APPROX | SLAP_MR_EXT,
4296 directoryStringApproxMatch, directoryStringApproxIndexer,
4297 directoryStringApproxFilter,
4300 {"( " IA5StringApproxMatchOID " NAME 'IA5StringApproxMatch' "
4301 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
4302 SLAP_MR_EQUALITY_APPROX | SLAP_MR_EXT,
4304 IA5StringApproxMatch, IA5StringApproxIndexer,
4305 IA5StringApproxFilter,
4309 * Other matching rules
4312 {"( 2.5.13.0 NAME 'objectIdentifierMatch' "
4313 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
4314 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4316 objectIdentifierMatch, caseIgnoreIA5Indexer, caseIgnoreIA5Filter,
4319 {"( 2.5.13.1 NAME 'distinguishedNameMatch' "
4320 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )",
4321 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4323 dnMatch, dnIndexer, dnFilter,
4326 {"( 2.5.13.2 NAME 'caseIgnoreMatch' "
4327 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
4328 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4330 caseIgnoreMatch, caseIgnoreIndexer, caseIgnoreFilter,
4331 directoryStringApproxMatchOID },
4333 {"( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' "
4334 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
4337 caseIgnoreOrderingMatch, NULL, NULL,
4340 {"( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' "
4341 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
4342 SLAP_MR_SUBSTR | SLAP_MR_EXT,
4344 caseIgnoreSubstringsMatch,
4345 caseIgnoreSubstringsIndexer,
4346 caseIgnoreSubstringsFilter,
4349 {"( 2.5.13.5 NAME 'caseExactMatch' "
4350 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
4351 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4353 caseExactMatch, caseExactIndexer, caseExactFilter,
4354 directoryStringApproxMatchOID },
4356 {"( 2.5.13.6 NAME 'caseExactOrderingMatch' "
4357 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
4360 caseExactOrderingMatch, NULL, NULL,
4363 {"( 2.5.13.7 NAME 'caseExactSubstringsMatch' "
4364 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
4365 SLAP_MR_SUBSTR | SLAP_MR_EXT,
4367 caseExactSubstringsMatch,
4368 caseExactSubstringsIndexer,
4369 caseExactSubstringsFilter,
4372 {"( 2.5.13.8 NAME 'numericStringMatch' "
4373 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )",
4374 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4377 caseIgnoreIA5Indexer,
4378 caseIgnoreIA5Filter,
4381 {"( 2.5.13.10 NAME 'numericStringSubstringsMatch' "
4382 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
4383 SLAP_MR_SUBSTR | SLAP_MR_EXT,
4385 caseIgnoreIA5SubstringsMatch,
4386 caseIgnoreIA5SubstringsIndexer,
4387 caseIgnoreIA5SubstringsFilter,
4390 {"( 2.5.13.11 NAME 'caseIgnoreListMatch' "
4391 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )",
4392 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4394 caseIgnoreListMatch, NULL, NULL,
4397 {"( 2.5.13.12 NAME 'caseIgnoreListSubstringsMatch' "
4398 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
4399 SLAP_MR_SUBSTR | SLAP_MR_EXT,
4401 caseIgnoreListSubstringsMatch, NULL, NULL,
4404 {"( 2.5.13.13 NAME 'booleanMatch' "
4405 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )",
4406 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4408 booleanMatch, NULL, NULL,
4411 {"( 2.5.13.14 NAME 'integerMatch' "
4412 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
4413 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4415 integerMatch, integerIndexer, integerFilter,
4418 {"( 2.5.13.16 NAME 'bitStringMatch' "
4419 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )",
4420 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4422 bitStringMatch, NULL, NULL,
4425 {"( 2.5.13.17 NAME 'octetStringMatch' "
4426 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )",
4427 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4429 octetStringMatch, octetStringIndexer, octetStringFilter,
4432 {"( 2.5.13.20 NAME 'telephoneNumberMatch' "
4433 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )",
4434 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4436 telephoneNumberMatch, NULL, NULL,
4439 {"( 2.5.13.21 NAME 'telephoneNumberSubstringsMatch' "
4440 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
4441 SLAP_MR_SUBSTR | SLAP_MR_EXT,
4443 telephoneNumberSubstringsMatch, NULL, NULL,
4446 {"( 2.5.13.22 NAME 'presentationAddressMatch' "
4447 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.43 )",
4448 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4450 presentationAddressMatch, NULL, NULL,
4453 {"( 2.5.13.23 NAME 'uniqueMemberMatch' "
4454 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )",
4455 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4457 uniqueMemberMatch, NULL, NULL,
4460 {"( 2.5.13.24 NAME 'protocolInformationMatch' "
4461 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.42 )",
4462 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4464 protocolInformationMatch, NULL, NULL,
4467 {"( 2.5.13.27 NAME 'generalizedTimeMatch' "
4468 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
4469 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4471 generalizedTimeMatch, NULL, NULL,
4474 {"( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' "
4475 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
4478 generalizedTimeOrderingMatch, NULL, NULL,
4481 {"( 2.5.13.29 NAME 'integerFirstComponentMatch' "
4482 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
4483 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4485 integerFirstComponentMatch, NULL, NULL,
4488 {"( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' "
4489 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
4490 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4492 objectIdentifierFirstComponentMatch, NULL, NULL,
4495 {"( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' "
4496 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
4497 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4499 caseExactIA5Match, caseExactIA5Indexer, caseExactIA5Filter,
4500 IA5StringApproxMatchOID },
4502 {"( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' "
4503 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
4504 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4506 caseIgnoreIA5Match, caseIgnoreIA5Indexer, caseIgnoreIA5Filter,
4507 IA5StringApproxMatchOID },
4509 {"( 1.3.6.1.4.1.1466.109.114.3 NAME 'caseIgnoreIA5SubstringsMatch' "
4510 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
4513 caseIgnoreIA5SubstringsMatch,
4514 caseIgnoreIA5SubstringsIndexer,
4515 caseIgnoreIA5SubstringsFilter,
4518 {"( 1.3.6.1.4.1.4203.1.2.1 NAME 'caseExactIA5SubstringsMatch' "
4519 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
4522 caseExactIA5SubstringsMatch,
4523 caseExactIA5SubstringsIndexer,
4524 caseExactIA5SubstringsFilter,
4527 {"( 1.3.6.1.4.1.4203.666.4.1 NAME 'authPasswordMatch' "
4528 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )",
4531 authPasswordMatch, NULL, NULL,
4534 {"( 1.3.6.1.4.1.4203.666.4.2 NAME 'OpenLDAPaciMatch' "
4535 "SYNTAX 1.3.6.1.4.1.4203.666.2.1 )",
4538 OpenLDAPaciMatch, NULL, NULL,
4541 {NULL, SLAP_MR_NONE, NULL, NULL, NULL, NULL}
4550 /* we should only be called once (from main) */
4551 assert( schema_init_done == 0 );
4553 for ( i=0; syntax_defs[i].sd_desc != NULL; i++ ) {
4554 res = register_syntax( syntax_defs[i].sd_desc,
4555 syntax_defs[i].sd_flags,
4556 syntax_defs[i].sd_validate,
4557 syntax_defs[i].sd_normalize,
4558 syntax_defs[i].sd_pretty
4559 #ifdef SLAPD_BINARY_CONVERSION
4561 syntax_defs[i].sd_ber2str,
4562 syntax_defs[i].sd_str2ber
4567 fprintf( stderr, "schema_init: Error registering syntax %s\n",
4568 syntax_defs[i].sd_desc );
4573 for ( i=0; mrule_defs[i].mrd_desc != NULL; i++ ) {
4574 if( mrule_defs[i].mrd_usage == SLAP_MR_NONE ) {
4576 "schema_init: Ingoring unusable matching rule %s\n",
4577 mrule_defs[i].mrd_desc );
4581 res = register_matching_rule(
4582 mrule_defs[i].mrd_desc,
4583 mrule_defs[i].mrd_usage,
4584 mrule_defs[i].mrd_convert,
4585 mrule_defs[i].mrd_normalize,
4586 mrule_defs[i].mrd_match,
4587 mrule_defs[i].mrd_indexer,
4588 mrule_defs[i].mrd_filter,
4589 mrule_defs[i].mrd_associated );
4593 "schema_init: Error registering matching rule %s\n",
4594 mrule_defs[i].mrd_desc );
4598 schema_init_done = 1;
4599 return LDAP_SUCCESS;