OK. Smbpasswd -j is DEAD.
[tprouty/samba.git] / source / utils / net_ads.c
index d7b508bf89a2e906d064e3414aefd6e26bad2268..cecfb6a4d0f31d1bc1450ec60d98509d7b88438c 100644 (file)
 
 #ifdef HAVE_ADS
 
-/* a lame random number generator - used /dev/urandom if possible */
-static unsigned one_random(void)
+int net_ads_usage(int argc, const char **argv)
 {
-       int fd = -1;
-       static int initialised;
-       unsigned ret;
-
-       if (!initialised) {
-               initialised = 1;
-               fd = open("/dev/urandom", O_RDONLY);
-               srandom(time(NULL) ^ getpid());
-       }
+       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"\
+"\nnet ads user"\
+"\n\tlist users in the realm\n"\
+"\nnet ads group"\
+"\n\tlist groups in the realm\n"\
+"\nnet ads status"\
+"\n\tdump the machine account details to stdout\n"
+               );
+       return -1;
+}
 
-       if (fd == -1) {
-               return random();
-       }
+static ADS_STRUCT *ads_startup(void)
+{
+       ADS_STRUCT *ads;
+       int rc;
+       ads = ads_init(NULL, NULL, NULL, NULL);
 
-       read(fd, &ret, sizeof(ret));
-       return ret;
+       rc = ads_connect(ads);
+       if (rc) {
+               d_printf("ads_connect: %s\n", ads_errstr(rc));
+               return NULL;
+       }
+       return ads;
 }
 
-/*
- * Generate a simple random password of 15 chars - not a cryptographic one
- */
-static char *generate_random_password(int len)
+static int net_ads_user(int argc, const char **argv)
 {
-       int i;
-       char *pass;
+       ADS_STRUCT *ads;
+       int rc;
+       void *res;
+       const char *attrs[] = {"sAMAccountName", "name", "objectSid", NULL};
 
-       if (!(pass = malloc(len+1)))
-               return NULL;
+       if (!(ads = ads_startup())) return -1;
+       rc = ads_search(ads, &res, "(objectclass=user)", attrs);
+       if (rc) {
+               d_printf("ads_search: %s\n", ads_errstr(rc));
+               return -1;
+       }
 
-       for (i=0; i<len; ) {
-               char c = one_random() & 0x7f;
-               if (!isalnum(c) && !ispunct(c)) continue;
-               pass[i++] = c;
+       if (ads_count_replies(ads, res) == 0) {
+               d_printf("No users found\n");
+               return -1;
        }
-       
-       return pass;
-}
 
+       ads_dump(ads, res);
+       ads_destroy(&ads);
+       return 0;
+}
 
-int net_ads_usage(void)
+static int net_ads_group(int argc, const char **argv)
 {
-       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;
-}
+       ADS_STRUCT *ads;
+       int rc;
+       void *res;
+       const char *attrs[] = {"sAMAccountName", "name", "objectSid", NULL};
+
+       if (!(ads = ads_startup())) return -1;
+       rc = ads_search(ads, &res, "(objectclass=group)", attrs);
+       if (rc) {
+               d_printf("ads_search: %s\n", ads_errstr(rc));
+               return -1;
+       }
 
+       if (ads_count_replies(ads, res) == 0) {
+               d_printf("No groups found\n");
+               return -1;
+       }
+
+       ads_dump(ads, res);
+       return 0;
+}
 
 static int net_ads_status(int argc, const char **argv)
 {
@@ -84,13 +108,7 @@ static int net_ads_status(int argc, const char **argv)
        extern pstring global_myname;
        void *res;
 
-       ads = ads_init(NULL, NULL, NULL);
-
-       rc = ads_connect(ads);
-       if (rc) {
-               d_printf("ads_connect: %s\n", ads_errstr(rc));
-               return -1;
-       }
+       if (!(ads = ads_startup())) return -1;
 
        rc = ads_find_machine_acct(ads, &res, global_myname);
        if (rc) {
@@ -114,19 +132,13 @@ static int net_ads_leave(int argc, const char **argv)
        int rc;
        extern pstring global_myname;
 
+       if (!(ads = ads_startup())) return -1;
+
        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, global_myname);
        if (rc) {
            d_printf("Failed to delete host '%s' from the '%s' realm.\n", 
@@ -144,6 +156,7 @@ static int net_ads_join(int argc, const char **argv)
        ADS_STRUCT *ads;
        int rc;
        char *password;
+       char *tmp_password;
        extern pstring global_myname;
        NTSTATUS status;
 
@@ -151,16 +164,12 @@ static int net_ads_join(int argc, const char **argv)
                DEBUG(1,("Failed to initialise secrets database\n"));
                return -1;
        }
+       
+       
+       tmp_password = generate_random_str(DEFAULT_TRUST_ACCOUNT_PASSWORD_LENGTH);
+       password = strdup(tmp_password);
 
-       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;
-       }
+       if (!(ads = ads_startup())) return -1;
 
        rc = ads_join_realm(ads, global_myname);
        if (rc) {
@@ -181,6 +190,8 @@ static int net_ads_join(int argc, const char **argv)
 
        d_printf("Joined '%s' to realm '%s'\n", global_myname, ads->realm);
 
+       free(password);
+
        return 0;
 }
 
@@ -190,6 +201,8 @@ int net_ads(int argc, const char **argv)
                {"JOIN", net_ads_join},
                {"LEAVE", net_ads_leave},
                {"STATUS", net_ads_status},
+               {"USER", net_ads_user},
+               {"GROUP", net_ads_group},
                {NULL, NULL}
        };
        
@@ -198,7 +211,7 @@ int net_ads(int argc, const char **argv)
 
 #else
 
-int net_ads_usage(void)
+int net_ads_usage(int argc, const char **argv)
 {
        d_printf("ADS support not compiled in\n");
        return -1;
@@ -206,7 +219,7 @@ int net_ads_usage(void)
 
 int net_ads(int argc, const char **argv)
 {
-       return net_ads_usage();
+       return net_ads_usage(argc, argv);
 }
 
 #endif