diff options
author | Andrew Tridgell <tridge@samba.org> | 2001-11-24 14:16:41 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2001-11-24 14:16:41 +0000 |
commit | ad2974cd05b4d08c8b92f505bf95aa8e8533235f (patch) | |
tree | 68ed4b1c3c99a13154fb768ba9f4bfcc1a3e7ce9 /source3/utils/net_join.c | |
parent | 0ebb29e032f2cdbfdb55184c0b97fd1f71b84609 (diff) | |
download | samba-ad2974cd05b4d08c8b92f505bf95aa8e8533235f.tar.gz samba-ad2974cd05b4d08c8b92f505bf95aa8e8533235f.tar.xz samba-ad2974cd05b4d08c8b92f505bf95aa8e8533235f.zip |
added "net join" command
this completes the first stage of the smbd ADS support
(This used to be commit 058a5aee901e6609969ef7e1d482a720a84a4a12)
Diffstat (limited to 'source3/utils/net_join.c')
-rw-r--r-- | source3/utils/net_join.c | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/source3/utils/net_join.c b/source3/utils/net_join.c new file mode 100644 index 0000000000..793d72ac7e --- /dev/null +++ b/source3/utils/net_join.c @@ -0,0 +1,143 @@ +/* + Samba Unix/Linux SMB client library + Version 3.0 + join a realm + 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" + +#if 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_join_usage(void) +{ + d_printf("\nnet join"\ + "\n\tjoins the local machine to a ADS realm\n"); + return -1; +} + +int net_join(int argc, const char **argv) +{ + char *ldap_host; + char *hostname; + char *realm; + ADS_STRUCT *ads; + int rc; + char *password; + extern pstring global_myname; + NTSTATUS status; + + hostname = strdup(global_myname); + strlower(hostname); + realm = lp_realm(); + ldap_host = lp_ads_server(); + if (!*ldap_host) ldap_host = NULL; + if (!*realm) realm = NULL; + + if (!secrets_init()) { + DEBUG(1,("Failed to initialise secrets database\n")); + return -1; + } + + password = generate_random_password(15); + + ads = ads_init(realm, ldap_host, 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, realm); + + return 0; +} + +#else + +int net_join_usage(void) +{ + d_printf("ADS support not compiled in\n"); + return -1; +} + +int net_join(int argc, const char **argv) +{ + return net_join_usage(); +} + +#endif |