From 32ec317c900efb104f7a7828898cbfdef0609c2a Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 20 Aug 2004 09:55:21 +0000 Subject: [PATCH] r1951: add 'net password set' call use it like: net password set user net password set DOM\\user net password set user pass net password set DOM\\user pass net password set -U DOM\\Administrator%admpass DOM\\user pass metze (This used to be commit b660e5b9e6236c996550973e9bde1e80a8eed775) --- source4/utils/net/net_password.c | 82 ++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/source4/utils/net/net_password.c b/source4/utils/net/net_password.c index 9daa3f401f7..5da18d94b58 100644 --- a/source4/utils/net/net_password.c +++ b/source4/utils/net/net_password.c @@ -81,8 +81,90 @@ static int net_password_change_help(struct net_context *ctx, int argc, const cha return 0; } +static int net_password_set(struct net_context *ctx, int argc, const char **argv) +{ + NTSTATUS status; + struct libnet_context *libnetctx; + union libnet_SetPassword r; + char *password_prompt = NULL; + char *p; + char *tmp; + const char *account_name; + const char *domain_name; + const char *new_password = NULL; + + switch (argc) { + case 0: /* no args -> fail */ + DEBUG(0,("net_password_set: no args\n")); + return -1; + case 1: /* only DOM\\user; prompt for password */ + tmp = talloc_strdup(ctx->mem_ctx, argv[0]); + break; + case 2: /* DOM\\USER and password */ + tmp = talloc_strdup(ctx->mem_ctx, argv[0]); + new_password = argv[1]; + break; + default: /* too mayn args -> fail */ + DEBUG(0,("net_password_set: too many args [%d]\n",argc)); + return -1; + } + + if ((p = strchr_m(tmp,'\\'))) { + *p = 0; + domain_name = tmp; + account_name = talloc_strdup(ctx->mem_ctx, p+1); + } else { + account_name = tmp; + domain_name = ctx->user.domain_name; + } + + if (!new_password) { + password_prompt = talloc_asprintf(ctx->mem_ctx, "Enter new password for account [%s\\%s]:", + domain_name, account_name); + new_password = getpass(password_prompt); + } + + libnetctx = libnet_context_init(); + 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_SET_PASSWORD_GENERIC; + r.generic.in.account_name = account_name; + r.generic.in.domain_name = domain_name; + r.generic.in.newpassword = new_password; + + /* do password change */ + status = libnet_SetPassword(libnetctx, ctx->mem_ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("net_password_set: %s\n",r.generic.out.error_string)); + return -1; + } + + libnet_context_destroy(&libnetctx); + + return 0; +} + +static int net_password_set_usage(struct net_context *ctx, int argc, const char **argv) +{ + d_printf("net_password_set_usage: TODO\n"); + return 0; +} + +static int net_password_set_help(struct net_context *ctx, int argc, const char **argv) +{ + d_printf("net_password_set_help: TODO\n"); + return 0; +} + static const struct net_functable const net_password_functable[] = { {"change", net_password_change, net_password_change_usage, net_password_change_help}, + {"set", net_password_set, net_password_set_usage, net_password_set_help}, {NULL, NULL} };