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