]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldap/search.c
ITS#7520 - back-ldap omit-unknown-schema changes
[openldap] / servers / slapd / back-ldap / search.c
index cc27f17afe5aac9e4c2b92452c0ca4d705d4d8d8..6001566059a9d4349e5f9df6945236fdb3ae9c61 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1999-2015 The OpenLDAP Foundation.
+ * Copyright 1999-2017 The OpenLDAP Foundation.
  * Portions Copyright 1999-2003 Howard Chu.
  * Portions Copyright 2000-2003 Pierangelo Masarati.
  * All rights reserved.
 
 static int
 ldap_build_entry( Operation *op, LDAPMessage *e, Entry *ent,
-        struct berval *bdn );
+        struct berval *bdn, int remove_unknown_schema );
+
+
+static ObjectClass *
+oc_bvfind_undef_ex( struct berval *ocname, int flag )
+{
+       ObjectClass     *oc     = oc_bvfind( ocname );
+
+       if ( oc || flag ) {
+               /* oc defined or remove-unknown-schema flag set */
+               return oc;
+       }
+
+       return oc_bvfind_undef( ocname );
+}
+
 
 /*
  * replaces (&) with (objectClass=*) and (|) with (!(objectClass=*))
@@ -147,6 +162,8 @@ ldap_back_search(
        int             do_retry = 1, dont_retry = 0;
        LDAPControl     **ctrls = NULL;
        char            **references = NULL;
+       int             remove_unknown_schema =
+                                LDAP_BACK_OMIT_UNKNOWN_SCHEMA (li);
 
        rs_assert_ready( rs );
        rs->sr_flags &= ~REP_ENTRY_MASK; /* paranoia, we can set rs = non-entry */
@@ -354,7 +371,8 @@ retry:
                        do_retry = 0;
 
                        e = ldap_first_entry( lc->lc_ld, res );
-                       rc = ldap_build_entry( op, e, &ent, &bdn );
+                       rc = ldap_build_entry( op, e, &ent, &bdn,
+                                               remove_unknown_schema);
                        if ( rc == LDAP_SUCCESS ) {
                                ldap_get_entry_controls( lc->lc_ld, res, &rs->sr_ctrls );
                                rs->sr_entry = &ent;
@@ -660,7 +678,8 @@ ldap_build_entry(
                Operation       *op,
                LDAPMessage     *e,
                Entry           *ent,
-               struct berval   *bdn )
+               struct berval   *bdn,
+               int remove_unknown_schema)
 {
        struct berval   a;
        BerElement      ber = *ldap_get_message_ber( e );
@@ -714,7 +733,7 @@ ldap_build_entry(
                                != LDAP_SUCCESS )
                {
                        if ( slap_bv2undef_ad( &a, &attr->a_desc, &text,
-                               SLAP_AD_PROXIED ) != LDAP_SUCCESS )
+                                (remove_unknown_schema ? SLAP_AD_NOINSERT : SLAP_AD_PROXIED )) != LDAP_SUCCESS )
                        {
                                Debug( LDAP_DEBUG_ANY, 
                                        "%s ldap_build_entry: "
@@ -792,7 +811,8 @@ ldap_build_entry(
 
                                /* check if, by chance, it's an undefined objectClass */
                                if ( attr->a_desc == slap_schema.si_ad_objectClass &&
-                                               ( oc = oc_bvfind_undef( &attr->a_vals[i] ) ) != NULL )
+                                               ( oc = oc_bvfind_undef_ex( &attr->a_vals[i],
+                                                               remove_unknown_schema ) ) != NULL )
                                {
                                        ber_dupbv( &pval, &oc->soc_cname );
                                        rc = LDAP_SUCCESS;
@@ -918,6 +938,8 @@ ldap_back_entry_get(
        LDAPControl     **ctrls = NULL;
        Operation op2 = *op;
 
+       int             remove_unknown_schema =
+                               LDAP_BACK_OMIT_UNKNOWN_SCHEMA (li);
        *ent = NULL;
 
        /* Tell getconn this is a privileged op */
@@ -993,7 +1015,7 @@ retry:
                goto cleanup;
        }
 
-       rc = ldap_build_entry( op, e, *ent, &bdn );
+       rc = ldap_build_entry( op, e, *ent, &bdn, remove_unknown_schema );
 
        if ( rc != LDAP_SUCCESS ) {
                entry_free( *ent );