summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/Makefile.in2
-rw-r--r--source3/utils/net.c8
-rw-r--r--source3/utils/net_ads.c187
3 files changed, 192 insertions, 5 deletions
diff --git a/source3/Makefile.in b/source3/Makefile.in
index 8a29a1f0ff..682b478c6c 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -319,7 +319,7 @@ CLIENT_OBJ = client/client.o client/clitar.o \
$(PARAM_OBJ) $(LIBSMB_OBJ) $(UBIQX_OBJ) $(LIB_OBJ) \
$(READLINE_OBJ)
-NET_OBJ = utils/net.o utils/net_join.o \
+NET_OBJ = utils/net.o utils/net_ads.o \
$(LIBSMB_OBJ) $(PARAM_OBJ) $(UBIQX_OBJ) $(LIB_OBJ) @BUILD_POPT@
CUPS_OBJ = client/smbspool.o $(PARAM_OBJ) $(LIBSMB_OBJ) $(UBIQX_OBJ) $(LIB_OBJ)
diff --git a/source3/utils/net.c b/source3/utils/net.c
index d1d63fe2af..f3a9953e87 100644
--- a/source3/utils/net.c
+++ b/source3/utils/net.c
@@ -35,7 +35,7 @@
/* */
/*****************************************************/
-#include <includes.h>
+#include "includes.h"
/***********************************************************************/
/* Beginning of internationalization section. Translatable constants */
@@ -1190,7 +1190,7 @@ static int help_usage(void)
"\n"\
"Valid functions are:\n"\
" FILE SHARE SESSION SERVER DOMAIN PRINTQ USER GROUP\n"\
-" VALIDATE GROUPMEMBER ADMIN SERVICE PASSWORD JOIN\n");
+" VALIDATE GROUPMEMBER ADMIN SERVICE PASSWORD ADS\n");
return -1;
}
@@ -1213,7 +1213,7 @@ static int net_help(int argc, const char **argv)
{"ADMIN", admin_usage},
{"SERVICE", service_usage},
{"PASSWORD", password_usage},
- {"JOIN", net_join_usage},
+ {"ADS", net_ads_usage},
{NULL, NULL}};
return net_run_function(argc, argv, func, help_usage);
@@ -1234,7 +1234,7 @@ static struct functable net_func[] = {
{"ADMIN", net_admin},
{"SERVICE", net_service},
{"PASSWORD", net_password},
- {"JOIN", net_join},
+ {"ADS", net_ads},
{"HELP", net_help},
{NULL, NULL}
};
diff --git a/source3/utils/net_ads.c b/source3/utils/net_ads.c
new file mode 100644
index 0000000000..038608503b
--- /dev/null
+++ b/source3/utils/net_ads.c
@@ -0,0 +1,187 @@
+/*
+ Samba Unix/Linux SMB client library
+ Version 3.0
+ net ads commands
+ Copyright (C) 2001 Andrew Tridgell (tridge@samba.org)
+
+ 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 2 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, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+
+#ifdef HAVE_ADS
+
+/* a lame random number generator - used /dev/urandom if possible */
+static unsigned one_random(void)
+{
+ int fd = -1;
+ static int initialised;
+ unsigned ret;
+
+ if (!initialised) {
+ initialised = 1;
+ fd = open("/dev/urandom", O_RDONLY);
+ srandom(time(NULL) ^ getpid());
+ }
+
+ if (fd == -1) {
+ return random();
+ }
+
+ read(fd, &ret, sizeof(ret));
+ return ret;
+}
+
+/*
+ * Generate a simple random password of 15 chars - not a cryptographic one
+ */
+static char *generate_random_password(int len)
+{
+ int i;
+ char *pass;
+
+ if (!(pass = malloc(len+1)))
+ return NULL;
+
+ for (i=0; i<len; ) {
+ char c = one_random() & 0x7f;
+ if (!isalnum(c) && !ispunct(c)) continue;
+ pass[i++] = c;
+ }
+
+ return pass;
+}
+
+
+int net_ads_usage(void)
+{
+ d_printf(
+"\nnet ads join"\
+"\n\tjoins the local machine to a ADS realm\n"\
+"\nnet ads leave"\
+"\n\tremoves the local machine from a ADS realm\n"
+ );
+ return -1;
+}
+
+static int net_ads_leave(int argc, const char **argv)
+{
+ char *hostname;
+ ADS_STRUCT *ads;
+ int rc;
+ extern pstring global_myname;
+
+ hostname = strdup(global_myname);
+ strlower(hostname);
+
+ if (!secrets_init()) {
+ DEBUG(1,("Failed to initialise secrets database\n"));
+ return -1;
+ }
+
+ ads = ads_init(NULL, NULL, NULL);
+
+ rc = ads_connect(ads);
+ if (rc) {
+ d_printf("ads_connect: %s\n", ads_errstr(rc));
+ return -1;
+ }
+
+ rc = ads_leave_realm(ads, hostname);
+ if (rc) {
+ d_printf("Failed to delete host '%s' from the '%s' realm.\n",
+ hostname, ads->realm);
+ return -1;
+ }
+
+ d_printf("Removed '%s' from realm '%s'\n", hostname, ads->realm);
+
+ return 0;
+}
+
+static int net_ads_join(int argc, const char **argv)
+{
+ char *hostname;
+ ADS_STRUCT *ads;
+ int rc;
+ char *password;
+ extern pstring global_myname;
+ NTSTATUS status;
+
+ hostname = strdup(global_myname);
+ strlower(hostname);
+
+ if (!secrets_init()) {
+ DEBUG(1,("Failed to initialise secrets database\n"));
+ return -1;
+ }
+
+ password = generate_random_password(15);
+
+ ads = ads_init(NULL, NULL, NULL);
+
+ rc = ads_connect(ads);
+ if (rc) {
+ d_printf("ads_connect: %s\n", ads_errstr(rc));
+ return -1;
+ }
+
+ rc = ads_join_realm(ads, hostname);
+ if (rc) {
+ d_printf("ads_join_realm: %s\n", ads_errstr(rc));
+ return -1;
+ }
+
+ status = ads_set_machine_password(ads, hostname, password);
+ if (!NT_STATUS_IS_OK(status)) {
+ d_printf("ads_set_machine_password: %s\n", get_nt_error_msg(status));
+ return -1;
+ }
+
+ if (!secrets_store_machine_password(password)) {
+ DEBUG(1,("Failed to save machine password\n"));
+ return -1;
+ }
+
+ d_printf("Joined '%s' to realm '%s'\n", hostname, ads->realm);
+
+ return 0;
+}
+
+int net_ads(int argc, const char **argv)
+{
+ struct functable func[] = {
+ {"JOIN", net_ads_join},
+ {"LEAVE", net_ads_leave},
+ {NULL, NULL}
+ };
+
+ return net_run_function(argc, argv, func, net_ads_usage);
+}
+
+#else
+
+int net_ads_usage(void)
+{
+ d_printf("ADS support not compiled in\n");
+ return -1;
+}
+
+int net_ads(int argc, const char **argv)
+{
+ return net_ads_usage();
+}
+
+#endif