]> git.sur5r.net Git - openldap/commitdiff
ITS#1893, use "schemadn" to configure subschemasubentry DN. (diff was
authorHoward Chu <hyc@openldap.org>
Sat, 10 Aug 2002 03:10:52 +0000 (03:10 +0000)
committerHoward Chu <hyc@openldap.org>
Sat, 10 Aug 2002 03:10:52 +0000 (03:10 +0000)
inaccessible, this is original code, not contributed.)

13 files changed:
servers/slapd/add.c
servers/slapd/backend.c
servers/slapd/compare.c
servers/slapd/config.c
servers/slapd/delete.c
servers/slapd/modify.c
servers/slapd/modrdn.c
servers/slapd/operational.c
servers/slapd/proto-slap.h
servers/slapd/schema.c
servers/slapd/search.c
servers/slapd/slap.h
servers/slapd/tools/mimic.c

index b43e78105212e139b353cecd8cec865f62203463..6e7cb7e443f8dfb347f8074eae08d96cf7ee60ce 100644 (file)
@@ -189,7 +189,7 @@ do_add( Connection *conn, Operation *op )
                goto done;
 
 #if defined( SLAPD_SCHEMA_DN )
-       } else if ( strcasecmp( e->e_ndn, SLAPD_SCHEMA_DN ) == 0 ) {
+       } else if ( bvmatch( &e->e_nname, &global_schemandn ) ) {
                send_ldap_result( conn, op, rc = LDAP_ALREADY_EXISTS,
                        NULL, "subschema subentry already exists",
                        NULL, NULL );
index 133f9fd82e8c52b57c9cd87e4ccb706490135038..a6237ec5db8148b55ff0604e84cc0418337afdff 100644 (file)
@@ -1113,7 +1113,7 @@ Attribute *backend_operational(
 #ifdef SLAPD_SCHEMA_DN
        if ( opattrs || ( attrs &&
                ad_inlist( slap_schema.si_ad_subschemaSubentry, attrs )) ) {
-               *ap = slap_operational_subschemaSubentry();
+               *ap = slap_operational_subschemaSubentry( be );
                ap = &(*ap)->a_next;
        }
 #endif
index b62d69dc4ad9410bfcb9271f1a460d1f65017576..61a8f6882ef9fd19253ab4aef568e2ccd6cd3552 100644 (file)
@@ -169,7 +169,8 @@ do_compare(
                        goto cleanup;
                }
 
-       } else if ( strcasecmp( ndn.bv_val, SLAPD_SCHEMA_DN ) == 0 ) {
+#ifdef SLAPD_SCHEMA_DN
+       } else if ( bvmatch( &ndn, &global_schemandn ) ) {
 #ifdef NEW_LOGGING
                LDAP_LOG( OPERATION, ARGS, 
                        "do_compare: dn (%s) attr(%s) value (%s)\n",
@@ -198,6 +199,7 @@ do_compare(
                        rc = 0;
                        goto cleanup;
                }
+#endif /* SLAPD_SCHEMA_DN */
        }
 
        if( entry ) {
index 0046551709c614c046b8e1d63b292dd47bc37855..f04c52f4d3e09113306c3a30c1c726b2805565c7 100644 (file)
@@ -52,6 +52,10 @@ char **cargv;
 struct berval default_search_base = { 0, NULL };
 struct berval default_search_nbase = { 0, NULL };
 unsigned               num_subordinates = 0;
+#ifdef SLAPD_SCHEMA_DN
+struct berval global_schemadn;
+struct berval global_schemandn;
+#endif
 
 ber_len_t sockbuf_max_incoming = SLAP_SB_MAX_INCOMING_DEFAULT;
 ber_len_t sockbuf_max_incoming_auth= SLAP_SB_MAX_INCOMING_AUTH;
@@ -564,6 +568,42 @@ read_config( const char *fname, int depth )
                                return 1;
 #endif /* HAVE_CYRUS_SASL */
 
+#ifdef SLAPD_SCHEMA_DN
+               } else if ( strcasecmp( cargv[0], "schemadn" ) == 0 ) {
+                       struct berval dn;
+                       if ( cargc < 2 ) {
+#ifdef NEW_LOGGING
+                               LDAP_LOG( CONFIG, CRIT, 
+                                          "%s: line %d: missing dn in "
+                                          "\"schemadn <dn>\" line.\n", fname, lineno, 0  );
+#else
+                               Debug( LDAP_DEBUG_ANY,
+           "%s: line %d: missing dn in \"schemadn <dn>\" line\n",
+                                   fname, lineno, 0 );
+#endif
+                               return 1 ;
+                       }
+                       ber_str2bv( cargv[1], 0, 0, &dn );
+                       if ( be ) {
+                               rc = dnPrettyNormal( NULL, &dn, &be->be_schemadn,
+                                       &be->be_schemandn );
+                       } else {
+                               rc = dnPrettyNormal( NULL, &dn, &global_schemadn,
+                                       &global_schemandn );
+                       }
+                       if ( rc != LDAP_SUCCESS ) {
+#ifdef NEW_LOGGING
+                               LDAP_LOG( CONFIG, CRIT, 
+                                       "%s: line %d: schemadn DN is invalid.\n",
+                                       fname, lineno , 0 );
+#else
+                               Debug( LDAP_DEBUG_ANY,
+                                       "%s: line %d: schemadn DN is invalid\n",
+                                       fname, lineno, 0 );
+#endif
+                               return 1;
+                       }
+#endif /* SLAPD_SCHEMA_DN */
                /* set UCDATA path */
                } else if ( strcasecmp( cargv[0], "ucdata-path" ) == 0 ) {
                        int err;
@@ -2261,6 +2301,14 @@ read_config( const char *fname, int depth )
 
        if ( depth == 0 ) ch_free( cargv );
 
+#ifdef SLAPD_SCHEMA_DN
+       if ( !global_schemadn.bv_val ) {
+               ber_str2bv( SLAPD_SCHEMA_DN, sizeof(SLAPD_SCHEMA_DN)-1, 1,
+                       &global_schemadn );
+               dnNormalize2( NULL, &global_schemadn, &global_schemandn );
+       }
+#endif
+
        if ( load_ucdata( NULL ) < 0 ) return 1;
        return( 0 );
 }
@@ -2480,6 +2528,10 @@ void
 config_destroy( )
 {
        ucdata_unload( UCDATA_ALL );
+#ifdef SLAPD_SCHEMA_DN
+       free( global_schemandn.bv_val );
+       free( global_schemadn.bv_val );
+#endif
        free( line );
        if ( slapd_args_file )
                free ( slapd_args_file );
index 89e405c43f0ef76a7321b08e369550b93fba2d22..057206c269f8c9d425325a7b97026ef5ff65c868 100644 (file)
@@ -104,7 +104,7 @@ do_delete(
 
 #ifdef SLAPD_SCHEMA_DN
 
-       } else if ( strcasecmp( ndn.bv_val, SLAPD_SCHEMA_DN ) == 0 ) {
+       } else if ( bvmatch( &ndn, &global_schemandn ) ) {
 #ifdef NEW_LOGGING
                LDAP_LOG( OPERATION, INFO, "do_delete: conn %d: "
                        "Attempt to delete subschema subentry.\n", conn->c_connid, 0, 0 );
index 026678a9ad129f4d18557898cd8dc1ea6fcc29f0..f9d618174774f47d797d3acd4b44ffe481d38e37 100644 (file)
@@ -205,7 +205,7 @@ do_modify(
                goto cleanup;
 
 #if defined( SLAPD_SCHEMA_DN )
-       } else if ( strcasecmp( ndn.bv_val, SLAPD_SCHEMA_DN ) == 0 ) {
+       } else if ( bvmatch( &ndn, &global_schemandn ) ) {
 #ifdef NEW_LOGGING
                LDAP_LOG( OPERATION, ERR,
                        "do_modify: attempt to modify subschema subentry.\n" , 0, 0, 0  );
index 8cb8a2737de44897807b7ed55f776ce959424073..07057d0407923a0462d8a5f23a3a5bd5bd8b036b 100644 (file)
@@ -202,7 +202,7 @@ do_modrdn(
                goto cleanup;
 
 #ifdef SLAPD_SCHEMA_DN
-       } else if ( strcasecmp( ndn.bv_val, SLAPD_SCHEMA_DN ) == 0 ) {
+       } else if ( bvmatch( &ndn, &global_schemandn ) == 0 ) {
 #ifdef NEW_LOGGING
                LDAP_LOG( OPERATION, ERR,
                        "do_modrdn: attempt to modify subschema subentry\n", 0, 0, 0 );
index 8accbee4252ad44d6e00797c3006b2e4376e8012..b9396b2473fd194affd1174765a1349981bedb1e 100644 (file)
 
 #ifdef SLAPD_SCHEMA_DN
 Attribute *
-slap_operational_subschemaSubentry( void )
+slap_operational_subschemaSubentry( Backend *be )
 {
        Attribute       *a;
 
+       /* The backend wants to take care of it */
+       if ( be && be->be_schemadn.bv_val )
+               return NULL;
+
        a = ch_malloc( sizeof( Attribute ) );
        a->a_desc = slap_schema.si_ad_subschemaSubentry;
 
-       /* Should be backend specific */
        a->a_vals = ch_malloc( 2 * sizeof( struct berval ) );
-       ber_str2bv( SLAPD_SCHEMA_DN, sizeof(SLAPD_SCHEMA_DN)-1, 1, a->a_vals );
+       ber_dupbv( a->a_vals, &global_schemadn );
        a->a_vals[1].bv_val = NULL;
 
        a->a_next = NULL;
index cb65f3fb925c46ddda876ade020684bb01084639..6fd4487eaf941eb4e48e55ac00fd07fd6e6c5f67 100644 (file)
@@ -341,6 +341,7 @@ LDAP_SLAPD_F (void) slapd_clr_read LDAP_P((ber_socket_t s, int wake));
  */
 
 #define dn_match(dn1, dn2)     ( ber_bvcmp((dn1), (dn2)) == 0 )
+#define bvmatch(bv1, bv2)      ( ((bv1)->bv_len == (bv2)->bv_len) && memcmp((bv1)->bv_val, (bv2)->bv_val, (bv1)->bv_len) == 0 )
 
 LDAP_SLAPD_V( const struct berval ) slap_empty_bv;
 
@@ -677,7 +678,7 @@ LDAP_SLAPD_F (Operation *) slap_op_pop LDAP_P(( Operation **olist ));
 /*
  * operational.c
  */
-LDAP_SLAPD_F (Attribute *) slap_operational_subschemaSubentry( void );
+LDAP_SLAPD_F (Attribute *) slap_operational_subschemaSubentry( Backend *be );
 LDAP_SLAPD_F (Attribute *) slap_operational_hasSubordinate( int has );
 
 /*
@@ -1045,6 +1046,11 @@ LDAP_SLAPD_V (int)               ldap_syslog;
 LDAP_SLAPD_V (struct berval)   default_search_base;
 LDAP_SLAPD_V (struct berval)   default_search_nbase;
 
+#ifdef SLAPD_SCHEMA_DN
+LDAP_SLAPD_V (struct berval)   global_schemadn;
+LDAP_SLAPD_V (struct berval)   global_schemandn;
+#endif
+
 LDAP_SLAPD_V (ldap_pvt_thread_mutex_t) num_sent_mutex;
 LDAP_SLAPD_V (unsigned long)           num_bytes_sent;
 LDAP_SLAPD_V (unsigned long)           num_pdu_sent;
index 4be9256d060c095c762d678141cba82b4c777aef..725995150fe03669113f729be32e78165ce83579 100644 (file)
@@ -35,8 +35,11 @@ schema_info( Entry **entry, const char **text )
        e = (Entry *) ch_calloc( 1, sizeof(Entry) );
 
        e->e_attrs = NULL;
-       ber_str2bv( SLAPD_SCHEMA_DN, sizeof(SLAPD_SCHEMA_DN)-1, 1, &e->e_name);
-       (void) dnNormalize2( NULL, &e->e_name, &e->e_nname );
+       /* backend-specific schema info should be created by the
+        * backend itself
+        */
+       ber_dupbv( &e->e_name, &global_schemadn );
+       ber_dupbv( &e->e_nname, &global_schemandn );
        e->e_private = NULL;
 
        vals[0].bv_val = "subentry";
@@ -62,8 +65,7 @@ schema_info( Entry **entry, const char **text )
        {
                int rc;
                AttributeDescription *desc = NULL;
-               struct berval rdn = { sizeof(SLAPD_SCHEMA_DN)-1,
-                       SLAPD_SCHEMA_DN };
+               struct berval rdn = global_schemadn;
                vals[0].bv_val = strchr( rdn.bv_val, '=' );
 
                if( vals[0].bv_val == NULL ) {
index 7e36a3d7483b3b0ddf990689eca751577ac6d692..90cb1927cc3d3ea70415b239c52405a99ae08c1f 100644 (file)
@@ -239,7 +239,7 @@ do_search(
                }
 
 #if defined( SLAPD_SCHEMA_DN )
-               else if ( strcasecmp( nbase.bv_val, SLAPD_SCHEMA_DN ) == 0 ) {
+               else if ( bvmatch( &nbase, &global_schemandn ) ) {
                        /* check restrictions */
                        rc = backend_check_restrictions( NULL, conn, op, NULL, &text ) ;
                        if( rc != LDAP_SUCCESS ) {
index 83456e3ecbcae740ea7541e00cce8584e4acd934..fadc1a84319eb5f0d8e88d2c02ad2f28cb23e315 100644 (file)
@@ -1197,6 +1197,10 @@ struct slap_backend_db {
        BerVarray       be_suffix;      /* the DN suffixes of data in this backend */
        BerVarray       be_nsuffix;     /* the normalized DN suffixes in this backend */
        BerVarray       be_suffixAlias; /* pairs of DN suffix aliases and deref values */
+#ifdef SLAPD_SCHEMA_DN
+       struct berval be_schemadn;      /* per-backend subschema subentry DN */
+       struct berval be_schemandn;     /* normalized subschema DN */
+#endif
        struct berval be_rootdn;        /* the magic "root" name (DN) for this db */
        struct berval be_rootndn;       /* the magic "root" normalized name (DN) for this db */
        struct berval be_rootpw;        /* the magic "root" password for this db        */
index a6c9ebb3ae1130575959413c1f3e110d4f951040..4a88f833c8920a8d19bfacfe82fd5c25b8116fc1 100644 (file)
@@ -239,7 +239,7 @@ int read_root_dse_file ( const char *file )
 }
 
 Attribute *
-slap_operational_subschemaSubentry( void )
+slap_operational_subschemaSubentry( Backend *be )
 {
        return NULL;
 }