mirror of
https://github.com/samba-team/samba.git
synced 2025-03-04 16:58:42 +03:00
BDC support.
Added synchronise_passdb function to update accounts in a BDC's smbpasswd. Improved rpc_read, which was still somewhat broken for multiple PDU's. modify_trust_password must initialise cli.pwd (pwd_set_nullpwd).
This commit is contained in:
parent
f0c71a804d
commit
4783ac3968
source/rpc_client
@ -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;
|
||||
}
|
||||
|
@ -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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user