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>
27 if( in->bv_len == 0 ) return LDAP_SUCCESS;
29 dn = ch_strdup( in->bv_val );
31 rc = dn_validate( dn ) == NULL
32 ? LDAP_INVALID_SYNTAX : LDAP_SUCCESS;
42 struct berval **normalized )
44 struct berval *out = ber_bvdup( val );
46 if( out->bv_len != 0 ) {
48 #ifdef USE_DN_NORMALIZE
49 dn = dn_normalize( out->bv_val );
51 dn = dn_validate( out->bv_val );
56 return LDAP_INVALID_SYNTAX;
60 out->bv_len = strlen( dn );
77 struct berval *asserted = (struct berval *) assertedValue;
79 match = value->bv_len - asserted->bv_len;
82 #ifdef USE_DN_NORMALIZE
83 match = strcmp( value->bv_val, asserted->bv_val );
85 match = strcasecmp( value->bv_val, asserted->bv_val );
89 Debug( LDAP_DEBUG_ARGS, "dnMatch %d\n\t\"%s\"\n\t\"%s\"\n",
90 match, value->bv_val, asserted->bv_val );
101 /* any value allowed */
110 /* any value allowed */
114 #define berValidate blobValidate
123 unsigned char *u = in->bv_val;
125 for( count = in->bv_len; count > 0; count-=len, u+=len ) {
126 /* get the length indicated by the first byte */
127 len = LDAP_UTF8_CHARLEN( u );
129 /* should not be zero */
130 if( len == 0 ) return LDAP_INVALID_SYNTAX;
132 /* make sure len corresponds with the offset
133 to the next character */
134 if( LDAP_UTF8_OFFSET( u ) != len ) return LDAP_INVALID_SYNTAX;
137 if( count != 0 ) return LDAP_INVALID_SYNTAX;
146 struct berval **normalized )
148 struct berval *newval;
151 newval = ch_malloc( sizeof( struct berval ) );
155 /* Ignore initial whitespace */
156 while ( ldap_utf8_isspace( p ) ) {
162 return LDAP_INVALID_SYNTAX;
165 newval->bv_val = ch_strdup( p );
166 p = q = newval->bv_val;
172 if ( ldap_utf8_isspace( p ) ) {
173 len = LDAP_UTF8_COPY(q,p);
178 /* Ignore the extra whitespace */
179 while ( ldap_utf8_isspace( p ) ) {
183 len = LDAP_UTF8_COPY(q,p);
190 assert( *newval->bv_val );
191 assert( newval->bv_val < p );
194 /* cannot start with a space */
195 assert( !ldap_utf8_isspace(newval->bv_val) );
198 * If the string ended in space, backup the pointer one
199 * position. One is enough because the above loop collapsed
200 * all whitespace to a single space.
207 /* cannot end with a space */
208 assert( !ldap_utf8_isspace( LDAP_UTF8_PREV(q) ) );
213 newval->bv_len = q - newval->bv_val;
214 *normalized = newval;
226 if( val->bv_len == 0 ) return 0;
228 if( isdigit(val->bv_val[0]) ) {
230 for(i=1; i < val->bv_len; i++) {
231 if( val->bv_val[i] == '.' ) {
232 if( dot++ ) return 1;
233 } else if ( isdigit(val->bv_val[i]) ) {
236 return LDAP_INVALID_SYNTAX;
240 return !dot ? LDAP_SUCCESS : LDAP_INVALID_SYNTAX;
242 } else if( isalpha(val->bv_val[0]) ) {
243 for(i=1; i < val->bv_len; i++) {
244 if( !isalpha(val->bv_val[i] ) ) {
245 return LDAP_INVALID_SYNTAX;
252 return LDAP_INVALID_SYNTAX;
262 for(i=0; i < val->bv_len; i++) {
263 if( !isdigit(val->bv_val[i]) ) return LDAP_INVALID_SYNTAX;
270 printableStringValidate(
276 for(i=0; i < val->bv_len; i++) {
277 if( !isprint(val->bv_val[i]) ) return LDAP_INVALID_SYNTAX;
290 for(i=0; i < val->bv_len; i++) {
291 if( !isascii(val->bv_val[i]) ) return LDAP_INVALID_SYNTAX;
301 struct berval **out )
304 ber_len_t i, len = in->bv_len;
305 struct berval *bv = ch_malloc( sizeof(struct berval) );
307 bv->bv_len = len * sizeof( ldap_unicode_t );
308 bv->bv_val = (char *) u = ch_malloc( bv->bv_len + sizeof( ldap_unicode_t ) );;
310 for(i=0; i < len; i++ ) {
312 * IA5StringValidate should have been called to ensure
313 * input is limited to IA5.
315 u[i] = in->bv_val[i];
327 struct berval **normalized )
329 struct berval *newval;
332 newval = ch_malloc( sizeof( struct berval ) );
336 /* Ignore initial whitespace */
337 while ( isspace( *p++ ) ) {
343 return LDAP_INVALID_SYNTAX;
346 newval->bv_val = ch_strdup( p );
347 p = q = newval->bv_val;
350 if ( isspace( *p ) ) {
353 /* Ignore the extra whitespace */
354 while ( isspace( *p++ ) ) {
362 assert( *newval->bv_val );
363 assert( newval->bv_val < p );
366 /* cannot start with a space */
367 assert( !isspace(*newval->bv_val) );
370 * If the string ended in space, backup the pointer one
371 * position. One is enough because the above loop collapsed
372 * all whitespace to a single space.
375 if ( isspace( q[-1] ) ) {
379 /* cannot end with a space */
380 assert( !isspace( q[-1] ) );
385 newval->bv_len = q - newval->bv_val;
386 *normalized = newval;
397 struct berval *value,
398 void *assertedValue )
400 *match = strcmp( value->bv_val,
401 ((struct berval *) assertedValue)->bv_val );
405 #ifdef SLAPD_SCHEMA_NOT_COMPAT
407 caseExactIA5SubstringsMatch(
412 struct berval *value,
413 void *assertedValue )
416 SubstringsAssertion *sub = assertedValue;
417 struct berval left = *value;
421 if( sub->sa_initial ) {
422 inlen += sub->sa_initial->bv_len;
425 for(i=0; sub->sa_any[i]; i++) {
426 inlen += sub->sa_final->bv_len;
429 if( sub->sa_final ) {
430 inlen += sub->sa_final->bv_len;
433 if( inlen > value->bv_len ) {
438 if( sub->sa_initial ) {
439 match = strncmp( sub->sa_initial->bv_val, left.bv_val,
440 sub->sa_initial->bv_len );
446 left.bv_val += sub->sa_initial->bv_len;
447 left.bv_len -= sub->sa_initial->bv_len;
448 inlen -= sub->sa_initial->bv_len;
451 if( sub->sa_final ) {
452 match = strncmp( sub->sa_final->bv_val,
453 &left.bv_val[left.bv_len - sub->sa_final->bv_len],
454 sub->sa_final->bv_len );
460 left.bv_len -= sub->sa_final->bv_len;
461 inlen -= sub->sa_initial->bv_len;
465 for(i=0; sub->sa_any[i]; i++) {
470 if( inlen < left.bv_len ) {
471 /* not enough length */
476 if( sub->sa_any[i]->bv_len == 0 ) {
480 p = strchr( left.bv_val, *sub->sa_any[i]->bv_val );
487 idx = p - left.bv_val;
488 assert( idx < left.bv_len );
490 if( idx >= left.bv_len ) {
491 /* this shouldn't happen */
498 if( sub->sa_any[i]->bv_len > left.bv_len ) {
499 /* not enough left */
504 match = strncmp( left.bv_val,
505 sub->sa_any[i]->bv_val,
506 sub->sa_any[i]->bv_len );
513 left.bv_val += sub->sa_any[i]->bv_len;
514 left.bv_len -= sub->sa_any[i]->bv_len;
530 struct berval *value,
531 void *assertedValue )
533 *match = strcasecmp( value->bv_val,
534 ((struct berval *) assertedValue)->bv_val );
538 #ifdef SLAPD_SCHEMA_NOT_COMPAT
539 static char *strcasechr( const char *str, int c )
541 char *lower = strchr( str, TOLOWER(c) );
542 char *upper = strchr( str, TOUPPER(c) );
544 if( lower && upper ) {
545 return lower < upper ? lower : upper;
546 } else if ( lower ) {
554 caseIgnoreIA5SubstringsMatch(
559 struct berval *value,
560 void *assertedValue )
563 SubstringsAssertion *sub = assertedValue;
564 struct berval left = *value;
568 if( sub->sa_initial ) {
569 inlen += sub->sa_initial->bv_len;
572 for(i=0; sub->sa_any[i]; i++) {
573 inlen += sub->sa_final->bv_len;
576 if( sub->sa_final ) {
577 inlen += sub->sa_final->bv_len;
580 if( inlen > value->bv_len ) {
585 if( sub->sa_initial ) {
586 match = strncasecmp( sub->sa_initial->bv_val, left.bv_val,
587 sub->sa_initial->bv_len );
593 left.bv_val += sub->sa_initial->bv_len;
594 left.bv_len -= sub->sa_initial->bv_len;
597 if( sub->sa_final ) {
598 match = strncasecmp( sub->sa_final->bv_val,
599 &left.bv_val[left.bv_len - sub->sa_final->bv_len],
600 sub->sa_final->bv_len );
606 left.bv_len -= sub->sa_final->bv_len;
610 for(i=0; sub->sa_any[i]; i++) {
615 if( inlen < left.bv_len ) {
616 /* not enough length */
621 if( sub->sa_any[i]->bv_len == 0 ) {
625 p = strcasechr( left.bv_val, *sub->sa_any[i]->bv_val );
632 idx = p - left.bv_val;
633 assert( idx < left.bv_len );
635 if( idx >= left.bv_len ) {
636 /* this shouldn't happen */
643 if( sub->sa_any[i]->bv_len > left.bv_len ) {
644 /* not enough left */
649 match = strncasecmp( left.bv_val,
650 sub->sa_any[i]->bv_val,
651 sub->sa_any[i]->bv_len );
658 left.bv_val += sub->sa_any[i]->bv_len;
659 left.bv_len -= sub->sa_any[i]->bv_len;
669 struct syntax_defs_rec {
672 slap_syntax_validate_func *sd_validate;
673 slap_syntax_transform_func *sd_normalize;
674 slap_syntax_transform_func *sd_pretty;
675 #ifdef SLAPD_BINARY_CONVERSION
676 slap_syntax_transform_func *sd_ber2str;
677 slap_syntax_transform_func *sd_str2ber;
681 #define X_HIDE "X-HIDE 'TRUE' "
682 #define X_BINARY "X-BINARY-TRANSFER-REQUIRED 'TRUE' "
683 #define X_NOT_H_R "X-NOT-HUMAN-READABLE 'TRUE' "
685 struct syntax_defs_rec syntax_defs[] = {
686 {"( 1.3.6.1.4.1.1466.115.121.1.1 DESC 'ACI Item' " X_BINARY X_NOT_H_R ")",
687 SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, NULL, NULL, NULL},
688 {"( 1.3.6.1.4.1.1466.115.121.1.2 DESC 'Access Point' " X_NOT_H_R ")",
689 0, NULL, NULL, NULL},
690 {"( 1.3.6.1.4.1.1466.115.121.1.3 DESC 'Attribute Type Description' )",
691 0, NULL, NULL, NULL},
692 {"( 1.3.6.1.4.1.1466.115.121.1.4 DESC 'Audio' " X_NOT_H_R ")",
693 SLAP_SYNTAX_BLOB, blobValidate, NULL, NULL},
694 {"( 1.3.6.1.4.1.1466.115.121.1.5 DESC 'Binary' " X_BINARY X_NOT_H_R ")",
695 SLAP_SYNTAX_BER, berValidate, NULL, NULL},
696 {"( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'Bit String' )",
697 0, NULL, NULL, NULL},
698 {"( 1.3.6.1.4.1.1466.115.121.1.7 DESC 'Boolean' )",
699 0, NULL, NULL, NULL},
700 {"( 1.3.6.1.4.1.1466.115.121.1.8 DESC 'Certificate' "
701 X_BINARY X_NOT_H_R ")",
702 SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL},
703 {"( 1.3.6.1.4.1.1466.115.121.1.9 DESC 'Certificate List' "
704 X_BINARY X_NOT_H_R ")",
705 SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL},
706 {"( 1.3.6.1.4.1.1466.115.121.1.10 DESC 'Certificate Pair' "
707 X_BINARY X_NOT_H_R ")",
708 SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL},
709 {"( 1.3.6.1.4.1.1466.115.121.1.11 DESC 'Country String' )",
710 0, NULL, NULL, NULL},
711 {"( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'Distinguished Name' )",
712 0, dnValidate, dnNormalize, NULL},
713 {"( 1.3.6.1.4.1.1466.115.121.1.13 DESC 'Data Quality' )",
714 0, NULL, NULL, NULL},
715 {"( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'Delivery Method' )",
716 0, NULL, NULL, NULL},
717 {"( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'Directory String' )",
718 0, UTF8StringValidate, UTF8StringNormalize, NULL},
719 {"( 1.3.6.1.4.1.1466.115.121.1.16 DESC 'DIT Content Rule Description' )",
720 0, NULL, NULL, NULL},
721 {"( 1.3.6.1.4.1.1466.115.121.1.17 DESC 'DIT Structure Rule Description' )",
722 0, NULL, NULL, NULL},
723 {"( 1.3.6.1.4.1.1466.115.121.1.19 DESC 'DSA Quality' )",
724 0, NULL, NULL, NULL},
725 {"( 1.3.6.1.4.1.1466.115.121.1.20 DESC 'DSE Type' )",
726 0, NULL, NULL, NULL},
727 {"( 1.3.6.1.4.1.1466.115.121.1.21 DESC 'Enhanced Guide' )",
728 0, NULL, NULL, NULL},
729 {"( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'Facsimile Telephone Number' )",
730 0, blobValidate, NULL, NULL},
731 {"( 1.3.6.1.4.1.1466.115.121.1.23 DESC 'Fax' " X_NOT_H_R ")",
732 SLAP_SYNTAX_BLOB, NULL, NULL, NULL},
733 {"( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'Generalized Time' )",
734 0, NULL, NULL, NULL},
735 {"( 1.3.6.1.4.1.1466.115.121.1.25 DESC 'Guide' )",
736 0, NULL, NULL, NULL},
737 {"( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5 String' )",
738 0, IA5StringValidate, IA5StringNormalize, NULL},
739 {"( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'Integer' )",
740 0, integerValidate, NULL, NULL},
741 {"( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' " X_NOT_H_R ")",
742 SLAP_SYNTAX_BLOB, NULL, NULL, NULL},
743 {"( 1.3.6.1.4.1.1466.115.121.1.29 DESC 'Master And Shadow Access Points' )",
744 0, NULL, NULL, NULL},
745 {"( 1.3.6.1.4.1.1466.115.121.1.30 DESC 'Matching Rule Description' )",
746 0, NULL, NULL, NULL},
747 {"( 1.3.6.1.4.1.1466.115.121.1.31 DESC 'Matching Rule Use Description' )",
748 0, NULL, NULL, NULL},
749 {"( 1.3.6.1.4.1.1466.115.121.1.32 DESC 'Mail Preference' )",
750 0, NULL, NULL, NULL},
751 {"( 1.3.6.1.4.1.1466.115.121.1.33 DESC 'MHS OR Address' )",
752 0, NULL, NULL, NULL},
753 {"( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'Name And Optional UID' )",
754 0, NULL, NULL, NULL},
755 {"( 1.3.6.1.4.1.1466.115.121.1.35 DESC 'Name Form Description' )",
756 0, NULL, NULL, NULL},
757 {"( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'Numeric String' )",
758 0, NULL, NULL, NULL},
759 {"( 1.3.6.1.4.1.1466.115.121.1.37 DESC 'Object Class Description' )",
760 0, NULL, NULL, NULL},
761 {"( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )",
762 0, oidValidate, NULL, NULL},
763 {"( 1.3.6.1.4.1.1466.115.121.1.39 DESC 'Other Mailbox' )",
764 0, NULL, NULL, NULL},
765 {"( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'Octet String' )",
766 0, blobValidate, NULL, NULL},
767 {"( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'Postal Address' )",
768 0, blobValidate, NULL, NULL},
769 {"( 1.3.6.1.4.1.1466.115.121.1.42 DESC 'Protocol Information' )",
770 0, NULL, NULL, NULL},
771 {"( 1.3.6.1.4.1.1466.115.121.1.43 DESC 'Presentation Address' )",
772 0, NULL, NULL, NULL},
773 {"( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'Printable String' )",
774 0, printableStringValidate, NULL, NULL},
775 {"( 1.3.6.1.4.1.1466.115.121.1.49 DESC 'Supported Algorithm' "
776 X_BINARY X_NOT_H_R ")",
777 SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL},
778 {"( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'Telephone Number' )",
779 0, blobValidate, NULL, NULL},
780 {"( 1.3.6.1.4.1.1466.115.121.1.51 DESC 'Teletex Terminal Identifier' )",
781 0, NULL, NULL, NULL},
782 {"( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'Telex Number' )",
783 0, NULL, NULL, NULL},
784 {"( 1.3.6.1.4.1.1466.115.121.1.53 DESC 'UTC Time' )",
785 0, NULL, NULL, NULL},
786 {"( 1.3.6.1.4.1.1466.115.121.1.54 DESC 'LDAP Syntax Description' )",
787 0, NULL, NULL, NULL},
788 {"( 1.3.6.1.4.1.1466.115.121.1.55 DESC 'Modify Rights' )",
789 0, NULL, NULL, NULL},
790 {"( 1.3.6.1.4.1.1466.115.121.1.56 DESC 'LDAP Schema Definition' )",
791 0, NULL, NULL, NULL},
792 {"( 1.3.6.1.4.1.1466.115.121.1.57 DESC 'LDAP Schema Description' )",
793 0, NULL, NULL, NULL},
794 {"( 1.3.6.1.4.1.1466.115.121.1.58 DESC 'Substring Assertion' )",
795 0, NULL, NULL, NULL},
797 /* OpenLDAP Experimental Syntaxes */
798 {"( 1.3.6.1.4.1.4203.666.2.1 DESC 'OpenLDAP Experimental ACI' )",
799 0, NULL, NULL, NULL},
800 {"( 1.3.6.1.4.1.4203.666.2.2 DESC 'OpenLDAP void' " X_HIDE ")" ,
801 SLAP_SYNTAX_HIDE, NULL, NULL, NULL},
802 {"( 1.3.6.1.4.1.4203.666.2.3 DESC 'OpenLDAP DN' " X_HIDE ")" ,
803 SLAP_SYNTAX_HIDE, NULL, NULL, NULL},
805 {NULL, 0, NULL, NULL, NULL}
808 struct mrule_defs_rec {
811 slap_mr_convert_func * mrd_convert;
812 slap_mr_normalize_func * mrd_normalize;
813 slap_mr_match_func * mrd_match;
814 slap_mr_indexer_func * mrd_indexer;
815 slap_mr_filter_func * mrd_filter;
819 * Other matching rules in X.520 that we do not use:
821 * 2.5.13.9 numericStringOrderingMatch
822 * 2.5.13.13 booleanMatch
823 * 2.5.13.15 integerOrderingMatch
824 * 2.5.13.18 octetStringOrderingMatch
825 * 2.5.13.19 octetStringSubstringsMatch
826 * 2.5.13.25 uTCTimeMatch
827 * 2.5.13.26 uTCTimeOrderingMatch
828 * 2.5.13.31 directoryStringFirstComponentMatch
829 * 2.5.13.32 wordMatch
830 * 2.5.13.33 keywordMatch
831 * 2.5.13.34 certificateExactMatch
832 * 2.5.13.35 certificateMatch
833 * 2.5.13.36 certificatePairExactMatch
834 * 2.5.13.37 certificatePairMatch
835 * 2.5.13.38 certificateListExactMatch
836 * 2.5.13.39 certificateListMatch
837 * 2.5.13.40 algorithmIdentifierMatch
838 * 2.5.13.41 storedPrefixMatch
839 * 2.5.13.42 attributeCertificateMatch
840 * 2.5.13.43 readerAndKeyIDMatch
841 * 2.5.13.44 attributeIntegrityMatch
844 #ifndef SLAPD_SCHEMA_NOT_COMPAT
845 #define caseIgnoreIA5SubstringsMatch NULL
846 #define caseExactIA5SubstringsMatch NULL
849 /* recycled matching functions */
850 #define caseIgnoreMatch caseIgnoreIA5Match
851 #define caseIgnoreOrderingMatch caseIgnoreMatch
852 #define caseIgnoreSubstringsMatch caseIgnoreIA5SubstringsMatch
853 #define caseExactMatch caseExactIA5Match
854 #define caseExactOrderingMatch caseExactMatch
855 #define caseExactSubstringsMatch caseExactIA5SubstringsMatch
857 /* unimplemented matching functions */
858 #define objectIdentifierMatch NULL
859 #define numericStringMatch NULL
860 #define numericStringSubstringsMatch NULL
861 #define caseIgnoreListMatch NULL
862 #define caseIgnoreListSubstringsMatch NULL
863 #define integerMatch NULL
864 #define bitStringMatch NULL
865 #define octetStringMatch NULL
866 #define telephoneNumberMatch NULL
867 #define telephoneNumberSubstringsMatch NULL
868 #define presentationAddressMatch NULL
869 #define uniqueMemberMatch NULL
870 #define protocolInformationMatch NULL
871 #define generalizedTimeMatch NULL
872 #define generalizedTimeOrderingMatch NULL
873 #define integerFirstComponentMatch NULL
874 #define objectIdentifierFirstComponentMatch NULL
876 struct mrule_defs_rec mrule_defs[] = {
877 {"( 2.5.13.0 NAME 'objectIdentifierMatch' "
878 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
879 SLAP_MR_EQUALITY | SLAP_MR_EXT,
880 NULL, NULL, objectIdentifierMatch, NULL, NULL},
882 {"( 2.5.13.1 NAME 'distinguishedNameMatch' "
883 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )",
884 SLAP_MR_EQUALITY | SLAP_MR_EXT,
885 NULL, NULL, dnMatch, NULL, NULL},
887 {"( 2.5.13.2 NAME 'caseIgnoreMatch' "
888 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
889 SLAP_MR_EQUALITY | SLAP_MR_EXT,
890 NULL, NULL, caseIgnoreMatch, NULL, NULL},
892 {"( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' "
893 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
895 NULL, NULL, caseIgnoreOrderingMatch, NULL, NULL},
897 {"( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' "
898 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
899 SLAP_MR_SUBSTR | SLAP_MR_EXT,
900 NULL, NULL, caseIgnoreSubstringsMatch, NULL, NULL},
902 /* Next three are not in the RFC's, but are needed for compatibility */
903 {"( 2.5.13.5 NAME 'caseExactMatch' "
904 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
905 SLAP_MR_EQUALITY | SLAP_MR_EXT,
906 NULL, NULL, caseExactMatch, NULL, NULL},
908 {"( 2.5.13.6 NAME 'caseExactOrderingMatch' "
909 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
911 NULL, NULL, caseExactOrderingMatch, NULL, NULL},
913 {"( 2.5.13.7 NAME 'caseExactSubstringsMatch' "
914 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
915 SLAP_MR_SUBSTR | SLAP_MR_EXT,
916 NULL, NULL, caseExactSubstringsMatch, NULL, NULL},
918 {"( 2.5.13.8 NAME 'numericStringMatch' "
919 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )",
920 SLAP_MR_EQUALITY | SLAP_MR_EXT,
921 NULL, NULL, numericStringMatch, NULL, NULL},
923 {"( 2.5.13.10 NAME 'numericStringSubstringsMatch' "
924 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
925 SLAP_MR_SUBSTR | SLAP_MR_EXT,
926 NULL, NULL, numericStringSubstringsMatch, NULL, NULL},
928 {"( 2.5.13.11 NAME 'caseIgnoreListMatch' "
929 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )",
930 SLAP_MR_EQUALITY | SLAP_MR_EXT,
931 NULL, NULL, caseIgnoreListMatch, NULL, NULL},
933 {"( 2.5.13.12 NAME 'caseIgnoreListSubstringsMatch' "
934 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
935 SLAP_MR_SUBSTR | SLAP_MR_EXT,
936 NULL, NULL, caseIgnoreListSubstringsMatch, NULL, NULL},
938 {"( 2.5.13.14 NAME 'integerMatch' "
939 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
940 SLAP_MR_NONE | SLAP_MR_EXT,
941 NULL, NULL, integerMatch, NULL, NULL},
943 {"( 2.5.13.16 NAME 'bitStringMatch' "
944 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )",
945 SLAP_MR_NONE | SLAP_MR_EXT,
946 NULL, NULL, bitStringMatch, NULL, NULL},
948 {"( 2.5.13.17 NAME 'octetStringMatch' "
949 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )",
950 SLAP_MR_EQUALITY | SLAP_MR_EXT,
951 NULL, NULL, octetStringMatch, NULL, NULL},
953 {"( 2.5.13.20 NAME 'telephoneNumberMatch' "
954 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )",
955 SLAP_MR_EQUALITY | SLAP_MR_EXT,
956 NULL, NULL, telephoneNumberMatch, NULL, NULL},
958 {"( 2.5.13.21 NAME 'telephoneNumberSubstringsMatch' "
959 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
960 SLAP_MR_SUBSTR | SLAP_MR_EXT,
961 NULL, NULL, telephoneNumberSubstringsMatch, NULL, NULL},
963 {"( 2.5.13.22 NAME 'presentationAddressMatch' "
964 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.43 )",
965 SLAP_MR_NONE | SLAP_MR_EXT,
966 NULL, NULL, presentationAddressMatch, NULL, NULL},
968 {"( 2.5.13.23 NAME 'uniqueMemberMatch' "
969 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )",
970 SLAP_MR_NONE | SLAP_MR_EXT,
971 NULL, NULL, uniqueMemberMatch, NULL, NULL},
973 {"( 2.5.13.24 NAME 'protocolInformationMatch' "
974 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.42 )",
975 SLAP_MR_NONE | SLAP_MR_EXT,
976 NULL, NULL, protocolInformationMatch, NULL, NULL},
978 {"( 2.5.13.27 NAME 'generalizedTimeMatch' "
979 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
980 SLAP_MR_EQUALITY | SLAP_MR_EXT,
981 NULL, NULL, generalizedTimeMatch, NULL, NULL},
983 {"( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' "
984 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
986 NULL, NULL, generalizedTimeOrderingMatch, NULL, NULL},
988 {"( 2.5.13.29 NAME 'integerFirstComponentMatch' "
989 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
990 SLAP_MR_EQUALITY | SLAP_MR_EXT,
991 NULL, NULL, integerFirstComponentMatch, NULL, NULL},
993 {"( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' "
994 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
995 SLAP_MR_EQUALITY | SLAP_MR_EXT,
996 NULL, NULL, objectIdentifierFirstComponentMatch, NULL, NULL},
998 {"( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' "
999 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
1000 SLAP_MR_EQUALITY | SLAP_MR_EXT,
1001 NULL, NULL, caseExactIA5Match, NULL, NULL},
1003 {"( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' "
1004 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
1005 SLAP_MR_EQUALITY | SLAP_MR_EXT,
1006 NULL, NULL, caseIgnoreIA5Match, NULL, NULL},
1008 {"( 1.3.6.1.4.1.1466.109.114.3 NAME 'caseIgnoreIA5SubstringsMatch' "
1009 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
1011 NULL, NULL, caseIgnoreIA5SubstringsMatch, NULL, NULL},
1013 {NULL, SLAP_MR_NONE, NULL, NULL, NULL}
1022 /* we should only be called once (from main) */
1023 assert( schema_init_done == 0 );
1025 for ( i=0; syntax_defs[i].sd_desc != NULL; i++ ) {
1026 res = register_syntax( syntax_defs[i].sd_desc,
1027 syntax_defs[i].sd_flags,
1028 syntax_defs[i].sd_validate,
1029 syntax_defs[i].sd_normalize,
1030 syntax_defs[i].sd_pretty
1031 #ifdef SLAPD_BINARY_CONVERSION
1033 syntax_defs[i].sd_ber2str,
1034 syntax_defs[i].sd_str2ber
1039 fprintf( stderr, "schema_init: Error registering syntax %s\n",
1040 syntax_defs[i].sd_desc );
1045 for ( i=0; mrule_defs[i].mrd_desc != NULL; i++ ) {
1046 if( mrule_defs[i].mrd_usage == SLAP_MR_NONE ) {
1048 "schema_init: Ingoring unusable matching rule %s\n",
1049 mrule_defs[i].mrd_desc );
1053 res = register_matching_rule(
1054 mrule_defs[i].mrd_desc,
1055 mrule_defs[i].mrd_usage,
1056 mrule_defs[i].mrd_convert,
1057 mrule_defs[i].mrd_normalize,
1058 mrule_defs[i].mrd_match,
1059 mrule_defs[i].mrd_indexer,
1060 mrule_defs[i].mrd_filter );
1064 "schema_init: Error registering matching rule %s\n",
1065 mrule_defs[i].mrd_desc );
1069 schema_init_done = 1;
1070 return LDAP_SUCCESS;