summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2004-08-20 09:55:21 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:58:13 -0500
commit32ec317c900efb104f7a7828898cbfdef0609c2a (patch)
treeb4723b5b172c4d3b750bbc888f1792301278412b
parenta5ca84508c02de1a6f4b824c53f41da590606717 (diff)
downloadsamba-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.c82
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}
};