The branch, master has been updated via ee73608... s4-kcc: added DsReplicaGetInfo pending ops call via 84b47d3... s4-provision: added w2k8r2 ldap capabilities via 637d50b... s4-devel: added rebuild_zone.sh via a9808ae... s4-provision: added "check-names ignore;" to allow for _msdcs A records via 473345f... s4-kcc: added DsReplicaGetInfo CURSORS2 level via 93531a5... s4-idl: in DsReplicaGetInfo unknown2 is actually an enumeration_context via c22973d... s4-kcc: added support for CURSORS info level in DsReplicaGetInfo via 8342d08... s4-dsdb: take advantage of local cursor and sort via db7eba7... s4-dsdb: add our local cursor and sort in dsdb_load_udv_*() via 0bba440... s4-drs: use dsdb_load_udv_v2() in getncchanges code via 09d947f... s4-dsdb: use dsdb_load_udv_v2() in repl task via 4cef742... s4-dsdb: added dsdb_load_udv_v2() and dsdb_load_udv_v1() via 3ff3612... s4-kcc: simplify the ReplicaGetInfo implementation a bit via 900fea3... s4-kcc: squash a warning via 3a9b33b... s4-drs: better debug info when security checks fail via 5efff3a... s4-dsdb: require admin access for DsReplicaGetInfo via 5bfeed8... s4-drs: framework for DsGetReplInfo(), includes the DS_REPL_INFO_NEIGHBORS infoType. via 22d9215... s4-drs: give better debug info on unsupported DRS calls via 48bdf3e... s4-drs: torture test for DsGetReplInfo() (RPC-DSGETINFO test). via 51bf383... s4-dsdb: added isGlobalCatalogReady from f85b6ee... Second part of bug 7045 - Bad (non memory copying) interfaces in smbc_setXXXX calls.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit ee736083c07e953a5fee944d3e048e2a38f98b30 Author: Andrew Tridgell <tri...@samba.org> Date: Sat Jan 16 13:40:51 2010 +1100 s4-kcc: added DsReplicaGetInfo pending ops call Just return 0 pending ops for now commit 84b47d33349ff12fa5951f3348db20a05879f614 Author: Andrew Tridgell <tri...@samba.org> Date: Sat Jan 16 13:20:46 2010 +1100 s4-provision: added w2k8r2 ldap capabilities commit 637d50b5d0eedced7c2cac6b0605a6c52eec2050 Author: Andrew Tridgell <tri...@samba.org> Date: Sat Jan 16 13:20:24 2010 +1100 s4-devel: added rebuild_zone.sh This rebuilds a DNS zone file, including all DCs from sam.ldb commit a9808ae83da936a2b93c9b8400ad2283a843ab4b Author: Andrew Tridgell <tri...@samba.org> Date: Sat Jan 16 13:19:50 2010 +1100 s4-provision: added "check-names ignore;" to allow for _msdcs A records commit 473345f8003a89a365a80963c24cb90d932c4e31 Author: Andrew Tridgell <tri...@samba.org> Date: Sat Jan 16 12:10:40 2010 +1100 s4-kcc: added DsReplicaGetInfo CURSORS2 level commit 93531a52f030cad7d4237d7813fa1d73d641b35a Author: Andrew Tridgell <tri...@samba.org> Date: Sat Jan 16 12:03:01 2010 +1100 s4-idl: in DsReplicaGetInfo unknown2 is actually an enumeration_context commit c22973d88dbfb46e5c387ff03b7bb66bada7cac3 Author: Andrew Tridgell <tri...@samba.org> Date: Sat Jan 16 11:49:39 2010 +1100 s4-kcc: added support for CURSORS info level in DsReplicaGetInfo commit 8342d08f5c3ffd02f54c5d5ace9e76cf551acb51 Author: Andrew Tridgell <tri...@samba.org> Date: Sat Jan 16 11:49:09 2010 +1100 s4-dsdb: take advantage of local cursor and sort in getncchanges and repl task we don't need the extra load and sort any more. commit db7eba7080e3f60da6751d638a31eaf3e36c9b12 Author: Andrew Tridgell <tri...@samba.org> Date: Sat Jan 16 11:48:25 2010 +1100 s4-dsdb: add our local cursor and sort in dsdb_load_udv_*() This makes things much simpler for the callers commit 0bba44094af9a1d88e0c2443d382993f1ebfb91e Author: Andrew Tridgell <tri...@samba.org> Date: Sat Jan 16 11:08:59 2010 +1100 s4-drs: use dsdb_load_udv_v2() in getncchanges code commit 09d947f77cda4eb62c21cfd7acd539b8fe305a6a Author: Andrew Tridgell <tri...@samba.org> Date: Sat Jan 16 11:08:44 2010 +1100 s4-dsdb: use dsdb_load_udv_v2() in repl task commit 4cef7427ec22df1a5c16a22820952f2f963dc1e3 Author: Andrew Tridgell <tri...@samba.org> Date: Sat Jan 16 11:08:15 2010 +1100 s4-dsdb: added dsdb_load_udv_v2() and dsdb_load_udv_v1() commit 3ff3612e29c16d7f3d87e06e6327d6b5bf530e2c Author: Andrew Tridgell <tri...@samba.org> Date: Sat Jan 16 10:37:26 2010 +1100 s4-kcc: simplify the ReplicaGetInfo implementation a bit commit 900fea322cabaa279e016508c688107415ed0796 Author: Andrew Tridgell <tri...@samba.org> Date: Sat Jan 16 10:36:56 2010 +1100 s4-kcc: squash a warning commit 3a9b33b4876349165e7e16777fa283b128d525be Author: Andrew Tridgell <tri...@samba.org> Date: Sat Jan 16 10:36:40 2010 +1100 s4-drs: better debug info when security checks fail show the security token of the user at debug level 2 commit 5efff3ad6a7fdfe71101b2debe7d79678432c5c4 Author: Andrew Tridgell <tri...@samba.org> Date: Sat Jan 16 10:36:06 2010 +1100 s4-dsdb: require admin access for DsReplicaGetInfo commit 5bfeed89da6177adf9dfa49471adcbc25c7d0e7a Author: Andrew Tridgell <tri...@samba.org> Date: Fri Jan 15 19:36:16 2010 +1100 s4-drs: framework for DsGetReplInfo(), includes the DS_REPL_INFO_NEIGHBORS infoType. This patch includes the framework for the implementation of all infoTypes of the DsGetReplInfo() call, and includes the implementation for the first one, the DS_REPL_INFO_NEIGHBORS. Signed-off-by: Andrew Tridgell <tri...@samba.org> commit 22d92157e35240b8b2f653a688dffd68a4b0e330 Author: Andrew Tridgell <tri...@samba.org> Date: Fri Jan 15 19:34:32 2010 +1100 s4-drs: give better debug info on unsupported DRS calls commit 48bdf3e608acf79926a7bc3acd9b0588216c7d64 Author: Erick Nogueira do Nascimento <erick.nogueira.nascime...@gmail.com> Date: Wed Dec 23 17:54:30 2009 -0200 s4-drs: torture test for DsGetReplInfo() (RPC-DSGETINFO test). Signed-off-by: Andrew Tridgell <tri...@samba.org> commit 51bf383c26cb3f867f376305c803dac04ff686a7 Author: Andrew Tridgell <tri...@samba.org> Date: Fri Jan 15 19:13:26 2010 +1100 s4-dsdb: added isGlobalCatalogReady needed for dcdiag.exe ----------------------------------------------------------------------- Summary of changes: librpc/gen_ndr/drsuapi.h | 14 +- librpc/gen_ndr/ndr_drsuapi.c | 42 +- librpc/idl/drsuapi.idl | 14 +- source4/dsdb/common/util.c | 128 +++++++ source4/dsdb/config.mk | 4 +- source4/dsdb/kcc/kcc_drs_replica_info.c | 549 +++++++++++++++++++++++++++ source4/dsdb/kcc/kcc_service.c | 10 +- source4/dsdb/kcc/kcc_service.h | 2 + source4/dsdb/repl/drepl_partitions.c | 66 +--- source4/dsdb/samdb/ldb_modules/rootdse.c | 12 + source4/rpc_server/drsuapi/dcesrv_drsuapi.c | 46 ++- source4/rpc_server/drsuapi/drsutil.c | 11 +- source4/rpc_server/drsuapi/getncchanges.c | 93 +---- source4/scripting/devel/rebuild_zone.sh | 107 ++++++ source4/setup/named.conf | 3 + source4/setup/provision_rootdse_add.ldif | 2 + source4/torture/config.mk | 2 +- source4/torture/rpc/dsgetinfo.c | 350 +++++++++++++++++ source4/torture/rpc/rpc.c | 1 + 19 files changed, 1251 insertions(+), 205 deletions(-) create mode 100644 source4/dsdb/kcc/kcc_drs_replica_info.c create mode 100755 source4/scripting/devel/rebuild_zone.sh create mode 100644 source4/torture/rpc/dsgetinfo.c Changeset truncated at 500 lines: diff --git a/librpc/gen_ndr/drsuapi.h b/librpc/gen_ndr/drsuapi.h index 6cc62a8..a440b7a 100644 --- a/librpc/gen_ndr/drsuapi.h +++ b/librpc/gen_ndr/drsuapi.h @@ -1295,10 +1295,10 @@ struct drsuapi_DsReplicaGetInfoRequest2 { enum drsuapi_DsReplicaInfoType info_type; const char *object_dn;/* [unique,charset(UTF16)] */ struct GUID guid1; - uint32_t unknown1; + uint32_t flags; const char *string1;/* [unique,charset(UTF16)] */ const char *string2;/* [unique,charset(UTF16)] */ - uint32_t unknown2; + uint32_t enumeration_context; }; union drsuapi_DsReplicaGetInfoRequest { @@ -1420,13 +1420,13 @@ struct drsuapi_DsReplicaAttrValMetaData { struct drsuapi_DsReplicaAttrValMetaDataCtr { uint32_t count; - int32_t enumeration_context; + uint32_t enumeration_context; struct drsuapi_DsReplicaAttrValMetaData *array;/* [size_is(count)] */ }; struct drsuapi_DsReplicaCursor2Ctr { uint32_t count; - int32_t enumeration_context; + uint32_t enumeration_context; struct drsuapi_DsReplicaCursor2 *array;/* [size_is(count)] */ }; @@ -1439,7 +1439,7 @@ struct drsuapi_DsReplicaCursor3 { struct drsuapi_DsReplicaCursor3Ctr { uint32_t count; - int32_t enumeration_context; + uint32_t enumeration_context; struct drsuapi_DsReplicaCursor3 *array;/* [size_is(count)] */ }; @@ -1455,7 +1455,7 @@ struct drsuapi_DsReplicaObjMetaData2 { struct drsuapi_DsReplicaObjMetaData2Ctr { uint32_t count; - int32_t enumeration_context; + uint32_t enumeration_context; struct drsuapi_DsReplicaObjMetaData2 *array;/* [size_is(count)] */ }; @@ -1476,7 +1476,7 @@ struct drsuapi_DsReplicaAttrValMetaData2 { struct drsuapi_DsReplicaAttrValMetaData2Ctr { uint32_t count; - int32_t enumeration_context; + uint32_t enumeration_context; struct drsuapi_DsReplicaAttrValMetaData2 *array;/* [size_is(count)] */ }; diff --git a/librpc/gen_ndr/ndr_drsuapi.c b/librpc/gen_ndr/ndr_drsuapi.c index 3b8ac3d..f18b9aa 100644 --- a/librpc/gen_ndr/ndr_drsuapi.c +++ b/librpc/gen_ndr/ndr_drsuapi.c @@ -9708,10 +9708,10 @@ static enum ndr_err_code ndr_push_drsuapi_DsReplicaGetInfoRequest2(struct ndr_pu NDR_CHECK(ndr_push_drsuapi_DsReplicaInfoType(ndr, NDR_SCALARS, r->info_type)); NDR_CHECK(ndr_push_unique_ptr(ndr, r->object_dn)); NDR_CHECK(ndr_push_GUID(ndr, NDR_SCALARS, &r->guid1)); - NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown1)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->flags)); NDR_CHECK(ndr_push_unique_ptr(ndr, r->string1)); NDR_CHECK(ndr_push_unique_ptr(ndr, r->string2)); - NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown2)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->enumeration_context)); NDR_CHECK(ndr_push_trailer_align(ndr, 5)); } if (ndr_flags & NDR_BUFFERS) { @@ -9755,7 +9755,7 @@ static enum ndr_err_code ndr_pull_drsuapi_DsReplicaGetInfoRequest2(struct ndr_pu r->object_dn = NULL; } NDR_CHECK(ndr_pull_GUID(ndr, NDR_SCALARS, &r->guid1)); - NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown1)); + NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->flags)); NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_string1)); if (_ptr_string1) { NDR_PULL_ALLOC(ndr, r->string1); @@ -9768,7 +9768,7 @@ static enum ndr_err_code ndr_pull_drsuapi_DsReplicaGetInfoRequest2(struct ndr_pu } else { r->string2 = NULL; } - NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown2)); + NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->enumeration_context)); NDR_CHECK(ndr_pull_trailer_align(ndr, 5)); } if (ndr_flags & NDR_BUFFERS) { @@ -9824,7 +9824,7 @@ _PUBLIC_ void ndr_print_drsuapi_DsReplicaGetInfoRequest2(struct ndr_print *ndr, } ndr->depth--; ndr_print_GUID(ndr, "guid1", &r->guid1); - ndr_print_uint32(ndr, "unknown1", r->unknown1); + ndr_print_uint32(ndr, "flags", r->flags); ndr_print_ptr(ndr, "string1", r->string1); ndr->depth++; if (r->string1) { @@ -9837,7 +9837,7 @@ _PUBLIC_ void ndr_print_drsuapi_DsReplicaGetInfoRequest2(struct ndr_print *ndr, ndr_print_string(ndr, "string2", r->string2); } ndr->depth--; - ndr_print_uint32(ndr, "unknown2", r->unknown2); + ndr_print_uint32(ndr, "enumeration_context", r->enumeration_context); ndr->depth--; } @@ -10969,7 +10969,7 @@ static enum ndr_err_code ndr_push_drsuapi_DsReplicaAttrValMetaDataCtr(struct ndr NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->count)); NDR_CHECK(ndr_push_align(ndr, 8)); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count)); - NDR_CHECK(ndr_push_int32(ndr, NDR_SCALARS, r->enumeration_context)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->enumeration_context)); for (cntr_array_0 = 0; cntr_array_0 < r->count; cntr_array_0++) { NDR_CHECK(ndr_push_drsuapi_DsReplicaAttrValMetaData(ndr, NDR_SCALARS, &r->array[cntr_array_0])); } @@ -10991,7 +10991,7 @@ static enum ndr_err_code ndr_pull_drsuapi_DsReplicaAttrValMetaDataCtr(struct ndr NDR_CHECK(ndr_pull_array_size(ndr, &r->array)); NDR_CHECK(ndr_pull_align(ndr, 8)); NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count)); - NDR_CHECK(ndr_pull_int32(ndr, NDR_SCALARS, &r->enumeration_context)); + NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->enumeration_context)); NDR_PULL_ALLOC_N(ndr, r->array, ndr_get_array_size(ndr, &r->array)); _mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr); NDR_PULL_SET_MEM_CTX(ndr, r->array, 0); @@ -11021,7 +11021,7 @@ _PUBLIC_ void ndr_print_drsuapi_DsReplicaAttrValMetaDataCtr(struct ndr_print *nd ndr_print_struct(ndr, name, "drsuapi_DsReplicaAttrValMetaDataCtr"); ndr->depth++; ndr_print_uint32(ndr, "count", r->count); - ndr_print_int32(ndr, "enumeration_context", r->enumeration_context); + ndr_print_uint32(ndr, "enumeration_context", r->enumeration_context); ndr->print(ndr, "%s: ARRAY(%d)", "array", (int)r->count); ndr->depth++; for (cntr_array_0=0;cntr_array_0<r->count;cntr_array_0++) { @@ -11042,7 +11042,7 @@ static enum ndr_err_code ndr_push_drsuapi_DsReplicaCursor2Ctr(struct ndr_push *n NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->count)); NDR_CHECK(ndr_push_align(ndr, 8)); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count)); - NDR_CHECK(ndr_push_int32(ndr, NDR_SCALARS, r->enumeration_context)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->enumeration_context)); for (cntr_array_0 = 0; cntr_array_0 < r->count; cntr_array_0++) { NDR_CHECK(ndr_push_drsuapi_DsReplicaCursor2(ndr, NDR_SCALARS, &r->array[cntr_array_0])); } @@ -11061,7 +11061,7 @@ static enum ndr_err_code ndr_pull_drsuapi_DsReplicaCursor2Ctr(struct ndr_pull *n NDR_CHECK(ndr_pull_array_size(ndr, &r->array)); NDR_CHECK(ndr_pull_align(ndr, 8)); NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count)); - NDR_CHECK(ndr_pull_int32(ndr, NDR_SCALARS, &r->enumeration_context)); + NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->enumeration_context)); NDR_PULL_ALLOC_N(ndr, r->array, ndr_get_array_size(ndr, &r->array)); _mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr); NDR_PULL_SET_MEM_CTX(ndr, r->array, 0); @@ -11085,7 +11085,7 @@ _PUBLIC_ void ndr_print_drsuapi_DsReplicaCursor2Ctr(struct ndr_print *ndr, const ndr_print_struct(ndr, name, "drsuapi_DsReplicaCursor2Ctr"); ndr->depth++; ndr_print_uint32(ndr, "count", r->count); - ndr_print_int32(ndr, "enumeration_context", r->enumeration_context); + ndr_print_uint32(ndr, "enumeration_context", r->enumeration_context); ndr->print(ndr, "%s: ARRAY(%d)", "array", (int)r->count); ndr->depth++; for (cntr_array_0=0;cntr_array_0<r->count;cntr_array_0++) { @@ -11177,7 +11177,7 @@ static enum ndr_err_code ndr_push_drsuapi_DsReplicaCursor3Ctr(struct ndr_push *n NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->count)); NDR_CHECK(ndr_push_align(ndr, 8)); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count)); - NDR_CHECK(ndr_push_int32(ndr, NDR_SCALARS, r->enumeration_context)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->enumeration_context)); for (cntr_array_0 = 0; cntr_array_0 < r->count; cntr_array_0++) { NDR_CHECK(ndr_push_drsuapi_DsReplicaCursor3(ndr, NDR_SCALARS, &r->array[cntr_array_0])); } @@ -11199,7 +11199,7 @@ static enum ndr_err_code ndr_pull_drsuapi_DsReplicaCursor3Ctr(struct ndr_pull *n NDR_CHECK(ndr_pull_array_size(ndr, &r->array)); NDR_CHECK(ndr_pull_align(ndr, 8)); NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count)); - NDR_CHECK(ndr_pull_int32(ndr, NDR_SCALARS, &r->enumeration_context)); + NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->enumeration_context)); NDR_PULL_ALLOC_N(ndr, r->array, ndr_get_array_size(ndr, &r->array)); _mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr); NDR_PULL_SET_MEM_CTX(ndr, r->array, 0); @@ -11229,7 +11229,7 @@ _PUBLIC_ void ndr_print_drsuapi_DsReplicaCursor3Ctr(struct ndr_print *ndr, const ndr_print_struct(ndr, name, "drsuapi_DsReplicaCursor3Ctr"); ndr->depth++; ndr_print_uint32(ndr, "count", r->count); - ndr_print_int32(ndr, "enumeration_context", r->enumeration_context); + ndr_print_uint32(ndr, "enumeration_context", r->enumeration_context); ndr->print(ndr, "%s: ARRAY(%d)", "array", (int)r->count); ndr->depth++; for (cntr_array_0=0;cntr_array_0<r->count;cntr_array_0++) { @@ -11360,7 +11360,7 @@ static enum ndr_err_code ndr_push_drsuapi_DsReplicaObjMetaData2Ctr(struct ndr_pu NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->count)); NDR_CHECK(ndr_push_align(ndr, 8)); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count)); - NDR_CHECK(ndr_push_int32(ndr, NDR_SCALARS, r->enumeration_context)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->enumeration_context)); for (cntr_array_0 = 0; cntr_array_0 < r->count; cntr_array_0++) { NDR_CHECK(ndr_push_drsuapi_DsReplicaObjMetaData2(ndr, NDR_SCALARS, &r->array[cntr_array_0])); } @@ -11382,7 +11382,7 @@ static enum ndr_err_code ndr_pull_drsuapi_DsReplicaObjMetaData2Ctr(struct ndr_pu NDR_CHECK(ndr_pull_array_size(ndr, &r->array)); NDR_CHECK(ndr_pull_align(ndr, 8)); NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count)); - NDR_CHECK(ndr_pull_int32(ndr, NDR_SCALARS, &r->enumeration_context)); + NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->enumeration_context)); NDR_PULL_ALLOC_N(ndr, r->array, ndr_get_array_size(ndr, &r->array)); _mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr); NDR_PULL_SET_MEM_CTX(ndr, r->array, 0); @@ -11412,7 +11412,7 @@ _PUBLIC_ void ndr_print_drsuapi_DsReplicaObjMetaData2Ctr(struct ndr_print *ndr, ndr_print_struct(ndr, name, "drsuapi_DsReplicaObjMetaData2Ctr"); ndr->depth++; ndr_print_uint32(ndr, "count", r->count); - ndr_print_int32(ndr, "enumeration_context", r->enumeration_context); + ndr_print_uint32(ndr, "enumeration_context", r->enumeration_context); ndr->print(ndr, "%s: ARRAY(%d)", "array", (int)r->count); ndr->depth++; for (cntr_array_0=0;cntr_array_0<r->count;cntr_array_0++) { @@ -11609,7 +11609,7 @@ static enum ndr_err_code ndr_push_drsuapi_DsReplicaAttrValMetaData2Ctr(struct nd NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->count)); NDR_CHECK(ndr_push_align(ndr, 8)); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count)); - NDR_CHECK(ndr_push_int32(ndr, NDR_SCALARS, r->enumeration_context)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->enumeration_context)); for (cntr_array_0 = 0; cntr_array_0 < r->count; cntr_array_0++) { NDR_CHECK(ndr_push_drsuapi_DsReplicaAttrValMetaData2(ndr, NDR_SCALARS, &r->array[cntr_array_0])); } @@ -11631,7 +11631,7 @@ static enum ndr_err_code ndr_pull_drsuapi_DsReplicaAttrValMetaData2Ctr(struct nd NDR_CHECK(ndr_pull_array_size(ndr, &r->array)); NDR_CHECK(ndr_pull_align(ndr, 8)); NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count)); - NDR_CHECK(ndr_pull_int32(ndr, NDR_SCALARS, &r->enumeration_context)); + NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->enumeration_context)); NDR_PULL_ALLOC_N(ndr, r->array, ndr_get_array_size(ndr, &r->array)); _mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr); NDR_PULL_SET_MEM_CTX(ndr, r->array, 0); @@ -11661,7 +11661,7 @@ _PUBLIC_ void ndr_print_drsuapi_DsReplicaAttrValMetaData2Ctr(struct ndr_print *n ndr_print_struct(ndr, name, "drsuapi_DsReplicaAttrValMetaData2Ctr"); ndr->depth++; ndr_print_uint32(ndr, "count", r->count); - ndr_print_int32(ndr, "enumeration_context", r->enumeration_context); + ndr_print_uint32(ndr, "enumeration_context", r->enumeration_context); ndr->print(ndr, "%s: ARRAY(%d)", "array", (int)r->count); ndr->depth++; for (cntr_array_0=0;cntr_array_0<r->count;cntr_array_0++) { diff --git a/librpc/idl/drsuapi.idl b/librpc/idl/drsuapi.idl index 9a9df03..b538b7c 100644 --- a/librpc/idl/drsuapi.idl +++ b/librpc/idl/drsuapi.idl @@ -1416,10 +1416,10 @@ interface drsuapi drsuapi_DsReplicaInfoType info_type; [charset(UTF16),string] uint16 *object_dn; GUID guid1; - uint32 unknown1; + uint32 flags; [charset(UTF16),string] uint16 *string1; [charset(UTF16),string] uint16 *string2; - uint32 unknown2; + uint32 enumeration_context; } drsuapi_DsReplicaGetInfoRequest2; typedef [switch_type(drsuapi_DsReplicaGetInfoLevel)] union { @@ -1530,13 +1530,13 @@ interface drsuapi typedef struct { uint32 count; - int32 enumeration_context; + uint32 enumeration_context; [size_is(count)] drsuapi_DsReplicaAttrValMetaData array[]; } drsuapi_DsReplicaAttrValMetaDataCtr; typedef struct { uint32 count; - int32 enumeration_context; + uint32 enumeration_context; [size_is(count)] drsuapi_DsReplicaCursor2 array[]; } drsuapi_DsReplicaCursor2Ctr; @@ -1549,7 +1549,7 @@ interface drsuapi typedef struct { uint32 count; - int32 enumeration_context; + uint32 enumeration_context; [size_is(count)] drsuapi_DsReplicaCursor3 array[]; } drsuapi_DsReplicaCursor3Ctr; @@ -1565,7 +1565,7 @@ interface drsuapi typedef struct { uint32 count; - int32 enumeration_context; + uint32 enumeration_context; [size_is(count)] drsuapi_DsReplicaObjMetaData2 array[]; } drsuapi_DsReplicaObjMetaData2Ctr; @@ -1586,7 +1586,7 @@ interface drsuapi typedef struct { uint32 count; - int32 enumeration_context; + uint32 enumeration_context; [size_is(count)] drsuapi_DsReplicaAttrValMetaData2 array[]; } drsuapi_DsReplicaAttrValMetaData2Ctr; diff --git a/source4/dsdb/common/util.c b/source4/dsdb/common/util.c index 5dcbbd8..b57d383 100644 --- a/source4/dsdb/common/util.c +++ b/source4/dsdb/common/util.c @@ -3237,3 +3237,131 @@ int samdb_ldb_val_case_cmp(const char *s, struct ldb_val *v) } return 0; } + + +/* + load the UDV for a partition in v2 format + The list is returned sorted, and with our local cursor added + */ +int dsdb_load_udv_v2(struct ldb_context *samdb, struct ldb_dn *dn, TALLOC_CTX *mem_ctx, + struct drsuapi_DsReplicaCursor2 **cursors, uint32_t *count) +{ + static const char *attrs[] = { "replUpToDateVector", NULL }; + struct ldb_result *r; + const struct ldb_val *ouv_value; + int ret, i; + uint64_t highest_usn; + const struct GUID *our_invocation_id; + struct timeval now = timeval_current(); + + ret = ldb_search(samdb, mem_ctx, &r, dn, LDB_SCOPE_BASE, attrs, NULL); + if (ret != LDB_SUCCESS) { + return ret; + } + + ouv_value = ldb_msg_find_ldb_val(r->msgs[0], "replUpToDateVector"); + if (ouv_value) { + enum ndr_err_code ndr_err; + struct replUpToDateVectorBlob ouv; + + ndr_err = ndr_pull_struct_blob(ouv_value, r, + lp_iconv_convenience(ldb_get_opaque(samdb, "loadparm")), &ouv, + (ndr_pull_flags_fn_t)ndr_pull_replUpToDateVectorBlob); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + talloc_free(r); + return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX; + } + if (ouv.version != 2) { + /* we always store as version 2, and + * replUpToDateVector is not replicated + */ + return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX; + } + + *count = ouv.ctr.ctr2.count; + *cursors = talloc_steal(mem_ctx, ouv.ctr.ctr2.cursors); + } else { + *count = 0; + *cursors = NULL; + } + + talloc_free(r); + + our_invocation_id = samdb_ntds_invocation_id(samdb); + if (!our_invocation_id) { + DEBUG(0,(__location__ ": No invocationID on samdb - %s\n", ldb_errstring(samdb))); + talloc_free(*cursors); + return LDB_ERR_OPERATIONS_ERROR; + } + + ret = dsdb_load_partition_usn(samdb, dn, &highest_usn, NULL); + if (ret != LDB_SUCCESS) { + /* nothing to add - this can happen after a vampire */ + qsort(*cursors, *count, + sizeof(struct drsuapi_DsReplicaCursor2), + (comparison_fn_t)drsuapi_DsReplicaCursor2_compare); + return LDB_SUCCESS; + } + + for (i=0; i<*count; i++) { + if (GUID_equal(our_invocation_id, &(*cursors)[i].source_dsa_invocation_id)) { + (*cursors)[i].highest_usn = highest_usn; + (*cursors)[i].last_sync_success = timeval_to_nttime(&now); + qsort(*cursors, *count, + sizeof(struct drsuapi_DsReplicaCursor2), + (comparison_fn_t)drsuapi_DsReplicaCursor2_compare); + return LDB_SUCCESS; + } + } + + (*cursors) = talloc_realloc(mem_ctx, *cursors, struct drsuapi_DsReplicaCursor2, (*count)+1); + if (! *cursors) { + return LDB_ERR_OPERATIONS_ERROR; + } + + (*cursors)[*count].source_dsa_invocation_id = *our_invocation_id; + (*cursors)[*count].highest_usn = highest_usn; + (*cursors)[*count].last_sync_success = timeval_to_nttime(&now); + (*count)++; + + qsort(*cursors, *count, + sizeof(struct drsuapi_DsReplicaCursor2), + (comparison_fn_t)drsuapi_DsReplicaCursor2_compare); + + return LDB_SUCCESS; +} + +/* + load the UDV for a partition in version 1 format + The list is returned sorted, and with our local cursor added + */ +int dsdb_load_udv_v1(struct ldb_context *samdb, struct ldb_dn *dn, TALLOC_CTX *mem_ctx, + struct drsuapi_DsReplicaCursor **cursors, uint32_t *count) +{ + struct drsuapi_DsReplicaCursor2 *v2; + int ret, i; + + ret = dsdb_load_udv_v2(samdb, dn, mem_ctx, &v2, count); + if (ret != LDB_SUCCESS) { + return ret; + } + + if (*count == 0) { + talloc_free(v2); + *cursors = NULL; + return LDB_SUCCESS; + } + + *cursors = talloc_array(mem_ctx, struct drsuapi_DsReplicaCursor, *count); + if (*cursors == NULL) { + talloc_free(v2); + return LDB_ERR_OPERATIONS_ERROR; + } + + for (i=0; i<*count; i++) { + (*cursors)[i].source_dsa_invocation_id = v2[i].source_dsa_invocation_id; + (*cursors)[i].highest_usn = v2[i].highest_usn; + } + talloc_free(v2); + return LDB_SUCCESS; +} diff --git a/source4/dsdb/config.mk b/source4/dsdb/config.mk index 3226c08..5ea31c3 100644 --- a/source4/dsdb/config.mk +++ b/source4/dsdb/config.mk @@ -85,6 +85,8 @@ KCC_SRV_OBJ_FILES = $(addprefix $(dsdbsrcdir)/kcc/, \ kcc_service.o \ kcc_connection.o \ kcc_deleted.o \ - kcc_periodic.o) + kcc_periodic.o \ + kcc_drs_replica_info.o) $(eval $(call proto_header_template,$(dsdbsrcdir)/kcc/kcc_service_proto.h,$(KCC_SRV_OBJ_FILES:.o=.c))) + diff --git a/source4/dsdb/kcc/kcc_drs_replica_info.c b/source4/dsdb/kcc/kcc_drs_replica_info.c new file mode 100644 index 0000000..8c18293 --- /dev/null +++ b/source4/dsdb/kcc/kcc_drs_replica_info.c @@ -0,0 +1,549 @@ +/* + Unix SMB/CIFS implementation. + + DRS Replica Information + + Copyright (C) Erick Nogueira do Nascimento 2009 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + */ + +#include "includes.h" +#include "dsdb/samdb/samdb.h" +#include "auth/auth.h" +#include "smbd/service.h" +#include "lib/events/events.h" +#include "lib/messaging/irpc.h" +#include "dsdb/kcc/kcc_service.h" +#include "lib/ldb/include/ldb_errors.h" +#include "../lib/util/dlinklist.h" +#include "librpc/gen_ndr/ndr_misc.h" +#include "librpc/gen_ndr/ndr_drsuapi.h" +#include "librpc/gen_ndr/ndr_drsblobs.h" +#include "param/param.h" + -- Samba Shared Repository