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 NumericStringNormalize(
672 struct berval **normalized )
674 /* similiar to IA5StringNormalize except removes all spaces */
675 struct berval *newval;
678 newval = ch_malloc( sizeof( struct berval ) );
682 /* Ignore initial whitespace */
683 while ( isspace( *p++ ) ) {
689 return LDAP_INVALID_SYNTAX;
692 newval->bv_val = ch_strdup( p );
693 p = q = newval->bv_val;
696 if ( isspace( *p ) ) {
697 /* Ignore whitespace */
704 assert( *newval->bv_val );
705 assert( newval->bv_val < p );
708 /* cannot start with a space */
709 assert( !isspace(*newval->bv_val) );
711 /* cannot end with a space */
712 assert( !isspace( q[-1] ) );
717 newval->bv_len = q - newval->bv_val;
718 *normalized = newval;
725 struct syntax_defs_rec {
728 slap_syntax_validate_func *sd_validate;
729 slap_syntax_transform_func *sd_normalize;
730 slap_syntax_transform_func *sd_pretty;
731 #ifdef SLAPD_BINARY_CONVERSION
732 slap_syntax_transform_func *sd_ber2str;
733 slap_syntax_transform_func *sd_str2ber;
737 #define X_HIDE "X-HIDE 'TRUE' "
738 #define X_BINARY "X-BINARY-TRANSFER-REQUIRED 'TRUE' "
739 #define X_NOT_H_R "X-NOT-HUMAN-READABLE 'TRUE' "
741 struct syntax_defs_rec syntax_defs[] = {
742 {"( 1.3.6.1.4.1.1466.115.121.1.1 DESC 'ACI Item' " X_BINARY X_NOT_H_R ")",
743 SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, NULL, NULL, NULL},
744 {"( 1.3.6.1.4.1.1466.115.121.1.2 DESC 'Access Point' " X_NOT_H_R ")",
745 0, NULL, NULL, NULL},
746 {"( 1.3.6.1.4.1.1466.115.121.1.3 DESC 'Attribute Type Description' )",
747 0, NULL, NULL, NULL},
748 {"( 1.3.6.1.4.1.1466.115.121.1.4 DESC 'Audio' " X_NOT_H_R ")",
749 SLAP_SYNTAX_BLOB, blobValidate, NULL, NULL},
750 {"( 1.3.6.1.4.1.1466.115.121.1.5 DESC 'Binary' " X_BINARY X_NOT_H_R ")",
751 SLAP_SYNTAX_BER, berValidate, NULL, NULL},
752 {"( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'Bit String' )",
753 0, NULL, NULL, NULL},
754 {"( 1.3.6.1.4.1.1466.115.121.1.7 DESC 'Boolean' )",
755 0, NULL, NULL, NULL},
756 {"( 1.3.6.1.4.1.1466.115.121.1.8 DESC 'Certificate' "
757 X_BINARY X_NOT_H_R ")",
758 SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL},
759 {"( 1.3.6.1.4.1.1466.115.121.1.9 DESC 'Certificate List' "
760 X_BINARY X_NOT_H_R ")",
761 SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL},
762 {"( 1.3.6.1.4.1.1466.115.121.1.10 DESC 'Certificate Pair' "
763 X_BINARY X_NOT_H_R ")",
764 SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL},
765 {"( 1.3.6.1.4.1.1466.115.121.1.11 DESC 'Country String' )",
766 0, NULL, NULL, NULL},
767 {"( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'Distinguished Name' )",
768 0, dnValidate, dnNormalize, NULL},
769 {"( 1.3.6.1.4.1.1466.115.121.1.13 DESC 'Data Quality' )",
770 0, NULL, NULL, NULL},
771 {"( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'Delivery Method' )",
772 0, NULL, NULL, NULL},
773 {"( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'Directory String' )",
774 0, UTF8StringValidate, UTF8StringNormalize, NULL},
775 {"( 1.3.6.1.4.1.1466.115.121.1.16 DESC 'DIT Content Rule Description' )",
776 0, NULL, NULL, NULL},
777 {"( 1.3.6.1.4.1.1466.115.121.1.17 DESC 'DIT Structure Rule Description' )",
778 0, NULL, NULL, NULL},
779 {"( 1.3.6.1.4.1.1466.115.121.1.19 DESC 'DSA Quality' )",
780 0, NULL, NULL, NULL},
781 {"( 1.3.6.1.4.1.1466.115.121.1.20 DESC 'DSE Type' )",
782 0, NULL, NULL, NULL},
783 {"( 1.3.6.1.4.1.1466.115.121.1.21 DESC 'Enhanced Guide' )",
784 0, NULL, NULL, NULL},
785 {"( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'Facsimile Telephone Number' )",
786 0, blobValidate, NULL, NULL},
787 {"( 1.3.6.1.4.1.1466.115.121.1.23 DESC 'Fax' " X_NOT_H_R ")",
788 SLAP_SYNTAX_BLOB, NULL, NULL, NULL},
789 {"( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'Generalized Time' )",
790 0, NULL, NULL, NULL},
791 {"( 1.3.6.1.4.1.1466.115.121.1.25 DESC 'Guide' )",
792 0, NULL, NULL, NULL},
793 {"( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5 String' )",
794 0, IA5StringValidate, IA5StringNormalize, NULL},
795 {"( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'Integer' )",
796 0, integerValidate, NULL, NULL},
797 {"( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' " X_NOT_H_R ")",
798 SLAP_SYNTAX_BLOB, NULL, NULL, NULL},
799 {"( 1.3.6.1.4.1.1466.115.121.1.29 DESC 'Master And Shadow Access Points' )",
800 0, NULL, NULL, NULL},
801 {"( 1.3.6.1.4.1.1466.115.121.1.30 DESC 'Matching Rule Description' )",
802 0, NULL, NULL, NULL},
803 {"( 1.3.6.1.4.1.1466.115.121.1.31 DESC 'Matching Rule Use Description' )",
804 0, NULL, NULL, NULL},
805 {"( 1.3.6.1.4.1.1466.115.121.1.32 DESC 'Mail Preference' )",
806 0, NULL, NULL, NULL},
807 {"( 1.3.6.1.4.1.1466.115.121.1.33 DESC 'MHS OR Address' )",
808 0, NULL, NULL, NULL},
809 {"( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'Name And Optional UID' )",
810 0, NULL, NULL, NULL},
811 {"( 1.3.6.1.4.1.1466.115.121.1.35 DESC 'Name Form Description' )",
812 0, NULL, NULL, NULL},
813 {"( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'Numeric String' )",
814 0, IA5StringValidate, NumericStringNormalize, NULL},
815 {"( 1.3.6.1.4.1.1466.115.121.1.37 DESC 'Object Class Description' )",
816 0, NULL, NULL, NULL},
817 {"( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )",
818 0, oidValidate, NULL, NULL},
819 {"( 1.3.6.1.4.1.1466.115.121.1.39 DESC 'Other Mailbox' )",
820 0, NULL, NULL, NULL},
821 {"( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'Octet String' )",
822 0, blobValidate, NULL, NULL},
823 {"( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'Postal Address' )",
824 0, blobValidate, NULL, NULL},
825 {"( 1.3.6.1.4.1.1466.115.121.1.42 DESC 'Protocol Information' )",
826 0, NULL, NULL, NULL},
827 {"( 1.3.6.1.4.1.1466.115.121.1.43 DESC 'Presentation Address' )",
828 0, NULL, NULL, NULL},
829 {"( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'Printable String' )",
830 0, printableStringValidate, NULL, NULL},
831 {"( 1.3.6.1.4.1.1466.115.121.1.49 DESC 'Supported Algorithm' "
832 X_BINARY X_NOT_H_R ")",
833 SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL},
834 {"( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'Telephone Number' )",
835 0, blobValidate, NULL, NULL},
836 {"( 1.3.6.1.4.1.1466.115.121.1.51 DESC 'Teletex Terminal Identifier' )",
837 0, NULL, NULL, NULL},
838 {"( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'Telex Number' )",
839 0, NULL, NULL, NULL},
840 {"( 1.3.6.1.4.1.1466.115.121.1.53 DESC 'UTC Time' )",
841 0, NULL, NULL, NULL},
842 {"( 1.3.6.1.4.1.1466.115.121.1.54 DESC 'LDAP Syntax Description' )",
843 0, NULL, NULL, NULL},
844 {"( 1.3.6.1.4.1.1466.115.121.1.55 DESC 'Modify Rights' )",
845 0, NULL, NULL, NULL},
846 {"( 1.3.6.1.4.1.1466.115.121.1.56 DESC 'LDAP Schema Definition' )",
847 0, NULL, NULL, NULL},
848 {"( 1.3.6.1.4.1.1466.115.121.1.57 DESC 'LDAP Schema Description' )",
849 0, NULL, NULL, NULL},
850 {"( 1.3.6.1.4.1.1466.115.121.1.58 DESC 'Substring Assertion' )",
851 0, NULL, NULL, NULL},
853 /* OpenLDAP Experimental Syntaxes */
854 {"( 1.3.6.1.4.1.4203.666.2.1 DESC 'OpenLDAP Experimental ACI' )",
855 0, NULL, NULL, NULL},
856 {"( 1.3.6.1.4.1.4203.666.2.2 DESC 'OpenLDAP void' " X_HIDE ")" ,
857 SLAP_SYNTAX_HIDE, NULL, NULL, NULL},
858 {"( 1.3.6.1.4.1.4203.666.2.3 DESC 'OpenLDAP DN' " X_HIDE ")" ,
859 SLAP_SYNTAX_HIDE, NULL, NULL, NULL},
861 {NULL, 0, NULL, NULL, NULL}
864 struct mrule_defs_rec {
867 slap_mr_convert_func * mrd_convert;
868 slap_mr_normalize_func * mrd_normalize;
869 slap_mr_match_func * mrd_match;
870 slap_mr_indexer_func * mrd_indexer;
871 slap_mr_filter_func * mrd_filter;
875 * Other matching rules in X.520 that we do not use:
877 * 2.5.13.9 numericStringOrderingMatch
878 * 2.5.13.13 booleanMatch
879 * 2.5.13.15 integerOrderingMatch
880 * 2.5.13.18 octetStringOrderingMatch
881 * 2.5.13.19 octetStringSubstringsMatch
882 * 2.5.13.25 uTCTimeMatch
883 * 2.5.13.26 uTCTimeOrderingMatch
884 * 2.5.13.31 directoryStringFirstComponentMatch
885 * 2.5.13.32 wordMatch
886 * 2.5.13.33 keywordMatch
887 * 2.5.13.34 certificateExactMatch
888 * 2.5.13.35 certificateMatch
889 * 2.5.13.36 certificatePairExactMatch
890 * 2.5.13.37 certificatePairMatch
891 * 2.5.13.38 certificateListExactMatch
892 * 2.5.13.39 certificateListMatch
893 * 2.5.13.40 algorithmIdentifierMatch
894 * 2.5.13.41 storedPrefixMatch
895 * 2.5.13.42 attributeCertificateMatch
896 * 2.5.13.43 readerAndKeyIDMatch
897 * 2.5.13.44 attributeIntegrityMatch
900 #ifndef SLAPD_SCHEMA_NOT_COMPAT
901 #define caseIgnoreIA5SubstringsMatch NULL
902 #define caseExactIA5SubstringsMatch NULL
905 /* recycled matching functions */
906 #define caseIgnoreMatch caseIgnoreIA5Match
907 #define caseIgnoreOrderingMatch caseIgnoreMatch
908 #define caseIgnoreSubstringsMatch caseIgnoreIA5SubstringsMatch
909 #define caseExactMatch caseExactIA5Match
910 #define caseExactOrderingMatch caseExactMatch
911 #define caseExactSubstringsMatch caseExactIA5SubstringsMatch
913 /* unimplemented matching functions */
914 #define objectIdentifierMatch NULL
915 #define caseIgnoreListMatch NULL
916 #define caseIgnoreListSubstringsMatch NULL
917 #define integerMatch NULL
918 #define bitStringMatch NULL
919 #define octetStringMatch NULL
920 #define telephoneNumberMatch NULL
921 #define telephoneNumberSubstringsMatch NULL
922 #define presentationAddressMatch NULL
923 #define uniqueMemberMatch NULL
924 #define protocolInformationMatch NULL
925 #define generalizedTimeMatch NULL
926 #define generalizedTimeOrderingMatch NULL
927 #define integerFirstComponentMatch NULL
928 #define objectIdentifierFirstComponentMatch NULL
930 struct mrule_defs_rec mrule_defs[] = {
931 {"( 2.5.13.0 NAME 'objectIdentifierMatch' "
932 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
933 SLAP_MR_EQUALITY | SLAP_MR_EXT,
934 NULL, NULL, objectIdentifierMatch, NULL, NULL},
936 {"( 2.5.13.1 NAME 'distinguishedNameMatch' "
937 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )",
938 SLAP_MR_EQUALITY | SLAP_MR_EXT,
939 NULL, NULL, dnMatch, NULL, NULL},
941 {"( 2.5.13.2 NAME 'caseIgnoreMatch' "
942 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
943 SLAP_MR_EQUALITY | SLAP_MR_EXT,
944 NULL, NULL, caseIgnoreMatch, NULL, NULL},
946 {"( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' "
947 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
949 NULL, NULL, caseIgnoreOrderingMatch, NULL, NULL},
951 {"( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' "
952 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
953 SLAP_MR_SUBSTR | SLAP_MR_EXT,
954 NULL, NULL, caseIgnoreSubstringsMatch, NULL, NULL},
956 /* Next three are not in the RFC's, but are needed for compatibility */
957 {"( 2.5.13.5 NAME 'caseExactMatch' "
958 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
959 SLAP_MR_EQUALITY | SLAP_MR_EXT,
960 NULL, NULL, caseExactMatch, NULL, NULL},
962 {"( 2.5.13.6 NAME 'caseExactOrderingMatch' "
963 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
965 NULL, NULL, caseExactOrderingMatch, NULL, NULL},
967 {"( 2.5.13.7 NAME 'caseExactSubstringsMatch' "
968 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
969 SLAP_MR_SUBSTR | SLAP_MR_EXT,
970 NULL, NULL, caseExactSubstringsMatch, NULL, NULL},
972 {"( 2.5.13.8 NAME 'numericStringMatch' "
973 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )",
974 SLAP_MR_EQUALITY | SLAP_MR_EXT,
975 NULL, NULL, caseIgnoreIA5Match, NULL, NULL},
977 {"( 2.5.13.10 NAME 'numericStringSubstringsMatch' "
978 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
979 SLAP_MR_SUBSTR | SLAP_MR_EXT,
980 NULL, NULL, caseIgnoreIA5SubstringsMatch, NULL, NULL},
982 {"( 2.5.13.11 NAME 'caseIgnoreListMatch' "
983 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )",
984 SLAP_MR_EQUALITY | SLAP_MR_EXT,
985 NULL, NULL, caseIgnoreListMatch, NULL, NULL},
987 {"( 2.5.13.12 NAME 'caseIgnoreListSubstringsMatch' "
988 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
989 SLAP_MR_SUBSTR | SLAP_MR_EXT,
990 NULL, NULL, caseIgnoreListSubstringsMatch, NULL, NULL},
992 {"( 2.5.13.14 NAME 'integerMatch' "
993 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
994 SLAP_MR_NONE | SLAP_MR_EXT,
995 NULL, NULL, integerMatch, NULL, NULL},
997 {"( 2.5.13.16 NAME 'bitStringMatch' "
998 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )",
999 SLAP_MR_NONE | SLAP_MR_EXT,
1000 NULL, NULL, bitStringMatch, NULL, NULL},
1002 {"( 2.5.13.17 NAME 'octetStringMatch' "
1003 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )",
1004 SLAP_MR_EQUALITY | SLAP_MR_EXT,
1005 NULL, NULL, octetStringMatch, NULL, NULL},
1007 {"( 2.5.13.20 NAME 'telephoneNumberMatch' "
1008 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )",
1009 SLAP_MR_EQUALITY | SLAP_MR_EXT,
1010 NULL, NULL, telephoneNumberMatch, NULL, NULL},
1012 {"( 2.5.13.21 NAME 'telephoneNumberSubstringsMatch' "
1013 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
1014 SLAP_MR_SUBSTR | SLAP_MR_EXT,
1015 NULL, NULL, telephoneNumberSubstringsMatch, NULL, NULL},
1017 {"( 2.5.13.22 NAME 'presentationAddressMatch' "
1018 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.43 )",
1019 SLAP_MR_NONE | SLAP_MR_EXT,
1020 NULL, NULL, presentationAddressMatch, NULL, NULL},
1022 {"( 2.5.13.23 NAME 'uniqueMemberMatch' "
1023 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )",
1024 SLAP_MR_NONE | SLAP_MR_EXT,
1025 NULL, NULL, uniqueMemberMatch, NULL, NULL},
1027 {"( 2.5.13.24 NAME 'protocolInformationMatch' "
1028 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.42 )",
1029 SLAP_MR_NONE | SLAP_MR_EXT,
1030 NULL, NULL, protocolInformationMatch, NULL, NULL},
1032 {"( 2.5.13.27 NAME 'generalizedTimeMatch' "
1033 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
1034 SLAP_MR_EQUALITY | SLAP_MR_EXT,
1035 NULL, NULL, generalizedTimeMatch, NULL, NULL},
1037 {"( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' "
1038 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
1040 NULL, NULL, generalizedTimeOrderingMatch, NULL, NULL},
1042 {"( 2.5.13.29 NAME 'integerFirstComponentMatch' "
1043 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
1044 SLAP_MR_EQUALITY | SLAP_MR_EXT,
1045 NULL, NULL, integerFirstComponentMatch, NULL, NULL},
1047 {"( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' "
1048 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
1049 SLAP_MR_EQUALITY | SLAP_MR_EXT,
1050 NULL, NULL, objectIdentifierFirstComponentMatch, NULL, NULL},
1052 {"( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' "
1053 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
1054 SLAP_MR_EQUALITY | SLAP_MR_EXT,
1055 NULL, NULL, caseExactIA5Match, NULL, NULL},
1057 {"( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' "
1058 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
1059 SLAP_MR_EQUALITY | SLAP_MR_EXT,
1060 NULL, NULL, caseIgnoreIA5Match, NULL, NULL},
1062 {"( 1.3.6.1.4.1.1466.109.114.3 NAME 'caseIgnoreIA5SubstringsMatch' "
1063 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
1065 NULL, NULL, caseIgnoreIA5SubstringsMatch, NULL, NULL},
1067 {NULL, SLAP_MR_NONE, NULL, NULL, NULL}
1076 /* we should only be called once (from main) */
1077 assert( schema_init_done == 0 );
1079 for ( i=0; syntax_defs[i].sd_desc != NULL; i++ ) {
1080 res = register_syntax( syntax_defs[i].sd_desc,
1081 syntax_defs[i].sd_flags,
1082 syntax_defs[i].sd_validate,
1083 syntax_defs[i].sd_normalize,
1084 syntax_defs[i].sd_pretty
1085 #ifdef SLAPD_BINARY_CONVERSION
1087 syntax_defs[i].sd_ber2str,
1088 syntax_defs[i].sd_str2ber
1093 fprintf( stderr, "schema_init: Error registering syntax %s\n",
1094 syntax_defs[i].sd_desc );
1099 for ( i=0; mrule_defs[i].mrd_desc != NULL; i++ ) {
1100 if( mrule_defs[i].mrd_usage == SLAP_MR_NONE ) {
1102 "schema_init: Ingoring unusable matching rule %s\n",
1103 mrule_defs[i].mrd_desc );
1107 res = register_matching_rule(
1108 mrule_defs[i].mrd_desc,
1109 mrule_defs[i].mrd_usage,
1110 mrule_defs[i].mrd_convert,
1111 mrule_defs[i].mrd_normalize,
1112 mrule_defs[i].mrd_match,
1113 mrule_defs[i].mrd_indexer,
1114 mrule_defs[i].mrd_filter );
1118 "schema_init: Error registering matching rule %s\n",
1119 mrule_defs[i].mrd_desc );
1123 schema_init_done = 1;
1124 return LDAP_SUCCESS;