[SCM] Samba Shared Repository - branch v3-2-stable updated -
release-3-2-0pre3-94-g2b5a634
Karolin Seeger
kseeger at samba.org
Mon May 19 11:42:44 GMT 2008
The branch, v3-2-stable has been updated
via 2b5a6347ee56aa90df54ecfe94059d9247493beb (commit)
via 7228e43d507ded2767b568a1ca2bca6723e67c63 (commit)
via 9de1d270203222f032d1678d56a59197ae143486 (commit)
via 80dc3b1a224c6b133d50a571849ec79c589a0a53 (commit)
from b2530cb85291fe5417ff4b5f6189a006928fbe34 (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-stable
- Log -----------------------------------------------------------------
commit 2b5a6347ee56aa90df54ecfe94059d9247493beb
Author: Günther Deschner <gd at samba.org>
Date: Tue May 6 09:48:16 2008 +0200
build: fix the build w/o ldap.
Guenther
(cherry picked from commit a159ec5f1f3ec8e9232b8f3230a996a3f9986bc1)
commit 7228e43d507ded2767b568a1ca2bca6723e67c63
Author: Günther Deschner <gd at samba.org>
Date: Fri May 16 13:24:15 2008 +0200
Fix Bug #5461 and implement a very basic _samr_GetDisplayEnumerationIndex().
Citrix PM cannot use a Samba DC when having more then 900 groups as citrix
insists on calling _samr_GetDisplayEnumerationIndex() after receiving the first
900 groups via _samr_QueryDisplayInfo() to get the continuation index.
Guenther
(cherry picked from commit 1c4adc8dda68eae9839bdff843aadf8c98dd9e87)
commit 9de1d270203222f032d1678d56a59197ae143486
Author: Günther Deschner <gd at samba.org>
Date: Tue Apr 22 23:11:21 2008 +0200
IDL: rerun make idl.
Guenther
(cherry picked from commit c92b585cc42ba9f42727512c08c896ee40e5e319)
commit 80dc3b1a224c6b133d50a571849ec79c589a0a53
Author: Günther Deschner <gd at samba.org>
Date: Tue Apr 22 23:10:35 2008 +0200
IDL: Fix IDL for samr_GetDisplayEnumerationIndex{2}.
Guenther
(cherry picked from commit cb0b0fd2684b63257421aba599f9d2111c0438bf)
-----------------------------------------------------------------------
Summary of changes:
source/librpc/gen_ndr/cli_samr.c | 4 +-
source/librpc/gen_ndr/cli_samr.h | 4 +-
source/librpc/gen_ndr/ndr_samr.c | 38 ++++++++--
source/librpc/gen_ndr/samr.h | 4 +-
source/librpc/idl/samr.idl | 4 +-
source/libsmb/cliconnect.c | 4 +-
source/rpc_server/srv_samr_nt.c | 159 +++++++++++++++++++++++++++++++++-----
7 files changed, 182 insertions(+), 35 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source/librpc/gen_ndr/cli_samr.c b/source/librpc/gen_ndr/cli_samr.c
index bdc9837..cff548c 100644
--- a/source/librpc/gen_ndr/cli_samr.c
+++ b/source/librpc/gen_ndr/cli_samr.c
@@ -1821,7 +1821,7 @@ NTSTATUS rpccli_samr_GetDisplayEnumerationIndex(struct rpc_pipe_client *cli,
TALLOC_CTX *mem_ctx,
struct policy_handle *domain_handle /* [in] [ref] */,
uint16_t level /* [in] */,
- struct lsa_String name /* [in] */,
+ struct lsa_String *name /* [in] [ref] */,
uint32_t *idx /* [out] [ref] */)
{
struct samr_GetDisplayEnumerationIndex r;
@@ -2165,7 +2165,7 @@ NTSTATUS rpccli_samr_GetDisplayEnumerationIndex2(struct rpc_pipe_client *cli,
TALLOC_CTX *mem_ctx,
struct policy_handle *domain_handle /* [in] [ref] */,
uint16_t level /* [in] */,
- struct lsa_String name /* [in] */,
+ struct lsa_String *name /* [in] [ref] */,
uint32_t *idx /* [out] [ref] */)
{
struct samr_GetDisplayEnumerationIndex2 r;
diff --git a/source/librpc/gen_ndr/cli_samr.h b/source/librpc/gen_ndr/cli_samr.h
index 53cdbfa..4c7a30e 100644
--- a/source/librpc/gen_ndr/cli_samr.h
+++ b/source/librpc/gen_ndr/cli_samr.h
@@ -230,7 +230,7 @@ NTSTATUS rpccli_samr_GetDisplayEnumerationIndex(struct rpc_pipe_client *cli,
TALLOC_CTX *mem_ctx,
struct policy_handle *domain_handle /* [in] [ref] */,
uint16_t level /* [in] */,
- struct lsa_String name /* [in] */,
+ struct lsa_String *name /* [in] [ref] */,
uint32_t *idx /* [out] [ref] */);
NTSTATUS rpccli_samr_TestPrivateFunctionsDomain(struct rpc_pipe_client *cli,
TALLOC_CTX *mem_ctx,
@@ -270,7 +270,7 @@ NTSTATUS rpccli_samr_GetDisplayEnumerationIndex2(struct rpc_pipe_client *cli,
TALLOC_CTX *mem_ctx,
struct policy_handle *domain_handle /* [in] [ref] */,
uint16_t level /* [in] */,
- struct lsa_String name /* [in] */,
+ struct lsa_String *name /* [in] [ref] */,
uint32_t *idx /* [out] [ref] */);
NTSTATUS rpccli_samr_CreateUser2(struct rpc_pipe_client *cli,
TALLOC_CTX *mem_ctx,
diff --git a/source/librpc/gen_ndr/ndr_samr.c b/source/librpc/gen_ndr/ndr_samr.c
index db95ec3..c3f8bc6 100644
--- a/source/librpc/gen_ndr/ndr_samr.c
+++ b/source/librpc/gen_ndr/ndr_samr.c
@@ -9346,7 +9346,10 @@ static enum ndr_err_code ndr_push_samr_GetDisplayEnumerationIndex(struct ndr_pus
}
NDR_CHECK(ndr_push_policy_handle(ndr, NDR_SCALARS, r->in.domain_handle));
NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->in.level));
- NDR_CHECK(ndr_push_lsa_String(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.name));
+ if (r->in.name == NULL) {
+ return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+ }
+ NDR_CHECK(ndr_push_lsa_String(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.name));
}
if (flags & NDR_OUT) {
if (r->out.idx == NULL) {
@@ -9361,6 +9364,7 @@ static enum ndr_err_code ndr_push_samr_GetDisplayEnumerationIndex(struct ndr_pus
static enum ndr_err_code ndr_pull_samr_GetDisplayEnumerationIndex(struct ndr_pull *ndr, int flags, struct samr_GetDisplayEnumerationIndex *r)
{
TALLOC_CTX *_mem_save_domain_handle_0;
+ TALLOC_CTX *_mem_save_name_0;
TALLOC_CTX *_mem_save_idx_0;
if (flags & NDR_IN) {
ZERO_STRUCT(r->out);
@@ -9373,7 +9377,13 @@ static enum ndr_err_code ndr_pull_samr_GetDisplayEnumerationIndex(struct ndr_pul
NDR_CHECK(ndr_pull_policy_handle(ndr, NDR_SCALARS, r->in.domain_handle));
NDR_PULL_SET_MEM_CTX(ndr, _mem_save_domain_handle_0, LIBNDR_FLAG_REF_ALLOC);
NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->in.level));
- NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.name));
+ if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+ NDR_PULL_ALLOC(ndr, r->in.name);
+ }
+ _mem_save_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+ NDR_PULL_SET_MEM_CTX(ndr, r->in.name, LIBNDR_FLAG_REF_ALLOC);
+ NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.name));
+ NDR_PULL_SET_MEM_CTX(ndr, _mem_save_name_0, LIBNDR_FLAG_REF_ALLOC);
NDR_PULL_ALLOC(ndr, r->out.idx);
ZERO_STRUCTP(r->out.idx);
}
@@ -9405,7 +9415,10 @@ _PUBLIC_ void ndr_print_samr_GetDisplayEnumerationIndex(struct ndr_print *ndr, c
ndr_print_policy_handle(ndr, "domain_handle", r->in.domain_handle);
ndr->depth--;
ndr_print_uint16(ndr, "level", r->in.level);
- ndr_print_lsa_String(ndr, "name", &r->in.name);
+ ndr_print_ptr(ndr, "name", r->in.name);
+ ndr->depth++;
+ ndr_print_lsa_String(ndr, "name", r->in.name);
+ ndr->depth--;
ndr->depth--;
}
if (flags & NDR_OUT) {
@@ -10008,7 +10021,10 @@ static enum ndr_err_code ndr_push_samr_GetDisplayEnumerationIndex2(struct ndr_pu
}
NDR_CHECK(ndr_push_policy_handle(ndr, NDR_SCALARS, r->in.domain_handle));
NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->in.level));
- NDR_CHECK(ndr_push_lsa_String(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.name));
+ if (r->in.name == NULL) {
+ return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+ }
+ NDR_CHECK(ndr_push_lsa_String(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.name));
}
if (flags & NDR_OUT) {
if (r->out.idx == NULL) {
@@ -10023,6 +10039,7 @@ static enum ndr_err_code ndr_push_samr_GetDisplayEnumerationIndex2(struct ndr_pu
static enum ndr_err_code ndr_pull_samr_GetDisplayEnumerationIndex2(struct ndr_pull *ndr, int flags, struct samr_GetDisplayEnumerationIndex2 *r)
{
TALLOC_CTX *_mem_save_domain_handle_0;
+ TALLOC_CTX *_mem_save_name_0;
TALLOC_CTX *_mem_save_idx_0;
if (flags & NDR_IN) {
ZERO_STRUCT(r->out);
@@ -10035,7 +10052,13 @@ static enum ndr_err_code ndr_pull_samr_GetDisplayEnumerationIndex2(struct ndr_pu
NDR_CHECK(ndr_pull_policy_handle(ndr, NDR_SCALARS, r->in.domain_handle));
NDR_PULL_SET_MEM_CTX(ndr, _mem_save_domain_handle_0, LIBNDR_FLAG_REF_ALLOC);
NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->in.level));
- NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.name));
+ if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+ NDR_PULL_ALLOC(ndr, r->in.name);
+ }
+ _mem_save_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+ NDR_PULL_SET_MEM_CTX(ndr, r->in.name, LIBNDR_FLAG_REF_ALLOC);
+ NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.name));
+ NDR_PULL_SET_MEM_CTX(ndr, _mem_save_name_0, LIBNDR_FLAG_REF_ALLOC);
NDR_PULL_ALLOC(ndr, r->out.idx);
ZERO_STRUCTP(r->out.idx);
}
@@ -10067,7 +10090,10 @@ _PUBLIC_ void ndr_print_samr_GetDisplayEnumerationIndex2(struct ndr_print *ndr,
ndr_print_policy_handle(ndr, "domain_handle", r->in.domain_handle);
ndr->depth--;
ndr_print_uint16(ndr, "level", r->in.level);
- ndr_print_lsa_String(ndr, "name", &r->in.name);
+ ndr_print_ptr(ndr, "name", r->in.name);
+ ndr->depth++;
+ ndr_print_lsa_String(ndr, "name", r->in.name);
+ ndr->depth--;
ndr->depth--;
}
if (flags & NDR_OUT) {
diff --git a/source/librpc/gen_ndr/samr.h b/source/librpc/gen_ndr/samr.h
index 37e27aa..522c6a9 100644
--- a/source/librpc/gen_ndr/samr.h
+++ b/source/librpc/gen_ndr/samr.h
@@ -1358,7 +1358,7 @@ struct samr_GetDisplayEnumerationIndex {
struct {
struct policy_handle *domain_handle;/* [ref] */
uint16_t level;
- struct lsa_String name;
+ struct lsa_String *name;/* [ref] */
} in;
struct {
@@ -1470,7 +1470,7 @@ struct samr_GetDisplayEnumerationIndex2 {
struct {
struct policy_handle *domain_handle;/* [ref] */
uint16_t level;
- struct lsa_String name;
+ struct lsa_String *name;/* [ref] */
} in;
struct {
diff --git a/source/librpc/idl/samr.idl b/source/librpc/idl/samr.idl
index 401de96..e823d1d 100644
--- a/source/librpc/idl/samr.idl
+++ b/source/librpc/idl/samr.idl
@@ -1019,7 +1019,7 @@ import "misc.idl", "lsa.idl", "security.idl";
NTSTATUS samr_GetDisplayEnumerationIndex(
[in,ref] policy_handle *domain_handle,
[in] uint16 level,
- [in] lsa_String name,
+ [in,ref] lsa_String *name,
[out,ref] uint32 *idx
);
@@ -1117,7 +1117,7 @@ import "misc.idl", "lsa.idl", "security.idl";
NTSTATUS samr_GetDisplayEnumerationIndex2(
[in,ref] policy_handle *domain_handle,
[in] uint16 level,
- [in] lsa_String name,
+ [in,ref] lsa_String *name,
[out,ref] uint32 *idx
);
diff --git a/source/libsmb/cliconnect.c b/source/libsmb/cliconnect.c
index e0c18d8..ae16572 100644
--- a/source/libsmb/cliconnect.c
+++ b/source/libsmb/cliconnect.c
@@ -928,7 +928,9 @@ ADS_STATUS cli_session_setup_spnego(struct cli_state *cli, const char *user,
ntlmssp:
account = talloc_strdup(talloc_tos(), user);
- ADS_ERROR_HAVE_NO_MEMORY(account);
+ if (!account) {
+ return ADS_ERROR_NT(NT_STATUS_NO_MEMORY);
+ }
/* when falling back to ntlmssp while authenticating with a machine
* account strip off the realm - gd */
diff --git a/source/rpc_server/srv_samr_nt.c b/source/rpc_server/srv_samr_nt.c
index 0d9dd55..f28c771 100644
--- a/source/rpc_server/srv_samr_nt.c
+++ b/source/rpc_server/srv_samr_nt.c
@@ -5652,6 +5652,145 @@ NTSTATUS _samr_SetDomainInfo(pipes_struct *p,
}
/****************************************************************
+ _samr_GetDisplayEnumerationIndex
+****************************************************************/
+
+NTSTATUS _samr_GetDisplayEnumerationIndex(pipes_struct *p,
+ struct samr_GetDisplayEnumerationIndex *r)
+{
+ struct samr_info *info = NULL;
+ uint32_t max_entries = (uint32_t) -1;
+ uint32_t enum_context = 0;
+ int i;
+ uint32_t num_account = 0;
+ struct samr_displayentry *entries = NULL;
+
+ DEBUG(5,("_samr_GetDisplayEnumerationIndex: %d\n", __LINE__));
+
+ /* find the policy handle. open a policy on it. */
+ if (!find_policy_by_hnd(p, r->in.domain_handle, (void **)(void *)&info)) {
+ return NT_STATUS_INVALID_HANDLE;
+ }
+
+ if ((r->in.level < 1) || (r->in.level > 3)) {
+ DEBUG(0,("_samr_GetDisplayEnumerationIndex: "
+ "Unknown info level (%u)\n",
+ r->in.level));
+ return NT_STATUS_INVALID_INFO_CLASS;
+ }
+
+ become_root();
+
+ /* The following done as ROOT. Don't return without unbecome_root(). */
+
+ switch (r->in.level) {
+ case 1:
+ if (info->disp_info->users == NULL) {
+ info->disp_info->users = pdb_search_users(ACB_NORMAL);
+ if (info->disp_info->users == NULL) {
+ unbecome_root();
+ return NT_STATUS_ACCESS_DENIED;
+ }
+ DEBUG(10,("_samr_GetDisplayEnumerationIndex: "
+ "starting user enumeration at index %u\n",
+ (unsigned int)enum_context));
+ } else {
+ DEBUG(10,("_samr_GetDisplayEnumerationIndex: "
+ "using cached user enumeration at index %u\n",
+ (unsigned int)enum_context));
+ }
+ num_account = pdb_search_entries(info->disp_info->users,
+ enum_context, max_entries,
+ &entries);
+ break;
+ case 2:
+ if (info->disp_info->machines == NULL) {
+ info->disp_info->machines =
+ pdb_search_users(ACB_WSTRUST|ACB_SVRTRUST);
+ if (info->disp_info->machines == NULL) {
+ unbecome_root();
+ return NT_STATUS_ACCESS_DENIED;
+ }
+ DEBUG(10,("_samr_GetDisplayEnumerationIndex: "
+ "starting machine enumeration at index %u\n",
+ (unsigned int)enum_context));
+ } else {
+ DEBUG(10,("_samr_GetDisplayEnumerationIndex: "
+ "using cached machine enumeration at index %u\n",
+ (unsigned int)enum_context));
+ }
+ num_account = pdb_search_entries(info->disp_info->machines,
+ enum_context, max_entries,
+ &entries);
+ break;
+ case 3:
+ if (info->disp_info->groups == NULL) {
+ info->disp_info->groups = pdb_search_groups();
+ if (info->disp_info->groups == NULL) {
+ unbecome_root();
+ return NT_STATUS_ACCESS_DENIED;
+ }
+ DEBUG(10,("_samr_GetDisplayEnumerationIndex: "
+ "starting group enumeration at index %u\n",
+ (unsigned int)enum_context));
+ } else {
+ DEBUG(10,("_samr_GetDisplayEnumerationIndex: "
+ "using cached group enumeration at index %u\n",
+ (unsigned int)enum_context));
+ }
+ num_account = pdb_search_entries(info->disp_info->groups,
+ enum_context, max_entries,
+ &entries);
+ break;
+ default:
+ unbecome_root();
+ smb_panic("info class changed");
+ break;
+ }
+
+ unbecome_root();
+
+ /* Ensure we cache this enumeration. */
+ set_disp_info_cache_timeout(info->disp_info, DISP_INFO_CACHE_TIMEOUT);
+
+ DEBUG(10,("_samr_GetDisplayEnumerationIndex: looking for :%s\n",
+ r->in.name->string));
+
+ for (i=0; i<num_account; i++) {
+ if (strequal(entries[i].account_name, r->in.name->string)) {
+ DEBUG(10,("_samr_GetDisplayEnumerationIndex: "
+ "found %s at idx %d\n",
+ r->in.name->string, i));
+ *r->out.idx = i;
+ return NT_STATUS_OK;
+ }
+ }
+
+ /* assuming account_name lives at the very end */
+ *r->out.idx = num_account;
+
+ return NT_STATUS_NO_MORE_ENTRIES;
+}
+
+/****************************************************************
+ _samr_GetDisplayEnumerationIndex2
+****************************************************************/
+
+NTSTATUS _samr_GetDisplayEnumerationIndex2(pipes_struct *p,
+ struct samr_GetDisplayEnumerationIndex2 *r)
+{
+ struct samr_GetDisplayEnumerationIndex q;
+
+ q.in.domain_handle = r->in.domain_handle;
+ q.in.level = r->in.level;
+ q.in.name = r->in.name;
+
+ q.out.idx = r->out.idx;
+
+ return _samr_GetDisplayEnumerationIndex(p, &q);
+}
+
+/****************************************************************
****************************************************************/
NTSTATUS _samr_Shutdown(pipes_struct *p,
@@ -5694,16 +5833,6 @@ NTSTATUS _samr_ChangePasswordUser(pipes_struct *p,
/****************************************************************
****************************************************************/
-NTSTATUS _samr_GetDisplayEnumerationIndex(pipes_struct *p,
- struct samr_GetDisplayEnumerationIndex *r)
-{
- p->rng_fault_state = true;
- return NT_STATUS_NOT_IMPLEMENTED;
-}
-
-/****************************************************************
-****************************************************************/
-
NTSTATUS _samr_TestPrivateFunctionsDomain(pipes_struct *p,
struct samr_TestPrivateFunctionsDomain *r)
{
@@ -5734,16 +5863,6 @@ NTSTATUS _samr_QueryUserInfo2(pipes_struct *p,
/****************************************************************
****************************************************************/
-NTSTATUS _samr_GetDisplayEnumerationIndex2(pipes_struct *p,
- struct samr_GetDisplayEnumerationIndex2 *r)
-{
- p->rng_fault_state = true;
- return NT_STATUS_NOT_IMPLEMENTED;
-}
-
-/****************************************************************
-****************************************************************/
-
NTSTATUS _samr_AddMultipleMembersToAlias(pipes_struct *p,
struct samr_AddMultipleMembersToAlias *r)
{
--
Samba Shared Repository
More information about the samba-cvs
mailing list