[SCM] Samba Shared Repository - branch master updated
Andrew Tridgell
tridge at samba.org
Mon Dec 21 05:59:39 MST 2009
The branch, master has been updated
via 0c36259... s4-schema: fixed the sorting of schema attributes
via ec7dc6a... s4-torture: update uuid_compare test for new behaviour
via ad35153... s4-drs: Implement constraints on ATTID values in prefixMap
via 911cefd... s4-tort: Test handling of different ATTID values in prefixMap interface.
via 35b8808... Adapted acl module to skip checks if as_system control is provided.
via 9f6c818... s4-drs: Save prefix map using LDB_CONTROL_AS_SYSTEM control
via 7685bbb... s4-dsdb-util: Execute ldb_request using LDB_CONTROL_AS_SYSTEM
via 11e2c57... s4-dsdb-util: Utility function to process ldb_request in transaction
via 516316b... s4-schema: Implement msDS-IntId attribute generation
via a409c0f... s4-schema: Constraints on msDS-IntId attribute
via 4e8ad28... s4-schema: Set ATTID in schema cache from "msDS-IntId"
via 14bac3a... Revert "s4-drs: cope with bogus empty attributes from w2k8-r2"
via ee48f58... s4-tort: Tests for "msDS-IntId" attribute implemented
via c113be8... s4-tort: Move Schema tests from ldap.py into separate module
via d9606d6... s4-drs: Fix bug - prefixMap is not updated when adding new OIDs.
via 03a1451... s4-drstest: Don't remove temp LDB so it can be reviewed if necessary
via 452fc0d... s4-repl: give a reason why the prepare commit failed
via 92d75a4... s4-kcc: don't crash with a NULL ntds connection list
via 60acce5... s4-repl: only try to replicate for NCs that we are a master for
via 87f28cc... s4-torture: another unsigned comparison bug
via ec74ffa... s4-schema: a unsigned comparison bug in the schema code
via d370810... s4-drs: another two unsigned comparison bugs
via a106fef... librpc: fixed the GUID_compare() function
via 2a4a159... s4-repl: lower debug level of a common message
via 47560bf... s4-dsdb: don't use a non-constant format string for a printf format
via a070119... s4-dsdb: added DSDB_MODIFY_RELAX flag to the dsdb_module_*() calls
via 9d56f65... s4-dsdb: added dsdb_get_extended_dn_uint64()
via e89a2db... s4-dsdb: use varargs expression in dsdb_module_search()
via 2c88ffb... s4-dsdb: added two new dsdb_get_extended_dn_*() helper functions
via dbda2c2... s4-provision: added a note about where invocationIDs come from
via 882768c... s4-dsdb: give us an invocationID when in standalone mode
from 1b5389a... s3: Fix an error case in cli_negprot
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 0c362597c0f933b3612bb17328c0a13b73d72e43
Author: Andrew Tridgell <tridge at samba.org>
Date: Mon Dec 21 23:36:23 2009 +1100
s4-schema: fixed the sorting of schema attributes
another case of unsigned int subtracting breaking sorts. This one
surfaced now as attributeID_id now can be larger than 2^31
commit ec7dc6a619d7fca83a49065c45fdbc0fa93249a0
Author: Andrew Tridgell <tridge at samba.org>
Date: Mon Dec 21 23:19:08 2009 +1100
s4-torture: update uuid_compare test for new behaviour
commit ad35153ef40ade858302dab2877353682604265b
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date: Sat Dec 19 01:49:31 2009 +0200
s4-drs: Implement constraints on ATTID values in prefixMap
Ref: MS-ADTS, 3.1.1.2.6 ATTRTYP
Signed-off-by: Andrew Tridgell <tridge at samba.org>
commit 911cefd48be67878dea89f905bc7de1cd3f7c40f
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date: Sat Dec 19 01:48:41 2009 +0200
s4-tort: Test handling of different ATTID values in prefixMap interface.
It turns out ATTID values are separated in ranges.
Ref: MS-ADTS, 3.1.1.2.6 ATTRTYP
Signed-off-by: Andrew Tridgell <tridge at samba.org>
commit 35b8808b94808f5d689c2b034ff5c21c739c11a4
Author: Nadezhda Ivanova <nadezhda.ivanova at postpath.com>
Date: Fri Dec 18 18:00:15 2009 +0200
Adapted acl module to skip checks if as_system control is provided.
Signed-off-by: Andrew Tridgell <tridge at samba.org>
commit 9f6c81874f6e63f30432814e4f443a69c4e04429
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date: Fri Dec 18 18:15:49 2009 +0200
s4-drs: Save prefix map using LDB_CONTROL_AS_SYSTEM control
Signed-off-by: Andrew Tridgell <tridge at samba.org>
commit 7685bbbc4ea2ffc522a1582a561477dad2c862b2
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date: Fri Dec 18 18:14:38 2009 +0200
s4-dsdb-util: Execute ldb_request using LDB_CONTROL_AS_SYSTEM
This function is intended to be used when data needs
to be modified skipping access checks.
Signed-off-by: Andrew Tridgell <tridge at samba.org>
commit 11e2c5777dc1bd8af1f696e04d0712fe43e7a21a
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date: Fri Dec 18 18:11:48 2009 +0200
s4-dsdb-util: Utility function to process ldb_request in transaction
This function is to be used later for manually crafted
ldb_requests from within dsdb layer
Signed-off-by: Andrew Tridgell <tridge at samba.org>
commit 516316b107e309a32362b7de9b010b73545480e0
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date: Fri Dec 18 03:46:39 2009 +0200
s4-schema: Implement msDS-IntId attribute generation
Signed-off-by: Andrew Tridgell <tridge at samba.org>
commit a409c0f0372e5a1d81b4acda5c0fc24ccbe68a7e
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date: Thu Dec 17 23:26:47 2009 +0200
s4-schema: Constraints on msDS-IntId attribute
This attribute can not be modified on existing schema object.
msDS-IntId is not allowed during attribute creation also.
Signed-off-by: Andrew Tridgell <tridge at samba.org>
commit 4e8ad284f5813413fdec8426f11e24570d22549b
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date: Fri Dec 18 04:08:52 2009 +0200
s4-schema: Set ATTID in schema cache from "msDS-IntId"
According to http://msdn.microsoft.com/en-us/library/cc223224%28PROT.13%29.aspx
some Attributes OIDs may not use prefixMap.
Setting ATTID in Schema Cache here should work, although
this code snippet should be moved in separate function.
Signed-off-by: Andrew Tridgell <tridge at samba.org>
commit 14bac3a3e6a9308d9088559cf8f898b6ac4b4d68
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date: Fri Dec 18 03:58:29 2009 +0200
Revert "s4-drs: cope with bogus empty attributes from w2k8-r2"
This reverts commit 1287c1d115fb7e8f3954bc05ff65007968403a9c.
Next patch should fix the "not recognized ATTIDs" problem
Signed-off-by: Andrew Tridgell <tridge at samba.org>
commit ee48f583b5f7a7acdf4857d69db49dfa36992f4d
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date: Thu Dec 17 19:27:47 2009 +0200
s4-tort: Tests for "msDS-IntId" attribute implemented
Signed-off-by: Andrew Tridgell <tridge at samba.org>
commit c113be8526fe5a4b67410a557201717ee2a385eb
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date: Mon Dec 14 01:52:18 2009 +0200
s4-tort: Move Schema tests from ldap.py into separate module
Signed-off-by: Andrew Tridgell <tridge at samba.org>
commit d9606d64ddad4e593b02310b392cd11ff4114aa1
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date: Fri Dec 18 03:53:13 2009 +0200
s4-drs: Fix bug - prefixMap is not updated when adding new OIDs.
The bug is that prefixMap is updated only memory when
adding new Classs/Attribute that has and OID not in
prefixMap already.
Signed-off-by: Andrew Tridgell <tridge at samba.org>
commit 03a1451bbc663a4dbb102d5e150b92acbe7f9599
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date: Fri Dec 4 03:58:59 2009 +0200
s4-drstest: Don't remove temp LDB so it can be reviewed if necessary
This test makes temp directory which is not removed
so why not just leave LDB also.
Signed-off-by: Andrew Tridgell <tridge at samba.org>
commit 452fc0d6f44eea0876c3671400d8a8713d00ddce
Author: Andrew Tridgell <tridge at samba.org>
Date: Mon Dec 21 20:58:09 2009 +1100
s4-repl: give a reason why the prepare commit failed
commit 92d75a4bfb1d666950f39aba19fcc4d97c2234ad
Author: Andrew Tridgell <tridge at samba.org>
Date: Mon Dec 21 20:57:21 2009 +1100
s4-kcc: don't crash with a NULL ntds connection list
commit 60acce584bf75c54c71813c93b6c607ef32c867d
Author: Andrew Tridgell <tridge at samba.org>
Date: Sun Dec 20 11:06:23 2009 +1100
s4-repl: only try to replicate for NCs that we are a master for
commit 87f28cc2671cf0211b0f1b286b719c5baf9e8111
Author: Andrew Tridgell <tridge at samba.org>
Date: Sun Dec 20 10:27:17 2009 +1100
s4-torture: another unsigned comparison bug
commit ec74ffa8f08d85c55ec7fc592101a21340b9a97d
Author: Andrew Tridgell <tridge at samba.org>
Date: Sun Dec 20 10:26:21 2009 +1100
s4-schema: a unsigned comparison bug in the schema code
commit d3708109a141f5d6468a89e35176cb56e7a8d821
Author: Andrew Tridgell <tridge at samba.org>
Date: Sun Dec 20 10:26:06 2009 +1100
s4-drs: another two unsigned comparison bugs
commit a106fefcfb0cb60ce439884d8cd0c920d2fb193a
Author: Andrew Tridgell <tridge at samba.org>
Date: Sun Dec 20 10:25:46 2009 +1100
librpc: fixed the GUID_compare() function
When comparing two unsigned values you can't just subtract
them.
Imagine you are comparing: "uint32_t u1" and "uint32_t u2". If you use
"u1 - u2" and u2 is zero, then the signed integer result will depend
on the top bit of u1.
This error occurs in a few places in Samba. For DRS replication it
resulted in corrupt uptodateness vectors.
commit 2a4a159a8443ebaae53f5902a0f5c1f8536a6edd
Author: Andrew Tridgell <tridge at samba.org>
Date: Sat Dec 19 23:32:48 2009 +1100
s4-repl: lower debug level of a common message
commit 47560bfda9932efa6b225a223aba662a4d72e637
Author: Andrew Tridgell <tridge at samba.org>
Date: Sat Dec 19 20:58:00 2009 +1100
s4-dsdb: don't use a non-constant format string for a printf format
commit a070119de34274e6122461d9cc0e9829b5fb6865
Author: Andrew Tridgell <tridge at samba.org>
Date: Sat Dec 19 20:56:41 2009 +1100
s4-dsdb: added DSDB_MODIFY_RELAX flag to the dsdb_module_*() calls
commit 9d56f656d4f593289340a876445785cdfefd3d91
Author: Andrew Tridgell <tridge at samba.org>
Date: Sat Dec 19 12:23:42 2009 +1100
s4-dsdb: added dsdb_get_extended_dn_uint64()
commit e89a2db4f24ee70c45e0636e9baa8b6212a27cde
Author: Andrew Tridgell <tridge at samba.org>
Date: Fri Dec 18 20:55:23 2009 +1100
s4-dsdb: use varargs expression in dsdb_module_search()
Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>
commit 2c88ffb8f1f3691d29a88ab263dde5b07f4f400a
Author: Andrew Tridgell <tridge at samba.org>
Date: Fri Dec 18 20:54:23 2009 +1100
s4-dsdb: added two new dsdb_get_extended_dn_*() helper functions
Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>
commit dbda2c2db5a3c0c39134fde1ae58ceadf473a87f
Author: Andrew Tridgell <tridge at samba.org>
Date: Fri Dec 18 14:45:58 2009 +1100
s4-provision: added a note about where invocationIDs come from
Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>
commit 882768c8785995acccbdf562be99a68fc0dde33b
Author: Andrew Tridgell <tridge at samba.org>
Date: Fri Dec 18 13:47:46 2009 +1100
s4-dsdb: give us an invocationID when in standalone mode
To allow us to use the repl_meta_data module in standalone mode (and
thus not have two module stacks to test), we need a invocationID
stored somewhere when standalone. This creates a random one, and
stores it in @SAMBA_DSDB.
Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>
-----------------------------------------------------------------------
Summary of changes:
librpc/ndr/uuid.c | 10 +-
source4/dsdb/common/util.c | 126 ++++++
source4/dsdb/kcc/kcc_connection.c | 6 +-
source4/dsdb/repl/drepl_notify.c | 2 +-
source4/dsdb/repl/drepl_partitions.c | 7 +-
source4/dsdb/repl/replicated_objects.c | 20 +-
source4/dsdb/samdb/ldb_modules/acl.c | 24 +-
source4/dsdb/samdb/ldb_modules/repl_meta_data.c | 8 +-
source4/dsdb/samdb/ldb_modules/samba_dsdb.c | 80 ++++-
source4/dsdb/samdb/ldb_modules/schema_data.c | 175 ++++++++-
source4/dsdb/samdb/ldb_modules/util.c | 28 +-
source4/dsdb/samdb/ldb_modules/util.h | 1 +
source4/dsdb/schema/prefixmap.h | 11 +
source4/dsdb/schema/schema_init.c | 23 +-
source4/dsdb/schema/schema_prefixmap.c | 24 ++
source4/dsdb/schema/schema_query.c | 3 +-
source4/dsdb/schema/schema_set.c | 12 +-
source4/lib/ldb/tests/python/ldap.py | 133 ------
source4/lib/ldb/tests/python/ldap_schema.py | 500 +++++++++++++++++++++++
source4/scripting/python/samba/provision.py | 2 +
source4/selftest/tests.sh | 1 +
source4/torture/drs/unit/prefixmap_tests.c | 45 ++-
source4/torture/ndr/ndr.c | 13 +-
source4/torture/raw/qfileinfo.c | 2 +-
24 files changed, 1038 insertions(+), 218 deletions(-)
create mode 100755 source4/lib/ldb/tests/python/ldap_schema.py
Changeset truncated at 500 lines:
diff --git a/librpc/ndr/uuid.c b/librpc/ndr/uuid.c
index 429a1b1..1899afb 100644
--- a/librpc/ndr/uuid.c
+++ b/librpc/ndr/uuid.c
@@ -241,23 +241,23 @@ _PUBLIC_ bool GUID_equal(const struct GUID *u1, const struct GUID *u2)
_PUBLIC_ int GUID_compare(const struct GUID *u1, const struct GUID *u2)
{
if (u1->time_low != u2->time_low) {
- return u1->time_low - u2->time_low;
+ return u1->time_low > u2->time_low ? 1 : -1;
}
if (u1->time_mid != u2->time_mid) {
- return u1->time_mid - u2->time_mid;
+ return u1->time_mid > u2->time_mid ? 1 : -1;
}
if (u1->time_hi_and_version != u2->time_hi_and_version) {
- return u1->time_hi_and_version - u2->time_hi_and_version;
+ return u1->time_hi_and_version > u2->time_hi_and_version ? 1 : -1;
}
if (u1->clock_seq[0] != u2->clock_seq[0]) {
- return u1->clock_seq[0] - u2->clock_seq[0];
+ return u1->clock_seq[0] > u2->clock_seq[0] ? 1 : -1;
}
if (u1->clock_seq[1] != u2->clock_seq[1]) {
- return u1->clock_seq[1] - u2->clock_seq[1];
+ return u1->clock_seq[1] > u2->clock_seq[1] ? 1 : -1;
}
return memcmp(u1->node, u2->node, 6);
diff --git a/source4/dsdb/common/util.c b/source4/dsdb/common/util.c
index 61d065b..561edff 100644
--- a/source4/dsdb/common/util.c
+++ b/source4/dsdb/common/util.c
@@ -997,6 +997,81 @@ int samdb_replace(struct ldb_context *sam_ldb, TALLOC_CTX *mem_ctx, struct ldb_m
}
/*
+ * Handle ldb_request in transaction
+ */
+static int dsdb_autotransaction_request(struct ldb_context *sam_ldb,
+ struct ldb_request *req)
+{
+ int ret;
+
+ ret = ldb_transaction_start(sam_ldb);
+ if (ret != LDB_SUCCESS) {
+ return ret;
+ }
+
+ ret = ldb_request(sam_ldb, req);
+ if (ret == LDB_SUCCESS) {
+ ret = ldb_wait(req->handle, LDB_WAIT_ALL);
+ }
+
+ if (ret == LDB_SUCCESS) {
+ return ldb_transaction_commit(sam_ldb);
+ }
+ ldb_transaction_cancel(sam_ldb);
+
+ return ret;
+}
+
+/*
+ * replace elements in a record using LDB_CONTROL_AS_SYSTEM
+ * used to skip access checks on operations
+ * that are performed by the system
+ */
+int samdb_replace_as_system(struct ldb_context *sam_ldb,
+ TALLOC_CTX *mem_ctx,
+ struct ldb_message *msg)
+{
+ int i;
+ int ldb_ret;
+ struct ldb_request *req = NULL;
+
+ /* mark all the message elements as LDB_FLAG_MOD_REPLACE */
+ for (i=0;i<msg->num_elements;i++) {
+ msg->elements[i].flags = LDB_FLAG_MOD_REPLACE;
+ }
+
+
+ ldb_ret = ldb_msg_sanity_check(sam_ldb, msg);
+ if (ldb_ret != LDB_SUCCESS) {
+ return ldb_ret;
+ }
+
+ ldb_ret = ldb_build_mod_req(&req, sam_ldb, mem_ctx,
+ msg,
+ NULL,
+ NULL,
+ ldb_op_default_callback,
+ NULL);
+
+ if (ldb_ret != LDB_SUCCESS) {
+ talloc_free(req);
+ return ldb_ret;
+ }
+
+ ldb_ret = ldb_request_add_control(req, LDB_CONTROL_AS_SYSTEM_OID, false, NULL);
+ if (ldb_ret != LDB_SUCCESS) {
+ talloc_free(req);
+ return ldb_ret;
+ }
+
+ /* do request and auto start a transaction */
+ ldb_ret = dsdb_autotransaction_request(sam_ldb, req);
+
+ talloc_free(req);
+ return ldb_ret;
+}
+
+/*
return a default security descriptor
*/
struct security_descriptor *samdb_default_security_descriptor(TALLOC_CTX *mem_ctx)
@@ -2735,6 +2810,57 @@ NTSTATUS dsdb_get_extended_dn_guid(struct ldb_dn *dn, struct GUID *guid)
}
/*
+ return a uint64_t from a extended DN structure
+ */
+NTSTATUS dsdb_get_extended_dn_uint64(struct ldb_dn *dn, uint64_t *val, const char *component_name)
+{
+ const struct ldb_val *v;
+ char *s;
+
+ v = ldb_dn_get_extended_component(dn, component_name);
+ if (v == NULL) {
+ return NT_STATUS_OBJECT_NAME_NOT_FOUND;
+ }
+ s = talloc_strndup(dn, (const char *)v->data, v->length);
+ NT_STATUS_HAVE_NO_MEMORY(s);
+
+ *val = strtoull(s, NULL, 0);
+
+ talloc_free(s);
+ return NT_STATUS_OK;
+}
+
+/*
+ return a NTTIME from a extended DN structure
+ */
+NTSTATUS dsdb_get_extended_dn_nttime(struct ldb_dn *dn, NTTIME *nttime, const char *component_name)
+{
+ return dsdb_get_extended_dn_uint64(dn, nttime, component_name);
+}
+
+/*
+ return a uint32_t from a extended DN structure
+ */
+NTSTATUS dsdb_get_extended_dn_uint32(struct ldb_dn *dn, uint32_t *val, const char *component_name)
+{
+ const struct ldb_val *v;
+ char *s;
+
+ v = ldb_dn_get_extended_component(dn, component_name);
+ if (v == NULL) {
+ return NT_STATUS_OBJECT_NAME_NOT_FOUND;
+ }
+
+ s = talloc_strndup(dn, (const char *)v->data, v->length);
+ NT_STATUS_HAVE_NO_MEMORY(s);
+
+ *val = strtoul(s, NULL, 0);
+
+ talloc_free(s);
+ return NT_STATUS_OK;
+}
+
+/*
return true if a ldb_val containing a DN in storage form is deleted
*/
bool dsdb_dn_is_deleted_val(struct ldb_val *val)
diff --git a/source4/dsdb/kcc/kcc_connection.c b/source4/dsdb/kcc/kcc_connection.c
index ee9a05a..7319804 100644
--- a/source4/dsdb/kcc/kcc_connection.c
+++ b/source4/dsdb/kcc/kcc_connection.c
@@ -133,7 +133,7 @@ void kccsrv_apply_connections(struct kccsrv_service *s,
{
int i, j, deleted = 0, added = 0, ret;
- for (i = 0; i < ntds_list->count; i++) {
+ for (i = 0; ntds_list && i < ntds_list->count; i++) {
struct kcc_connection *ntds = &ntds_list->servers[i];
for (j = 0; j < dsa_list->count; j++) {
struct kcc_connection *dsa = &dsa_list->servers[j];
@@ -152,13 +152,13 @@ void kccsrv_apply_connections(struct kccsrv_service *s,
for (i = 0; i < dsa_list->count; i++) {
struct kcc_connection *dsa = &dsa_list->servers[i];
- for (j = 0; j < ntds_list->count; j++) {
+ for (j = 0; ntds_list && j < ntds_list->count; j++) {
struct kcc_connection *ntds = &ntds_list->servers[j];
if (GUID_equal(&dsa->dsa_guid, &ntds->dsa_guid)) {
break;
}
}
- if (j == ntds_list->count) {
+ if (ntds_list == NULL || j == ntds_list->count) {
ret = kccsrv_add_connection(s, dsa);
if (ret == LDB_SUCCESS) {
added++;
diff --git a/source4/dsdb/repl/drepl_notify.c b/source4/dsdb/repl/drepl_notify.c
index e8652dc..fe3b2d2 100644
--- a/source4/dsdb/repl/drepl_notify.c
+++ b/source4/dsdb/repl/drepl_notify.c
@@ -404,7 +404,7 @@ WERROR dreplsrv_notify_schedule(struct dreplsrv_service *service, uint32_t next_
W_ERROR_HAVE_NO_MEMORY(new_te);
tmp_mem = talloc_new(service);
- DEBUG(2,("dreplsrv_notify_schedule(%u) %sscheduled for: %s\n",
+ DEBUG(4,("dreplsrv_notify_schedule(%u) %sscheduled for: %s\n",
next_interval,
(service->notify.te?"re":""),
nt_time_string(tmp_mem, timeval_to_nttime(&next_time))));
diff --git a/source4/dsdb/repl/drepl_partitions.c b/source4/dsdb/repl/drepl_partitions.c
index 85412a7..5b8227e 100644
--- a/source4/dsdb/repl/drepl_partitions.c
+++ b/source4/dsdb/repl/drepl_partitions.c
@@ -39,16 +39,15 @@ WERROR dreplsrv_load_partitions(struct dreplsrv_service *s)
struct ldb_dn *basedn;
struct ldb_result *r;
struct ldb_message_element *el;
- static const char *attrs[] = { "namingContexts", NULL };
+ static const char *attrs[] = { "hasMasterNCs", NULL };
uint32_t i;
int ret;
- basedn = ldb_dn_new(s, s->samdb, NULL);
+ basedn = samdb_ntds_settings_dn(s->samdb);
W_ERROR_HAVE_NO_MEMORY(basedn);
ret = ldb_search(s->samdb, s, &r, basedn, LDB_SCOPE_BASE, attrs,
"(objectClass=*)");
- talloc_free(basedn);
if (ret != LDB_SUCCESS) {
return WERR_FOOBAR;
} else if (r->count != 1) {
@@ -56,7 +55,7 @@ WERROR dreplsrv_load_partitions(struct dreplsrv_service *s)
return WERR_FOOBAR;
}
- el = ldb_msg_find_element(r->msgs[0], "namingContexts");
+ el = ldb_msg_find_element(r->msgs[0], "hasMasterNCs");
if (!el) {
return WERR_FOOBAR;
}
diff --git a/source4/dsdb/repl/replicated_objects.c b/source4/dsdb/repl/replicated_objects.c
index 1efbd29..c72b107 100644
--- a/source4/dsdb/repl/replicated_objects.c
+++ b/source4/dsdb/repl/replicated_objects.c
@@ -128,15 +128,6 @@ static WERROR dsdb_convert_object_ex(struct ldb_context *ldb,
}
status = dsdb_attribute_drsuapi_to_ldb(ldb, schema, a, msg->elements, e);
- if (!NT_STATUS_IS_OK(status) && a->value_ctr.num_values == 0) {
- /* w2k8-r2 occasionally sends bogus empty
- attributes with rubbish attribute IDs. The
- only think we can do is discard these */
- DEBUG(0,(__location__ ": Discarding bogus empty DsReplicaAttribute with attid 0x%x\n",
- a->attid));
- ZERO_STRUCTP(e);
- continue;
- }
W_ERROR_NOT_OK_RETURN(status);
m->attid = a->attid;
@@ -157,14 +148,6 @@ static WERROR dsdb_convert_object_ex(struct ldb_context *ldb,
}
}
- /* delete any empty elements */
- for (i=0; i < msg->num_elements; i++) {
- if (msg->elements[i].name == NULL) {
- ldb_msg_remove_element(msg, &msg->elements[i]);
- i--;
- }
- }
-
if (rdn_m) {
struct ldb_message_element *el;
el = ldb_msg_find_element(msg, rdn_attr->lDAPDisplayName);
@@ -319,7 +302,8 @@ WERROR dsdb_extended_replicated_objects_commit(struct ldb_context *ldb,
ret = ldb_transaction_prepare_commit(ldb);
if (ret != LDB_SUCCESS) {
- DEBUG(0,(__location__ " Failed to prepare commit of transaction\n"));
+ DEBUG(0,(__location__ " Failed to prepare commit of transaction: %s\n",
+ ldb_errstring(ldb)));
return WERR_FOOBAR;
}
diff --git a/source4/dsdb/samdb/ldb_modules/acl.c b/source4/dsdb/samdb/ldb_modules/acl.c
index b70b895..a329836 100644
--- a/source4/dsdb/samdb/ldb_modules/acl.c
+++ b/source4/dsdb/samdb/ldb_modules/acl.c
@@ -447,8 +447,10 @@ static int acl_allowedAttributes(struct ldb_module *module,
if (ac->allowedAttributesEffective) {
struct security_descriptor *sd;
struct dom_sid *sid = NULL;
+ struct ldb_control *as_system = ldb_request_get_control(ac->req,
+ LDB_CONTROL_AS_SYSTEM_OID);
ldb_msg_remove_attr(msg, "allowedAttributesEffective");
- if (ac->user_type == SECURITY_SYSTEM) {
+ if (ac->user_type == SECURITY_SYSTEM || as_system) {
for (i=0; attr_list && attr_list[i]; i++) {
ldb_msg_add_string(msg, "allowedAttributesEffective", attr_list[i]);
}
@@ -559,10 +561,12 @@ static int acl_childClassesEffective(struct ldb_module *module,
const struct dsdb_schema *schema = dsdb_get_schema(ldb);
const struct dsdb_class *sclass;
struct security_descriptor *sd;
+ struct ldb_control *as_system = ldb_request_get_control(ac->req,
+ LDB_CONTROL_AS_SYSTEM_OID);
struct dom_sid *sid = NULL;
int i, j, ret;
- if (ac->user_type == SECURITY_SYSTEM) {
+ if (ac->user_type == SECURITY_SYSTEM || as_system) {
return acl_childClasses(module, sd_msg, msg, "allowedChildClassesEffective");
}
@@ -635,6 +639,8 @@ static int acl_sDRightsEffective(struct ldb_module *module,
struct ldb_message_element *rightsEffective;
int ret;
struct security_descriptor *sd;
+ struct ldb_control *as_system = ldb_request_get_control(ac->req,
+ LDB_CONTROL_AS_SYSTEM_OID);
struct dom_sid *sid = NULL;
uint32_t flags = 0;
@@ -644,7 +650,7 @@ static int acl_sDRightsEffective(struct ldb_module *module,
if (ret != LDB_SUCCESS) {
return ret;
}
- if (ac->user_type == SECURITY_SYSTEM) {
+ if (ac->user_type == SECURITY_SYSTEM || as_system) {
flags = SECINFO_OWNER | SECINFO_GROUP | SECINFO_SACL | SECINFO_DACL;
}
else {
@@ -699,8 +705,9 @@ static int acl_add(struct ldb_module *module, struct ldb_request *req)
const struct GUID *guid;
struct object_tree *root = NULL;
struct object_tree *new_node = NULL;
+ struct ldb_control *as_system = ldb_request_get_control(req, LDB_CONTROL_AS_SYSTEM_OID);
- if (what_is_user(module) == SECURITY_SYSTEM) {
+ if (what_is_user(module) == SECURITY_SYSTEM || as_system) {
return ldb_next_request(module, req);
}
@@ -752,6 +759,7 @@ static int acl_modify(struct ldb_module *module, struct ldb_request *req)
struct ldb_result *acl_res;
struct security_descriptor *sd;
struct dom_sid *sid = NULL;
+ struct ldb_control *as_system = ldb_request_get_control(req, LDB_CONTROL_AS_SYSTEM_OID);
TALLOC_CTX *tmp_ctx = talloc_new(req);
static const char *acl_attrs[] = {
"nTSecurityDescriptor",
@@ -765,7 +773,7 @@ static int acl_modify(struct ldb_module *module, struct ldb_request *req)
{
DEBUG(10, ("ldb:acl_modify: %s\n", req->op.mod.message->elements[0].name));
}
- if (what_is_user(module) == SECURITY_SYSTEM) {
+ if (what_is_user(module) == SECURITY_SYSTEM || as_system) {
return ldb_next_request(module, req);
}
if (ldb_dn_is_special(req->op.mod.message->dn)) {
@@ -890,9 +898,10 @@ static int acl_delete(struct ldb_module *module, struct ldb_request *req)
int ret;
struct ldb_dn *parent = ldb_dn_get_parent(req, req->op.del.dn);
struct ldb_context *ldb;
+ struct ldb_control *as_system = ldb_request_get_control(req, LDB_CONTROL_AS_SYSTEM_OID);
DEBUG(10, ("ldb:acl_delete: %s\n", ldb_dn_get_linearized(req->op.del.dn)));
- if (what_is_user(module) == SECURITY_SYSTEM) {
+ if (what_is_user(module) == SECURITY_SYSTEM || as_system) {
return ldb_next_request(module, req);
}
@@ -934,6 +943,7 @@ static int acl_rename(struct ldb_module *module, struct ldb_request *req)
const struct GUID *guid;
struct object_tree *root = NULL;
struct object_tree *new_node = NULL;
+ struct ldb_control *as_system = ldb_request_get_control(req, LDB_CONTROL_AS_SYSTEM_OID);
TALLOC_CTX *tmp_ctx = talloc_new(req);
NTSTATUS status;
uint32_t access_granted;
@@ -945,7 +955,7 @@ static int acl_rename(struct ldb_module *module, struct ldb_request *req)
};
DEBUG(10, ("ldb:acl_rename: %s\n", ldb_dn_get_linearized(req->op.rename.olddn)));
- if (what_is_user(module) == SECURITY_SYSTEM) {
+ if (what_is_user(module) == SECURITY_SYSTEM || as_system) {
return ldb_next_request(module, req);
}
if (ldb_dn_is_special(req->op.rename.olddn)) {
diff --git a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
index 3ae165c..3d31cc3 100644
--- a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
+++ b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
@@ -336,7 +336,7 @@ static int replmd_replPropertyMetaData1_attid_sort(const struct replPropertyMeta
return -1;
}
- return m1->attid - m2->attid;
+ return m1->attid > m2->attid ? 1 : -1;
}
static int replmd_replPropertyMetaDataCtr1_sort(struct replPropertyMetaDataCtr1 *ctr1,
@@ -390,8 +390,10 @@ static int replmd_ldb_message_element_attid_sort(const struct ldb_message_elemen
if (!a1 || !a2) {
return strcasecmp(e1->name, e2->name);
}
-
- return a1->attributeID_id - a2->attributeID_id;
+ if (a1->attributeID_id == a2->attributeID_id) {
+ return 0;
+ }
+ return a1->attributeID_id > a2->attributeID_id ? 1 : -1;
}
static void replmd_ldb_message_sort(struct ldb_message *msg,
diff --git a/source4/dsdb/samdb/ldb_modules/samba_dsdb.c b/source4/dsdb/samdb/ldb_modules/samba_dsdb.c
index ee7e42e..bfa2599 100644
--- a/source4/dsdb/samdb/ldb_modules/samba_dsdb.c
+++ b/source4/dsdb/samdb/ldb_modules/samba_dsdb.c
@@ -38,6 +38,7 @@
#include "dsdb/samdb/ldb_modules/util.h"
#include "dsdb/samdb/samdb.h"
+#include "librpc/ndr/libndr.h"
static int read_at_rootdse_record(struct ldb_context *ldb, struct ldb_module *module, TALLOC_CTX *mem_ctx,
struct ldb_message **msg)
@@ -135,6 +136,55 @@ static int prepare_modules_line(struct ldb_context *ldb,
return ret;
}
+
+
+/*
+ initialise the invocationID for a standalone server
+ */
+static int initialise_invocation_id(struct ldb_module *module, struct GUID *guid)
+{
+ struct ldb_message *msg;
+ struct ldb_context *ldb = ldb_module_get_ctx(module);
+ int ret;
+
+ *guid = GUID_random();
+
+ msg = ldb_msg_new(module);
+ if (msg == NULL) {
+ ldb_module_oom(module);
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
+ msg->dn = ldb_dn_new(msg, ldb, "@SAMBA_DSDB");
+ if (!msg->dn) {
+ ldb_module_oom(module);
+ talloc_free(msg);
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
+ ret = dsdb_msg_add_guid(msg, guid, "invocationID");
+ if (ret != LDB_SUCCESS) {
+ ldb_module_oom(module);
+ talloc_free(msg);
+ return ret;
+ }
+ msg->elements[0].flags = LDB_FLAG_MOD_ADD;
+
+ ret = ldb_modify(ldb, msg);
+ if (ret != LDB_SUCCESS) {
+ ldb_asprintf_errstring(ldb, "Failed to setup standalone invocationID - %s",
+ ldb_errstring(ldb));
+ talloc_free(msg);
+ return ret;
+ }
+
+ DEBUG(1,("Initialised standalone invocationID to %s\n",
+ GUID_string(msg, guid)));
+
+ talloc_free(msg);
+
+ return LDB_SUCCESS;
+}
+
+
static int samba_dsdb_init(struct ldb_module *module)
{
struct ldb_context *ldb = ldb_module_get_ctx(module);
@@ -213,7 +263,7 @@ static int samba_dsdb_init(struct ldb_module *module)
static const char *openldap_backend_modules[] = {
"entryuuid", "paged_searches", NULL };
- static const char *samba_dsdb_attrs[] = { "backendType", "serverRole", NULL };
--
Samba Shared Repository
More information about the samba-cvs
mailing list