summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/winbindd/winbindd_samr.c135
1 files changed, 92 insertions, 43 deletions
diff --git a/source3/winbindd/winbindd_samr.c b/source3/winbindd/winbindd_samr.c
index c7528d1c66..22235e300d 100644
--- a/source3/winbindd/winbindd_samr.c
+++ b/source3/winbindd/winbindd_samr.c
@@ -27,7 +27,7 @@
#include "winbindd.h"
#include "winbindd_rpc.h"
-#include "../librpc/gen_ndr/cli_samr.h"
+#include "../librpc/gen_ndr/ndr_samr_c.h"
#include "rpc_client/cli_samr.h"
#include "../librpc/gen_ndr/srv_samr.h"
#include "../librpc/gen_ndr/cli_lsa.h"
@@ -85,31 +85,40 @@ NTSTATUS open_internal_samr_conn(TALLOC_CTX *mem_ctx,
struct rpc_pipe_client **samr_pipe,
struct policy_handle *samr_domain_hnd)
{
- NTSTATUS status;
+ NTSTATUS status, result;
struct policy_handle samr_connect_hnd;
+ struct dcerpc_binding_handle *b;
status = open_internal_samr_pipe(mem_ctx, samr_pipe);
if (!NT_STATUS_IS_OK(status)) {
return status;
}
- status = rpccli_samr_Connect2((*samr_pipe),
- mem_ctx,
+ b = (*samr_pipe)->binding_handle;
+
+ status = dcerpc_samr_Connect2(b, mem_ctx,
(*samr_pipe)->desthost,
SEC_FLAG_MAXIMUM_ALLOWED,
- &samr_connect_hnd);
+ &samr_connect_hnd,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
return status;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ return result;
+ }
- status = rpccli_samr_OpenDomain((*samr_pipe),
- mem_ctx,
+ status = dcerpc_samr_OpenDomain(b, mem_ctx,
&samr_connect_hnd,
SEC_FLAG_MAXIMUM_ALLOWED,
&domain->sid,
- samr_domain_hnd);
+ samr_domain_hnd,
+ &result);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
- return status;
+ return result;
}
static NTSTATUS open_internal_lsa_pipe(TALLOC_CTX *mem_ctx,
@@ -188,7 +197,8 @@ static NTSTATUS sam_enum_dom_groups(struct winbindd_domain *domain,
struct acct_info *info = NULL;
uint32_t num_info = 0;
TALLOC_CTX *tmp_ctx;
- NTSTATUS status;
+ NTSTATUS status, result;
+ struct dcerpc_binding_handle *b = NULL;
DEBUG(3,("sam_enum_dom_groups\n"));
@@ -208,6 +218,8 @@ static NTSTATUS sam_enum_dom_groups(struct winbindd_domain *domain,
goto error;
}
+ b = samr_pipe->binding_handle;
+
status = rpc_enum_dom_groups(tmp_ctx,
samr_pipe,
&dom_pol,
@@ -226,8 +238,8 @@ static NTSTATUS sam_enum_dom_groups(struct winbindd_domain *domain,
}
error:
- if (is_valid_policy_hnd(&dom_pol)) {
- rpccli_samr_Close(samr_pipe, mem_ctx, &dom_pol);
+ if (b && is_valid_policy_hnd(&dom_pol)) {
+ dcerpc_samr_Close(b, mem_ctx, &dom_pol, &result);
}
TALLOC_FREE(tmp_ctx);
return status;
@@ -244,7 +256,8 @@ static NTSTATUS sam_query_user_list(struct winbindd_domain *domain,
struct wbint_userinfo *info = NULL;
uint32_t num_info = 0;
TALLOC_CTX *tmp_ctx;
- NTSTATUS status;
+ NTSTATUS status, result;
+ struct dcerpc_binding_handle *b = NULL;
DEBUG(3,("samr_query_user_list\n"));
@@ -264,6 +277,8 @@ static NTSTATUS sam_query_user_list(struct winbindd_domain *domain,
goto done;
}
+ b = samr_pipe->binding_handle;
+
status = rpc_query_user_list(tmp_ctx,
samr_pipe,
&dom_pol,
@@ -283,8 +298,8 @@ static NTSTATUS sam_query_user_list(struct winbindd_domain *domain,
}
done:
- if (is_valid_policy_hnd(&dom_pol)) {
- rpccli_samr_Close(samr_pipe, mem_ctx, &dom_pol);
+ if (b && is_valid_policy_hnd(&dom_pol)) {
+ dcerpc_samr_Close(b, mem_ctx, &dom_pol, &result);
}
TALLOC_FREE(tmp_ctx);
@@ -300,7 +315,8 @@ static NTSTATUS sam_query_user(struct winbindd_domain *domain,
struct rpc_pipe_client *samr_pipe;
struct policy_handle dom_pol;
TALLOC_CTX *tmp_ctx;
- NTSTATUS status;
+ NTSTATUS status, result;
+ struct dcerpc_binding_handle *b = NULL;
DEBUG(3,("sam_query_user\n"));
@@ -327,6 +343,8 @@ static NTSTATUS sam_query_user(struct winbindd_domain *domain,
goto done;
}
+ b = samr_pipe->binding_handle;
+
status = rpc_query_user(tmp_ctx,
samr_pipe,
&dom_pol,
@@ -335,8 +353,8 @@ static NTSTATUS sam_query_user(struct winbindd_domain *domain,
user_info);
done:
- if (is_valid_policy_hnd(&dom_pol)) {
- rpccli_samr_Close(samr_pipe, mem_ctx, &dom_pol);
+ if (b && is_valid_policy_hnd(&dom_pol)) {
+ dcerpc_samr_Close(b, mem_ctx, &dom_pol, &result);
}
TALLOC_FREE(tmp_ctx);
@@ -415,7 +433,8 @@ static NTSTATUS sam_lookup_groupmem(struct winbindd_domain *domain,
uint32_t *name_types = NULL;
TALLOC_CTX *tmp_ctx;
- NTSTATUS status;
+ NTSTATUS status, result;
+ struct dcerpc_binding_handle *b = NULL;
DEBUG(3,("sam_lookup_groupmem\n"));
@@ -441,6 +460,8 @@ static NTSTATUS sam_lookup_groupmem(struct winbindd_domain *domain,
goto done;
}
+ b = samr_pipe->binding_handle;
+
status = rpc_lookup_groupmem(tmp_ctx,
samr_pipe,
&dom_pol,
@@ -470,8 +491,8 @@ static NTSTATUS sam_lookup_groupmem(struct winbindd_domain *domain,
}
done:
- if (is_valid_policy_hnd(&dom_pol)) {
- rpccli_samr_Close(samr_pipe, mem_ctx, &dom_pol);
+ if (b && is_valid_policy_hnd(&dom_pol)) {
+ dcerpc_samr_Close(b, mem_ctx, &dom_pol, &result);
}
TALLOC_FREE(tmp_ctx);
@@ -539,7 +560,8 @@ static NTSTATUS sam_enum_local_groups(struct winbindd_domain *domain,
struct acct_info *info = NULL;
uint32_t num_info = 0;
TALLOC_CTX *tmp_ctx;
- NTSTATUS status;
+ NTSTATUS status, result;
+ struct dcerpc_binding_handle *b = NULL;
DEBUG(3,("samr: enum local groups\n"));
@@ -559,6 +581,8 @@ static NTSTATUS sam_enum_local_groups(struct winbindd_domain *domain,
goto done;
}
+ b = samr_pipe->binding_handle;
+
status = rpc_enum_local_groups(mem_ctx,
samr_pipe,
&dom_pol,
@@ -577,8 +601,8 @@ static NTSTATUS sam_enum_local_groups(struct winbindd_domain *domain,
}
done:
- if (is_valid_policy_hnd(&dom_pol)) {
- rpccli_samr_Close(samr_pipe, mem_ctx, &dom_pol);
+ if (b && is_valid_policy_hnd(&dom_pol)) {
+ dcerpc_samr_Close(b, mem_ctx, &dom_pol, &result);
}
TALLOC_FREE(tmp_ctx);
@@ -803,7 +827,8 @@ static NTSTATUS sam_lockout_policy(struct winbindd_domain *domain,
struct policy_handle dom_pol;
union samr_DomainInfo *info = NULL;
TALLOC_CTX *tmp_ctx;
- NTSTATUS status;
+ NTSTATUS status, result;
+ struct dcerpc_binding_handle *b = NULL;
DEBUG(3,("sam_lockout_policy\n"));
@@ -819,20 +844,27 @@ static NTSTATUS sam_lockout_policy(struct winbindd_domain *domain,
goto error;
}
- status = rpccli_samr_QueryDomainInfo(samr_pipe,
+ b = samr_pipe->binding_handle;
+
+ status = dcerpc_samr_QueryDomainInfo(b,
mem_ctx,
&dom_pol,
12,
- &info);
+ &info,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
goto error;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ status = result;
+ goto error;
+ }
*lockout_policy = info->info12;
error:
- if (is_valid_policy_hnd(&dom_pol)) {
- rpccli_samr_Close(samr_pipe, mem_ctx, &dom_pol);
+ if (b && is_valid_policy_hnd(&dom_pol)) {
+ dcerpc_samr_Close(b, mem_ctx, &dom_pol, &result);
}
TALLOC_FREE(tmp_ctx);
@@ -847,7 +879,8 @@ static NTSTATUS sam_password_policy(struct winbindd_domain *domain,
struct policy_handle dom_pol;
union samr_DomainInfo *info = NULL;
TALLOC_CTX *tmp_ctx;
- NTSTATUS status;
+ NTSTATUS status, result;
+ struct dcerpc_binding_handle *b = NULL;
DEBUG(3,("sam_password_policy\n"));
@@ -863,20 +896,27 @@ static NTSTATUS sam_password_policy(struct winbindd_domain *domain,
goto error;
}
- status = rpccli_samr_QueryDomainInfo(samr_pipe,
+ b = samr_pipe->binding_handle;
+
+ status = dcerpc_samr_QueryDomainInfo(b,
mem_ctx,
&dom_pol,
1,
- &info);
+ &info,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
goto error;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ status = result;
+ goto error;
+ }
*passwd_policy = info->info1;
error:
- if (is_valid_policy_hnd(&dom_pol)) {
- rpccli_samr_Close(samr_pipe, mem_ctx, &dom_pol);
+ if (b && is_valid_policy_hnd(&dom_pol)) {
+ dcerpc_samr_Close(b, mem_ctx, &dom_pol, &result);
}
TALLOC_FREE(tmp_ctx);
@@ -895,7 +935,8 @@ static NTSTATUS sam_lookup_usergroups(struct winbindd_domain *domain,
struct dom_sid *user_grpsids = NULL;
uint32_t num_groups = 0;
TALLOC_CTX *tmp_ctx;
- NTSTATUS status;
+ NTSTATUS status, result;
+ struct dcerpc_binding_handle *b = NULL;
DEBUG(3,("sam_lookup_usergroups\n"));
@@ -915,6 +956,8 @@ static NTSTATUS sam_lookup_usergroups(struct winbindd_domain *domain,
goto done;
}
+ b = samr_pipe->binding_handle;
+
status = rpc_lookup_usergroups(tmp_ctx,
samr_pipe,
&dom_pol,
@@ -935,8 +978,8 @@ static NTSTATUS sam_lookup_usergroups(struct winbindd_domain *domain,
}
done:
- if (is_valid_policy_hnd(&dom_pol)) {
- rpccli_samr_Close(samr_pipe, mem_ctx, &dom_pol);
+ if (b && is_valid_policy_hnd(&dom_pol)) {
+ dcerpc_samr_Close(b, mem_ctx, &dom_pol, &result);
}
TALLOC_FREE(tmp_ctx);
@@ -955,7 +998,8 @@ static NTSTATUS sam_lookup_useraliases(struct winbindd_domain *domain,
uint32_t num_aliases = 0;
uint32_t *alias_rids = NULL;
TALLOC_CTX *tmp_ctx;
- NTSTATUS status;
+ NTSTATUS status, result;
+ struct dcerpc_binding_handle *b = NULL;
DEBUG(3,("sam_lookup_useraliases\n"));
@@ -975,6 +1019,8 @@ static NTSTATUS sam_lookup_useraliases(struct winbindd_domain *domain,
goto done;
}
+ b = samr_pipe->binding_handle;
+
status = rpc_lookup_useraliases(tmp_ctx,
samr_pipe,
&dom_pol,
@@ -995,8 +1041,8 @@ static NTSTATUS sam_lookup_useraliases(struct winbindd_domain *domain,
}
done:
- if (is_valid_policy_hnd(&dom_pol)) {
- rpccli_samr_Close(samr_pipe, mem_ctx, &dom_pol);
+ if (b && is_valid_policy_hnd(&dom_pol)) {
+ dcerpc_samr_Close(b, mem_ctx, &dom_pol, &result);
}
TALLOC_FREE(tmp_ctx);
@@ -1011,7 +1057,8 @@ static NTSTATUS sam_sequence_number(struct winbindd_domain *domain,
struct policy_handle dom_pol;
uint32_t seq;
TALLOC_CTX *tmp_ctx;
- NTSTATUS status;
+ NTSTATUS status, result;
+ struct dcerpc_binding_handle *b = NULL;
DEBUG(3,("samr: sequence number\n"));
@@ -1031,6 +1078,8 @@ static NTSTATUS sam_sequence_number(struct winbindd_domain *domain,
goto done;
}
+ b = samr_pipe->binding_handle;
+
status = rpc_sequence_number(tmp_ctx,
samr_pipe,
&dom_pol,
@@ -1044,8 +1093,8 @@ static NTSTATUS sam_sequence_number(struct winbindd_domain *domain,
*pseq = seq;
}
done:
- if (is_valid_policy_hnd(&dom_pol)) {
- rpccli_samr_Close(samr_pipe, tmp_ctx, &dom_pol);
+ if (b && is_valid_policy_hnd(&dom_pol)) {
+ dcerpc_samr_Close(b, tmp_ctx, &dom_pol, &result);
}
TALLOC_FREE(tmp_ctx);