From 9d62046b0e09fa7a4a660859dd8651e6d60c8dc8 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 19 Aug 2004 13:32:06 +0000 Subject: r1919: paasword change basicly works now:-) but we need to find the real pdc for the users domain and fallback to other levels metze (This used to be commit f1b9c1f3dd0fb927c065541da900ae43e0018a62) --- source4/libnet/libnet.h | 5 +++++ source4/libnet/libnet_passwd.c | 10 +++++----- source4/libnet/libnet_rpc.c | 34 +++++++++++++++++++++++++++++++++- source4/utils/net/net_password.c | 3 +++ 4 files changed, 46 insertions(+), 6 deletions(-) diff --git a/source4/libnet/libnet.h b/source4/libnet/libnet.h index 65dba4ff78..0a96e6c530 100644 --- a/source4/libnet/libnet.h +++ b/source4/libnet/libnet.h @@ -25,6 +25,11 @@ struct libnet_context { * a client env context * a user env context */ + struct { + const char *account_name; + const char *domain_name; + const char *password; + } user; }; /* struct and enum for connecting to a dcerpc inferface */ diff --git a/source4/libnet/libnet_passwd.c b/source4/libnet/libnet_passwd.c index ea61a457ba..cdb5160a92 100644 --- a/source4/libnet/libnet_passwd.c +++ b/source4/libnet/libnet_passwd.c @@ -109,11 +109,11 @@ static NTSTATUS libnet_ChangePassword_generic(struct libnet_context *ctx, TALLOC NTSTATUS status; union libnet_ChangePassword r2; - r2.generic.level = LIBNET_CHANGE_PASSWORD_RPC; - r2.rpc.in.account_name = NULL; - r2.rpc.in.domain_name = NULL; - r2.rpc.in.oldpassword = NULL; - r2.rpc.in.newpassword = NULL; + r2.rpc.level = LIBNET_CHANGE_PASSWORD_RPC; + r2.rpc.in.account_name = r->generic.in.account_name; + r2.rpc.in.domain_name = r->generic.in.domain_name; + r2.rpc.in.oldpassword = r->generic.in.oldpassword; + r2.rpc.in.newpassword = r->generic.in.newpassword; status = libnet_ChangePassword(ctx, mem_ctx, &r2); diff --git a/source4/libnet/libnet_rpc.c b/source4/libnet/libnet_rpc.c index 0ab07fa4a5..c76498d0bb 100644 --- a/source4/libnet/libnet_rpc.c +++ b/source4/libnet/libnet_rpc.c @@ -20,8 +20,40 @@ #include "includes.h" +/* connect to a dcerpc interface of a domains PDC */ +NTSTATUS libnet_rpc_connect_pdc(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_rpc_connect *r) +{ + NTSTATUS status; + const char *binding = NULL; + const char *pdc = NULL; + + /* TODO: find real PDC! + * for now I use the lp_netbios_name() + * that's the most important for me as we don't have + * smbpasswd in samba4 (and this is good!:-) --metze + */ + pdc = lp_netbios_name(); + + binding = talloc_asprintf(mem_ctx, "ncacn_np:%s",pdc); + + status = dcerpc_pipe_connect(&r->pdc.out.dcerpc_pipe, + binding, + r->pdc.in.dcerpc_iface_uuid, + r->pdc.in.dcerpc_iface_version, + ctx->user.domain_name, + ctx->user.account_name, + ctx->user.password); + + return status; +} + /* connect to a dcerpc interface */ NTSTATUS libnet_rpc_connect(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_rpc_connect *r) { - return NT_STATUS_NOT_IMPLEMENTED; + switch (r->pdc.level) { + case LIBNET_RPC_CONNECT_PDC: + return libnet_rpc_connect_pdc(ctx, mem_ctx, r); + } + + return NT_STATUS_INVALID_LEVEL; } diff --git a/source4/utils/net/net_password.c b/source4/utils/net/net_password.c index c9c549fcff..9daa3f401f 100644 --- a/source4/utils/net/net_password.c +++ b/source4/utils/net/net_password.c @@ -46,6 +46,9 @@ static int net_password_change(struct net_context *ctx, int argc, const char **a if (!libnetctx) { return -1; } + libnetctx->user.account_name = ctx->user.account_name; + libnetctx->user.domain_name = ctx->user.domain_name; + libnetctx->user.password = ctx->user.password; /* prepare password change */ r.generic.level = LIBNET_CHANGE_PASSWORD_GENERIC; -- cgit