mirror of
https://github.com/samba-team/samba.git
synced 2025-03-05 20:58:40 +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
@ -580,6 +580,8 @@ addresses. Cannot add to ourselves.\n", remote_machine));
|
|||||||
|
|
||||||
cli.protocol = PROTOCOL_NT1;
|
cli.protocol = PROTOCOL_NT1;
|
||||||
|
|
||||||
|
pwd_set_nullpwd(&cli.pwd);
|
||||||
|
|
||||||
if (!cli_establish_connection(&cli, remote_machine, &cli.dest_ip,
|
if (!cli_establish_connection(&cli, remote_machine, &cli.dest_ip,
|
||||||
&calling, &called,
|
&calling, &called,
|
||||||
"IPC$", "IPC", False, True))
|
"IPC$", "IPC", False, True))
|
||||||
@ -752,3 +754,73 @@ BOOL do_sam_sync(struct cli_state *cli,
|
|||||||
|
|
||||||
return True;
|
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)
|
uint32 rdata_offset)
|
||||||
{
|
{
|
||||||
int size = cli->max_recv_frag;
|
int size = cli->max_recv_frag;
|
||||||
int file_offset = rdata_offset;
|
int file_offset = 0;
|
||||||
int num_read;
|
int num_read;
|
||||||
char *data;
|
char *data;
|
||||||
uint32 err;
|
uint32 new_data_size = rdata_offset + data_to_read;
|
||||||
uint32 new_data_size = rdata->data->data_used + data_to_read;
|
|
||||||
|
|
||||||
file_offset -= rdata_offset;
|
|
||||||
|
|
||||||
DEBUG(5,("rpc_read: data_to_read: %d data offset: %d file offset: %d\n",
|
DEBUG(5,("rpc_read: data_to_read: %d data offset: %d file offset: %d\n",
|
||||||
data_to_read, rdata_offset, file_offset));
|
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)
|
if (size > data_to_read)
|
||||||
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);
|
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",
|
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;
|
file_offset += num_read;
|
||||||
data += 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);
|
} 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 = new_data_size;
|
||||||
rdata->data->offset.end = file_offset + rdata_offset;
|
|
||||||
|
|
||||||
DEBUG(5,("rpc_read: offset end: 0x%x. data left to read:0x%x\n",
|
DEBUG(5,("rpc_read: offset end: 0x%x. data left to read:0x%x\n",
|
||||||
rdata->data->offset.end, data_to_read));
|
rdata->data->offset.end, data_to_read));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user