r10656: BIG merge from trunk. Features not copied over
[nivanova/samba-autobuild/.git] / source3 / smbd / change_trust_pw.c
index e4a7fbae6b7f5419625c0f29e81fc368a5cb2418..738d12151db5252a33972a60878ff3d5d82d28d5 100644 (file)
 
 #include "includes.h"
 
-/*********************************************************
- Change the domain password on the PDC.
-**********************************************************/
+/************************************************************************
+ Change the trust account password for a domain.
+************************************************************************/
 
-static NTSTATUS modify_trust_password( const char *domain, const char *remote_machine, 
-                                  unsigned char orig_trust_passwd_hash[16])
+NTSTATUS change_trust_account_password( const char *domain, const char *remote_machine)
 {
-  struct cli_state *cli;
-  DOM_SID domain_sid;
-  NTSTATUS nt_status;
-
-  /*
-   * Ensure we have the domain SID for this domain.
-   */
-
-  if (!secrets_fetch_domain_sid(domain, &domain_sid)) {
-    DEBUG(0, ("modify_trust_password: unable to fetch domain sid.\n"));
-    return NT_STATUS_UNSUCCESSFUL;
-  }
-
-  if (!NT_STATUS_IS_OK(cli_full_connection(&cli, global_myname(), remote_machine, 
+       NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
+       struct in_addr pdc_ip;
+       fstring dc_name;
+       struct cli_state *cli = NULL;
+       struct rpc_pipe_client *netlogon_pipe = NULL;
+
+       DEBUG(5,("change_trust_account_password: Attempting to change trust account password in domain %s....\n",
+               domain));
+
+       if (remote_machine == NULL || !strcmp(remote_machine, "*")) {
+               /* Use the PDC *only* for this */
+       
+               if ( !get_pdc_ip(domain, &pdc_ip) ) {
+                       DEBUG(0,("Can't get IP for PDC for domain %s\n", domain));
+                       goto failed;
+               }
+
+               if ( !name_status_find( domain, 0x1b, 0x20, pdc_ip, dc_name) )
+                       goto failed;
+       } else {
+               /* supoport old deprecated "smbpasswd -j DOMAIN -r MACHINE" behavior */
+               fstrcpy( dc_name, remote_machine );
+       }
+       
+       /* if this next call fails, then give up.  We can't do
+          password changes on BDC's  --jerry */
+          
+       if (!NT_STATUS_IS_OK(cli_full_connection(&cli, global_myname(), dc_name, 
                                           NULL, 0,
                                           "IPC$", "IPC",  
                                           "", "",
-                                          "", 0, NULL))) {
-         DEBUG(0,("modify_trust_password: Connection to %s failed!\n", remote_machine));
-         return NT_STATUS_UNSUCCESSFUL;
-  }
+                                          "", 0, Undefined, NULL))) {
+               DEBUG(0,("modify_trust_password: Connection to %s failed!\n", dc_name));
+               nt_status = NT_STATUS_UNSUCCESSFUL;
+               goto failed;
+       }
       
-  /*
-   * Ok - we have an anonymous connection to the IPC$ share.
-   * Now start the NT Domain stuff :-).
-   */
-
-  if(cli_nt_session_open(cli, PI_NETLOGON) == False) {
-    DEBUG(0,("modify_trust_password: unable to open the domain client session to \
-machine %s. Error was : %s.\n", remote_machine, cli_errstr(cli)));
-    cli_nt_session_close(cli);
-    cli_ulogoff(cli);
-    cli_shutdown(cli);
-    return NT_STATUS_UNSUCCESSFUL;
-  } 
-
-  nt_status = trust_pw_change_and_store_it(cli, cli->mem_ctx,
-                                          orig_trust_passwd_hash);
+       /*
+        * Ok - we have an anonymous connection to the IPC$ share.
+        * Now start the NT Domain stuff :-).
+        */
+
+       /* Shouldn't we open this with schannel ? JRA. */
+
+       netlogon_pipe = cli_rpc_pipe_open_noauth(cli, PI_NETLOGON, &nt_status);
+       if (!netlogon_pipe) {
+               DEBUG(0,("modify_trust_password: unable to open the domain client session to machine %s. Error was : %s.\n", 
+                       dc_name, nt_errstr(nt_status)));
+               cli_shutdown(cli);
+               goto failed;
+       }
+
+       nt_status = trust_pw_find_change_and_store_it(netlogon_pipe, cli->mem_ctx, domain);
   
-  cli_nt_session_close(cli);
-  cli_ulogoff(cli);
-  cli_shutdown(cli);
-  return nt_status;
-}
-
-/************************************************************************
- Change the trust account password for a domain.
-************************************************************************/
-
-NTSTATUS change_trust_account_password( const char *domain, const char *remote_machine_list)
-{
-  fstring remote_machine;
-  unsigned char old_trust_passwd_hash[16];
-  time_t lct;
-  NTSTATUS res = NT_STATUS_UNSUCCESSFUL;
-
-  if(!secrets_fetch_trust_account_password(domain, old_trust_passwd_hash, &lct)) {
-    DEBUG(0,("change_trust_account_password: unable to read the machine \
-account password for domain %s.\n", domain));
-    return NT_STATUS_UNSUCCESSFUL;
-  }
-
-  while(remote_machine_list && 
-       next_token(&remote_machine_list, remote_machine, 
-                  LIST_SEP, sizeof(remote_machine))) {
-    strupper(remote_machine);
-    if(strequal(remote_machine, "*")) {
-
-      /*
-       * We have been asked to dynamcially determine the IP addresses of the PDC.
-       */
-
-      struct in_addr pdc_ip;
-      fstring dc_name;
-
-      /* Use the PDC *only* for this. */
-      if(!get_pdc_ip(domain, &pdc_ip))
-        continue;
-
-      /*
-       * Try and connect to the PDC/BDC list in turn as an IP
-       * address used as a string.
-       */
-
-        if(!lookup_dc_name(global_myname(), domain, &pdc_ip, dc_name))
-          continue;
-        if(NT_STATUS_IS_OK(res = modify_trust_password( domain, dc_name,
-                                         old_trust_passwd_hash)))
-          break;
-
-    } else {
-           res = modify_trust_password( domain, remote_machine,
-                                        old_trust_passwd_hash);
-    }
-
-  }
-
-  if (!NT_STATUS_IS_OK(res)) {
-         DEBUG(0,("%s : change_trust_account_password: Failed to change password for \
-domain %s.\n", timestring(False), domain));
-  }
+       cli_shutdown(cli);
+       
+failed:
+       if (!NT_STATUS_IS_OK(nt_status)) {
+               DEBUG(0,("%s : change_trust_account_password: Failed to change password for domain %s.\n", 
+                       timestring(False), domain));
+       }
+       else
+               DEBUG(5,("change_trust_account_password: sucess!\n"));
   
-  return res;
+       return nt_status;
 }