diff options
author | Stefan Metzmacher <metze@samba.org> | 2004-08-20 09:55:21 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:58:13 -0500 |
commit | 32ec317c900efb104f7a7828898cbfdef0609c2a (patch) | |
tree | b4723b5b172c4d3b750bbc888f1792301278412b | |
parent | a5ca84508c02de1a6f4b824c53f41da590606717 (diff) | |
download | samba-32ec317c900efb104f7a7828898cbfdef0609c2a.tar.gz samba-32ec317c900efb104f7a7828898cbfdef0609c2a.tar.bz2 samba-32ec317c900efb104f7a7828898cbfdef0609c2a.zip |
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)
-rw-r--r-- | source4/utils/net/net_password.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/source4/utils/net/net_password.c b/source4/utils/net/net_password.c index 9daa3f401f..5da18d94b5 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} }; |