]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/schema_init.c
add logs; fix bug in group/dn selection logic
[openldap] / servers / slapd / schema_init.c
index 8369a43204a121943b7c366f538d7e1168b5e2fe..499935beed43b870e1e0d94b28d0b5824958dd32 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2003 The OpenLDAP Foundation.
+ * Copyright 1998-2004 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -97,7 +97,7 @@ sequenceValidate(
 static int certificateValidate( Syntax *syntax, struct berval *in )
 {
        X509 *xcert=NULL;
-       unsigned char *p = in->bv_val;
+       unsigned char *p = (unsigned char *)in->bv_val;
  
        xcert = d2i_X509(NULL, &p, in->bv_len);
        if ( !xcert ) return LDAP_INVALID_SYNTAX;
@@ -167,7 +167,7 @@ int octetStringIndexer(
        HASH_CONTEXT HASHcontext;
        unsigned char HASHdigest[HASH_BYTES];
        struct berval digest;
-       digest.bv_val = HASHdigest;
+       digest.bv_val = (char *)HASHdigest;
        digest.bv_len = sizeof(HASHdigest);
 
        for( i=0; values[i].bv_val != NULL; i++ ) {
@@ -186,14 +186,15 @@ int octetStringIndexer(
                HASH_Init( &HASHcontext );
                if( prefix != NULL && prefix->bv_len > 0 ) {
                        HASH_Update( &HASHcontext,
-                               prefix->bv_val, prefix->bv_len );
+                               (unsigned char *)prefix->bv_val,
+                               prefix->bv_len );
                }
                HASH_Update( &HASHcontext,
-                       syntax->ssyn_oid, slen );
+                       (unsigned char *)syntax->ssyn_oid, slen );
                HASH_Update( &HASHcontext,
-                       mr->smr_oid, mlen );
+                       (unsigned char *)mr->smr_oid, mlen );
                HASH_Update( &HASHcontext,
-                       values[i].bv_val, values[i].bv_len );
+                       (unsigned char *)values[i].bv_val, values[i].bv_len );
                HASH_Final( HASHdigest, &HASHcontext );
 
                ber_dupbv_x( &keys[i], &digest, ctx );
@@ -224,7 +225,7 @@ int octetStringFilter(
        unsigned char HASHdigest[HASH_BYTES];
        struct berval *value = (struct berval *) assertedValue;
        struct berval digest;
-       digest.bv_val = HASHdigest;
+       digest.bv_val = (char *)HASHdigest;
        digest.bv_len = sizeof(HASHdigest);
 
        slen = syntax->ssyn_oidlen;
@@ -235,14 +236,14 @@ int octetStringFilter(
        HASH_Init( &HASHcontext );
        if( prefix != NULL && prefix->bv_len > 0 ) {
                HASH_Update( &HASHcontext,
-                       prefix->bv_val, prefix->bv_len );
+                       (unsigned char *)prefix->bv_val, prefix->bv_len );
        }
        HASH_Update( &HASHcontext,
-               syntax->ssyn_oid, slen );
+               (unsigned char *)syntax->ssyn_oid, slen );
        HASH_Update( &HASHcontext,
-               mr->smr_oid, mlen );
+               (unsigned char *)mr->smr_oid, mlen );
        HASH_Update( &HASHcontext,
-               value->bv_val, value->bv_len );
+               (unsigned char *)value->bv_val, value->bv_len );
        HASH_Final( HASHdigest, &HASHcontext );
 
        ber_dupbv_x( keys, &digest, ctx );
@@ -397,7 +398,7 @@ octetStringSubstringsIndexer(
        HASH_CONTEXT HASHcontext;
        unsigned char HASHdigest[HASH_BYTES];
        struct berval digest;
-       digest.bv_val = HASHdigest;
+       digest.bv_val = (char *)HASHdigest;
        digest.bv_len = sizeof(HASHdigest);
 
        nkeys=0;
@@ -460,17 +461,17 @@ octetStringSubstringsIndexer(
                                HASH_Init( &HASHcontext );
                                if( prefix != NULL && prefix->bv_len > 0 ) {
                                        HASH_Update( &HASHcontext,
-                                               prefix->bv_val, prefix->bv_len );
+                                               (unsigned char *)prefix->bv_val, prefix->bv_len );
                                }
 
                                HASH_Update( &HASHcontext,
-                                       &pre, sizeof( pre ) );
+                                       (unsigned char *)&pre, sizeof( pre ) );
                                HASH_Update( &HASHcontext,
-                                       syntax->ssyn_oid, slen );
+                                       (unsigned char *)syntax->ssyn_oid, slen );
                                HASH_Update( &HASHcontext,
-                                       mr->smr_oid, mlen );
+                                       (unsigned char *)mr->smr_oid, mlen );
                                HASH_Update( &HASHcontext,
-                                       &values[i].bv_val[j],
+                                       (unsigned char *)&values[i].bv_val[j],
                                        SLAP_INDEX_SUBSTR_MAXLEN );
                                HASH_Final( HASHdigest, &HASHcontext );
 
@@ -489,16 +490,16 @@ octetStringSubstringsIndexer(
                                HASH_Init( &HASHcontext );
                                if( prefix != NULL && prefix->bv_len > 0 ) {
                                        HASH_Update( &HASHcontext,
-                                               prefix->bv_val, prefix->bv_len );
+                                               (unsigned char *)prefix->bv_val, prefix->bv_len );
                                }
                                HASH_Update( &HASHcontext,
-                                       &pre, sizeof( pre ) );
+                                       (unsigned char *)&pre, sizeof( pre ) );
                                HASH_Update( &HASHcontext,
-                                       syntax->ssyn_oid, slen );
+                                       (unsigned char *)syntax->ssyn_oid, slen );
                                HASH_Update( &HASHcontext,
-                                       mr->smr_oid, mlen );
+                                       (unsigned char *)mr->smr_oid, mlen );
                                HASH_Update( &HASHcontext,
-                                       values[i].bv_val, j );
+                                       (unsigned char *)values[i].bv_val, j );
                                HASH_Final( HASHdigest, &HASHcontext );
 
                                ber_dupbv_x( &keys[nkeys++], &digest, ctx );
@@ -509,16 +510,16 @@ octetStringSubstringsIndexer(
                                HASH_Init( &HASHcontext );
                                if( prefix != NULL && prefix->bv_len > 0 ) {
                                        HASH_Update( &HASHcontext,
-                                               prefix->bv_val, prefix->bv_len );
+                                               (unsigned char *)prefix->bv_val, prefix->bv_len );
                                }
                                HASH_Update( &HASHcontext,
-                                       &pre, sizeof( pre ) );
+                                       (unsigned char *)&pre, sizeof( pre ) );
                                HASH_Update( &HASHcontext,
-                                       syntax->ssyn_oid, slen );
+                                       (unsigned char *)syntax->ssyn_oid, slen );
                                HASH_Update( &HASHcontext,
-                                       mr->smr_oid, mlen );
+                                       (unsigned char *)mr->smr_oid, mlen );
                                HASH_Update( &HASHcontext,
-                                       &values[i].bv_val[values[i].bv_len-j], j );
+                                       (unsigned char *)&values[i].bv_val[values[i].bv_len-j], j );
                                HASH_Final( HASHdigest, &HASHcontext );
 
                                ber_dupbv_x( &keys[nkeys++], &digest, ctx );
@@ -590,7 +591,7 @@ octetStringSubstringsFilter (
                return LDAP_SUCCESS;
        }
 
-       digest.bv_val = HASHdigest;
+       digest.bv_val = (char *)HASHdigest;
        digest.bv_len = sizeof(HASHdigest);
 
        slen = syntax->ssyn_oidlen;
@@ -611,16 +612,16 @@ octetStringSubstringsFilter (
                HASH_Init( &HASHcontext );
                if( prefix != NULL && prefix->bv_len > 0 ) {
                        HASH_Update( &HASHcontext,
-                               prefix->bv_val, prefix->bv_len );
+                               (unsigned char *)prefix->bv_val, prefix->bv_len );
                }
                HASH_Update( &HASHcontext,
-                       &pre, sizeof( pre ) );
+                       (unsigned char *)&pre, sizeof( pre ) );
                HASH_Update( &HASHcontext,
-                       syntax->ssyn_oid, slen );
+                       (unsigned char *)syntax->ssyn_oid, slen );
                HASH_Update( &HASHcontext,
-                       mr->smr_oid, mlen );
+                       (unsigned char *)mr->smr_oid, mlen );
                HASH_Update( &HASHcontext,
-                       value->bv_val, klen );
+                       (unsigned char *)value->bv_val, klen );
                HASH_Final( HASHdigest, &HASHcontext );
 
                ber_dupbv_x( &keys[nkeys++], &digest, ctx );
@@ -645,16 +646,16 @@ octetStringSubstringsFilter (
                                HASH_Init( &HASHcontext );
                                if( prefix != NULL && prefix->bv_len > 0 ) {
                                        HASH_Update( &HASHcontext,
-                                               prefix->bv_val, prefix->bv_len );
+                                               (unsigned char *)prefix->bv_val, prefix->bv_len );
                                }
                                HASH_Update( &HASHcontext,
-                                       &pre, sizeof( pre ) );
+                                       (unsigned char *)&pre, sizeof( pre ) );
                                HASH_Update( &HASHcontext,
-                                       syntax->ssyn_oid, slen );
+                                       (unsigned char *)syntax->ssyn_oid, slen );
                                HASH_Update( &HASHcontext,
-                                       mr->smr_oid, mlen );
+                                       (unsigned char *)mr->smr_oid, mlen );
                                HASH_Update( &HASHcontext,
-                                       &value->bv_val[j], klen ); 
+                                       (unsigned char *)&value->bv_val[j], klen ); 
                                HASH_Final( HASHdigest, &HASHcontext );
 
                                ber_dupbv_x( &keys[nkeys++], &digest, ctx );
@@ -674,16 +675,16 @@ octetStringSubstringsFilter (
                HASH_Init( &HASHcontext );
                if( prefix != NULL && prefix->bv_len > 0 ) {
                        HASH_Update( &HASHcontext,
-                               prefix->bv_val, prefix->bv_len );
+                               (unsigned char *)prefix->bv_val, prefix->bv_len );
                }
                HASH_Update( &HASHcontext,
-                       &pre, sizeof( pre ) );
+                       (unsigned char *)&pre, sizeof( pre ) );
                HASH_Update( &HASHcontext,
-                       syntax->ssyn_oid, slen );
+                       (unsigned char *)syntax->ssyn_oid, slen );
                HASH_Update( &HASHcontext,
-                       mr->smr_oid, mlen );
+                       (unsigned char *)mr->smr_oid, mlen );
                HASH_Update( &HASHcontext,
-                       &value->bv_val[value->bv_len-klen], klen );
+                       (unsigned char *)&value->bv_val[value->bv_len-klen], klen );
                HASH_Final( HASHdigest, &HASHcontext );
 
                ber_dupbv_x( &keys[nkeys++], &digest, ctx );
@@ -803,7 +804,7 @@ nameUIDPretty(
        } else {
                int rc;
                struct berval dnval = *val;
-               struct berval uidval = { 0, NULL };
+               struct berval uidval = BER_BVNULL;
 
                if( val->bv_val[val->bv_len-1] == 'B'
                        && val->bv_val[val->bv_len-2] == '\'' )
@@ -874,7 +875,7 @@ uniqueMemberNormalize(
 
        ber_dupbv( &out, val );
        if( out.bv_len != 0 ) {
-               struct berval uid = { 0, NULL };
+               struct berval uid = BER_BVNULL;
 
                if( out.bv_val[out.bv_len-1] == 'B'
                        && out.bv_val[out.bv_len-2] == '\'' )
@@ -934,10 +935,10 @@ uniqueMemberMatch(
 {
        int match;
        struct berval *asserted = (struct berval *) assertedValue;
-       struct berval assertedDN = { 0, NULL };
-       struct berval assertedUID = { 0, NULL };
-       struct berval valueDN = { 0, NULL };
-       struct berval valueUID = { 0, NULL };
+       struct berval assertedDN = BER_BVNULL;
+       struct berval assertedUID = BER_BVNULL;
+       struct berval valueDN = BER_BVNULL;
+       struct berval valueUID = BER_BVNULL;
 
        if( asserted->bv_len != 0 ) {
                assertedDN = *asserted;
@@ -1116,7 +1117,7 @@ UTF8StringValidate(
 {
        ber_len_t count;
        int len;
-       unsigned char *u = in->bv_val;
+       unsigned char *u = (unsigned char *)in->bv_val;
 
        if( in->bv_len == 0 && syntax == slap_schema.si_syn_directoryString ) {
                /* directory strings cannot be empty */
@@ -1158,7 +1159,7 @@ UTF8StringValidate(
 
                /* make sure len corresponds with the offset
                        to the next character */
-               if( LDAP_UTF8_OFFSET( u ) != len ) return LDAP_INVALID_SYNTAX;
+               if( LDAP_UTF8_OFFSET( (char *)u ) != len ) return LDAP_INVALID_SYNTAX;
        }
 
        if( count != 0 ) {
@@ -1371,7 +1372,7 @@ approxIndexer(
        BerVarray keys=NULL;
 
        for( j=0; values[j].bv_val != NULL; j++ ) {
-               struct berval val = { 0, NULL };
+               struct berval val = BER_BVNULL;
                /* Yes, this is necessary */
                UTF8bvnormalize( &values[j], &val, LDAP_UTF8_APPROX, NULL );
                assert( val.bv_val != NULL );
@@ -1819,7 +1820,7 @@ UUIDNormalize(
        struct berval *normalized,
        void *ctx )
 {
-       unsigned char octet;
+       unsigned char octet = '\0';
        int i;
        int j;
        normalized->bv_len = 16;
@@ -2209,7 +2210,7 @@ certificateExactNormalize(
        unsigned char *p;
        char *serial = NULL;
        ber_len_t seriallen;
-       struct berval issuer_dn = { 0, NULL };
+       struct berval issuer_dn = BER_BVNULL;
        X509_NAME *name = NULL;
        ASN1_INTEGER *sn = NULL;
        X509 *xcert = NULL;
@@ -2222,7 +2223,7 @@ certificateExactNormalize(
 
        assert( SLAP_MR_IS_VALUE_OF_ATTRIBUTE_SYNTAX(usage) );
 
-       p = val->bv_val;
+       p = (unsigned char *)val->bv_val;
        xcert = d2i_X509( NULL, &p, val->bv_len);
        if( xcert == NULL ) goto done;
 
@@ -2238,7 +2239,8 @@ certificateExactNormalize(
        if( rc != LDAP_SUCCESS ) goto done;
 
        normalized->bv_len = seriallen + issuer_dn.bv_len + 1;
-       p = normalized->bv_val = ch_malloc(normalized->bv_len+1);
+       normalized->bv_val = ch_malloc(normalized->bv_len+1);
+       p = (unsigned char *)normalized->bv_val;
        AC_MEMCPY(p, serial, seriallen);
        p += seriallen;
        *p++ = '$';
@@ -2555,6 +2557,139 @@ generalizedTimeOrderingMatch(
        return LDAP_SUCCESS;
 }
 
+static int
+deliveryMethodValidate(
+       Syntax *syntax,
+       struct berval *val )
+{
+#undef LENOF
+#define LENOF(s) (sizeof(s)-1)
+       struct berval tmp = *val;
+       /*
+     * DeliveryMethod = pdm *( WSP DOLLAR WSP DeliveryMethod )
+        *      pdm = "any" / "mhs" / "physical" / "telex" / "teletex" /
+        *              "g3fax" / "g4fax" / "ia5" / "videotex" / "telephone"
+        */
+again:
+       if( tmp.bv_len < 3 ) return LDAP_INVALID_SYNTAX;
+
+       switch( tmp.bv_val[0] ) {
+       case 'a':
+       case 'A':
+               if(( tmp.bv_len >= LENOF("any") ) &&
+                       ( strncasecmp(tmp.bv_val, "any", LENOF("any")) == 0 ))
+               {
+                       tmp.bv_len -= LENOF("any");
+                       tmp.bv_val += LENOF("any");
+                       break;
+               }
+               return LDAP_INVALID_SYNTAX;
+
+       case 'm':
+       case 'M':
+               if(( tmp.bv_len >= LENOF("mhs") ) &&
+                       ( strncasecmp(tmp.bv_val, "mhs", LENOF("mhs")) == 0 ))
+               {
+                       tmp.bv_len -= LENOF("mhs");
+                       tmp.bv_val += LENOF("mhs");
+                       break;
+               }
+               return LDAP_INVALID_SYNTAX;
+
+       case 'p':
+       case 'P':
+               if(( tmp.bv_len >= LENOF("physical") ) &&
+                       ( strncasecmp(tmp.bv_val, "physical", LENOF("physical")) == 0 ))
+               {
+                       tmp.bv_len -= LENOF("physical");
+                       tmp.bv_val += LENOF("physical");
+                       break;
+               }
+               return LDAP_INVALID_SYNTAX;
+
+       case 't':
+       case 'T': /* telex or teletex or telephone */
+               if(( tmp.bv_len >= LENOF("telex") ) &&
+                       ( strncasecmp(tmp.bv_val, "telex", LENOF("telex")) == 0 ))
+               {
+                       tmp.bv_len -= LENOF("telex");
+                       tmp.bv_val += LENOF("telex");
+                       break;
+               }
+               if(( tmp.bv_len >= LENOF("teletex") ) &&
+                       ( strncasecmp(tmp.bv_val, "teletex", LENOF("teletex")) == 0 ))
+               {
+                       tmp.bv_len -= LENOF("teletex");
+                       tmp.bv_val += LENOF("teletex");
+                       break;
+               }
+               if(( tmp.bv_len >= LENOF("telephone") ) &&
+                       ( strncasecmp(tmp.bv_val, "telephone", LENOF("telephone")) == 0 ))
+               {
+                       tmp.bv_len -= LENOF("telephone");
+                       tmp.bv_val += LENOF("telephone");
+                       break;
+               }
+               return LDAP_INVALID_SYNTAX;
+
+       case 'g':
+       case 'G': /* g3fax or g4fax */
+               if(( tmp.bv_len >= LENOF("g3fax") ) && (
+                       ( strncasecmp(tmp.bv_val, "g3fax", LENOF("g3fax")) == 0 ) ||
+                       ( strncasecmp(tmp.bv_val, "g4fax", LENOF("g4fax")) == 0 )))
+               {
+                       tmp.bv_len -= LENOF("g3fax");
+                       tmp.bv_val += LENOF("g3fax");
+                       break;
+               }
+               return LDAP_INVALID_SYNTAX;
+
+       case 'i':
+       case 'I':
+               if(( tmp.bv_len >= LENOF("ia5") ) &&
+                       ( strncasecmp(tmp.bv_val, "ia5", LENOF("ia5")) == 0 ))
+               {
+                       tmp.bv_len -= LENOF("ia5");
+                       tmp.bv_val += LENOF("ia5");
+                       break;
+               }
+               return LDAP_INVALID_SYNTAX;
+
+       case 'v':
+       case 'V':
+               if(( tmp.bv_len >= LENOF("videotex") ) &&
+                       ( strncasecmp(tmp.bv_val, "videotex", LENOF("videotex")) == 0 ))
+               {
+                       tmp.bv_len -= LENOF("videotex");
+                       tmp.bv_val += LENOF("videotex");
+                       break;
+               }
+               return LDAP_INVALID_SYNTAX;
+
+       default:
+               return LDAP_INVALID_SYNTAX;
+       }
+
+       if( tmp.bv_len == 0 ) return LDAP_SUCCESS;
+
+       while( tmp.bv_len && ( tmp.bv_val[0] == ' ' )) {
+               tmp.bv_len++;
+               tmp.bv_val--;
+       }
+       if( tmp.bv_len && ( tmp.bv_val[0] == '$' )) {
+               tmp.bv_len++;
+               tmp.bv_val--;
+       } else {
+               return LDAP_INVALID_SYNTAX;
+       }
+       while( tmp.bv_len && ( tmp.bv_val[0] == ' ' )) {
+               tmp.bv_len++;
+               tmp.bv_val--;
+       }
+
+       goto again;
+}
+
 static int
 nisNetgroupTripleValidate(
        Syntax *syntax,
@@ -2738,7 +2873,7 @@ static slap_syntax_defs_rec syntax_defs[] = {
        {"( 1.3.6.1.4.1.1466.115.121.1.13 DESC 'Data Quality' )",
                0, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'Delivery Method' )",
-               0, NULL, NULL},
+               0, deliveryMethodValidate, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'Directory String' )",
                0, UTF8StringValidate, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.16 DESC 'DIT Content Rule Description' )",
@@ -2887,21 +3022,22 @@ char *objectIdentifierFirstComponentMatchSyntaxes[] = {
 /*
  * Other matching rules in X.520 that we do not use (yet):
  *
- * 2.5.13.9            numericStringOrderingMatch
  * 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.31*  directoryStringFirstComponentMatch
+ * 2.5.13.32*  wordMatch
+ * 2.5.13.33*  keywordMatch
  * 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.41*  storedPrefixMatch
  * 2.5.13.42   attributeCertificateMatch
  * 2.5.13.43   readerAndKeyIDMatch
  * 2.5.13.44   attributeIntegrityMatch
+ *
+ * (*) described in RFC 3698 (LDAP: Additional Matching Rules)
  */
 static slap_mrule_defs_rec mrule_defs[] = {
        /*
@@ -2956,7 +3092,7 @@ static slap_mrule_defs_rec mrule_defs[] = {
 
        {"( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
-               SLAP_MR_SUBSTR, NULL,
+               SLAP_MR_SUBSTR, directoryStringSyntaxes,
                NULL, UTF8StringNormalize, octetStringSubstringsMatch,
                octetStringSubstringsIndexer, octetStringSubstringsFilter,
                "caseIgnoreMatch" },
@@ -2985,10 +3121,17 @@ static slap_mrule_defs_rec mrule_defs[] = {
        {"( 2.5.13.8 NAME 'numericStringMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
-               NULL, numericStringNormalize, octetStringSubstringsMatch,
-               octetStringSubstringsIndexer, octetStringSubstringsFilter,
+               NULL, numericStringNormalize, octetStringMatch,
+               octetStringIndexer, octetStringFilter,
                NULL },
 
+       {"( 2.5.13.9 NAME 'numericStringOrderingMatch' "
+               "SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )",
+               SLAP_MR_ORDERING, NULL,
+               NULL, numericStringNormalize, octetStringOrderingMatch,
+               NULL, NULL,
+               "numericStringMatch" },
+
        {"( 2.5.13.10 NAME 'numericStringSubstringsMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
                SLAP_MR_SUBSTR, NULL,