]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/schema.c
When recreating a database from an ldif file created by ldbmcat,
[openldap] / servers / slapd / schema.c
index ec67cc3905811be854637179f45500ce08ffe155..c7bafd9b8a51b2e5f068915c6b5c2d4901ca7f54 100644 (file)
@@ -14,6 +14,7 @@
 static char *  oc_check_required(Entry *e, char *ocname);
 static int             oc_check_allowed(char *type, struct berval **ocl);
 
+
 /*
  * oc_check - check that entry e conforms to the schema required by
  * its object class(es). returns 0 if so, non-zero otherwise.
@@ -133,8 +134,8 @@ static char *oc_usermod_attrs[] = {
 
 static char *oc_operational_attrs[] = {
        /*
-        * these are operational attributes that *could* be
-        * modified by users if we supported such.
+        * these are operational attributes 
+        * most could be user modifiable
         */
        "objectClasses",
        "attributeTypes",
@@ -144,6 +145,12 @@ static char *oc_operational_attrs[] = {
        "dITContentRules",
        "nameForms",
        "ldapSyntaxes",
+       "namingContexts",
+       "supportedExtension",
+       "supportedControl",
+       "supportedSASLMechanisms",
+       "supportedLDAPversion",
+       "subschemaSubentry",            /* NO USER MOD */
        NULL
 
 };
@@ -152,6 +159,7 @@ static char *oc_operational_attrs[] = {
 static char *oc_no_usermod_attrs[] = {
        /*
         * Operational and 'no user modification' attributes
+        * which are STORED in the directory server.
         */
 
        /* RFC2252, 3.2.1 */
@@ -159,7 +167,6 @@ static char *oc_no_usermod_attrs[] = {
        "createTimestamp",
        "modifiersName",
        "modifyTimestamp",
-       "subschemaSubentry",
 
        NULL
 };
@@ -1113,15 +1120,19 @@ schema_info( Connection *conn, Operation *op, char **attrs, int attrsonly )
        (void) dn_normalize_case( e->e_ndn );
        e->e_private = NULL;
 
-       val.bv_val = ch_strdup( "top" );
-       val.bv_len = strlen( val.bv_val );
-       attr_merge( e, "objectClass", vals );
-       ldap_memfree( val.bv_val );
+       {
+               char *rdn = ch_strdup( SLAPD_SCHEMA_DN );
+               val.bv_val = strchr( rdn, '=' );
 
-       val.bv_val = ch_strdup( "subschema" );
-       val.bv_len = strlen( val.bv_val );
-       attr_merge( e, "objectClass", vals );
-       ldap_memfree( val.bv_val );
+               if( val.bv_val != NULL ) {
+                       *val.bv_val = '\0';
+                       val.bv_len = strlen( ++val.bv_val );
+
+                       attr_merge( e, rdn, vals );
+               }
+
+               free( rdn );
+       }
 
        if ( syn_schema_info( e ) ) {
                /* Out of memory, do something about it */
@@ -1144,8 +1155,20 @@ schema_info( Connection *conn, Operation *op, char **attrs, int attrsonly )
                return;
        }
        
+       val.bv_val = "top";
+       val.bv_len = sizeof("top")-1;
+       attr_merge( e, "objectClass", vals );
+
+       val.bv_val = "subschema";
+       val.bv_len = sizeof("subschema")-1;
+       attr_merge( e, "objectClass", vals );
+
+       val.bv_val = "extensibleObject";
+       val.bv_len = sizeof("extensibleObject")-1;
+       attr_merge( e, "objectClass", vals );
+
        send_search_entry( &backends[0], conn, op,
-               e, attrs, attrsonly, 0, NULL );
+               e, attrs, attrsonly, NULL );
        send_search_result( conn, op, LDAP_SUCCESS,
                NULL, NULL, NULL, NULL, 1 );
 
@@ -1213,4 +1236,4 @@ int is_entry_objectclass(
        }
 
        return 1;
-}
\ No newline at end of file
+}