summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/rpc_client/cli_netlogon.c72
-rw-r--r--source3/rpc_client/cli_pipe.c21
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));