mirror of
https://github.com/samba-team/samba.git
synced 2025-01-15 23:24:37 +03:00
c86e98aa80
Add a test for wbinfo -a to test_member.sh Reimplement the server-side 'pam_auth' and 'pam_auth_crap' calls to use the same SamLogon code as auth_winbind uses. In my previous code, we did not bind to the LSA and SAMR pipes, before attempting operations. We now do this (how we passed any tests before is beyond me). This required some rework, particularly to make it easier to setup secondary connections. The new rpc_secondary_auth_connection() function also performs the bind. The dcerpc_connect.c file was getting to big, so things have been merged into dcerpc_secondary.c. Andrew Bartlett (This used to be commit 365778a993b7d76af6d53ba2a598b7e271741dc5)
121 lines
3.5 KiB
C
121 lines
3.5 KiB
C
/*
|
|
Unix SMB/CIFS implementation.
|
|
|
|
Get a struct wb_dom_info for a domain using DNS, netbios, possibly cldap
|
|
etc.
|
|
|
|
Copyright (C) Volker Lendecke 2005
|
|
|
|
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 "libcli/composite/composite.h"
|
|
#include "libcli/resolve/resolve.h"
|
|
#include "libcli/security/security.h"
|
|
#include "winbind/wb_server.h"
|
|
#include "smbd/service_task.h"
|
|
#include "librpc/gen_ndr/ndr_irpc.h"
|
|
#include "librpc/gen_ndr/samr.h"
|
|
#include "lib/messaging/irpc.h"
|
|
#include "libcli/finddcs.h"
|
|
|
|
struct get_dom_info_state {
|
|
struct composite_context *ctx;
|
|
struct wb_dom_info *info;
|
|
};
|
|
|
|
static void get_dom_info_recv_addrs(struct composite_context *ctx);
|
|
|
|
struct composite_context *wb_get_dom_info_send(TALLOC_CTX *mem_ctx,
|
|
struct wbsrv_service *service,
|
|
const char *domain_name,
|
|
const struct dom_sid *sid)
|
|
{
|
|
struct composite_context *result, *ctx;
|
|
struct get_dom_info_state *state;
|
|
struct dom_sid *dom_sid;
|
|
result = composite_create(mem_ctx, service->task->event_ctx);
|
|
if (result == NULL) goto failed;
|
|
|
|
state = talloc(result, struct get_dom_info_state);
|
|
if (state == NULL) goto failed;
|
|
state->ctx = result;
|
|
result->private_data = state;
|
|
|
|
state->info = talloc_zero(state, struct wb_dom_info);
|
|
if (state->info == NULL) goto failed;
|
|
|
|
state->info->name = talloc_strdup(state->info, domain_name);
|
|
if (state->info->name == NULL) goto failed;
|
|
|
|
state->info->sid = dom_sid_dup(state->info, sid);
|
|
if (state->info->sid == NULL) goto failed;
|
|
|
|
dom_sid = dom_sid_dup(mem_ctx, sid);
|
|
if (dom_sid == NULL) goto failed;
|
|
|
|
ctx = finddcs_send(mem_ctx, domain_name, NBT_NAME_LOGON,
|
|
dom_sid, lp_name_resolve_order(), service->task->event_ctx,
|
|
service->task->msg_ctx);
|
|
if (ctx == NULL) goto failed;
|
|
|
|
composite_continue(state->ctx, ctx, get_dom_info_recv_addrs, state);
|
|
return result;
|
|
|
|
failed:
|
|
talloc_free(result);
|
|
return NULL;
|
|
}
|
|
|
|
static void get_dom_info_recv_addrs(struct composite_context *ctx)
|
|
{
|
|
struct get_dom_info_state *state =
|
|
talloc_get_type(ctx->async.private_data,
|
|
struct get_dom_info_state);
|
|
|
|
state->ctx->status = finddcs_recv(ctx, state->info,
|
|
&state->info->num_dcs,
|
|
&state->info->dcs);
|
|
if (!composite_is_ok(state->ctx)) return;
|
|
|
|
composite_done(state->ctx);
|
|
}
|
|
|
|
NTSTATUS wb_get_dom_info_recv(struct composite_context *ctx,
|
|
TALLOC_CTX *mem_ctx,
|
|
struct wb_dom_info **result)
|
|
{
|
|
NTSTATUS status = composite_wait(ctx);
|
|
if (NT_STATUS_IS_OK(status)) {
|
|
struct get_dom_info_state *state =
|
|
talloc_get_type(ctx->private_data,
|
|
struct get_dom_info_state);
|
|
*result = talloc_steal(mem_ctx, state->info);
|
|
}
|
|
talloc_free(ctx);
|
|
return status;
|
|
}
|
|
|
|
NTSTATUS wb_get_dom_info(TALLOC_CTX *mem_ctx,
|
|
struct wbsrv_service *service,
|
|
const char *domain_name,
|
|
const struct dom_sid *sid,
|
|
struct wb_dom_info **result)
|
|
{
|
|
struct composite_context *ctx =
|
|
wb_get_dom_info_send(mem_ctx, service, domain_name, sid);
|
|
return wb_get_dom_info_recv(ctx, mem_ctx, result);
|
|
}
|