- * IA5StringValidate should have been called to ensure
- * input is limited to IA5.
- */
- bv->bv_val[i] = in->bv_val[i];
- }
-
- *out = bv;
- return 0;
-}
-
-static int
-IA5StringNormalize(
- Syntax *syntax,
- MatchingRule *mr,
- struct berval *val,
- struct berval **normalized )
-{
- struct berval *newval;
- char *p, *q;
-
- newval = ch_malloc( sizeof( struct berval ) );
-
- p = val->bv_val;
-
- /* Ignore initial whitespace */
- while ( isspace( *p++ ) ) {
- /* EMPTY */ ;
- }
-
- if( *p ) {
- ch_free( newval );
- return 1;
- }
-
- newval->bv_val = ch_strdup( p );
- p = q = newval->bv_val;
-
- while ( *p ) {
- if ( isspace( *p ) ) {
- *q++ = *p++;
-
- /* Ignore the extra whitespace */
- while ( isspace( *p++ ) ) {
- /* EMPTY */ ;
- }
- } else {
- *q++ = *p++;
- }
- }
-
- assert( *newval->bv_val );
- assert( newval->bv_val < p );
- assert( p <= q );
-
- /* cannot start with a space */
- assert( !isspace(*newval->bv_val) );
-
- /*
- * If the string ended in space, backup the pointer one
- * position. One is enough because the above loop collapsed
- * all whitespace to a single space.
- */
-
- if ( isspace( q[-1] ) ) {
- --q;
- }
-
- /* cannot end with a space */
- assert( !isspace( q[-1] ) );
-
- /* null terminate */
- *q = '\0';
-
- newval->bv_len = q - newval->bv_val;
- normalized = &newval;
-
- return 0;
-}
-
-static int
-caseExactIA5Match(
- Syntax *syntax,
- MatchingRule *mr,
- struct berval *value,
- struct berval *assertedValue )
-{
- return strcmp( value->bv_val, assertedValue->bv_val );
-}
-
-static int
-caseIgnoreIA5Match(
- Syntax *syntax,
- MatchingRule *mr,
- struct berval *value,
- struct berval *assertedValue )
-{
- return strcasecmp( value->bv_val, assertedValue->bv_val );
-}
-
-int
-register_syntax(
- char * desc,
- slap_syntax_validate_func *validate,
- slap_syntax_transform_func *ber2str,
- slap_syntax_transform_func *str2ber )
-{
- LDAP_SYNTAX *syn;
- int code;
- const char *err;
-
- syn = ldap_str2syntax( desc, &code, &err);
- if ( !syn ) {
- Debug( LDAP_DEBUG_ANY, "Error in register_syntax: %s before %s in %s\n",
- ldap_scherr2str(code), err, desc );
- return( -1 );
- }
-
- code = syn_add( syn, validate, ber2str, str2ber, &err );
- if ( code ) {
- Debug( LDAP_DEBUG_ANY, "Error in register_syntax: %s %s in %s\n",
- scherr2str(code), err, desc );
- return( -1 );
- }
-
- return( 0 );
-}
-
-int
-register_matching_rule(
- char * desc,
- slap_mr_convert_func *convert,
- slap_mr_normalize_func *normalize,
- slap_mr_match_func *match )
-{
- LDAP_MATCHING_RULE *mr;
- int code;
- const char *err;
-
- mr = ldap_str2matchingrule( desc, &code, &err);
- if ( !mr ) {
- Debug( LDAP_DEBUG_ANY, "Error in register_matching_rule: %s before %s in %s\n",
- ldap_scherr2str(code), err, desc );
- return( -1 );
- }
-
- code = mr_add( mr, convert, normalize, match, &err );
- if ( code ) {
- Debug( LDAP_DEBUG_ANY, "Error in register_syntax: %s for %s in %s\n",
- scherr2str(code), err, desc );
- return( -1 );
- }
- return( 0 );
-}
-
-struct syntax_defs_rec {
- char *sd_desc;
- slap_syntax_validate_func *sd_validate;
- slap_syntax_transform_func *sd_ber2str;
- slap_syntax_transform_func *sd_str2ber;
-};
-
-struct syntax_defs_rec syntax_defs[] = {
- {"( 1.3.6.1.4.1.1466.115.121.1.3 DESC 'AttributeTypeDescription' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.4 DESC 'Audio' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.5 DESC 'Binary' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'BitString' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.7 DESC 'Boolean' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.8 DESC 'Certificate' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.9 DESC 'CertificateList' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.10 DESC 'CertificatePair' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'DN' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'DeliveryMethod' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'DirectoryString' )",
- UTF8StringValidate, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.16 DESC 'DITContentRuleDescription' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.17 DESC 'DITStructureRuleDescription' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.21 DESC 'EnhancedGuide' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'FacsimileTelephoneNumber' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'GeneralizedTime' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.25 DESC 'Guide' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5String' )",
- IA5StringValidate, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'Integer' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.30 DESC 'MatchingRuleDescription' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.31 DESC 'MatchingRuleUseDescription' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.32 DESC 'MailPreference' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'NameAndOptionalUID' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.35 DESC 'NameFormDescription' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'NumericString' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.37 DESC 'ObjectClassDescription' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.39 DESC 'OtherMailbox' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'OctetString' )",
- octetStringValidate, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'PostalAddress' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.42 DESC 'ProtocolInformation' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.43 DESC 'PresentationAddress' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'PrintableString' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.49 DESC 'SupportedAlgorithm' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'TelephoneNumber' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.51 DESC 'TeletexTerminalIdentifier' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'TelexNumber' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.53 DESC 'UTCTime' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.54 DESC 'LDAPSyntaxDescription' )",
- NULL, NULL, NULL},
- {"( 1.3.6.1.4.1.1466.115.121.1.58 DESC 'SubstringAssertion' )",
- NULL, NULL, NULL},
-
- {NULL, NULL, NULL}
-};
-
-struct mrule_defs_rec {
- char *mrd_desc;
- slap_mr_convert_func *mrd_convert;
- slap_mr_normalize_func *mrd_normalize;
- slap_mr_match_func *mrd_match;
-};
-
-/*
- * Other matching rules in X.520 that we do not use:
- *
- * 2.5.13.9 numericStringOrderingMatch
- * 2.5.13.12 caseIgnoreListSubstringsMatch
- * 2.5.13.13 booleanMatch
- * 2.5.13.15 integerOrderingMatch
- * 2.5.13.18 octetStringOrderingMatch
- * 2.5.13.19 octetStringSubstringsMatch
- * 2.5.13.25 uTCTimeMatch
- * 2.5.13.26 uTCTimeOrderingMatch
- * 2.5.13.31 directoryStringFirstComponentMatch
- * 2.5.13.32 wordMatch
- * 2.5.13.33 keywordMatch
- * 2.5.13.34 certificateExactMatch
- * 2.5.13.35 certificateMatch
- * 2.5.13.36 certificatePairExactMatch
- * 2.5.13.37 certificatePairMatch
- * 2.5.13.38 certificateListExactMatch
- * 2.5.13.39 certificateListMatch
- * 2.5.13.40 algorithmIdentifierMatch
- * 2.5.13.41 storedPrefixMatch
- * 2.5.13.42 attributeCertificateMatch
- * 2.5.13.43 readerAndKeyIDMatch
- * 2.5.13.44 attributeIntegrityMatch
- */
-
-/* recycled matching functions */
-#define caseIgnoreMatch caseIgnoreIA5Match
-#define caseExactMatch caseExactIA5Match
-
-/* unimplemented matching functions */
-#define objectIdentifierMatch NULL
-#define distinguishedNameMatch NULL
-#define caseIgnoreOrderingMatch NULL
-#define caseIgnoreSubstringsMatch NULL
-#define caseExactOrderingMatch NULL
-#define caseExactSubstringsMatch NULL
-#define numericStringMatch NULL
-#define numericStringSubstringsMatch NULL
-#define caseIgnoreListMatch NULL
-#define integerMatch NULL
-#define bitStringMatch NULL
-#define octetStringMatch NULL
-#define telephoneNumberMatch NULL
-#define telephoneNumberSubstringsMatch NULL
-#define presentationAddressMatch NULL
-#define uniqueMemberMatch NULL
-#define protocolInformationMatch NULL
-#define generalizedTimeMatch NULL
-#define generalizedTimeOrderingMatch NULL
-#define integerFirstComponentMatch NULL
-#define objectIdentifierFirstComponentMatch NULL
-#define caseIgnoreIA5SubstringsMatch NULL
-
-struct mrule_defs_rec mrule_defs[] = {
- {"( 2.5.13.0 NAME 'objectIdentifierMatch' "
- "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
- NULL, NULL, objectIdentifierMatch},
-
- {"( 2.5.13.1 NAME 'distinguishedNameMatch' "
- "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )",
- NULL, NULL, distinguishedNameMatch},
-
- {"( 2.5.13.2 NAME 'caseIgnoreMatch' "
- "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
- NULL, UTF8StringNormalize, caseIgnoreMatch},
-
- {"( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' "
- "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
- NULL, UTF8StringNormalize, caseIgnoreOrderingMatch},
-
- {"( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' "
- "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
- NULL, UTF8StringNormalize, caseIgnoreSubstringsMatch},
-
- /* Next three are not in the RFC's, but are needed for compatibility */
- {"( 2.5.13.5 NAME 'caseExactMatch' "
- "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
- NULL, UTF8StringNormalize, caseExactMatch},