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 ) {
2220 /* disallow empty strings */
2221 return LDAP_INVALID_SYNTAX;
2224 if( OID_LEADCHAR(val->bv_val[0]) ) {
2226 for(i=1; i < val->bv_len; i++) {
2227 if( OID_SEPARATOR( val->bv_val[i] ) ) {
2228 if( dot++ ) return 1;
2229 } else if ( OID_CHAR( val->bv_val[i] ) ) {
2232 return LDAP_INVALID_SYNTAX;
2236 return !dot ? LDAP_SUCCESS : LDAP_INVALID_SYNTAX;
2238 } else if( DESC_LEADCHAR(val->bv_val[0]) ) {
2239 for(i=1; i < val->bv_len; i++) {
2240 if( !DESC_CHAR(val->bv_val[i] ) ) {
2241 return LDAP_INVALID_SYNTAX;
2245 return LDAP_SUCCESS;
2248 return LDAP_INVALID_SYNTAX;
2254 struct berval *val )
2258 if( !val->bv_len ) return LDAP_INVALID_SYNTAX;
2260 if( val->bv_val[0] == '+' || val->bv_val[0] == '-' ) {
2261 if( val->bv_len < 2 ) return LDAP_INVALID_SYNTAX;
2262 } else if( !ASCII_DIGIT(val->bv_val[0]) ) {
2263 return LDAP_INVALID_SYNTAX;
2266 for(i=1; i < val->bv_len; i++) {
2267 if( !ASCII_DIGIT(val->bv_val[i]) ) return LDAP_INVALID_SYNTAX;
2270 return LDAP_SUCCESS;
2277 struct berval **normalized )
2280 struct berval *newval;
2286 negative = ( *p == '-' );
2287 if( *p == '-' || *p == '+' ) p++;
2289 /* Ignore leading zeros */
2290 while ( *p == '0' ) p++;
2292 newval = (struct berval *) ch_malloc( sizeof(struct berval) );
2295 newval->bv_val = ch_strdup("0");
2300 newval->bv_val = ch_malloc( val->bv_len + 1 );
2304 newval->bv_val[newval->bv_len++] = '-';
2307 for( ; *p != '\0'; p++ ) {
2308 newval->bv_val[newval->bv_len++] = *p;
2312 *normalized = newval;
2313 return LDAP_SUCCESS;
2317 countryStringValidate(
2319 struct berval *val )
2323 if( val->bv_len != 2 ) return LDAP_INVALID_SYNTAX;
2325 if( !SLAP_PRINTABLE(val->bv_val[0]) ) {
2326 return LDAP_INVALID_SYNTAX;
2328 if( !SLAP_PRINTABLE(val->bv_val[1]) ) {
2329 return LDAP_INVALID_SYNTAX;
2332 return LDAP_SUCCESS;
2336 printableStringValidate(
2338 struct berval *val )
2342 if( !val->bv_len ) return LDAP_INVALID_SYNTAX;
2344 for(i=0; i < val->bv_len; i++) {
2345 if( !SLAP_PRINTABLE(val->bv_val[i]) ) {
2346 return LDAP_INVALID_SYNTAX;
2350 return LDAP_SUCCESS;
2354 printablesStringValidate(
2356 struct berval *val )
2360 if( !val->bv_len ) return LDAP_INVALID_SYNTAX;
2362 for(i=0; i < val->bv_len; i++) {
2363 if( !SLAP_PRINTABLES(val->bv_val[i]) ) {
2364 return LDAP_INVALID_SYNTAX;
2368 return LDAP_SUCCESS;
2374 struct berval *val )
2378 if( !val->bv_len ) return LDAP_INVALID_SYNTAX;
2380 for(i=0; i < val->bv_len; i++) {
2381 if( !isascii(val->bv_val[i]) ) return LDAP_INVALID_SYNTAX;
2384 return LDAP_SUCCESS;
2391 struct berval **normalized )
2393 struct berval *newval;
2396 newval = ch_malloc( sizeof( struct berval ) );
2400 /* Ignore initial whitespace */
2401 while ( ASCII_SPACE( *p ) ) {
2407 return LDAP_INVALID_SYNTAX;
2410 newval->bv_val = ch_strdup( p );
2411 p = q = newval->bv_val;
2414 if ( ASCII_SPACE( *p ) ) {
2417 /* Ignore the extra whitespace */
2418 while ( ASCII_SPACE( *p ) ) {
2426 assert( *newval->bv_val );
2427 assert( newval->bv_val < p );
2430 /* cannot start with a space */
2431 assert( !ASCII_SPACE(*newval->bv_val) );
2434 * If the string ended in space, backup the pointer one
2435 * position. One is enough because the above loop collapsed
2436 * all whitespace to a single space.
2439 if ( ASCII_SPACE( q[-1] ) ) {
2443 /* cannot end with a space */
2444 assert( !ASCII_SPACE( q[-1] ) );
2446 /* null terminate */
2449 newval->bv_len = q - newval->bv_val;
2450 *normalized = newval;
2452 return LDAP_SUCCESS;
2461 struct berval *value,
2462 void *assertedValue )
2464 int match = value->bv_len - ((struct berval *) assertedValue)->bv_len;
2467 match = strncmp( value->bv_val,
2468 ((struct berval *) assertedValue)->bv_val,
2473 return LDAP_SUCCESS;
2477 caseExactIA5SubstringsMatch(
2482 struct berval *value,
2483 void *assertedValue )
2486 SubstringsAssertion *sub = assertedValue;
2487 struct berval left = *value;
2491 /* Add up asserted input length */
2492 if( sub->sa_initial ) {
2493 inlen += sub->sa_initial->bv_len;
2496 for(i=0; sub->sa_any[i] != NULL; i++) {
2497 inlen += sub->sa_any[i]->bv_len;
2500 if( sub->sa_final ) {
2501 inlen += sub->sa_final->bv_len;
2504 if( sub->sa_initial ) {
2505 if( inlen > left.bv_len ) {
2510 match = strncmp( sub->sa_initial->bv_val, left.bv_val,
2511 sub->sa_initial->bv_len );
2517 left.bv_val += sub->sa_initial->bv_len;
2518 left.bv_len -= sub->sa_initial->bv_len;
2519 inlen -= sub->sa_initial->bv_len;
2522 if( sub->sa_final ) {
2523 if( inlen > left.bv_len ) {
2528 match = strncmp( sub->sa_final->bv_val,
2529 &left.bv_val[left.bv_len - sub->sa_final->bv_len],
2530 sub->sa_final->bv_len );
2536 left.bv_len -= sub->sa_final->bv_len;
2537 inlen -= sub->sa_final->bv_len;
2541 for(i=0; sub->sa_any[i]; i++) {
2546 if( inlen > left.bv_len ) {
2547 /* not enough length */
2552 if( sub->sa_any[i]->bv_len == 0 ) {
2556 p = strchr( left.bv_val, *sub->sa_any[i]->bv_val );
2563 idx = p - left.bv_val;
2564 assert( idx < left.bv_len );
2566 if( idx >= left.bv_len ) {
2567 /* this shouldn't happen */
2574 if( sub->sa_any[i]->bv_len > left.bv_len ) {
2575 /* not enough left */
2580 match = strncmp( left.bv_val,
2581 sub->sa_any[i]->bv_val,
2582 sub->sa_any[i]->bv_len );
2590 left.bv_val += sub->sa_any[i]->bv_len;
2591 left.bv_len -= sub->sa_any[i]->bv_len;
2592 inlen -= sub->sa_any[i]->bv_len;
2598 return LDAP_SUCCESS;
2601 /* Index generation function */
2602 int caseExactIA5Indexer(
2607 struct berval *prefix,
2608 struct berval **values,
2609 struct berval ***keysp )
2613 struct berval **keys;
2614 HASH_CONTEXT HASHcontext;
2615 unsigned char HASHdigest[HASH_BYTES];
2616 struct berval digest;
2617 digest.bv_val = HASHdigest;
2618 digest.bv_len = sizeof(HASHdigest);
2620 /* we should have at least one value at this point */
2621 assert( values != NULL && values[0] != NULL );
2623 for( i=0; values[i] != NULL; i++ ) {
2624 /* just count them */
2627 keys = ch_malloc( sizeof( struct berval * ) * (i+1) );
2629 slen = strlen( syntax->ssyn_oid );
2630 mlen = strlen( mr->smr_oid );
2632 for( i=0; values[i] != NULL; i++ ) {
2633 struct berval *value = values[i];
2635 HASH_Init( &HASHcontext );
2636 if( prefix != NULL && prefix->bv_len > 0 ) {
2637 HASH_Update( &HASHcontext,
2638 prefix->bv_val, prefix->bv_len );
2640 HASH_Update( &HASHcontext,
2641 syntax->ssyn_oid, slen );
2642 HASH_Update( &HASHcontext,
2643 mr->smr_oid, mlen );
2644 HASH_Update( &HASHcontext,
2645 value->bv_val, value->bv_len );
2646 HASH_Final( HASHdigest, &HASHcontext );
2648 keys[i] = ber_bvdup( &digest );
2653 return LDAP_SUCCESS;
2656 /* Index generation function */
2657 int caseExactIA5Filter(
2662 struct berval *prefix,
2664 struct berval ***keysp )
2667 struct berval **keys;
2668 HASH_CONTEXT HASHcontext;
2669 unsigned char HASHdigest[HASH_BYTES];
2670 struct berval *value;
2671 struct berval digest;
2672 digest.bv_val = HASHdigest;
2673 digest.bv_len = sizeof(HASHdigest);
2675 slen = strlen( syntax->ssyn_oid );
2676 mlen = strlen( mr->smr_oid );
2678 value = (struct berval *) assertValue;
2680 keys = ch_malloc( sizeof( struct berval * ) * 2 );
2682 HASH_Init( &HASHcontext );
2683 if( prefix != NULL && prefix->bv_len > 0 ) {
2684 HASH_Update( &HASHcontext,
2685 prefix->bv_val, prefix->bv_len );
2687 HASH_Update( &HASHcontext,
2688 syntax->ssyn_oid, slen );
2689 HASH_Update( &HASHcontext,
2690 mr->smr_oid, mlen );
2691 HASH_Update( &HASHcontext,
2692 value->bv_val, value->bv_len );
2693 HASH_Final( HASHdigest, &HASHcontext );
2695 keys[0] = ber_bvdup( &digest );
2699 return LDAP_SUCCESS;
2702 /* Substrings Index generation function */
2703 int caseExactIA5SubstringsIndexer(
2708 struct berval *prefix,
2709 struct berval **values,
2710 struct berval ***keysp )
2714 struct berval **keys;
2715 HASH_CONTEXT HASHcontext;
2716 unsigned char HASHdigest[HASH_BYTES];
2717 struct berval digest;
2718 digest.bv_val = HASHdigest;
2719 digest.bv_len = sizeof(HASHdigest);
2721 /* we should have at least one value at this point */
2722 assert( values != NULL && values[0] != NULL );
2725 for( i=0; values[i] != NULL; i++ ) {
2726 /* count number of indices to generate */
2727 if( values[i]->bv_len < SLAP_INDEX_SUBSTR_MINLEN ) {
2731 if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
2732 if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
2733 nkeys += SLAP_INDEX_SUBSTR_MAXLEN -
2734 ( SLAP_INDEX_SUBSTR_MINLEN - 1);
2736 nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MINLEN - 1 );
2740 if( flags & SLAP_INDEX_SUBSTR_ANY ) {
2741 if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
2742 nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
2746 if( flags & SLAP_INDEX_SUBSTR_FINAL ) {
2747 if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
2748 nkeys += SLAP_INDEX_SUBSTR_MAXLEN -
2749 ( SLAP_INDEX_SUBSTR_MINLEN - 1);
2751 nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MINLEN - 1 );
2757 /* no keys to generate */
2759 return LDAP_SUCCESS;
2762 keys = ch_malloc( sizeof( struct berval * ) * (nkeys+1) );
2764 slen = strlen( syntax->ssyn_oid );
2765 mlen = strlen( mr->smr_oid );
2768 for( i=0; values[i] != NULL; i++ ) {
2770 struct berval *value;
2773 if( value->bv_len < SLAP_INDEX_SUBSTR_MINLEN ) continue;
2775 if( ( flags & SLAP_INDEX_SUBSTR_ANY ) &&
2776 ( value->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) )
2778 char pre = SLAP_INDEX_SUBSTR_PREFIX;
2779 max = value->bv_len - ( SLAP_INDEX_SUBSTR_MAXLEN - 1);
2781 for( j=0; j<max; j++ ) {
2782 HASH_Init( &HASHcontext );
2783 if( prefix != NULL && prefix->bv_len > 0 ) {
2784 HASH_Update( &HASHcontext,
2785 prefix->bv_val, prefix->bv_len );
2788 HASH_Update( &HASHcontext,
2789 &pre, sizeof( pre ) );
2790 HASH_Update( &HASHcontext,
2791 syntax->ssyn_oid, slen );
2792 HASH_Update( &HASHcontext,
2793 mr->smr_oid, mlen );
2794 HASH_Update( &HASHcontext,
2796 SLAP_INDEX_SUBSTR_MAXLEN );
2797 HASH_Final( HASHdigest, &HASHcontext );
2799 keys[nkeys++] = ber_bvdup( &digest );
2803 max = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
2804 ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
2806 for( j=SLAP_INDEX_SUBSTR_MINLEN; j<=max; j++ ) {
2809 if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
2810 pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX;
2811 HASH_Init( &HASHcontext );
2812 if( prefix != NULL && prefix->bv_len > 0 ) {
2813 HASH_Update( &HASHcontext,
2814 prefix->bv_val, prefix->bv_len );
2816 HASH_Update( &HASHcontext,
2817 &pre, sizeof( pre ) );
2818 HASH_Update( &HASHcontext,
2819 syntax->ssyn_oid, slen );
2820 HASH_Update( &HASHcontext,
2821 mr->smr_oid, mlen );
2822 HASH_Update( &HASHcontext,
2824 HASH_Final( HASHdigest, &HASHcontext );
2826 keys[nkeys++] = ber_bvdup( &digest );
2829 if( flags & SLAP_INDEX_SUBSTR_FINAL ) {
2830 pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX;
2831 HASH_Init( &HASHcontext );
2832 if( prefix != NULL && prefix->bv_len > 0 ) {
2833 HASH_Update( &HASHcontext,
2834 prefix->bv_val, prefix->bv_len );
2836 HASH_Update( &HASHcontext,
2837 &pre, sizeof( pre ) );
2838 HASH_Update( &HASHcontext,
2839 syntax->ssyn_oid, slen );
2840 HASH_Update( &HASHcontext,
2841 mr->smr_oid, mlen );
2842 HASH_Update( &HASHcontext,
2843 &value->bv_val[value->bv_len-j], j );
2844 HASH_Final( HASHdigest, &HASHcontext );
2846 keys[nkeys++] = ber_bvdup( &digest );
2860 return LDAP_SUCCESS;
2863 int caseExactIA5SubstringsFilter(
2868 struct berval *prefix,
2870 struct berval ***keysp )
2872 SubstringsAssertion *sa = assertValue;
2874 ber_len_t nkeys = 0;
2875 size_t slen, mlen, klen;
2876 struct berval **keys;
2877 HASH_CONTEXT HASHcontext;
2878 unsigned char HASHdigest[HASH_BYTES];
2879 struct berval *value;
2880 struct berval digest;
2882 if( flags & SLAP_INDEX_SUBSTR_INITIAL && sa->sa_initial != NULL &&
2883 sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
2888 if( flags & SLAP_INDEX_SUBSTR_ANY && sa->sa_any != NULL ) {
2890 for( i=0; sa->sa_any[i] != NULL; i++ ) {
2891 if( sa->sa_any[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
2892 /* don't bother accounting for stepping */
2893 nkeys += sa->sa_any[i]->bv_len -
2894 ( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
2899 if( flags & SLAP_INDEX_SUBSTR_FINAL && sa->sa_final != NULL &&
2900 sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
2907 return LDAP_SUCCESS;
2910 digest.bv_val = HASHdigest;
2911 digest.bv_len = sizeof(HASHdigest);
2913 slen = strlen( syntax->ssyn_oid );
2914 mlen = strlen( mr->smr_oid );
2916 keys = ch_malloc( sizeof( struct berval * ) * (nkeys+1) );
2919 if( flags & SLAP_INDEX_SUBSTR_INITIAL && sa->sa_initial != NULL &&
2920 sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
2922 pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX;
2923 value = sa->sa_initial;
2925 klen = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
2926 ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
2928 HASH_Init( &HASHcontext );
2929 if( prefix != NULL && prefix->bv_len > 0 ) {
2930 HASH_Update( &HASHcontext,
2931 prefix->bv_val, prefix->bv_len );
2933 HASH_Update( &HASHcontext,
2934 &pre, sizeof( pre ) );
2935 HASH_Update( &HASHcontext,
2936 syntax->ssyn_oid, slen );
2937 HASH_Update( &HASHcontext,
2938 mr->smr_oid, mlen );
2939 HASH_Update( &HASHcontext,
2940 value->bv_val, klen );
2941 HASH_Final( HASHdigest, &HASHcontext );
2943 keys[nkeys++] = ber_bvdup( &digest );
2946 if( flags & SLAP_INDEX_SUBSTR_ANY && sa->sa_any != NULL ) {
2948 pre = SLAP_INDEX_SUBSTR_PREFIX;
2949 klen = SLAP_INDEX_SUBSTR_MAXLEN;
2951 for( i=0; sa->sa_any[i] != NULL; i++ ) {
2952 if( sa->sa_any[i]->bv_len < SLAP_INDEX_SUBSTR_MAXLEN ) {
2956 value = sa->sa_any[i];
2959 j <= value->bv_len - SLAP_INDEX_SUBSTR_MAXLEN;
2960 j += SLAP_INDEX_SUBSTR_STEP )
2962 HASH_Init( &HASHcontext );
2963 if( prefix != NULL && prefix->bv_len > 0 ) {
2964 HASH_Update( &HASHcontext,
2965 prefix->bv_val, prefix->bv_len );
2967 HASH_Update( &HASHcontext,
2968 &pre, sizeof( pre ) );
2969 HASH_Update( &HASHcontext,
2970 syntax->ssyn_oid, slen );
2971 HASH_Update( &HASHcontext,
2972 mr->smr_oid, mlen );
2973 HASH_Update( &HASHcontext,
2974 &value->bv_val[j], klen );
2975 HASH_Final( HASHdigest, &HASHcontext );
2977 keys[nkeys++] = ber_bvdup( &digest );
2982 if( flags & SLAP_INDEX_SUBSTR_FINAL && sa->sa_final != NULL &&
2983 sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
2985 pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX;
2986 value = sa->sa_final;
2988 klen = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
2989 ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
2991 HASH_Init( &HASHcontext );
2992 if( prefix != NULL && prefix->bv_len > 0 ) {
2993 HASH_Update( &HASHcontext,
2994 prefix->bv_val, prefix->bv_len );
2996 HASH_Update( &HASHcontext,
2997 &pre, sizeof( pre ) );
2998 HASH_Update( &HASHcontext,
2999 syntax->ssyn_oid, slen );
3000 HASH_Update( &HASHcontext,
3001 mr->smr_oid, mlen );
3002 HASH_Update( &HASHcontext,
3003 &value->bv_val[value->bv_len-klen], klen );
3004 HASH_Final( HASHdigest, &HASHcontext );
3006 keys[nkeys++] = ber_bvdup( &digest );
3017 return LDAP_SUCCESS;
3026 struct berval *value,
3027 void *assertedValue )
3029 int match = value->bv_len - ((struct berval *) assertedValue)->bv_len;
3032 match = strncasecmp( value->bv_val,
3033 ((struct berval *) assertedValue)->bv_val,
3038 return LDAP_SUCCESS;
3042 caseIgnoreIA5SubstringsMatch(
3047 struct berval *value,
3048 void *assertedValue )
3051 SubstringsAssertion *sub = assertedValue;
3052 struct berval left = *value;
3056 /* Add up asserted input length */
3057 if( sub->sa_initial ) {
3058 inlen += sub->sa_initial->bv_len;
3061 for(i=0; sub->sa_any[i] != NULL; i++) {
3062 inlen += sub->sa_any[i]->bv_len;
3065 if( sub->sa_final ) {
3066 inlen += sub->sa_final->bv_len;
3069 if( sub->sa_initial ) {
3070 if( inlen > left.bv_len ) {
3075 match = strncasecmp( sub->sa_initial->bv_val, left.bv_val,
3076 sub->sa_initial->bv_len );
3082 left.bv_val += sub->sa_initial->bv_len;
3083 left.bv_len -= sub->sa_initial->bv_len;
3084 inlen -= sub->sa_initial->bv_len;
3087 if( sub->sa_final ) {
3088 if( inlen > left.bv_len ) {
3093 match = strncasecmp( sub->sa_final->bv_val,
3094 &left.bv_val[left.bv_len - sub->sa_final->bv_len],
3095 sub->sa_final->bv_len );
3101 left.bv_len -= sub->sa_final->bv_len;
3102 inlen -= sub->sa_final->bv_len;
3106 for(i=0; sub->sa_any[i]; i++) {
3111 if( inlen > left.bv_len ) {
3112 /* not enough length */
3117 if( sub->sa_any[i]->bv_len == 0 ) {
3121 p = strcasechr( left.bv_val, *sub->sa_any[i]->bv_val );
3128 idx = p - left.bv_val;
3129 assert( idx < left.bv_len );
3131 if( idx >= left.bv_len ) {
3132 /* this shouldn't happen */
3139 if( sub->sa_any[i]->bv_len > left.bv_len ) {
3140 /* not enough left */
3145 match = strncasecmp( left.bv_val,
3146 sub->sa_any[i]->bv_val,
3147 sub->sa_any[i]->bv_len );
3156 left.bv_val += sub->sa_any[i]->bv_len;
3157 left.bv_len -= sub->sa_any[i]->bv_len;
3158 inlen -= sub->sa_any[i]->bv_len;
3164 return LDAP_SUCCESS;
3167 /* Index generation function */
3168 int caseIgnoreIA5Indexer(
3173 struct berval *prefix,
3174 struct berval **values,
3175 struct berval ***keysp )
3179 struct berval **keys;
3180 HASH_CONTEXT HASHcontext;
3181 unsigned char HASHdigest[HASH_BYTES];
3182 struct berval digest;
3183 digest.bv_val = HASHdigest;
3184 digest.bv_len = sizeof(HASHdigest);
3186 /* we should have at least one value at this point */
3187 assert( values != NULL && values[0] != NULL );
3189 for( i=0; values[i] != NULL; i++ ) {
3190 /* just count them */
3193 keys = ch_malloc( sizeof( struct berval * ) * (i+1) );
3195 slen = strlen( syntax->ssyn_oid );
3196 mlen = strlen( mr->smr_oid );
3198 for( i=0; values[i] != NULL; i++ ) {
3199 struct berval *value = ber_bvdup( values[i] );
3200 ldap_pvt_str2upper( value->bv_val );
3202 HASH_Init( &HASHcontext );
3203 if( prefix != NULL && prefix->bv_len > 0 ) {
3204 HASH_Update( &HASHcontext,
3205 prefix->bv_val, prefix->bv_len );
3207 HASH_Update( &HASHcontext,
3208 syntax->ssyn_oid, slen );
3209 HASH_Update( &HASHcontext,
3210 mr->smr_oid, mlen );
3211 HASH_Update( &HASHcontext,
3212 value->bv_val, value->bv_len );
3213 HASH_Final( HASHdigest, &HASHcontext );
3215 ber_bvfree( value );
3217 keys[i] = ber_bvdup( &digest );
3222 return LDAP_SUCCESS;
3225 /* Index generation function */
3226 int caseIgnoreIA5Filter(
3231 struct berval *prefix,
3233 struct berval ***keysp )
3236 struct berval **keys;
3237 HASH_CONTEXT HASHcontext;
3238 unsigned char HASHdigest[HASH_BYTES];
3239 struct berval *value;
3240 struct berval digest;
3241 digest.bv_val = HASHdigest;
3242 digest.bv_len = sizeof(HASHdigest);
3244 slen = strlen( syntax->ssyn_oid );
3245 mlen = strlen( mr->smr_oid );
3247 value = ber_bvdup( (struct berval *) assertValue );
3248 ldap_pvt_str2upper( value->bv_val );
3250 keys = ch_malloc( sizeof( struct berval * ) * 2 );
3252 HASH_Init( &HASHcontext );
3253 if( prefix != NULL && prefix->bv_len > 0 ) {
3254 HASH_Update( &HASHcontext,
3255 prefix->bv_val, prefix->bv_len );
3257 HASH_Update( &HASHcontext,
3258 syntax->ssyn_oid, slen );
3259 HASH_Update( &HASHcontext,
3260 mr->smr_oid, mlen );
3261 HASH_Update( &HASHcontext,
3262 value->bv_val, value->bv_len );
3263 HASH_Final( HASHdigest, &HASHcontext );
3265 keys[0] = ber_bvdup( &digest );
3268 ber_bvfree( value );
3272 return LDAP_SUCCESS;
3275 /* Substrings Index generation function */
3276 int caseIgnoreIA5SubstringsIndexer(
3281 struct berval *prefix,
3282 struct berval **values,
3283 struct berval ***keysp )
3287 struct berval **keys;
3288 HASH_CONTEXT HASHcontext;
3289 unsigned char HASHdigest[HASH_BYTES];
3290 struct berval digest;
3291 digest.bv_val = HASHdigest;
3292 digest.bv_len = sizeof(HASHdigest);
3294 /* we should have at least one value at this point */
3295 assert( values != NULL && values[0] != NULL );
3298 for( i=0; values[i] != NULL; i++ ) {
3299 /* count number of indices to generate */
3300 if( values[i]->bv_len < SLAP_INDEX_SUBSTR_MINLEN ) {
3304 if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
3305 if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
3306 nkeys += SLAP_INDEX_SUBSTR_MAXLEN -
3307 ( SLAP_INDEX_SUBSTR_MINLEN - 1);
3309 nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MINLEN - 1 );
3313 if( flags & SLAP_INDEX_SUBSTR_ANY ) {
3314 if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
3315 nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
3319 if( flags & SLAP_INDEX_SUBSTR_FINAL ) {
3320 if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
3321 nkeys += SLAP_INDEX_SUBSTR_MAXLEN -
3322 ( SLAP_INDEX_SUBSTR_MINLEN - 1);
3324 nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MINLEN - 1 );
3330 /* no keys to generate */
3332 return LDAP_SUCCESS;
3335 keys = ch_malloc( sizeof( struct berval * ) * (nkeys+1) );
3337 slen = strlen( syntax->ssyn_oid );
3338 mlen = strlen( mr->smr_oid );
3341 for( i=0; values[i] != NULL; i++ ) {
3343 struct berval *value;
3345 if( values[i]->bv_len < SLAP_INDEX_SUBSTR_MINLEN ) continue;
3347 value = ber_bvdup( values[i] );
3348 ldap_pvt_str2upper( value->bv_val );
3350 if( ( flags & SLAP_INDEX_SUBSTR_ANY ) &&
3351 ( value->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) )
3353 char pre = SLAP_INDEX_SUBSTR_PREFIX;
3354 max = value->bv_len - ( SLAP_INDEX_SUBSTR_MAXLEN - 1);
3356 for( j=0; j<max; j++ ) {
3357 HASH_Init( &HASHcontext );
3358 if( prefix != NULL && prefix->bv_len > 0 ) {
3359 HASH_Update( &HASHcontext,
3360 prefix->bv_val, prefix->bv_len );
3363 HASH_Update( &HASHcontext,
3364 &pre, sizeof( pre ) );
3365 HASH_Update( &HASHcontext,
3366 syntax->ssyn_oid, slen );
3367 HASH_Update( &HASHcontext,
3368 mr->smr_oid, mlen );
3369 HASH_Update( &HASHcontext,
3371 SLAP_INDEX_SUBSTR_MAXLEN );
3372 HASH_Final( HASHdigest, &HASHcontext );
3374 keys[nkeys++] = ber_bvdup( &digest );
3378 max = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
3379 ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
3381 for( j=SLAP_INDEX_SUBSTR_MINLEN; j<=max; j++ ) {
3384 if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
3385 pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX;
3386 HASH_Init( &HASHcontext );
3387 if( prefix != NULL && prefix->bv_len > 0 ) {
3388 HASH_Update( &HASHcontext,
3389 prefix->bv_val, prefix->bv_len );
3391 HASH_Update( &HASHcontext,
3392 &pre, sizeof( pre ) );
3393 HASH_Update( &HASHcontext,
3394 syntax->ssyn_oid, slen );
3395 HASH_Update( &HASHcontext,
3396 mr->smr_oid, mlen );
3397 HASH_Update( &HASHcontext,
3399 HASH_Final( HASHdigest, &HASHcontext );
3401 keys[nkeys++] = ber_bvdup( &digest );
3404 if( flags & SLAP_INDEX_SUBSTR_FINAL ) {
3405 pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX;
3406 HASH_Init( &HASHcontext );
3407 if( prefix != NULL && prefix->bv_len > 0 ) {
3408 HASH_Update( &HASHcontext,
3409 prefix->bv_val, prefix->bv_len );
3411 HASH_Update( &HASHcontext,
3412 &pre, sizeof( pre ) );
3413 HASH_Update( &HASHcontext,
3414 syntax->ssyn_oid, slen );
3415 HASH_Update( &HASHcontext,
3416 mr->smr_oid, mlen );
3417 HASH_Update( &HASHcontext,
3418 &value->bv_val[value->bv_len-j], j );
3419 HASH_Final( HASHdigest, &HASHcontext );
3421 keys[nkeys++] = ber_bvdup( &digest );
3426 ber_bvfree( value );
3437 return LDAP_SUCCESS;
3440 int caseIgnoreIA5SubstringsFilter(
3445 struct berval *prefix,
3447 struct berval ***keysp )
3449 SubstringsAssertion *sa = assertValue;
3451 ber_len_t nkeys = 0;
3452 size_t slen, mlen, klen;
3453 struct berval **keys;
3454 HASH_CONTEXT HASHcontext;
3455 unsigned char HASHdigest[HASH_BYTES];
3456 struct berval *value;
3457 struct berval digest;
3459 if((flags & SLAP_INDEX_SUBSTR_INITIAL) && sa->sa_initial != NULL &&
3460 sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
3465 if((flags & SLAP_INDEX_SUBSTR_ANY) && sa->sa_any != NULL ) {
3467 for( i=0; sa->sa_any[i] != NULL; i++ ) {
3468 if( sa->sa_any[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
3469 /* don't bother accounting for stepping */
3470 nkeys += sa->sa_any[i]->bv_len -
3471 ( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
3476 if((flags & SLAP_INDEX_SUBSTR_FINAL) && sa->sa_final != NULL &&
3477 sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
3484 return LDAP_SUCCESS;
3487 digest.bv_val = HASHdigest;
3488 digest.bv_len = sizeof(HASHdigest);
3490 slen = strlen( syntax->ssyn_oid );
3491 mlen = strlen( mr->smr_oid );
3493 keys = ch_malloc( sizeof( struct berval * ) * (nkeys+1) );
3496 if((flags & SLAP_INDEX_SUBSTR_INITIAL) && sa->sa_initial != NULL &&
3497 sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
3499 pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX;
3500 value = ber_bvdup( sa->sa_initial );
3501 ldap_pvt_str2upper( value->bv_val );
3503 klen = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
3504 ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
3506 HASH_Init( &HASHcontext );
3507 if( prefix != NULL && prefix->bv_len > 0 ) {
3508 HASH_Update( &HASHcontext,
3509 prefix->bv_val, prefix->bv_len );
3511 HASH_Update( &HASHcontext,
3512 &pre, sizeof( pre ) );
3513 HASH_Update( &HASHcontext,
3514 syntax->ssyn_oid, slen );
3515 HASH_Update( &HASHcontext,
3516 mr->smr_oid, mlen );
3517 HASH_Update( &HASHcontext,
3518 value->bv_val, klen );
3519 HASH_Final( HASHdigest, &HASHcontext );
3521 ber_bvfree( value );
3522 keys[nkeys++] = ber_bvdup( &digest );
3525 if((flags & SLAP_INDEX_SUBSTR_ANY) && sa->sa_any != NULL ) {
3527 pre = SLAP_INDEX_SUBSTR_PREFIX;
3528 klen = SLAP_INDEX_SUBSTR_MAXLEN;
3530 for( i=0; sa->sa_any[i] != NULL; i++ ) {
3531 if( sa->sa_any[i]->bv_len < SLAP_INDEX_SUBSTR_MAXLEN ) {
3535 value = ber_bvdup( sa->sa_any[i] );
3536 ldap_pvt_str2upper( value->bv_val );
3539 j <= value->bv_len - SLAP_INDEX_SUBSTR_MAXLEN;
3540 j += SLAP_INDEX_SUBSTR_STEP )
3542 HASH_Init( &HASHcontext );
3543 if( prefix != NULL && prefix->bv_len > 0 ) {
3544 HASH_Update( &HASHcontext,
3545 prefix->bv_val, prefix->bv_len );
3547 HASH_Update( &HASHcontext,
3548 &pre, sizeof( pre ) );
3549 HASH_Update( &HASHcontext,
3550 syntax->ssyn_oid, slen );
3551 HASH_Update( &HASHcontext,
3552 mr->smr_oid, mlen );
3553 HASH_Update( &HASHcontext,
3554 &value->bv_val[j], klen );
3555 HASH_Final( HASHdigest, &HASHcontext );
3557 keys[nkeys++] = ber_bvdup( &digest );
3560 ber_bvfree( value );
3564 if((flags & SLAP_INDEX_SUBSTR_FINAL) && sa->sa_final != NULL &&
3565 sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
3567 pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX;
3568 value = ber_bvdup( sa->sa_final );
3569 ldap_pvt_str2upper( value->bv_val );
3571 klen = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
3572 ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
3574 HASH_Init( &HASHcontext );
3575 if( prefix != NULL && prefix->bv_len > 0 ) {
3576 HASH_Update( &HASHcontext,
3577 prefix->bv_val, prefix->bv_len );
3579 HASH_Update( &HASHcontext,
3580 &pre, sizeof( pre ) );
3581 HASH_Update( &HASHcontext,
3582 syntax->ssyn_oid, slen );
3583 HASH_Update( &HASHcontext,
3584 mr->smr_oid, mlen );
3585 HASH_Update( &HASHcontext,
3586 &value->bv_val[value->bv_len-klen], klen );
3587 HASH_Final( HASHdigest, &HASHcontext );
3589 ber_bvfree( value );
3590 keys[nkeys++] = ber_bvdup( &digest );
3601 return LDAP_SUCCESS;
3605 numericStringNormalize(
3608 struct berval **normalized )
3610 /* similiar to IA5StringNormalize except removes all spaces */
3611 struct berval *newval;
3614 newval = ch_malloc( sizeof( struct berval ) );
3618 /* Ignore initial whitespace */
3619 while ( ASCII_SPACE( *p ) ) {
3625 return LDAP_INVALID_SYNTAX;
3628 newval->bv_val = ch_strdup( p );
3629 p = q = newval->bv_val;
3632 if ( ASCII_SPACE( *p ) ) {
3633 /* Ignore whitespace */
3640 assert( *newval->bv_val );
3641 assert( newval->bv_val < p );
3644 /* cannot start with a space */
3645 assert( !ASCII_SPACE(*newval->bv_val) );
3647 /* cannot end with a space */
3648 assert( !ASCII_SPACE( q[-1] ) );
3650 /* null terminate */
3653 newval->bv_len = q - newval->bv_val;
3654 *normalized = newval;
3656 return LDAP_SUCCESS;
3660 objectIdentifierFirstComponentMatch(
3665 struct berval *value,
3666 void *assertedValue )
3668 int rc = LDAP_SUCCESS;
3670 struct berval *asserted = (struct berval *) assertedValue;
3674 if( value->bv_len == 0 || value->bv_val[0] != '(' /*')'*/ ) {
3675 return LDAP_INVALID_SYNTAX;
3678 /* trim leading white space */
3679 for( i=1; ASCII_SPACE(value->bv_val[i]) && i < value->bv_len; i++ ) {
3683 /* grab next word */
3684 oid.bv_val = &value->bv_val[i];
3685 oid.bv_len = value->bv_len - i;
3686 for( i=1; ASCII_SPACE(value->bv_val[i]) && i < oid.bv_len; i++ ) {
3691 /* insert attributeTypes, objectclass check here */
3692 if( OID_LEADCHAR(asserted->bv_val[0]) ) {
3693 rc = objectIdentifierMatch( &match, flags, syntax, mr, &oid, asserted );
3696 char *stored = ch_malloc( oid.bv_len + 1 );
3697 AC_MEMCPY( stored, oid.bv_val, oid.bv_len );
3698 stored[oid.bv_len] = '\0';
3700 if ( !strcmp( syntax->ssyn_oid, SLAP_SYNTAX_MATCHINGRULES_OID ) ) {
3701 MatchingRule *asserted_mr = mr_find( asserted->bv_val );
3702 MatchingRule *stored_mr = mr_find( stored );
3704 if( asserted_mr == NULL ) {
3705 rc = SLAPD_COMPARE_UNDEFINED;
3707 match = asserted_mr != stored_mr;
3710 } else if ( !strcmp( syntax->ssyn_oid,
3711 SLAP_SYNTAX_ATTRIBUTETYPES_OID ) )
3713 AttributeType *asserted_at = at_find( asserted->bv_val );
3714 AttributeType *stored_at = at_find( stored );
3716 if( asserted_at == NULL ) {
3717 rc = SLAPD_COMPARE_UNDEFINED;
3719 match = asserted_at != stored_at;
3722 } else if ( !strcmp( syntax->ssyn_oid,
3723 SLAP_SYNTAX_OBJECTCLASSES_OID ) )
3725 ObjectClass *asserted_oc = oc_find( asserted->bv_val );
3726 ObjectClass *stored_oc = oc_find( stored );
3728 if( asserted_oc == NULL ) {
3729 rc = SLAPD_COMPARE_UNDEFINED;
3731 match = asserted_oc != stored_oc;
3738 Debug( LDAP_DEBUG_ARGS, "objectIdentifierFirstComponentMatch "
3739 "%d\n\t\"%s\"\n\t\"%s\"\n",
3740 match, value->bv_val, asserted->bv_val );
3742 if( rc == LDAP_SUCCESS ) *matchp = match;
3747 check_time_syntax (struct berval *val,
3751 static int ceiling[9] = { 99, 99, 11, 30, 23, 59, 59, 12, 59 };
3752 static int mdays[2][12] = {
3753 /* non-leap years */
3754 { 30, 27, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30 },
3756 { 30, 28, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30 }
3759 int part, c, tzoffset, leapyear = 0 ;
3761 if( val->bv_len == 0 ) {
3762 return LDAP_INVALID_SYNTAX;
3765 p = (char *)val->bv_val;
3766 e = p + val->bv_len;
3768 /* Ignore initial whitespace */
3769 while ( ( p < e ) && ASCII_SPACE( *p ) ) {
3773 if (e - p < 13 - (2 * start)) {
3774 return LDAP_INVALID_SYNTAX;
3777 for (part = 0; part < 9; part++) {
3781 for (part = start; part < 7; part++) {
3783 if ((part == 6) && (c == 'Z' || c == '+' || c == '-')) {
3790 return LDAP_INVALID_SYNTAX;
3792 if (c < 0 || c > 9) {
3793 return LDAP_INVALID_SYNTAX;
3799 return LDAP_INVALID_SYNTAX;
3801 if (c < 0 || c > 9) {
3802 return LDAP_INVALID_SYNTAX;
3807 if (part == 2 || part == 3) {
3810 if (parts[part] < 0) {
3811 return LDAP_INVALID_SYNTAX;
3813 if (parts[part] > ceiling[part]) {
3814 return LDAP_INVALID_SYNTAX;
3818 /* leapyear check for the Gregorian calendar (year>1581) */
3819 if (((parts[1] % 4 == 0) && (parts[1] != 0)) ||
3820 ((parts[0] % 4 == 0) && (parts[1] == 0)))
3825 if (parts[3] > mdays[leapyear][parts[2]]) {
3826 return LDAP_INVALID_SYNTAX;
3831 tzoffset = 0; /* UTC */
3832 } else if (c != '+' && c != '-') {
3833 return LDAP_INVALID_SYNTAX;
3837 } else /* c == '+' */ {
3842 return LDAP_INVALID_SYNTAX;
3845 for (part = 7; part < 9; part++) {
3847 if (c < 0 || c > 9) {
3848 return LDAP_INVALID_SYNTAX;
3853 if (c < 0 || c > 9) {
3854 return LDAP_INVALID_SYNTAX;
3858 if (parts[part] < 0 || parts[part] > ceiling[part]) {
3859 return LDAP_INVALID_SYNTAX;
3864 /* Ignore trailing whitespace */
3865 while ( ( p < e ) && ASCII_SPACE( *p ) ) {
3869 return LDAP_INVALID_SYNTAX;
3872 switch ( tzoffset ) {
3873 case -1: /* negativ offset to UTC, ie west of Greenwich */
3874 parts[4] += parts[7];
3875 parts[5] += parts[8];
3876 for (part = 6; --part > 0; ) { /* offset is just hhmm, no seconds */
3880 c = mdays[leapyear][parts[2]];
3882 if (parts[part] > c) {
3883 parts[part] -= c + 1;
3888 case 1: /* positive offset to UTC, ie east of Greenwich */
3889 parts[4] -= parts[7];
3890 parts[5] -= parts[8];
3891 for (part = 6; --part > 0; ) {
3895 /* first arg to % needs to be non negativ */
3896 c = mdays[leapyear][(parts[2] - 1 + 12) % 12];
3898 if (parts[part] < 0) {
3899 parts[part] += c + 1;
3904 case 0: /* already UTC */
3908 return LDAP_SUCCESS;
3915 struct berval **normalized )
3920 rc = check_time_syntax(val, 1, parts);
3921 if (rc != LDAP_SUCCESS) {
3926 out = ch_malloc( sizeof(struct berval) );
3928 return LBER_ERROR_MEMORY;
3931 out->bv_val = ch_malloc( 14 );
3932 if ( out->bv_val == NULL ) {
3934 return LBER_ERROR_MEMORY;
3937 sprintf( out->bv_val, "%02ld%02ld%02ld%02ld%02ld%02ldZ",
3938 parts[1], parts[2] + 1, parts[3] + 1,
3939 parts[4], parts[5], parts[6] );
3943 return LDAP_SUCCESS;
3953 return check_time_syntax(in, 1, parts);
3957 generalizedTimeValidate(
3963 return check_time_syntax(in, 0, parts);
3967 generalizedTimeNormalize(
3970 struct berval **normalized )
3975 rc = check_time_syntax(val, 0, parts);
3976 if (rc != LDAP_SUCCESS) {
3981 out = ch_malloc( sizeof(struct berval) );
3983 return LBER_ERROR_MEMORY;
3986 out->bv_val = ch_malloc( 16 );
3987 if ( out->bv_val == NULL ) {
3989 return LBER_ERROR_MEMORY;
3992 sprintf( out->bv_val, "%02ld%02ld%02ld%02ld%02ld%02ld%02ldZ",
3993 parts[0], parts[1], parts[2] + 1, parts[3] + 1,
3994 parts[4], parts[5], parts[6] );
3998 return LDAP_SUCCESS;
4002 nisNetgroupTripleValidate(
4004 struct berval *val )
4009 if ( val->bv_len == 0 ) {
4010 return LDAP_INVALID_SYNTAX;
4013 p = (char *)val->bv_val;
4014 e = p + val->bv_len;
4017 /* syntax does not allow leading white space */
4018 /* Ignore initial whitespace */
4019 while ( ( p < e ) && ASCII_SPACE( *p ) ) {
4024 if ( *p != '(' /*')'*/ ) {
4025 return LDAP_INVALID_SYNTAX;
4028 for ( p++; ( p < e ) && ( *p != ')' ); p++ ) {
4032 return LDAP_INVALID_SYNTAX;
4035 } else if ( !ATTR_CHAR( *p ) ) {
4036 return LDAP_INVALID_SYNTAX;
4040 if ( ( commas != 2 ) || ( *p != /*'('*/ ')' ) ) {
4041 return LDAP_INVALID_SYNTAX;
4047 /* syntax does not allow trailing white space */
4048 /* Ignore trailing whitespace */
4049 while ( ( p < e ) && ASCII_SPACE( *p ) ) {
4055 return LDAP_INVALID_SYNTAX;
4058 return LDAP_SUCCESS;
4062 bootParameterValidate(
4064 struct berval *val )
4068 if ( val->bv_len == 0 ) {
4069 return LDAP_INVALID_SYNTAX;
4072 p = (char *)val->bv_val;
4073 e = p + val->bv_len;
4076 for (; ( p < e ) && ( *p != '=' ); p++ ) {
4077 if ( !ATTR_CHAR( *p ) ) {
4078 return LDAP_INVALID_SYNTAX;
4083 return LDAP_INVALID_SYNTAX;
4087 for ( p++; ( p < e ) && ( *p != ':' ); p++ ) {
4088 if ( !ATTR_CHAR( *p ) ) {
4089 return LDAP_INVALID_SYNTAX;
4094 return LDAP_INVALID_SYNTAX;
4098 for ( p++; p < e; p++ ) {
4099 if ( !ATTR_CHAR( *p ) ) {
4100 return LDAP_INVALID_SYNTAX;
4104 return LDAP_SUCCESS;
4107 struct syntax_defs_rec {
4110 slap_syntax_validate_func *sd_validate;
4111 slap_syntax_transform_func *sd_normalize;
4112 slap_syntax_transform_func *sd_pretty;
4113 #ifdef SLAPD_BINARY_CONVERSION
4114 slap_syntax_transform_func *sd_ber2str;
4115 slap_syntax_transform_func *sd_str2ber;
4119 #define X_BINARY "X-BINARY-TRANSFER-REQUIRED 'TRUE' "
4120 #define X_NOT_H_R "X-NOT-HUMAN-READABLE 'TRUE' "
4122 struct syntax_defs_rec syntax_defs[] = {
4123 {"( 1.3.6.1.4.1.1466.115.121.1.1 DESC 'ACI Item' " X_BINARY X_NOT_H_R ")",
4124 SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, NULL, NULL, NULL},
4125 {"( 1.3.6.1.4.1.1466.115.121.1.2 DESC 'Access Point' " X_NOT_H_R ")",
4126 0, NULL, NULL, NULL},
4127 {"( 1.3.6.1.4.1.1466.115.121.1.3 DESC 'Attribute Type Description' )",
4128 0, NULL, NULL, NULL},
4129 {"( 1.3.6.1.4.1.1466.115.121.1.4 DESC 'Audio' " X_NOT_H_R ")",
4130 SLAP_SYNTAX_BLOB, blobValidate, NULL, NULL},
4131 {"( 1.3.6.1.4.1.1466.115.121.1.5 DESC 'Binary' " X_NOT_H_R ")",
4132 SLAP_SYNTAX_BER, berValidate, NULL, NULL},
4133 {"( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'Bit String' )",
4134 0, bitStringValidate, NULL, NULL },
4135 {"( 1.3.6.1.4.1.1466.115.121.1.7 DESC 'Boolean' )",
4136 0, booleanValidate, NULL, NULL},
4137 {"( 1.3.6.1.4.1.1466.115.121.1.8 DESC 'Certificate' "
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.9 DESC 'Certificate List' "
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.10 DESC 'Certificate Pair' "
4144 X_BINARY X_NOT_H_R ")",
4145 SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL},
4146 {"( 1.3.6.1.4.1.1466.115.121.1.11 DESC 'Country String' )",
4147 0, countryStringValidate, IA5StringNormalize, NULL},
4148 {"( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'Distinguished Name' )",
4149 0, dnValidate, dnNormalize, dnPretty},
4150 {"( 1.3.6.1.4.1.1466.115.121.1.13 DESC 'Data Quality' )",
4151 0, NULL, NULL, NULL},
4152 {"( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'Delivery Method' )",
4153 0, NULL, NULL, NULL},
4154 {"( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'Directory String' )",
4155 0, UTF8StringValidate, UTF8StringNormalize, NULL},
4156 {"( 1.3.6.1.4.1.1466.115.121.1.16 DESC 'DIT Content Rule Description' )",
4157 0, NULL, NULL, NULL},
4158 {"( 1.3.6.1.4.1.1466.115.121.1.17 DESC 'DIT Structure Rule Description' )",
4159 0, NULL, NULL, NULL},
4160 {"( 1.3.6.1.4.1.1466.115.121.1.19 DESC 'DSA Quality' )",
4161 0, NULL, NULL, NULL},
4162 {"( 1.3.6.1.4.1.1466.115.121.1.20 DESC 'DSE Type' )",
4163 0, NULL, NULL, NULL},
4164 {"( 1.3.6.1.4.1.1466.115.121.1.21 DESC 'Enhanced Guide' )",
4165 0, NULL, NULL, NULL},
4166 {"( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'Facsimile Telephone Number' )",
4167 0, printablesStringValidate, IA5StringNormalize, NULL},
4168 {"( 1.3.6.1.4.1.1466.115.121.1.23 DESC 'Fax' " X_NOT_H_R ")",
4169 SLAP_SYNTAX_BLOB, NULL, NULL, NULL},
4170 {"( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'Generalized Time' )",
4171 0, generalizedTimeValidate, generalizedTimeNormalize, NULL},
4172 {"( 1.3.6.1.4.1.1466.115.121.1.25 DESC 'Guide' )",
4173 0, NULL, NULL, NULL},
4174 {"( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5 String' )",
4175 0, IA5StringValidate, IA5StringNormalize, NULL},
4176 {"( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'Integer' )",
4177 0, integerValidate, integerNormalize, integerPretty},
4178 {"( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' " X_NOT_H_R ")",
4179 SLAP_SYNTAX_BLOB, blobValidate, NULL, NULL},
4180 {"( 1.3.6.1.4.1.1466.115.121.1.29 DESC 'Master And Shadow Access Points' )",
4181 0, NULL, NULL, NULL},
4182 {"( 1.3.6.1.4.1.1466.115.121.1.30 DESC 'Matching Rule Description' )",
4183 0, NULL, NULL, NULL},
4184 {"( 1.3.6.1.4.1.1466.115.121.1.31 DESC 'Matching Rule Use Description' )",
4185 0, NULL, NULL, NULL},
4186 {"( 1.3.6.1.4.1.1466.115.121.1.32 DESC 'Mail Preference' )",
4187 0, NULL, NULL, NULL},
4188 {"( 1.3.6.1.4.1.1466.115.121.1.33 DESC 'MHS OR Address' )",
4189 0, NULL, NULL, NULL},
4190 {"( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'Name And Optional UID' )",
4191 0, nameUIDValidate, nameUIDNormalize, NULL},
4192 {"( 1.3.6.1.4.1.1466.115.121.1.35 DESC 'Name Form Description' )",
4193 0, NULL, NULL, NULL},
4194 {"( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'Numeric String' )",
4195 0, IA5StringValidate, numericStringNormalize, NULL},
4196 {"( 1.3.6.1.4.1.1466.115.121.1.37 DESC 'Object Class Description' )",
4197 0, NULL, NULL, NULL},
4198 {"( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )",
4199 0, oidValidate, NULL, NULL},
4200 {"( 1.3.6.1.4.1.1466.115.121.1.39 DESC 'Other Mailbox' )",
4201 0, IA5StringValidate, IA5StringNormalize, NULL},
4202 {"( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'Octet String' )",
4203 0, blobValidate, NULL, NULL},
4204 {"( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'Postal Address' )",
4205 0, UTF8StringValidate, UTF8StringNormalize, NULL},
4206 {"( 1.3.6.1.4.1.1466.115.121.1.42 DESC 'Protocol Information' )",
4207 0, NULL, NULL, NULL},
4208 {"( 1.3.6.1.4.1.1466.115.121.1.43 DESC 'Presentation Address' )",
4209 0, NULL, NULL, NULL},
4210 {"( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'Printable String' )",
4211 0, printableStringValidate, IA5StringNormalize, NULL},
4212 {"( 1.3.6.1.4.1.1466.115.121.1.49 DESC 'Supported Algorithm' "
4213 X_BINARY X_NOT_H_R ")",
4214 SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL},
4215 {"( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'Telephone Number' )",
4216 0, printableStringValidate, IA5StringNormalize, NULL},
4217 {"( 1.3.6.1.4.1.1466.115.121.1.51 DESC 'Teletex Terminal Identifier' )",
4218 0, NULL, NULL, NULL},
4219 {"( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'Telex Number' )",
4220 0, printableStringValidate, IA5StringNormalize, NULL},
4221 {"( 1.3.6.1.4.1.1466.115.121.1.53 DESC 'UTC Time' )",
4222 0, utcTimeValidate, utcTimeNormalize, NULL},
4223 {"( 1.3.6.1.4.1.1466.115.121.1.54 DESC 'LDAP Syntax Description' )",
4224 0, NULL, NULL, NULL},
4225 {"( 1.3.6.1.4.1.1466.115.121.1.55 DESC 'Modify Rights' )",
4226 0, NULL, NULL, NULL},
4227 {"( 1.3.6.1.4.1.1466.115.121.1.56 DESC 'LDAP Schema Definition' )",
4228 0, NULL, NULL, NULL},
4229 {"( 1.3.6.1.4.1.1466.115.121.1.57 DESC 'LDAP Schema Description' )",
4230 0, NULL, NULL, NULL},
4231 {"( 1.3.6.1.4.1.1466.115.121.1.58 DESC 'Substring Assertion' )",
4232 0, NULL, NULL, NULL},
4234 /* RFC 2307 NIS Syntaxes */
4235 {"( 1.3.6.1.1.1.0.0 DESC 'RFC2307 NIS Netgroup Triple' )",
4236 0, nisNetgroupTripleValidate, NULL, NULL},
4237 {"( 1.3.6.1.1.1.0.1 DESC 'RFC2307 Boot Parameter' )",
4238 0, bootParameterValidate, NULL, NULL},
4240 /* OpenLDAP Experimental Syntaxes */
4241 {"( 1.3.6.1.4.1.4203.666.2.1 DESC 'OpenLDAP Experimental ACI' )",
4242 0, IA5StringValidate /* THIS WILL CHANGE FOR NEW ACI SYNTAX */,
4244 {"( 1.3.6.1.4.1.4203.666.2.2 DESC 'OpenLDAP authPassword' )",
4245 0, NULL, NULL, NULL},
4247 /* OpenLDAP Void Syntax */
4248 {"( 1.3.6.1.4.1.4203.1.1.1 DESC 'OpenLDAP void' )" ,
4249 SLAP_SYNTAX_HIDE, inValidate, NULL, NULL},
4250 {NULL, 0, NULL, NULL, NULL}
4253 struct mrule_defs_rec {
4255 slap_mask_t mrd_usage;
4256 slap_mr_convert_func * mrd_convert;
4257 slap_mr_normalize_func * mrd_normalize;
4258 slap_mr_match_func * mrd_match;
4259 slap_mr_indexer_func * mrd_indexer;
4260 slap_mr_filter_func * mrd_filter;
4262 char * mrd_associated;
4266 * Other matching rules in X.520 that we do not use (yet):
4268 * 2.5.13.9 numericStringOrderingMatch
4269 * 2.5.13.15 integerOrderingMatch
4270 * 2.5.13.18 octetStringOrderingMatch
4271 * 2.5.13.19 octetStringSubstringsMatch
4272 * 2.5.13.25 uTCTimeMatch
4273 * 2.5.13.26 uTCTimeOrderingMatch
4274 * 2.5.13.31 directoryStringFirstComponentMatch
4275 * 2.5.13.32 wordMatch
4276 * 2.5.13.33 keywordMatch
4277 * 2.5.13.34 certificateExactMatch
4278 * 2.5.13.35 certificateMatch
4279 * 2.5.13.36 certificatePairExactMatch
4280 * 2.5.13.37 certificatePairMatch
4281 * 2.5.13.38 certificateListExactMatch
4282 * 2.5.13.39 certificateListMatch
4283 * 2.5.13.40 algorithmIdentifierMatch
4284 * 2.5.13.41 storedPrefixMatch
4285 * 2.5.13.42 attributeCertificateMatch
4286 * 2.5.13.43 readerAndKeyIDMatch
4287 * 2.5.13.44 attributeIntegrityMatch
4290 struct mrule_defs_rec mrule_defs[] = {
4292 * EQUALITY matching rules must be listed after associated APPROX
4293 * matching rules. So, we list all APPROX matching rules first.
4295 {"( " directoryStringApproxMatchOID " NAME 'directoryStringApproxMatch' "
4296 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
4297 SLAP_MR_EQUALITY_APPROX | SLAP_MR_EXT,
4299 directoryStringApproxMatch, directoryStringApproxIndexer,
4300 directoryStringApproxFilter,
4303 {"( " IA5StringApproxMatchOID " NAME 'IA5StringApproxMatch' "
4304 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
4305 SLAP_MR_EQUALITY_APPROX | SLAP_MR_EXT,
4307 IA5StringApproxMatch, IA5StringApproxIndexer,
4308 IA5StringApproxFilter,
4312 * Other matching rules
4315 {"( 2.5.13.0 NAME 'objectIdentifierMatch' "
4316 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
4317 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4319 objectIdentifierMatch, caseIgnoreIA5Indexer, caseIgnoreIA5Filter,
4322 {"( 2.5.13.1 NAME 'distinguishedNameMatch' "
4323 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )",
4324 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4326 dnMatch, dnIndexer, dnFilter,
4329 {"( 2.5.13.2 NAME 'caseIgnoreMatch' "
4330 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
4331 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4333 caseIgnoreMatch, caseIgnoreIndexer, caseIgnoreFilter,
4334 directoryStringApproxMatchOID },
4336 {"( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' "
4337 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
4340 caseIgnoreOrderingMatch, NULL, NULL,
4343 {"( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' "
4344 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
4345 SLAP_MR_SUBSTR | SLAP_MR_EXT,
4347 caseIgnoreSubstringsMatch,
4348 caseIgnoreSubstringsIndexer,
4349 caseIgnoreSubstringsFilter,
4352 {"( 2.5.13.5 NAME 'caseExactMatch' "
4353 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
4354 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4356 caseExactMatch, caseExactIndexer, caseExactFilter,
4357 directoryStringApproxMatchOID },
4359 {"( 2.5.13.6 NAME 'caseExactOrderingMatch' "
4360 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
4363 caseExactOrderingMatch, NULL, NULL,
4366 {"( 2.5.13.7 NAME 'caseExactSubstringsMatch' "
4367 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
4368 SLAP_MR_SUBSTR | SLAP_MR_EXT,
4370 caseExactSubstringsMatch,
4371 caseExactSubstringsIndexer,
4372 caseExactSubstringsFilter,
4375 {"( 2.5.13.8 NAME 'numericStringMatch' "
4376 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )",
4377 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4380 caseIgnoreIA5Indexer,
4381 caseIgnoreIA5Filter,
4384 {"( 2.5.13.10 NAME 'numericStringSubstringsMatch' "
4385 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
4386 SLAP_MR_SUBSTR | SLAP_MR_EXT,
4388 caseIgnoreIA5SubstringsMatch,
4389 caseIgnoreIA5SubstringsIndexer,
4390 caseIgnoreIA5SubstringsFilter,
4393 {"( 2.5.13.11 NAME 'caseIgnoreListMatch' "
4394 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )",
4395 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4397 caseIgnoreListMatch, NULL, NULL,
4400 {"( 2.5.13.12 NAME 'caseIgnoreListSubstringsMatch' "
4401 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
4402 SLAP_MR_SUBSTR | SLAP_MR_EXT,
4404 caseIgnoreListSubstringsMatch, NULL, NULL,
4407 {"( 2.5.13.13 NAME 'booleanMatch' "
4408 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )",
4409 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4411 booleanMatch, NULL, NULL,
4414 {"( 2.5.13.14 NAME 'integerMatch' "
4415 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
4416 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4418 integerMatch, integerIndexer, integerFilter,
4421 {"( 2.5.13.16 NAME 'bitStringMatch' "
4422 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )",
4423 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4425 bitStringMatch, NULL, NULL,
4428 {"( 2.5.13.17 NAME 'octetStringMatch' "
4429 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )",
4430 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4432 octetStringMatch, octetStringIndexer, octetStringFilter,
4435 {"( 2.5.13.20 NAME 'telephoneNumberMatch' "
4436 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )",
4437 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4439 telephoneNumberMatch, NULL, NULL,
4442 {"( 2.5.13.21 NAME 'telephoneNumberSubstringsMatch' "
4443 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
4444 SLAP_MR_SUBSTR | SLAP_MR_EXT,
4446 telephoneNumberSubstringsMatch, NULL, NULL,
4449 {"( 2.5.13.22 NAME 'presentationAddressMatch' "
4450 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.43 )",
4451 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4453 presentationAddressMatch, NULL, NULL,
4456 {"( 2.5.13.23 NAME 'uniqueMemberMatch' "
4457 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )",
4458 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4460 uniqueMemberMatch, NULL, NULL,
4463 {"( 2.5.13.24 NAME 'protocolInformationMatch' "
4464 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.42 )",
4465 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4467 protocolInformationMatch, NULL, NULL,
4470 {"( 2.5.13.27 NAME 'generalizedTimeMatch' "
4471 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
4472 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4474 generalizedTimeMatch, NULL, NULL,
4477 {"( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' "
4478 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
4481 generalizedTimeOrderingMatch, NULL, NULL,
4484 {"( 2.5.13.29 NAME 'integerFirstComponentMatch' "
4485 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
4486 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4488 integerFirstComponentMatch, NULL, NULL,
4491 {"( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' "
4492 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
4493 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4495 objectIdentifierFirstComponentMatch, NULL, NULL,
4498 {"( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' "
4499 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
4500 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4502 caseExactIA5Match, caseExactIA5Indexer, caseExactIA5Filter,
4503 IA5StringApproxMatchOID },
4505 {"( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' "
4506 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
4507 SLAP_MR_EQUALITY | SLAP_MR_EXT,
4509 caseIgnoreIA5Match, caseIgnoreIA5Indexer, caseIgnoreIA5Filter,
4510 IA5StringApproxMatchOID },
4512 {"( 1.3.6.1.4.1.1466.109.114.3 NAME 'caseIgnoreIA5SubstringsMatch' "
4513 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
4516 caseIgnoreIA5SubstringsMatch,
4517 caseIgnoreIA5SubstringsIndexer,
4518 caseIgnoreIA5SubstringsFilter,
4521 {"( 1.3.6.1.4.1.4203.1.2.1 NAME 'caseExactIA5SubstringsMatch' "
4522 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
4525 caseExactIA5SubstringsMatch,
4526 caseExactIA5SubstringsIndexer,
4527 caseExactIA5SubstringsFilter,
4530 {"( 1.3.6.1.4.1.4203.666.4.1 NAME 'authPasswordMatch' "
4531 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )",
4534 authPasswordMatch, NULL, NULL,
4537 {"( 1.3.6.1.4.1.4203.666.4.2 NAME 'OpenLDAPaciMatch' "
4538 "SYNTAX 1.3.6.1.4.1.4203.666.2.1 )",
4541 OpenLDAPaciMatch, NULL, NULL,
4544 {NULL, SLAP_MR_NONE, NULL, NULL, NULL, NULL}
4553 /* we should only be called once (from main) */
4554 assert( schema_init_done == 0 );
4556 for ( i=0; syntax_defs[i].sd_desc != NULL; i++ ) {
4557 res = register_syntax( syntax_defs[i].sd_desc,
4558 syntax_defs[i].sd_flags,
4559 syntax_defs[i].sd_validate,
4560 syntax_defs[i].sd_normalize,
4561 syntax_defs[i].sd_pretty
4562 #ifdef SLAPD_BINARY_CONVERSION
4564 syntax_defs[i].sd_ber2str,
4565 syntax_defs[i].sd_str2ber
4570 fprintf( stderr, "schema_init: Error registering syntax %s\n",
4571 syntax_defs[i].sd_desc );
4576 for ( i=0; mrule_defs[i].mrd_desc != NULL; i++ ) {
4577 if( mrule_defs[i].mrd_usage == SLAP_MR_NONE ) {
4579 "schema_init: Ingoring unusable matching rule %s\n",
4580 mrule_defs[i].mrd_desc );
4584 res = register_matching_rule(
4585 mrule_defs[i].mrd_desc,
4586 mrule_defs[i].mrd_usage,
4587 mrule_defs[i].mrd_convert,
4588 mrule_defs[i].mrd_normalize,
4589 mrule_defs[i].mrd_match,
4590 mrule_defs[i].mrd_indexer,
4591 mrule_defs[i].mrd_filter,
4592 mrule_defs[i].mrd_associated );
4596 "schema_init: Error registering matching rule %s\n",
4597 mrule_defs[i].mrd_desc );
4601 schema_init_done = 1;
4602 return LDAP_SUCCESS;