1
0
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:
Matthew Chapman -
parent f0c71a804d
commit 4783ac3968
2 changed files with 76 additions and 17 deletions
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));