[SCM] Samba Shared Repository - branch master updated

Andrew Tridgell tridge at samba.org
Fri Mar 26 02:46:04 MDT 2010


The branch, master has been updated
       via  525a4fb... util: on FreeBSD true is in /usr/bin. Use execvp to find it
       via  fae84f9... libutil: moved the networking defines to util_net.h
       via  c81d2ae... libreplace: strerror_r() is needed by heimdal on solaris8
       via  af80775... s4-drs: replmd_delete with the 3 stage deletion recycle bin
       via  63fc397... tsocket: not all systems have IPV6_V6ONLY
      from  92332fb... Second part of bug #7288 - SMB job IDs in CUPS job names wrong.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 525a4fb2c423dbbeeb1e6da3254f334044b7bd7f
Author: Andrew Tridgell <tridge at samba.org>
Date:   Fri Mar 26 19:03:22 2010 +1100

    util: on FreeBSD true is in /usr/bin. Use execvp to find it

commit fae84f98e37e99e41b23739305e7331b3a34ae48
Author: Andrew Tridgell <tridge at samba.org>
Date:   Fri Mar 26 17:36:02 2010 +1100

    libutil: moved the networking defines to util_net.h
    
    These were causing thousands of warnings on solaris8

commit c81d2ae3c9a4f9b5d2291563f141bb10d64cd650
Author: Andrew Tridgell <tridge at samba.org>
Date:   Fri Mar 26 16:50:24 2010 +1100

    libreplace: strerror_r() is needed by heimdal on solaris8

commit af807758e8d98ea53f58b2bae8f00b83074cfdec
Author: Eduardo Lima <eduardoll at gmail.com>
Date:   Wed Mar 24 16:21:15 2010 -0300

    s4-drs: replmd_delete with the 3 stage deletion recycle bin

commit 63fc3978089df403d7e63462593784ff3d05e6e7
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Mar 25 16:42:19 2010 +1100

    tsocket: not all systems have IPV6_V6ONLY

-----------------------------------------------------------------------

Summary of changes:
 lib/replace/libreplace.m4                       |    2 +-
 lib/replace/replace.c                           |    8 +
 lib/replace/replace.h                           |    5 +
 lib/tsocket/tsocket_bsd.c                       |    4 +-
 lib/util/util.h                                 |   27 ---
 lib/util/util_net.c                             |    1 +
 lib/util/util_net.h                             |   28 +++
 lib/util/util_runcmd.c                          |    2 +-
 libcli/nbt/nbtname.c                            |    1 +
 librpc/ndr/ndr_basic.c                          |    1 +
 librpc/rpc/binding.c                            |    1 +
 nsswitch/libwbclient/tests/wbclient.c           |    1 +
 selftest/target/Samba4.pm                       |    2 +-
 source4/auth/gensec/gensec_gssapi.c             |    1 +
 source4/auth/gensec/gensec_krb5.c               |    1 +
 source4/dsdb/samdb/ldb_modules/repl_meta_data.c |  283 ++++++++++++++---------
 source4/dsdb/samdb/ldb_modules/util.c           |   26 ++-
 source4/lib/socket/access.c                     |    1 +
 source4/lib/socket/interface.c                  |    1 +
 source4/lib/socket/socket_ip.c                  |    1 +
 source4/libcli/resolve/resolve.c                |    1 +
 source4/libcli/resolve/testsuite.c              |    1 +
 source4/libcli/smb_composite/connect.c          |    1 +
 source4/librpc/tests/binding_string.c           |    1 +
 source4/nbt_server/interfaces.c                 |    1 +
 source4/nbt_server/wins/winsserver.c            |    1 +
 26 files changed, 266 insertions(+), 137 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/replace/libreplace.m4 b/lib/replace/libreplace.m4
index 8b7a56e..6da209d 100644
--- a/lib/replace/libreplace.m4
+++ b/lib/replace/libreplace.m4
@@ -104,7 +104,7 @@ AC_CHECK_HEADERS(sys/mount.h mntent.h)
 AC_CHECK_HEADERS(stropts.h)
 AC_CHECK_HEADERS(unix.h)
 
-AC_CHECK_FUNCS(seteuid setresuid setegid setresgid chroot bzero strerror)
+AC_CHECK_FUNCS(seteuid setresuid setegid setresgid chroot bzero strerror strerror_r)
 AC_CHECK_FUNCS(vsyslog setlinebuf mktime ftruncate chsize rename)
 AC_CHECK_FUNCS(waitpid wait4 strlcpy strlcat initgroups memmove strdup)
 AC_CHECK_FUNCS(pread pwrite strndup strcasestr strtok_r mkdtemp dup2 dprintf vdprintf)
diff --git a/lib/replace/replace.c b/lib/replace/replace.c
index e4b97a8..6a32540 100644
--- a/lib/replace/replace.c
+++ b/lib/replace/replace.c
@@ -747,3 +747,11 @@ char *rep_get_current_dir_name(void)
 	return strdup(p);
 }
 #endif
+
+#ifndef HAVE_STRERROR_R
+char *rep_strerror_r(int errnum, char *buf, size_t buflen)
+{
+	strncpy(buf, strerror(errnum), buflen);
+	return buf;
+}
+#endif
diff --git a/lib/replace/replace.h b/lib/replace/replace.h
index cd73e65..9eb6604 100644
--- a/lib/replace/replace.h
+++ b/lib/replace/replace.h
@@ -512,6 +512,11 @@ ssize_t rep_pwrite(int __fd, const void *__buf, size_t __nbytes, off_t __offset)
 char *rep_get_current_dir_name(void);
 #endif
 
+#ifndef HAVE_STRERROR_R
+#define strerror_r rep_strerror_r
+char *rep_strerror_r(int errnum, char *buf, size_t buflen);
+#endif
+
 #ifdef HAVE_LIMITS_H
 #include <limits.h>
 #endif
diff --git a/lib/tsocket/tsocket_bsd.c b/lib/tsocket/tsocket_bsd.c
index c44ba4e..1a7a4ee 100644
--- a/lib/tsocket/tsocket_bsd.c
+++ b/lib/tsocket/tsocket_bsd.c
@@ -1248,7 +1248,7 @@ static int tdgram_bsd_dgram_socket(const struct tsocket_address *local,
 	bsds->fd = fd;
 	talloc_set_destructor(bsds, tdgram_bsd_destructor);
 
-#ifdef HAVE_IPV6
+#if defined(HAVE_IPV6) && defined(IPV6_V6ONLY)
 	if (do_ipv6only) {
 		int val = 1;
 
@@ -2089,7 +2089,7 @@ static struct tevent_req * tstream_bsd_connect_send(TALLOC_CTX *mem_ctx,
 		goto post;
 	}
 
-#ifdef HAVE_IPV6
+#if defined(HAVE_IPV6) && defined(IPV6_V6ONLY)
 	if (do_ipv6only) {
 		int val = 1;
 
diff --git a/lib/util/util.h b/lib/util/util.h
index 2d4a025..b89a7d6 100644
--- a/lib/util/util.h
+++ b/lib/util/util.h
@@ -663,33 +663,6 @@ _PUBLIC_ void msleep(unsigned int t);
 _PUBLIC_ char* get_myname(TALLOC_CTX *mem_ctx);
 
 /**
- Return true if a string could be a pure IP address.
-**/
-_PUBLIC_ bool is_ipaddress(const char *str);
-
-/**
- Interpret an internet address or name into an IP address in 4 byte form.
-**/
-_PUBLIC_ uint32_t interpret_addr(const char *str);
-
-/**
- A convenient addition to interpret_addr().
-**/
-_PUBLIC_ struct in_addr interpret_addr2(const char *str);
-
-/**
- Check if an IP is the 0.0.0.0.
-**/
-_PUBLIC_ bool is_zero_ip_v4(struct in_addr ip);
-
-/**
- Are two IPs on the same subnet?
-**/
-_PUBLIC_ bool same_net_v4(struct in_addr ip1,struct in_addr ip2,struct in_addr mask);
-
-_PUBLIC_ bool is_ipaddress_v4(const char *str);
-
-/**
  Check if a process exists. Does this work on all unixes?
 **/
 _PUBLIC_ bool process_exists_by_pid(pid_t pid);
diff --git a/lib/util/util_net.c b/lib/util/util_net.c
index 9e47f51..00a5ee4 100644
--- a/lib/util/util_net.c
+++ b/lib/util/util_net.c
@@ -27,6 +27,7 @@
 #include "system/network.h"
 #include "system/locale.h"
 #include "system/filesys.h"
+#include "lib/util/util_net.h"
 #undef strcasecmp
 
 /*******************************************************************
diff --git a/lib/util/util_net.h b/lib/util/util_net.h
index 5dc4df5..530311e 100644
--- a/lib/util/util_net.h
+++ b/lib/util/util_net.h
@@ -45,4 +45,32 @@ bool interpret_string_addr_prefer_ipv4(struct sockaddr_storage *pss,
 
 void set_sockaddr_port(struct sockaddr *psa, uint16_t port);
 
+/**
+ Check if an IP is the 0.0.0.0.
+**/
+_PUBLIC_ bool is_zero_ip_v4(struct in_addr ip);
+
+/**
+ Are two IPs on the same subnet?
+**/
+_PUBLIC_ bool same_net_v4(struct in_addr ip1,struct in_addr ip2,struct in_addr mask);
+
+/**
+ Return true if a string could be a pure IP address.
+**/
+_PUBLIC_ bool is_ipaddress(const char *str);
+
+/**
+ Interpret an internet address or name into an IP address in 4 byte form.
+**/
+_PUBLIC_ uint32_t interpret_addr(const char *str);
+
+/**
+ A convenient addition to interpret_addr().
+**/
+_PUBLIC_ struct in_addr interpret_addr2(const char *str);
+
+_PUBLIC_ bool is_ipaddress_v4(const char *str);
+
+
 #endif /* _SAMBA_UTIL_NET_H_ */
diff --git a/lib/util/util_runcmd.c b/lib/util/util_runcmd.c
index ef897d4..54643d3 100644
--- a/lib/util/util_runcmd.c
+++ b/lib/util/util_runcmd.c
@@ -183,7 +183,7 @@ struct tevent_req *samba_runcmd_send(TALLOC_CTX *mem_ctx,
 	}
 	va_end(ap);
 
-	ret = execv(state->arg0, argv);
+	ret = execvp(state->arg0, argv);
 	fprintf(stderr, "Failed to exec child - %s\n", strerror(errno));
 	_exit(255);
 	return NULL;
diff --git a/libcli/nbt/nbtname.c b/libcli/nbt/nbtname.c
index f890b91..385905a 100644
--- a/libcli/nbt/nbtname.c
+++ b/libcli/nbt/nbtname.c
@@ -27,6 +27,7 @@
 #include "librpc/gen_ndr/ndr_nbt.h"
 #include "librpc/gen_ndr/ndr_misc.h"
 #include "system/locale.h"
+#include "lib/util/util_net.h"
 
 /* don't allow an unlimited number of name components */
 #define MAX_COMPONENTS 10
diff --git a/librpc/ndr/ndr_basic.c b/librpc/ndr/ndr_basic.c
index 1fd6fde..f7d6ee0 100644
--- a/librpc/ndr/ndr_basic.c
+++ b/librpc/ndr/ndr_basic.c
@@ -22,6 +22,7 @@
 #include "includes.h"
 #include "system/network.h"
 #include "librpc/ndr/libndr.h"
+#include "lib/util/util_net.h"
 
 #define NDR_SVAL(ndr, ofs) (NDR_BE(ndr)?RSVAL(ndr->data,ofs):SVAL(ndr->data,ofs))
 #define NDR_IVAL(ndr, ofs) (NDR_BE(ndr)?RIVAL(ndr->data,ofs):IVAL(ndr->data,ofs))
diff --git a/librpc/rpc/binding.c b/librpc/rpc/binding.c
index 3f15eef..e3edc67 100644
--- a/librpc/rpc/binding.c
+++ b/librpc/rpc/binding.c
@@ -23,6 +23,7 @@
 */
 
 #include "includes.h"
+#include "../../lib/util/util_net.h"
 #include "librpc/gen_ndr/ndr_epmapper.h"
 #include "librpc/gen_ndr/ndr_misc.h"
 #include "librpc/rpc/dcerpc.h"
diff --git a/nsswitch/libwbclient/tests/wbclient.c b/nsswitch/libwbclient/tests/wbclient.c
index 6d4ea86..0074040 100644
--- a/nsswitch/libwbclient/tests/wbclient.c
+++ b/nsswitch/libwbclient/tests/wbclient.c
@@ -22,6 +22,7 @@
 #include "nsswitch/libwbclient/wbc_async.h"
 #include "torture/smbtorture.h"
 #include "torture/winbind/proto.h"
+#include "lib/util/util_net.h"
 
 #define WBC_ERROR_EQUAL(x,y) (x == y)
 
diff --git a/selftest/target/Samba4.pm b/selftest/target/Samba4.pm
index 9370a17..06a5326 100644
--- a/selftest/target/Samba4.pm
+++ b/selftest/target/Samba4.pm
@@ -584,7 +584,7 @@ sub provision_raw_step1($$)
 	gensec:require_pac = true
 	log level = $ctx->{server_loglevel}
 	lanman auth = Yes
-	rndc command = /bin/true
+	rndc command = true
         dns update command = $ENV{SRCDIR_ABS}/scripting/bin/samba_dnsupdate -s $ctx->{smb_conf} --all-interfaces --use-file=$ctx->{dns_host_file}
         resolv:host file = $ctx->{dns_host_file}
 ";
diff --git a/source4/auth/gensec/gensec_gssapi.c b/source4/auth/gensec/gensec_gssapi.c
index a50190f..6d59bbe 100644
--- a/source4/auth/gensec/gensec_gssapi.c
+++ b/source4/auth/gensec/gensec_gssapi.c
@@ -40,6 +40,7 @@
 #include <gssapi/gssapi_krb5.h>
 #include <gssapi/gssapi_spnego.h>
 #include "auth/gensec/gensec_gssapi.h"
+#include "lib/util/util_net.h"
 
 static size_t gensec_gssapi_max_input_size(struct gensec_security *gensec_security);
 static size_t gensec_gssapi_max_wrapped_size(struct gensec_security *gensec_security);
diff --git a/source4/auth/gensec/gensec_krb5.c b/source4/auth/gensec/gensec_krb5.c
index e8beb4c..9a96e5e 100644
--- a/source4/auth/gensec/gensec_krb5.c
+++ b/source4/auth/gensec/gensec_krb5.c
@@ -35,6 +35,7 @@
 #include "auth/gensec/gensec_proto.h"
 #include "param/param.h"
 #include "auth/auth_sam_reply.h"
+#include "lib/util/util_net.h"
 
 enum GENSEC_KRB5_STATE {
 	GENSEC_KRB5_SERVER_START,
diff --git a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
index 8b4e012..75aed6a 100644
--- a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
+++ b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
@@ -2338,6 +2338,10 @@ static int replmd_delete(struct ldb_module *module, struct ldb_request *req)
 		"trustType", "trustAttributes", "userAccountControl", "uSNChanged", "uSNCreated", "whenCreated",
 		"whenChanged", NULL};
 	unsigned int i, el_count = 0;
+	enum deletion_state { OBJECT_NOT_DELETED=1, OBJECT_DELETED=2, OBJECT_RECYCLED=3,
+						OBJECT_TOMBSTONE=4, OBJECT_REMOVED=5 };
+	enum deletion_state deletion_state, next_deletion_state;
+	bool enabled;
 
 	if (ldb_dn_is_special(req->op.del.dn)) {
 		return ldb_next_request(module, req);
@@ -2368,12 +2372,39 @@ static int replmd_delete(struct ldb_module *module, struct ldb_request *req)
 	}
 	old_msg = res->msgs[0];
 
+
+	ret = dsdb_recyclebin_enabled(module, &enabled);
+	if (ret != LDB_SUCCESS) {
+		talloc_free(tmp_ctx);
+		return ret;
+	}
+
 	if (ldb_msg_check_string_attribute(old_msg, "isDeleted", "TRUE")) {
+		if (!enabled) {
+			deletion_state = OBJECT_TOMBSTONE;
+			next_deletion_state = OBJECT_REMOVED;
+		} else if (ldb_msg_check_string_attribute(old_msg, "isRecycled", "TRUE")) {
+			deletion_state = OBJECT_RECYCLED;
+			next_deletion_state = OBJECT_REMOVED;
+		} else {
+			deletion_state = OBJECT_DELETED;
+			next_deletion_state = OBJECT_RECYCLED;
+		}
+	} else {
+		deletion_state = OBJECT_NOT_DELETED;
+		if (enabled) {
+			next_deletion_state = OBJECT_DELETED;
+		} else {
+			next_deletion_state = OBJECT_TOMBSTONE;
+		}
+	}
+
+	if (next_deletion_state == OBJECT_REMOVED) {
 		struct auth_session_info *session_info =
-			(struct auth_session_info *)ldb_get_opaque(ldb, "sessionInfo");
+				(struct auth_session_info *)ldb_get_opaque(ldb, "sessionInfo");
 		if (security_session_user_level(session_info) != SECURITY_SYSTEM) {
 			ldb_asprintf_errstring(ldb, "Refusing to delete deleted object %s",
-					       ldb_dn_get_linearized(old_msg->dn));
+					ldb_dn_get_linearized(old_msg->dn));
 			return LDB_ERR_UNWILLING_TO_PERFORM;
 		}
 
@@ -2382,36 +2413,56 @@ static int replmd_delete(struct ldb_module *module, struct ldb_request *req)
 		return ldb_next_request(module, req);
 	}
 
-	/* work out where we will be renaming this object to */
-	ret = dsdb_get_deleted_objects_dn(ldb, tmp_ctx, old_dn, &new_dn);
-	if (ret != LDB_SUCCESS) {
-		/* this is probably an attempted delete on a partition
-		 * that doesn't allow delete operations, such as the
-		 * schema partition */
-		ldb_asprintf_errstring(ldb, "No Deleted Objects container for DN %s",
-				       ldb_dn_get_linearized(old_dn));
-		talloc_free(tmp_ctx);
-		return LDB_ERR_UNWILLING_TO_PERFORM;
-	}
-
 	rdn_name = ldb_dn_get_rdn_name(old_dn);
 	rdn_value = ldb_dn_get_rdn_val(old_dn);
 
-	/* get the objects GUID from the search we just did */
-	guid = samdb_result_guid(old_msg, "objectGUID");
-
-	/* Add a formatted child */
-	retb = ldb_dn_add_child_fmt(new_dn, "%s=%s\\0ADEL:%s",
-				    rdn_name,
-				    rdn_value->data,
-				    GUID_string(tmp_ctx, &guid));
-	if (!retb) {
-		DEBUG(0,(__location__ ": Unable to add a formatted child to dn: %s",
-				ldb_dn_get_linearized(new_dn)));
+	msg = ldb_msg_new(tmp_ctx);
+	if (msg == NULL) {
+		ldb_module_oom(module);
 		talloc_free(tmp_ctx);
 		return LDB_ERR_OPERATIONS_ERROR;
 	}
 
+	msg->dn = old_dn;
+
+	if (deletion_state == OBJECT_NOT_DELETED){
+		/* work out where we will be renaming this object to */
+		ret = dsdb_get_deleted_objects_dn(ldb, tmp_ctx, old_dn, &new_dn);
+		if (ret != LDB_SUCCESS) {
+			/* this is probably an attempted delete on a partition
+			 * that doesn't allow delete operations, such as the
+			 * schema partition */
+			ldb_asprintf_errstring(ldb, "No Deleted Objects container for DN %s",
+						   ldb_dn_get_linearized(old_dn));
+			talloc_free(tmp_ctx);
+			return LDB_ERR_UNWILLING_TO_PERFORM;
+		}
+
+		/* get the objects GUID from the search we just did */
+		guid = samdb_result_guid(old_msg, "objectGUID");
+
+		/* Add a formatted child */
+		retb = ldb_dn_add_child_fmt(new_dn, "%s=%s\\0ADEL:%s",
+						rdn_name,
+						rdn_value->data,
+						GUID_string(tmp_ctx, &guid));
+		if (!retb) {
+			DEBUG(0,(__location__ ": Unable to add a formatted child to dn: %s",
+					ldb_dn_get_linearized(new_dn)));
+			talloc_free(tmp_ctx);
+			return LDB_ERR_OPERATIONS_ERROR;
+		}
+
+		ret = ldb_msg_add_string(msg, "isDeleted", "TRUE");
+		if (ret != LDB_SUCCESS) {
+			DEBUG(0,(__location__ ": Failed to add isDeleted string to the msg\n"));
+			ldb_module_oom(module);
+			talloc_free(tmp_ctx);
+			return ret;
+		}
+		msg->elements[el_count++].flags = LDB_FLAG_MOD_ADD;
+	}
+
 	/*
 	  now we need to modify the object in the following ways:
 
@@ -2429,30 +2480,22 @@ static int replmd_delete(struct ldb_module *module, struct ldb_request *req)
 	  see MS-ADTS "Tombstone Requirements" section 3.1.1.5.5.1.1
 	 */
 
-	msg = ldb_msg_new(tmp_ctx);
-	if (msg == NULL) {
-		ldb_module_oom(module);
-		talloc_free(tmp_ctx);
-		return LDB_ERR_OPERATIONS_ERROR;
-	}
-
-	msg->dn = old_dn;
-
-	ret = ldb_msg_add_string(msg, "isDeleted", "TRUE");
+	/* we need the storage form of the parent GUID */
+	ret = dsdb_module_search_dn(module, tmp_ctx, &parent_res,
+				    ldb_dn_get_parent(tmp_ctx, old_dn), NULL,
+				    DSDB_SEARCH_SHOW_DN_IN_STORAGE_FORMAT |
+				    DSDB_SEARCH_REVEAL_INTERNALS|
+				    DSDB_SEARCH_SHOW_DELETED);
 	if (ret != LDB_SUCCESS) {
-		DEBUG(0,(__location__ ": Failed to add isDeleted string to the msg\n"));
-		ldb_module_oom(module);
 		talloc_free(tmp_ctx);
 		return ret;
 	}
-	msg->elements[el_count++].flags = LDB_FLAG_MOD_ADD;
 
-	/* we also mark it as recycled, meaning this object can't be
-	   recovered (we are stripping its attributes) */
-	if (dsdb_functional_level(ldb) >= DS_DOMAIN_FUNCTION_2008_R2) {
-		ret = ldb_msg_add_string(msg, "isRecycled", "TRUE");
+	if (deletion_state == OBJECT_NOT_DELETED){
+		ret = ldb_msg_add_steal_string(msg, "lastKnownParent",
+						   ldb_dn_get_extended_linearized(tmp_ctx, parent_res->msgs[0]->dn, 1));
 		if (ret != LDB_SUCCESS) {
-			DEBUG(0,(__location__ ": Failed to add isRecycled string to the msg\n"));
+			DEBUG(0,(__location__ ": Failed to add lastKnownParent string to the msg\n"));
 			ldb_module_oom(module);
 			talloc_free(tmp_ctx);
 			return ret;
@@ -2460,79 +2503,109 @@ static int replmd_delete(struct ldb_module *module, struct ldb_request *req)
 		msg->elements[el_count++].flags = LDB_FLAG_MOD_ADD;
 	}
 
-	/* we need the storage form of the parent GUID */
-	ret = dsdb_module_search_dn(module, tmp_ctx, &parent_res,
-				    ldb_dn_get_parent(tmp_ctx, old_dn), NULL,
-				    DSDB_SEARCH_SHOW_DN_IN_STORAGE_FORMAT |
-				    DSDB_SEARCH_REVEAL_INTERNALS);
-	if (ret != LDB_SUCCESS) {
-		talloc_free(tmp_ctx);
-		return ret;
-	}
+	switch (next_deletion_state){
 
-	ret = ldb_msg_add_steal_string(msg, "lastKnownParent",
-				       ldb_dn_get_extended_linearized(tmp_ctx, parent_res->msgs[0]->dn, 1));
-	if (ret != LDB_SUCCESS) {
-		DEBUG(0,(__location__ ": Failed to add lastKnownParent string to the msg\n"));
-		ldb_module_oom(module);
-		talloc_free(tmp_ctx);
-		return ret;
-	}
-	msg->elements[el_count++].flags = LDB_FLAG_MOD_ADD;
+	case OBJECT_DELETED:
 
-	/* work out which of the old attributes we will be removing */
-	for (i=0; i<old_msg->num_elements; i++) {
-		const struct dsdb_attribute *sa;
-		el = &old_msg->elements[i];
-		sa = dsdb_attribute_by_lDAPDisplayName(schema, el->name);
-		if (!sa) {
+		ret = ldb_msg_add_value(msg, "msDS-LastKnownRDN", rdn_value, NULL);
+		if (ret != LDB_SUCCESS) {
+			DEBUG(0,(__location__ ": Failed to add msDS-LastKnownRDN string to the msg\n"));
+			ldb_module_oom(module);
 			talloc_free(tmp_ctx);
-			return LDB_ERR_OPERATIONS_ERROR;
+			return ret;
 		}
-		if (ldb_attr_cmp(el->name, rdn_name) == 0) {
-			/* don't remove the rDN */
-			continue;
+		msg->elements[el_count++].flags = LDB_FLAG_MOD_ADD;
+
+		ret = ldb_msg_add_empty(msg, "objectCategory", LDB_FLAG_MOD_DELETE, NULL);
+		if (ret != LDB_SUCCESS) {
+			talloc_free(tmp_ctx);
+			ldb_module_oom(module);
+			return ret;
 		}
 
-		if (sa->linkID && sa->linkID & 1) {
-			ret = replmd_delete_remove_link(module, schema, old_dn, el, sa);
+		ret = ldb_msg_add_empty(msg, "sAMAccountType", LDB_FLAG_MOD_DELETE, NULL);
+		if (ret != LDB_SUCCESS) {
+			talloc_free(tmp_ctx);
+			ldb_module_oom(module);
+			return ret;
+		}
+
+		break;
+
+	case OBJECT_RECYCLED:
+	case OBJECT_TOMBSTONE:
+
+		/* we also mark it as recycled, meaning this object can't be
+		   recovered (we are stripping its attributes) */
+		if (dsdb_functional_level(ldb) >= DS_DOMAIN_FUNCTION_2008_R2) {
+			ret = ldb_msg_add_string(msg, "isRecycled", "TRUE");


-- 
Samba Shared Repository


More information about the samba-cvs mailing list