summaryrefslogtreecommitdiff
path: root/source3/winbindd
diff options
context:
space:
mode:
authorSamuel Cabrero <scabrero@samba.org>2019-10-22 18:28:44 +0200
committerSamuel Cabrero <scabrero@sn-devel-184>2020-03-20 15:36:35 +0000
commit97ee59fd4eae318d2de83a8c26688e6d2f4b9d3a (patch)
tree789d1f4a4afbd3960a8d2d6f4e6ee51eee285fae /source3/winbindd
parent60fa8e255254d38e9443bf96f2c0f31430be6ab8 (diff)
downloadsamba-97ee59fd4eae318d2de83a8c26688e6d2f4b9d3a.tar.gz
s3:winbindd: Dispatch RPC calls through interface local handler
Signed-off-by: Samuel Cabrero <scabrero@samba.org> Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Diffstat (limited to 'source3/winbindd')
-rw-r--r--source3/winbindd/winbindd.c13
-rw-r--r--source3/winbindd/winbindd_dual_ndr.c69
-rw-r--r--source3/winbindd/winbindd_dual_srv.c2
3 files changed, 63 insertions, 21 deletions
diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c
index dd8e53e29a5..4397a1bc0d1 100644
--- a/source3/winbindd/winbindd.c
+++ b/source3/winbindd/winbindd.c
@@ -31,6 +31,7 @@
#include "librpc/rpc/dcesrv_core.h"
#include "librpc/gen_ndr/ndr_lsa_scompat.h"
#include "librpc/gen_ndr/ndr_samr_scompat.h"
+#include "librpc/gen_ndr/ndr_winbind_scompat.h"
#include "secrets.h"
#include "rpc_client/cli_netlogon.h"
#include "idmap.h"
@@ -1965,6 +1966,18 @@ int main(int argc, const char **argv)
exit(1);
}
+ ep_server = winbind_get_ep_server();
+ if (ep_server == NULL) {
+ DBG_ERR("Failed to get 'winbind' endpoint server\n");
+ exit(1);
+ }
+ status = dcerpc_register_ep_server(ep_server);
+ if (!NT_STATUS_IS_OK(status)) {
+ DBG_ERR("Failed to register 'winbind' endpoint "
+ "server: %s\n", nt_errstr(status));
+ exit(1);
+ }
+
dce_ctx = global_dcesrv_context();
DBG_INFO("Initializing DCE/RPC registered endpoint servers\n");
diff --git a/source3/winbindd/winbindd_dual_ndr.c b/source3/winbindd/winbindd_dual_ndr.c
index 25e7445edc6..f615ada1fca 100644
--- a/source3/winbindd/winbindd_dual_ndr.c
+++ b/source3/winbindd/winbindd_dual_ndr.c
@@ -30,7 +30,8 @@
#include "winbindd/winbindd.h"
#include "winbindd/winbindd_proto.h"
#include "ntdomain.h"
-#include "librpc/gen_ndr/srv_winbind.h"
+#include "librpc/rpc/dcesrv_core.h"
+#include "librpc/gen_ndr/ndr_winbind.h"
struct wbint_bh_state {
struct winbindd_domain *domain;
@@ -346,41 +347,67 @@ struct dcerpc_binding_handle *wbint_binding_handle(TALLOC_CTX *mem_ctx,
enum winbindd_result winbindd_dual_ndrcmd(struct winbindd_domain *domain,
struct winbindd_cli_state *state)
{
- struct pipes_struct p;
- const struct api_struct *fns;
- int num_fns;
- bool ret;
+ const struct dcesrv_endpoint_server *ep_server = NULL;
+ struct dcesrv_interface iface;
+ const struct ndr_syntax_id *abstract_syntax;
+ bool ok;
+ uint32_t opnum = state->request->data.ndrcmd;
+ struct pipes_struct *p;
+ TALLOC_CTX *mem_ctx;
+ DATA_BLOB in;
+ DATA_BLOB out;
+ NTSTATUS status;
+
+ DBG_DEBUG("Running command %s (domain '%s')\n",
+ ndr_table_winbind.calls[opnum].name,
+ domain ? domain->name : "(null)");
+
+ ep_server = dcesrv_ep_server_byname(ndr_table_winbind.name);
+ if (ep_server == NULL) {
+ DBG_ERR("Failed to get DCE/RPC endpoint server '%s'\n",
+ ndr_table_winbind.name);
+ return WINBINDD_ERROR;
+ }
- fns = winbind_get_pipe_fns(&num_fns);
+ abstract_syntax = &ndr_table_winbind.syntax_id;
+ ok = ep_server->interface_by_uuid(&iface, &abstract_syntax->uuid,
+ abstract_syntax->if_version);
+ if (!ok) {
+ DBG_ERR("Failed to get DCE/RPC interface\n");
+ return WINBINDD_ERROR;
+ }
- if (state->request->data.ndrcmd >= num_fns) {
+ mem_ctx = talloc_stackframe();
+ if (mem_ctx == NULL) {
+ DBG_ERR("No memory");
return WINBINDD_ERROR;
}
- DEBUG(10, ("winbindd_dual_ndrcmd: Running command %s (%s)\n",
- fns[state->request->data.ndrcmd].name,
- domain ? domain->name : "no domain"));
+ p = talloc_zero(mem_ctx, struct pipes_struct);
+ if (p == NULL) {
+ DBG_ERR("No memory\n");
+ return WINBINDD_ERROR;
+ }
+ p->mem_ctx = mem_ctx;
- ZERO_STRUCT(p);
- p.mem_ctx = talloc_stackframe();
- p.in_data.data = data_blob_const(state->request->extra_data.data,
- state->request->extra_len);
+ in = data_blob_const(state->request->extra_data.data,
+ state->request->extra_len);
- ret = fns[state->request->data.ndrcmd].fn(&p);
- if (!ret) {
- TALLOC_FREE(p.mem_ctx);
+ status = iface.local(p, opnum, mem_ctx, &in, &out);
+ if (!NT_STATUS_IS_OK(status)) {
+ TALLOC_FREE(mem_ctx);
return WINBINDD_ERROR;
}
state->response->extra_data.data =
- talloc_move(state->mem_ctx, &p.out_data.rdata.data);
- state->response->length += p.out_data.rdata.length;
- p.out_data.rdata.length = 0;
+ talloc_steal(state->mem_ctx, out.data);
+ state->response->length += out.length;
- TALLOC_FREE(p.mem_ctx);
+ TALLOC_FREE(mem_ctx);
if (state->response->extra_data.data == NULL) {
return WINBINDD_ERROR;
}
+
return WINBINDD_OK;
}
diff --git a/source3/winbindd/winbindd_dual_srv.c b/source3/winbindd/winbindd_dual_srv.c
index 13345caa41b..a41177ae871 100644
--- a/source3/winbindd/winbindd_dual_srv.c
+++ b/source3/winbindd/winbindd_dual_srv.c
@@ -1899,3 +1899,5 @@ reconnect:
return status;
}
+
+#include "librpc/gen_ndr/ndr_winbind_scompat.c"