The branch, v3-0-test has been updated
       via  09145720b510647e7c24e3062a4a1246cc7bff5b (commit)
       via  84fbac51ffc5f4a8a4f7b1baf5e9b1af174505f5 (commit)
       via  a5b913dd31cc3c4d01458e6fcc0a03852a2738a2 (commit)
       via  15fe1a3fa07493060a0155bd4f9f0f9bd1588d50 (commit)
      from  91dcce0e4deb87c6d5e491eb9dbb09fd04981d28 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-0-test


- Log -----------------------------------------------------------------
commit 09145720b510647e7c24e3062a4a1246cc7bff5b
Author: Günther Deschner <[EMAIL PROTECTED]>
Date:   Fri Aug 29 00:06:09 2008 +0200

    net: net should just use machine account creds when changing passwords.
    
    Guenther

commit 84fbac51ffc5f4a8a4f7b1baf5e9b1af174505f5
Author: Günther Deschner <[EMAIL PROTECTED]>
Date:   Fri Aug 29 00:05:32 2008 +0200

    Backport bugfix for bug #5710.
    
    In order to successfully update a machine account password we need to use
    Netlogon ServerPasswordSet2 when NETLOGON_NEG_PASSWORD_SET2 has been 
negotiated.
    
    Guenther

commit a5b913dd31cc3c4d01458e6fcc0a03852a2738a2
Author: Günther Deschner <[EMAIL PROTECTED]>
Date:   Fri Aug 29 00:02:54 2008 +0200

    netlogon: "re-run make idl" - implement netr_ServerPasswordSet2 client.
    
    Guenther

commit 15fe1a3fa07493060a0155bd4f9f0f9bd1588d50
Author: Günther Deschner <[EMAIL PROTECTED]>
Date:   Fri Aug 29 00:01:45 2008 +0200

    netlogon: define NET_SRVPWSET2 call.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 source/include/rpc_dce.h         |    2 +
 source/include/rpc_netlogon.h    |   18 ++++++++
 source/libsmb/trusts_util.c      |   28 +++++++------
 source/rpc_client/cli_netlogon.c |   50 +++++++++++++++++++++++
 source/rpc_parse/parse_net.c     |   80 ++++++++++++++++++++++++++++++++++++++
 source/utils/net_rpc.c           |    2 +
 6 files changed, 167 insertions(+), 13 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/include/rpc_dce.h b/source/include/rpc_dce.h
index ad5fb68..abc11ce 100644
--- a/source/include/rpc_dce.h
+++ b/source/include/rpc_dce.h
@@ -104,6 +104,8 @@ enum RPC_PKT_TYPE {
 #define NETLOGON_NEG_128BIT                    0x00004000
 #define NETLOGON_NEG_SCHANNEL                  0x40000000
 
+#define NETLOGON_NEG_PASSWORD_SET2             0x00020000
+
 /* The 7 here seems to be required to get Win2k not to downgrade us
    to NT4.  Actually, anything other than 1ff would seem to do... */
 #define NETLOGON_NEG_AUTH2_FLAGS 0x000701ff
diff --git a/source/include/rpc_netlogon.h b/source/include/rpc_netlogon.h
index 324755a..b4b014d 100644
--- a/source/include/rpc_netlogon.h
+++ b/source/include/rpc_netlogon.h
@@ -42,6 +42,7 @@
 #define NET_AUTH3              0x1a
 #define NET_DSR_GETDCNAMEEX    0x1b
 #define NET_DSR_GETSITENAME    0x1c
+#define NET_SRVPWSET2          0x1e
 #define NET_DSR_GETDCNAMEEX2   0x22
 #define NET_SAMLOGON_EX                0x27
 
@@ -530,6 +531,23 @@ typedef struct net_r_srv_pwset_info {
        NTSTATUS status; /* return code */
 } NET_R_SRV_PWSET;
 
+typedef struct net_crypt_password {
+        uint8_t data[512];
+        uint32_t length;
+} NET_CRYPT_PWD;
+
+/* NET_Q_SRV_PWSET2 */
+typedef struct net_q_srv_pwset2_info {
+       DOM_CLNT_INFO clnt_id; /* client identification/authentication info */
+       NET_CRYPT_PWD pwd; /* new password */
+} NET_Q_SRV_PWSET2;
+
+/* NET_R_SRV_PWSET2 */
+typedef struct net_r_srv_pwset2_info {
+       DOM_CRED srv_cred;     /* server-calculated credentials */
+       NTSTATUS status; /* return code */
+} NET_R_SRV_PWSET2;
+
 /* NET_ID_INFO_2 */
 typedef struct net_network_info_2 {
        uint32            ptr_id_info2;        /* pointer to id_info_2 */
diff --git a/source/libsmb/trusts_util.c b/source/libsmb/trusts_util.c
index bd6bbfe..257d04e 100644
--- a/source/libsmb/trusts_util.c
+++ b/source/libsmb/trusts_util.c
@@ -32,18 +32,14 @@
 
 static NTSTATUS just_change_the_password(struct rpc_pipe_client *cli, 
TALLOC_CTX *mem_ctx, 
                                         const unsigned char 
orig_trust_passwd_hash[16],
+                                        const char *new_trust_pwd_cleartext,
                                         const unsigned char 
new_trust_passwd_hash[16],
                                         uint32 sec_channel_type)
 {
        NTSTATUS result;
+       uint32_t neg_flags = NETLOGON_NEG_AUTH2_ADS_FLAGS;
 
-       /* Check if the netlogon pipe is open using schannel. If so we
-          already have valid creds. If not we must set them up. */
-
-       if (cli->auth.auth_type != PIPE_AUTH_TYPE_SCHANNEL) {
-               uint32_t neg_flags = NETLOGON_NEG_AUTH2_ADS_FLAGS;
-
-               result = rpccli_netlogon_setup_creds(cli, 
+       result = rpccli_netlogon_setup_creds(cli,
                                        cli->cli->desthost, /* server name */
                                        lp_workgroup(), /* domain */
                                        global_myname(), /* client name */
@@ -52,14 +48,19 @@ static NTSTATUS just_change_the_password(struct 
rpc_pipe_client *cli, TALLOC_CTX
                                        sec_channel_type,
                                        &neg_flags);
 
-               if (!NT_STATUS_IS_OK(result)) {
-                       DEBUG(3,("just_change_the_password: unable to setup 
creds (%s)!\n",
-                                nt_errstr(result)));
-                       return result;
-               }
+       if (!NT_STATUS_IS_OK(result)) {
+               DEBUG(3,("just_change_the_password: unable to setup creds 
(%s)!\n",
+                        nt_errstr(result)));
+               return result;
        }
 
-       result = rpccli_net_srv_pwset(cli, mem_ctx, global_myname(), 
new_trust_passwd_hash);
+       if (neg_flags & NETLOGON_NEG_PASSWORD_SET2) {
+               result = rpccli_net_srv_pwset2(cli, mem_ctx, global_myname(),
+                                              new_trust_pwd_cleartext);
+       } else {
+               result = rpccli_net_srv_pwset(cli, mem_ctx, global_myname(),
+                                             new_trust_passwd_hash);
+       }
 
        if (!NT_STATUS_IS_OK(result)) {
                DEBUG(0,("just_change_the_password: unable to change password 
(%s)!\n",
@@ -95,6 +96,7 @@ NTSTATUS trust_pw_change_and_store_it(struct rpc_pipe_client 
*cli, TALLOC_CTX *m
        E_md4hash(new_trust_passwd, new_trust_passwd_hash);
 
        nt_status = just_change_the_password(cli, mem_ctx, 
orig_trust_passwd_hash,
+                                            new_trust_passwd,
                                             new_trust_passwd_hash, 
sec_channel_type);
        
        if (NT_STATUS_IS_OK(nt_status)) {
diff --git a/source/rpc_client/cli_netlogon.c b/source/rpc_client/cli_netlogon.c
index fb8c5cf..3c77597 100644
--- a/source/rpc_client/cli_netlogon.c
+++ b/source/rpc_client/cli_netlogon.c
@@ -1082,3 +1082,53 @@ NTSTATUS rpccli_net_srv_pwset(struct rpc_pipe_client 
*cli, TALLOC_CTX *mem_ctx,
 
        return result;
 }
+
+/***************************************************************************
+LSA Server Password Set2.
+****************************************************************************/
+
+NTSTATUS rpccli_net_srv_pwset2(struct rpc_pipe_client *cli,
+                              TALLOC_CTX *mem_ctx,
+                              const char *machine_name,
+                              const char *clear_text_mach_pwd)
+{
+       prs_struct rbuf;
+       prs_struct qbuf;
+       DOM_CRED clnt_creds;
+       NET_Q_SRV_PWSET2 q;
+       NET_R_SRV_PWSET2 r;
+       uint16 sec_chan_type = 2;
+       NTSTATUS result;
+
+       creds_client_step(cli->dc, &clnt_creds);
+
+       DEBUG(4,("cli_net_srv_pwset2: srv:%s acct:%s sc: %d mc: %s\n",
+                cli->dc->remote_machine, cli->dc->mach_acct, sec_chan_type, 
machine_name));
+
+        /* store the parameters */
+       init_q_srv_pwset2(&q, cli->dc->remote_machine, (const char 
*)cli->dc->sess_key,
+                         cli->dc->mach_acct, sec_chan_type, machine_name,
+                         &clnt_creds, clear_text_mach_pwd);
+
+       CLI_DO_RPC(cli, mem_ctx, PI_NETLOGON, NET_SRVPWSET2,
+               q, r,
+               qbuf, rbuf,
+               net_io_q_srv_pwset2,
+               net_io_r_srv_pwset2,
+               NT_STATUS_UNSUCCESSFUL);
+
+       result = r.status;
+
+       if (!NT_STATUS_IS_OK(result)) {
+               /* report error code */
+               DEBUG(0,("cli_net_srv_pwset2: %s\n", nt_errstr(result)));
+       }
+
+       /* Always check returned credentials. */
+       if (!creds_client_check(cli->dc, &r.srv_cred.challenge)) {
+               DEBUG(0,("rpccli_net_srv_pwset2: credentials chain check 
failed\n"));
+               return NT_STATUS_ACCESS_DENIED;
+       }
+
+       return result;
+}
diff --git a/source/rpc_parse/parse_net.c b/source/rpc_parse/parse_net.c
index 693de2d..708f5ba 100644
--- a/source/rpc_parse/parse_net.c
+++ b/source/rpc_parse/parse_net.c
@@ -996,6 +996,86 @@ BOOL net_io_r_srv_pwset(const char *desc, NET_R_SRV_PWSET 
*r_s, prs_struct *ps,
        return True;
 }
 
+/*******************************************************************
+ Inits a NET_Q_SRV_PWSET2.
+********************************************************************/
+
+void init_q_srv_pwset2(NET_Q_SRV_PWSET2 *q_s,
+                      const char *logon_srv,
+                      const char *sess_key,
+                      const char *acct_name,
+                      uint16 sec_chan,
+                      const char *comp_name,
+                      DOM_CRED *cred,
+                      const char *clear_text_mach_pwd)
+{
+       uint8_t password_buf[516];
+       NET_CRYPT_PWD new_password;
+
+       DEBUG(5,("init_q_srv_pwset2\n"));
+
+       /* Process the new password. */
+
+       encode_pw_buffer(password_buf, clear_text_mach_pwd, STR_UNICODE);
+
+       SamOEMhash(password_buf, (const unsigned char *)sess_key, 516);
+       memcpy(new_password.data, password_buf, 512);
+       new_password.length = IVAL(password_buf, 512);
+
+       init_clnt_info(&q_s->clnt_id, logon_srv, acct_name, sec_chan, 
comp_name, cred);
+
+       memcpy(&q_s->pwd, &new_password, sizeof(q_s->pwd));
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL net_io_q_srv_pwset2(const char *desc, NET_Q_SRV_PWSET2 *q_s, prs_struct 
*ps, int depth)
+{
+       if (q_s == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "net_io_q_srv_pwset2");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!smb_io_clnt_info("", &q_s->clnt_id, ps, depth)) /* client 
identification/authentication info */
+               return False;
+       if(!prs_uint8s(False, "pwd.data", ps, depth, q_s->pwd.data, 516)) /* 
new password - undocumented */
+               return False;
+       if(!prs_uint32("pwd.length", ps, depth, &q_s->pwd.length)) /* new 
password - undocumented */
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL net_io_r_srv_pwset2(const char *desc, NET_R_SRV_PWSET2 *r_s, prs_struct 
*ps, int depth)
+{
+       if (r_s == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "net_io_r_srv_pwset2");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!smb_io_cred("", &r_s->srv_cred, ps, depth)) /* server challenge */
+               return False;
+
+       if(!prs_ntstatus("status", ps, depth, &r_s->status))
+               return False;
+
+       return True;
+}
+
 /*************************************************************************
  Init DOM_SID2 array from a string containing multiple sids
  *************************************************************************/
diff --git a/source/utils/net_rpc.c b/source/utils/net_rpc.c
index 4b77db9..54ebd7b 100644
--- a/source/utils/net_rpc.c
+++ b/source/utils/net_rpc.c
@@ -227,6 +227,8 @@ static NTSTATUS rpc_changetrustpw_internals(const DOM_SID 
*domain_sid,
 
 int net_rpc_changetrustpw(int argc, const char **argv) 
 {
+       net_use_machine_account();
+
        return run_rpc_command(NULL, PI_NETLOGON, NET_FLAGS_ANONYMOUS | 
NET_FLAGS_PDC, 
                               rpc_changetrustpw_internals,
                               argc, argv);


-- 
Samba Shared Repository

Reply via email to