]> git.sur5r.net Git - openldap/commitdiff
updatedn fix for syncrepl
authorJong Hyuk Choi <jongchoi@openldap.org>
Wed, 7 Apr 2004 17:32:37 +0000 (17:32 +0000)
committerJong Hyuk Choi <jongchoi@openldap.org>
Wed, 7 Apr 2004 17:32:37 +0000 (17:32 +0000)
16 files changed:
servers/slapd/add.c
servers/slapd/back-bdb/add.c
servers/slapd/back-bdb/delete.c
servers/slapd/back-bdb/modrdn.c
servers/slapd/back-ldap/add.c
servers/slapd/back-ldap/modify.c
servers/slapd/back-ldbm/add.c
servers/slapd/back-ldbm/delete.c
servers/slapd/back-ldbm/modrdn.c
servers/slapd/backend.c
servers/slapd/delete.c
servers/slapd/modify.c
servers/slapd/modrdn.c
servers/slapd/overlays/rwm.c
servers/slapd/proto-slap.h
servers/slapd/syncrepl.c

index ebb06d69afaa8936c9a5822895a97198b5a87b80..fb6f6e6a5182b03a1e78c64b825a820b88f2e503 100644 (file)
@@ -253,8 +253,6 @@ do_add( Operation *op, SlapReply *rs )
                int repl_user = be_isupdate( op );
 #ifndef SLAPD_MULTIMASTER
                if ( !SLAP_SHADOW(op->o_bd) || repl_user )
-#else
-               if ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo ))
 #endif
                {
                        int update = op->o_bd->be_update_ndn.bv_len;
index 6e7ccdb9b029cbd5f8e997f2e8edf8f7c7e18820..3901900011348b335a7a0c6fc125bda0bd5d51cc 100644 (file)
@@ -298,8 +298,8 @@ retry:      /* transaction retry */
                 * no parent!
                 *  if not attempting to add entry at suffix or with parent ""
                 */
-               if ((( !be_isroot( op ) && !be_isupdate(op)) || pdn.bv_len > 0 )
-                       && !is_entry_glue( op->oq_add.rs_e ))
+               if ((( !be_isroot( op ) && !be_isupdate(op) && !syncrepl_isupdate(op))
+                       || pdn.bv_len > 0 ) && !is_entry_glue( op->oq_add.rs_e ))
                {
 #ifdef NEW_LOGGING
                        LDAP_LOG ( OPERATION, DETAIL1, "bdb_add: %s denied\n", 
index 4f9bff15a1d9a975f1cdcb67ad914e607cc24c36..feb7b81e9cf284426e7121b77cf6dc48250c2b4f 100644 (file)
@@ -246,7 +246,7 @@ retry:      /* transaction retry */
                /* no parent, must be root to delete */
                if( ! be_isroot( op ) ) {
                        if ( be_issuffix( op->o_bd, (struct berval *)&slap_empty_bv )
-                               || be_isupdate( op ) ) {
+                               || be_isupdate( op ) || syncrepl_isupdate( op ) ) {
                                p = (Entry *)&slap_entry_root;
 
                                /* check parent for "children" acl */
index b950479151d02409caeec1ed0dfd61d4e7107b33..9e3529be7f832601208a1fa58a6f9d90cf43811b 100644 (file)
@@ -396,7 +396,7 @@ retry:      /* transaction retry */
                isroot = be_isroot( op );
                if ( ! isroot ) {
                        if ( be_issuffix( op->o_bd, (struct berval *)&slap_empty_bv )
-                               || be_isupdate( op ) ) {
+                               || be_isupdate( op ) || syncrepl_isupdate( op ) ) {
 
                                p = (Entry *)&slap_entry_root;
 
index 72c40f0b51ff29504bbcce59800276328c469195..803bc4aef9819a3d260dbc8ebdad7f34cc56e187 100644 (file)
@@ -90,7 +90,7 @@ ldap_back_add(
        dc.ctx = "addAttrDN";
 #endif
 
-       isupdate = be_isupdate( op );
+       isupdate = be_isupdate( op ) || syncrepl_isupdate( op );
        for (i=0, a=op->oq_add.rs_e->e_attrs; a; a=a->a_next) {
                if ( !isupdate && a->a_desc->ad_type->sat_no_user_mod  ) {
                        continue;
index 6f1ccd169cce9de96e73b0343e6df80bd9440abb..517a202e5c453fbfc590aed0443f1a3ebeecb647 100644 (file)
@@ -91,7 +91,7 @@ ldap_back_modify(
        dc.ctx = "modifyAttrDN";
 #endif
 
-       isupdate = be_isupdate( op );
+       isupdate = be_isupdate( op ) || syncrepl_isupdate( op );
        for (i=0, ml=op->oq_modify.rs_modlist; ml; ml=ml->sml_next) {
                int     is_oc = 0;
 
index d621eeb2a89291db3d33f2fdd391023ff7e558c2..d415b2ec09c8f1b977882176bc5a934b60dd12c2 100644 (file)
@@ -247,8 +247,8 @@ ldbm_back_add(
        } else {
                assert( pdn.bv_val == NULL || *pdn.bv_val == '\0' );
 
-               if (( !be_isroot( op ) && !be_isupdate( op )) &&
-                       !is_entry_glue( op->oq_add.rs_e ))
+               if (( !be_isroot(op) && !be_isupdate(op) && !syncrepl_isupdate(op))
+                       && !is_entry_glue( op->oq_add.rs_e ))
                {
                        ldap_pvt_thread_rdwr_wunlock(&li->li_giant_rwlock);
 
index 7acf90ac896bb4b2e44aacb403b1c8d8ff75bfb4..24b9ac36b36721149a28b497f30f7a5d82826b6b 100644 (file)
@@ -195,7 +195,8 @@ ldbm_back_delete(
        } else {
                /* no parent, must be root to delete */
                if( ! be_isroot( op ) ) {
-                       if ( be_issuffix( op->o_bd, (struct berval *)&slap_empty_bv ) || be_isupdate( op ) ) {
+                       if ( be_issuffix( op->o_bd, (struct berval *)&slap_empty_bv )
+                               || be_isupdate( op ) || syncrepl_isupdate( op ) ) {
                                p = (Entry *)&slap_entry_root;
                                
                                rc = access_allowed( op, p,
index d0a7c791c42a84e5883e06312c19d4db9db59fd9..acab4030daee87e8ae8beea8de75d102db505112 100644 (file)
@@ -248,7 +248,8 @@ ldbm_back_modrdn(
                /* no parent, must be root to modify rdn */
                isroot = be_isroot( op );
                if ( ! isroot ) {
-                       if ( be_issuffix( op->o_bd, (struct berval *)&slap_empty_bv ) || be_isupdate( op ) ) {
+                       if ( be_issuffix( op->o_bd, (struct berval *)&slap_empty_bv )
+                               || be_isupdate( op ) || syncrepl_isupdate( op ) ) {
                                int     can_access;
                                p = (Entry *)&slap_entry_root;
                                
@@ -422,7 +423,8 @@ ldbm_back_modrdn(
                        }
 
                        if ( ! isroot ) {
-                               if ( be_issuffix( op->o_bd, (struct berval *)&slap_empty_bv ) || be_isupdate( op ) ) {
+                               if ( be_issuffix( op->o_bd, (struct berval *)&slap_empty_bv )
+                                       || be_isupdate( op ) || syncrepl_isupdate( op )) {
                                        int     can_access;
                                        np = (Entry *)&slap_entry_root;
                                
index 54249eebc400a67a246600458aaae67f52a67e40..30e3a3055f42e6ba4ce4db18a0de403dee249eda 100644 (file)
@@ -730,7 +730,7 @@ be_isroot_dn( Backend *be, struct berval *ndn )
 int
 be_isupdate( Operation *op )
 {
-       return be_isupdate_dn( op->o_bd, &op->o_ndn );
+       return ( be_isupdate_dn( op->o_bd, &op->o_ndn ));
 }
 
 int
index eded9982950c704973c46943a8d91ee08e8b8088..70f4cee5e073897d73b8014ae28fefed7ac4cc07 100644 (file)
@@ -208,8 +208,6 @@ do_delete(
                int repl_user = be_isupdate( op );
 #ifndef SLAPD_MULTIMASTER
                if ( !SLAP_SHADOW(op->o_bd) || repl_user )
-#else
-               if ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo ))
 #endif
                {
                        slap_callback cb = { NULL, slap_replog_cb, NULL, NULL };
index 0f81ef1a3962d23dd7e96e101f942aaf69fb32f0..05d827301dcc8d624b6fef20a4c54b107a541074 100644 (file)
@@ -468,8 +468,6 @@ do_modify(
                 */
 #ifndef SLAPD_MULTIMASTER
                if ( !SLAP_SHADOW(op->o_bd) || repl_user )
-#else
-               if ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo ))
 #endif
                {
                        int update = op->o_bd->be_update_ndn.bv_len;
index 205ea71166abfc25b70f9d1bb5cc8c366ce5ca75..9f184ada3cf73635270e206f8c6907619bd51494 100644 (file)
@@ -365,8 +365,6 @@ do_modrdn(
                int repl_user = be_isupdate( op );
 #ifndef SLAPD_MULTIMASTER
                if ( !SLAP_SHADOW(op->o_bd) || repl_user )
-#else
-               if ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo ))
 #endif
                {
                        slap_callback cb = { NULL, slap_replog_cb, NULL, NULL };
index 20f40dab49f4aff4e50bcd689005f97d44fa08a9..9443ad27e0aedfd4462c7b35fec1b189dd4e914c 100644 (file)
@@ -100,7 +100,7 @@ rwm_add( Operation *op, SlapReply *rs )
        }
 
        /* Count number of attributes in entry */ 
-       isupdate = be_isupdate( op );
+       isupdate = be_isupdate( op ) || syncrepl_isupdate( op );
        for ( i = 0, ap = &op->oq_add.rs_e->e_attrs; *ap; ) {
                struct berval   mapped;
                Attribute       *a;
index d1c05ebc7a45c8da32fc109e78da02afef6cc8f0..a24df9d9a7b46a1aa80b8a69e727e17510ebc9fb 100644 (file)
@@ -1136,6 +1136,8 @@ LDAP_SLAPD_F (Entry*) slap_create_syncrepl_entry LDAP_P((
                                        struct berval *, struct berval * ));
 LDAP_SLAPD_F (struct berval *) slap_uuidstr_from_normalized LDAP_P((
                                        struct berval *, struct berval *, void * ));
+LDAP_SLAPD_F (int) syncrepl_isupdate LDAP_P(( Operation * ));
+LDAP_SLAPD_F (int) syncrepl_isupdate_dn LDAP_P(( Backend *, struct berval * ));
 
 /* syntax.c */
 LDAP_SLAPD_F (Syntax *) syn_find LDAP_P((
index 5b2f8e809232198564c905a3e882580961a7700b..125d10ba68b85891aec97f67e6de22aa9404c568 100644 (file)
@@ -1788,6 +1788,31 @@ done :
        return;
 }
 
+int
+syncrepl_isupdate( Operation *op )
+{
+       return ( syncrepl_isupdate_dn( op->o_bd, &op->o_ndn ));
+}
+
+int
+syncrepl_isupdate_dn(
+       Backend*                be,
+       struct berval*  ndn
+)
+{
+       syncinfo_t*     si;
+       int                     ret = 0;
+
+       if ( !LDAP_STAILQ_EMPTY( &be->be_syncinfo )) {
+               LDAP_STAILQ_FOREACH( si, &be->be_syncinfo, si_next ) {
+                       if ( ret = dn_match( &si->si_updatedn, ndn )) {
+                               return ret;
+                       }
+               }
+       }
+       return 0;
+}
+
 static int
 dn_callback(
        Operation*      op,
@@ -1991,4 +2016,3 @@ avl_ber_bvfree( void *bv )
        }
        ch_free ( (char *) bv );
 }
-