Enable net ads commands to use existing tickets if the user doesn't specify a usernam...
authorJim McDonough <jmcd@samba.org>
Fri, 25 Jan 2002 22:07:46 +0000 (22:07 +0000)
committerJim McDonough <jmcd@samba.org>
Fri, 25 Jan 2002 22:07:46 +0000 (22:07 +0000)
(This used to be commit 7e5d7dfa834c0161460bde8a2f0d4824c0a0d1fe)

source3/libads/ldap.c
source3/utils/net.c
source3/utils/net_ads.c

index d922e4c7c566732f45e450b09f88d9000d4b559b..d7d21632812da592d4a5039d0832f8fe6bd26743 100644 (file)
@@ -31,6 +31,7 @@
 ADS_STATUS ads_connect(ADS_STRUCT *ads)
 {
        int version = LDAP_VERSION3;
+       int code;
        ADS_STATUS status;
 
        ads->last_attempt = time(NULL);
@@ -48,7 +49,8 @@ ADS_STATUS ads_connect(ADS_STRUCT *ads)
        ldap_set_option(ads->ld, LDAP_OPT_PROTOCOL_VERSION, &version);
 
        if (ads->password) {
-               ads_kinit_password(ads);
+               if ((code = ads_kinit_password(ads)))
+                       return ADS_ERROR_KRB5(code);
        }
 
        return ads_sasl_bind(ads);
index 89eb9211ca175ef0c44b95a40464429b9a72a429..81968e6f8470bf22f7fd248887f570675d36121f 100644 (file)
@@ -61,6 +61,7 @@ char *opt_requester_name = NULL;
 char *opt_host = NULL; 
 char *opt_password = NULL;
 char *opt_user_name = NULL;
+BOOL opt_user_specified = False;
 char *opt_workgroup = NULL;
 int opt_long_list_entries = 0;
 int opt_reboot = 0;
@@ -394,6 +395,7 @@ static struct functable net_func[] = {
                                opt_have_ip = True;
                        break;
                case 'U':
+                       opt_user_specified = True;
                        opt_user_name = strdup(opt_user_name);
                        p = strchr(opt_user_name,'%');
                        if (p) {
index fec31c6ea3f8e07cc3257080b47366158397eee2..ae7bf5d446729a41a754088bbadf10015432b806 100644 (file)
@@ -75,8 +75,12 @@ static ADS_STRUCT *ads_startup(void)
 {
        ADS_STRUCT *ads;
        ADS_STATUS status;
+       BOOL need_password = False;
+       BOOL second_time = False;
        extern char *opt_password;
        extern char *opt_user_name;
+       extern BOOL opt_user_specified;
+
 
        ads = ads_init(NULL, NULL, NULL, NULL);
 
@@ -84,19 +88,30 @@ static ADS_STRUCT *ads_startup(void)
                opt_user_name = "administrator";
        }
 
-       if (!opt_password) {
+       if (opt_user_specified)
+               need_password = True;
+
+retry:
+       if (!opt_password && need_password) {
                char *prompt;
                asprintf(&prompt,"%s password: ", opt_user_name);
                opt_password = getpass(prompt);
                free(prompt);
+               ads->password = strdup(opt_password);
        }
-       ads->password = strdup(opt_password);
+
        ads->user_name = strdup(opt_user_name);
 
        status = ads_connect(ads);
        if (!ADS_ERR_OK(status)) {
-               d_printf("ads_connect: %s\n", ads_errstr(status));
-               return NULL;
+               if (!need_password && !second_time) {
+                       need_password = True;
+                       second_time = True;
+                       goto retry;
+               } else {
+                       d_printf("ads_connect: %s\n", ads_errstr(status));
+                       return NULL;
+               }
        }
        return ads;
 }