s4-drs: handle mixtures of old and new style links in getncchanges
authorAndrew Tridgell <tridge@samba.org>
Sat, 19 Dec 2009 09:59:04 +0000 (20:59 +1100)
committerAndrew Tridgell <tridge@samba.org>
Fri, 1 Jan 2010 21:16:51 +0000 (08:16 +1100)
We need to send non-upgraded links using the old format

source4/rpc_server/drsuapi/getncchanges.c

index e07aca6e65f07b59ba7f024345a3f280df3c2a39..b3808206cb364f3e8060e91258c847339f49b2e3 100644 (file)
@@ -136,6 +136,7 @@ static WERROR get_nc_changes_build_object(struct drsuapi_DsReplicaObjectListItem
        
        obj->meta_data_ctr->meta_data = talloc_array(obj, struct drsuapi_DsReplicaMetaData, md.ctr.ctr1.count);
        for (n=i=0; i<md.ctr.ctr1.count; i++) {
+               const struct dsdb_attribute *sa;
                /* if the attribute has not changed, and it is not the
                   instanceType then don't include it */
                if (md.ctr.ctr1.array[i].local_usn < highest_usn &&
@@ -144,6 +145,16 @@ static WERROR get_nc_changes_build_object(struct drsuapi_DsReplicaObjectListItem
                /* don't include the rDN */
                if (md.ctr.ctr1.array[i].attid == rdn_sa->attributeID_id) continue;
 
+               sa = dsdb_attribute_by_attributeID_id(schema, md.ctr.ctr1.array[i].attid);
+               if (sa->linkID) {
+                       struct ldb_message_element *el;
+                       el = ldb_msg_find_element(msg, sa->lDAPDisplayName);
+                       if (el && el->num_values && dsdb_dn_is_upgraded_link_val(&el->values[0])) {
+                               /* don't send upgraded links inline */
+                               continue;
+                       }
+               }
+
                obj->meta_data_ctr->meta_data[n].originating_change_time = md.ctr.ctr1.array[i].originating_change_time;
                obj->meta_data_ctr->meta_data[n].version = md.ctr.ctr1.array[i].version;
                obj->meta_data_ctr->meta_data[n].originating_invocation_id = md.ctr.ctr1.array[i].originating_invocation_id;
@@ -326,6 +337,12 @@ static WERROR get_nc_changes_add_links(struct ldb_context *sam_ctx,
                        continue;
                }
 
+               if (el->num_values && !dsdb_dn_is_upgraded_link_val(&el->values[0])) {
+                       /* its an old style link, it will have been
+                        * sent in the main replication data */
+                       continue;
+               }
+
                for (j=0; j<el->num_values; j++) {
                        struct dsdb_dn *dsdb_dn;
                        uint64_t local_usn;