diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/rpc_client/cli_netlogon.c | 72 | ||||
-rw-r--r-- | source3/rpc_client/cli_pipe.c | 21 |
2 files changed, 76 insertions, 17 deletions
diff --git a/source3/rpc_client/cli_netlogon.c b/source3/rpc_client/cli_netlogon.c index 188390ae54..6f0d7e1c3a 100644 --- a/source3/rpc_client/cli_netlogon.c +++ b/source3/rpc_client/cli_netlogon.c @@ -580,6 +580,8 @@ addresses. Cannot add to ourselves.\n", remote_machine)); cli.protocol = PROTOCOL_NT1; + pwd_set_nullpwd(&cli.pwd); + if (!cli_establish_connection(&cli, remote_machine, &cli.dest_ip, &calling, &called, "IPC$", "IPC", False, True)) @@ -752,3 +754,73 @@ BOOL do_sam_sync(struct cli_state *cli, return True; } + +BOOL synchronise_passdb(void) +{ + struct cli_state cli; + SAM_DELTA_HDR hdr_deltas[MAX_SAM_DELTAS]; + SAM_DELTA_CTR deltas[MAX_SAM_DELTAS]; + uint32 num; + + SAM_ACCOUNT_INFO *acc; + struct smb_passwd pwd; + fstring nt_name; + unsigned char smb_passwd[16]; + unsigned char smb_nt_passwd[16]; + + char *mode; + BOOL success; + BOOL ret; + int i; + + if (!cli_connect_serverlist(&cli, lp_passwordserver())) + { + return False; + } + + pstrcpy(cli.domain, lp_workgroup()); + + ret = do_sam_sync(&cli, hdr_deltas, deltas, &num); + + if (ret) + { + for (i = 0; i < num; i++) + { + /* Currently only interested in accounts */ + if (hdr_deltas[i].type != 5) + { + continue; + } + + acc = &deltas[i].account_info; + pwdb_init_smb(&pwd); + + pwd.user_rid = acc->user_rid; + unistr2_to_ascii(nt_name, &(acc->uni_acct_name), sizeof(fstring)-1); + pwd.nt_name = nt_name; + pwd.acct_ctrl = acc->acb_info; + pwd.pass_last_set_time = nt_time_to_unix(&(acc->pwd_last_set_time)); + + sam_pwd_hash(acc->user_rid, smb_passwd, acc->pass.buf_lm_pwd, 0); + sam_pwd_hash(acc->user_rid, smb_nt_passwd, acc->pass.buf_nt_pwd, 0); + pwd.smb_passwd = smb_passwd; + pwd.smb_nt_passwd = smb_nt_passwd; + + mode = "modify"; + success = mod_smbpwd_entry(&pwd, True); + + if (!success) + { + mode = "add"; + success = add_smbpwd_entry(&pwd); + } + + DEBUG(0, ("Attempted to %s account for %s: %s\n", mode, + nt_name, success ? "OK" : "FAILED")); + } + } + + cli_ulogoff(&cli); + cli_shutdown(&cli); + return ret; +} diff --git a/source3/rpc_client/cli_pipe.c b/source3/rpc_client/cli_pipe.c index 54ddac6f78..c8f2593858 100644 --- a/source3/rpc_client/cli_pipe.c +++ b/source3/rpc_client/cli_pipe.c @@ -51,13 +51,10 @@ static BOOL rpc_read(struct cli_state *cli, uint16 nt_pipe_fnum, uint32 rdata_offset) { int size = cli->max_recv_frag; - int file_offset = rdata_offset; + int file_offset = 0; int num_read; char *data; - uint32 err; - uint32 new_data_size = rdata->data->data_used + data_to_read; - - file_offset -= rdata_offset; + uint32 new_data_size = rdata_offset + data_to_read; DEBUG(5,("rpc_read: data_to_read: %d data offset: %d file offset: %d\n", data_to_read, rdata_offset, file_offset)); @@ -75,14 +72,6 @@ static BOOL rpc_read(struct cli_state *cli, uint16 nt_pipe_fnum, if (size > data_to_read) size = data_to_read; - new_data_size = rdata->data->data_used + size; - - if (new_data_size > rdata->data->data_size) - { - mem_grow_data(&rdata->data, True, new_data_size, True); - DEBUG(5,("rpc_read: grow buffer to %d\n", rdata->data->data_used)); - } - num_read = cli_read(cli, nt_pipe_fnum, data, file_offset, size); DEBUG(5,("rpc_read: read offset: %d read: %d to read: %d\n", @@ -92,13 +81,11 @@ static BOOL rpc_read(struct cli_state *cli, uint16 nt_pipe_fnum, file_offset += num_read; data += num_read; - if (cli_error(cli, NULL, &err)) return False; + if (cli_error(cli, NULL, NULL)) return False; } while (num_read > 0 && data_to_read > 0); - /* && err == (0x80000000 | STATUS_BUFFER_OVERFLOW)); */ - mem_realloc_data(rdata->data, file_offset + rdata_offset); - rdata->data->offset.end = file_offset + rdata_offset; + rdata->data->offset.end = new_data_size; DEBUG(5,("rpc_read: offset end: 0x%x. data left to read:0x%x\n", rdata->data->offset.end, data_to_read)); |