const char *domain,
const char *myhostname,
const char *trust_acct,
- const uchar trust_pwd[16], uint16 sec_chan);
+ const uchar trust_pwd[16], uint16 sec_chan,
+ uint16 *validation_level);
BOOL cli_nt_srv_pwset(const char *srv_name, const char *myhostname,
const char *trust_acct,
const uchar * new_hashof_trust_pwd, uint16 sec_chan);
const char *domain, const char *username,
uint32 luid_low,
const char *general,
- NET_ID_INFO_CTR * ctr, NET_USER_INFO_3 * user_info3);
+ NET_ID_INFO_CTR * ctr,
+ uint16 validation_level,
+ NET_USER_INFO_3 * user_info3);
uint32 cli_nt_login_interactive(const char *srv_name, const char *myhostname,
- const char *domain, const char *username,
- uint32 luid_low,
- const uchar * lm_owf_user_pwd,
- const uchar * nt_owf_user_pwd,
- NET_ID_INFO_CTR * ctr,
- NET_USER_INFO_3 * user_info3);
+ const char *domain, const char *username,
+ uint32 luid_low,
+ const uchar * lm_owf_user_pwd,
+ const uchar * nt_owf_user_pwd,
+ NET_ID_INFO_CTR * ctr,
+ uint16 validation_level,
+ NET_USER_INFO_3 * user_info3);
uint32 cli_nt_login_network(const char *srv_name, const char *myhostname,
- const char *domain, const char *username,
- uint32 luid_low, const char lm_chal[8],
- const char *lm_chal_resp,
- int lm_chal_len,
- const char *nt_chal_resp,
- int nt_chal_len,
- NET_ID_INFO_CTR * ctr, NET_USER_INFO_3 * user_info3);
+ const char *domain, const char *username,
+ uint32 luid_low, const char lm_chal[8],
+ const char *lm_chal_resp,
+ int lm_chal_len,
+ const char *nt_chal_resp,
+ int nt_chal_len,
+ NET_ID_INFO_CTR * ctr,
+ uint16 validation_level,
+ NET_USER_INFO_3 * user_info3);
BOOL cli_nt_logoff(const char *srv_name, const char *myhostname,
NET_ID_INFO_CTR * ctr);
BOOL net_sam_sync(const char *srv_name,
/*The following definitions come from smbd/reply.c */
-int reply_special(char *inbuf,char *outbuf);
-int reply_tcon(connection_struct *conn,
- char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_tcon_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize);
-int reply_unknown(char *inbuf,char *outbuf);
-int reply_ioctl(connection_struct *conn,
- char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize);
-int reply_chkpth(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_getatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_setatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_dskattr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_fclose(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_open(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize);
-int reply_ulogoffX(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize);
-int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_ctemp(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_unlink(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_size, int dum_buffsize);
-int reply_lockread(connection_struct *conn, char *inbuf,char *outbuf, int length, int dum_buffsiz);
-int reply_read(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_read_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize);
-int reply_writebraw(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_writeunlock(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_write(connection_struct *conn, char *inbuf,char *outbuf,int dum_size,int dum_buffsize);
-int reply_write_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize);
-int reply_lseek(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_flush(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_exit(connection_struct *conn,
- char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_close(connection_struct *conn,
- char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_writeclose(connection_struct *conn,
- char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_lock(connection_struct *conn,
- char *inbuf,char *outbuf, int length, int dum_buffsize);
-int reply_unlock(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_tdis(connection_struct *conn,
- char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_echo(connection_struct *conn,
- char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_printopen(connection_struct *conn,
- char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_printclose(connection_struct *conn,
- char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_printqueue(connection_struct *conn,
- char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_printwrite(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_mkdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_rmdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int rename_internals(connection_struct *conn,
- char *inbuf, char *outbuf, char *name,
+int reply_special(char *inbuf, char *outbuf);
+int reply_tcon(connection_struct * conn,
+ char *inbuf, char *outbuf, int dum_size, int dum_buffsize);
+int reply_tcon_and_X(connection_struct * conn, char *inbuf, char *outbuf,
+ int length, int bufsize);
+int reply_unknown(char *inbuf, char *outbuf);
+int reply_ioctl(connection_struct * conn,
+ char *inbuf, char *outbuf, int dum_size, int dum_buffsize);
+int reply_sesssetup_and_X(connection_struct * conn, char *inbuf, char *outbuf,
+ int length, int bufsize);
+int reply_chkpth(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_getatr(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_setatr(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_dskattr(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_search(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_fclose(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_open(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_open_and_X(connection_struct * conn, char *inbuf, char *outbuf,
+ int length, int bufsize);
+int reply_ulogoffX(connection_struct * conn, char *inbuf, char *outbuf,
+ int length, int bufsize);
+int reply_mknew(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_ctemp(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_unlink(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_readbraw(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_lockread(connection_struct * conn, char *inbuf, char *outbuf,
+ int length, int dum_buffsiz);
+int reply_read(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_read_and_X(connection_struct * conn, char *inbuf, char *outbuf,
+ int length, int bufsize);
+int reply_writebraw(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_writeunlock(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_write(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_write_and_X(connection_struct * conn, char *inbuf, char *outbuf,
+ int length, int bufsize);
+int reply_lseek(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_flush(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_exit(connection_struct * conn,
+ char *inbuf, char *outbuf, int dum_size, int dum_buffsize);
+int reply_close(connection_struct * conn,
+ char *inbuf, char *outbuf, int dum_size, int dum_buffsize);
+int reply_writeclose(connection_struct * conn,
+ char *inbuf, char *outbuf, int dum_size,
+ int dum_buffsize);
+int reply_lock(connection_struct * conn,
+ char *inbuf, char *outbuf, int length, int dum_buffsize);
+int reply_unlock(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_tdis(connection_struct * conn,
+ char *inbuf, char *outbuf, int dum_size, int dum_buffsize);
+int reply_echo(connection_struct * conn,
+ char *inbuf, char *outbuf, int dum_size, int dum_buffsize);
+int reply_printopen(connection_struct * conn,
+ char *inbuf, char *outbuf, int dum_size, int dum_buffsize);
+int reply_printclose(connection_struct * conn,
+ char *inbuf, char *outbuf, int dum_size,
+ int dum_buffsize);
+int reply_printqueue(connection_struct * conn,
+ char *inbuf, char *outbuf, int dum_size,
+ int dum_buffsize);
+int reply_printwrite(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_mkdir(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_rmdir(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int rename_internals(connection_struct * conn,
+ char *inbuf, char *outbuf, char *name,
char *newname, BOOL replace_if_exists);
-int reply_mv(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_setdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_lockingX(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize);
-int reply_readbmpx(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize);
-int reply_writebmpx(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_writebs(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_setattrE(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_getattrE(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
+int reply_mv(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_copy(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_setdir(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_lockingX(connection_struct * conn, char *inbuf, char *outbuf,
+ int length, int bufsize);
+int reply_readbmpx(connection_struct * conn, char *inbuf, char *outbuf,
+ int length, int bufsize);
+int reply_writebmpx(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_writebs(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_setattrE(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
+int reply_getattrE(connection_struct * conn, char *inbuf, char *outbuf,
+ int dum_size, int dum_buffsize);
/*The following definitions come from smbd/server.c */
const char *domain,
const char *myhostname,
const char *trust_acct,
- const uchar trust_pwd[16], uint16 sec_chan)
+ const uchar trust_pwd[16], uint16 sec_chan,
+ uint16 * validation_level)
{
DOM_CHAL clnt_chal;
DOM_CHAL srv_chal;
generate_random_buffer(clnt_chal.data, 8, False);
/* send a client challenge; receive a server challenge */
- status = cli_net_req_chal(srv_name, myhostname, &clnt_chal, &srv_chal);
+ status =
+ cli_net_req_chal(srv_name, myhostname, &clnt_chal, &srv_chal);
if (status != 0)
{
DEBUG(1, ("cli_nt_setup_creds: request challenge failed\n"));
* Receive an auth-2 challenge response and check it.
*/
status = cli_net_auth2(srv_name, trust_acct, myhostname,
- sec_chan, &neg_flags, &srv_chal);
+ sec_chan, &neg_flags, &srv_chal);
if (status != 0x0)
{
DEBUG(1,
return NT_STATUS_ACCESS_DENIED | 0xC0000000;
}
}
+
+ if (IS_BITS_SET_ALL(neg_flags, 0x40))
+ {
+ (*validation_level) = 3;
+ }
+ else
+ {
+ (*validation_level) = 2;
+ }
+
return status;
}
const char *domain, const char *username,
uint32 luid_low,
const char *general,
- NET_ID_INFO_CTR * ctr, NET_USER_INFO_3 * user_info3)
+ NET_ID_INFO_CTR * ctr,
+ uint16 validation_level,
+ NET_USER_INFO_3 * user_info3)
{
uint8 sess_key[16];
NET_USER_INFO_CTR user_ctr;
uint32 status;
- user_ctr.switch_value = 2;
+ user_ctr.switch_value = validation_level;
DEBUG(5, ("cli_nt_login_general: %d\n", __LINE__));
given the current design of the NT Domain system. JRA.
****************************************************************************/
uint32 cli_nt_login_interactive(const char *srv_name, const char *myhostname,
- const char *domain, const char *username,
- uint32 luid_low,
- const uchar * lm_owf_user_pwd,
- const uchar * nt_owf_user_pwd,
- NET_ID_INFO_CTR * ctr,
- NET_USER_INFO_3 * user_info3)
+ const char *domain, const char *username,
+ uint32 luid_low,
+ const uchar * lm_owf_user_pwd,
+ const uchar * nt_owf_user_pwd,
+ NET_ID_INFO_CTR * ctr,
+ uint16 validation_level,
+ NET_USER_INFO_3 * user_info3)
{
uint32 status;
uint8 sess_key[16];
NET_USER_INFO_CTR user_ctr;
- user_ctr.switch_value = 2;
+ user_ctr.switch_value = validation_level;
DEBUG(5, ("cli_nt_login_interactive: %d\n", __LINE__));
****************************************************************************/
uint32 cli_nt_login_network(const char *srv_name, const char *myhostname,
- const char *domain, const char *username,
- uint32 luid_low, const char lm_chal[8],
- const char *lm_chal_resp,
- int lm_chal_len,
- const char *nt_chal_resp,
- int nt_chal_len,
- NET_ID_INFO_CTR * ctr, NET_USER_INFO_3 * user_info3)
+ const char *domain, const char *username,
+ uint32 luid_low, const char lm_chal[8],
+ const char *lm_chal_resp,
+ int lm_chal_len,
+ const char *nt_chal_resp,
+ int nt_chal_len,
+ NET_ID_INFO_CTR * ctr,
+ uint16 validation_level,
+ NET_USER_INFO_3 * user_info3)
{
uint8 sess_key[16];
uint32 status;
NET_USER_INFO_CTR user_ctr;
- user_ctr.switch_value = 2;
+ user_ctr.switch_value = validation_level;
DEBUG(5, ("cli_nt_login_network: %d\n", __LINE__));
SAM_DELTA_CTR deltas[MAX_SAM_DELTAS], uint32 * num_deltas)
{
BOOL res = True;
+ uint16 validation_level;
*num_deltas = 0;
res = res ? cli_nt_setup_creds(srv_name, domain, myhostname,
trust_acct,
trust_passwd,
- SEC_CHAN_BDC) == 0x0 : False;
+ SEC_CHAN_BDC,
+ &validation_level) == 0x0 : False;
memset(trust_passwd, 0, 16);
return True;
}
+/*******************************************************************
+makes a structure.
+********************************************************************/
+BOOL make_unk_info12(SAM_UNK_INFO_12 * u_12)
+{
+ if (u_12 == NULL)
+ return False;
+
+ u_12->unknown_0 = 0xcf1dcc00;
+ u_12->unknown_1 = 0xfffffffb;
+ u_12->unknown_2 = 0xcf1dcc00;
+ u_12->unknown_3 = 0xfffffffb;
+
+ u_12->unknown_4 = 0x8a880000;
+
+ return True;
+}
+
+/*******************************************************************
+reads or writes a structure.
+********************************************************************/
+static BOOL sam_io_unk_info12(char *desc, SAM_UNK_INFO_12 * u_12,
+ prs_struct * ps, int depth)
+{
+ if (u_12 == NULL)
+ return False;
+
+ prs_debug(ps, depth, desc, "sam_io_unk_info12");
+ depth++;
+
+ prs_uint32("unknown_0", ps, depth, &u_12->unknown_0);
+ prs_uint32("unknown_1", ps, depth, &u_12->unknown_1);
+ prs_uint32("unknown_2", ps, depth, &u_12->unknown_2);
+ prs_uint32("unknown_3", ps, depth, &u_12->unknown_3);
+ prs_uint32("unknown_4", ps, depth, &u_12->unknown_4);
+
+ prs_align(ps);
+
+ return True;
+}
+
/*******************************************************************
makes a structure.
********************************************************************/
prs_debug(ps, depth, desc, "sam_io_unk_info2");
depth++;
- prs_uint32("unknown_0", ps, depth, &u_2->unknown_0); /* 0x0000 0000 */
- prs_uint32("unknown_1", ps, depth, &u_2->unknown_1); /* 0x8000 0000 */
- prs_uint32("unknown_2", ps, depth, &u_2->unknown_2); /* 0x0000 0000 */
+ prs_uint32("unknown_0", ps, depth, &u_2->unknown_0); /* 0x0000 0000 */
+ prs_uint32("unknown_1", ps, depth, &u_2->unknown_1); /* 0x8000 0000 */
+ prs_uint32("unknown_2", ps, depth, &u_2->unknown_2); /* 0x0000 0000 */
- prs_uint32("ptr_0", ps, depth, &u_2->ptr_0); /* pointer to unknown structure */
- smb_io_unihdr("hdr_domain", &u_2->hdr_domain, ps, depth); /* domain name unicode header */
- smb_io_unihdr("hdr_server", &u_2->hdr_server, ps, depth); /* server name unicode header */
+ prs_uint32("ptr_0", ps, depth, &u_2->ptr_0);
+ smb_io_unihdr("hdr_domain", &u_2->hdr_domain, ps, depth);
+ smb_io_unihdr("hdr_server", &u_2->hdr_server, ps, depth);
/* put all the data in here, at the moment, including what the above
pointer is referring to
*/
- prs_uint32("seq_num ", ps, depth, &u_2->seq_num); /* 0x0000 0099 or 0x1000 0000 */
- prs_uint32("unknown_3 ", ps, depth, &u_2->unknown_3); /* 0x0000 0000 */
+ prs_uint32("seq_num ", ps, depth, &u_2->seq_num); /* 0x0000 0099 or 0x1000 0000 */
+ prs_uint32("unknown_3 ", ps, depth, &u_2->unknown_3); /* 0x0000 0000 */
- prs_uint32("unknown_4 ", ps, depth, &u_2->unknown_4); /* 0x0000 0001 */
- prs_uint32("unknown_5 ", ps, depth, &u_2->unknown_5); /* 0x0000 0003 */
- prs_uint32("unknown_6 ", ps, depth, &u_2->unknown_6); /* 0x0000 0001 */
- prs_uint32("num_domain_usrs ", ps, depth, &u_2->num_domain_usrs); /* 0x0000 0008 */
- prs_uint32("num_domain_grps", ps, depth, &u_2->num_domain_grps); /* 0x0000 0003 */
- prs_uint32("num_local_grps", ps, depth, &u_2->num_local_grps); /* 0x0000 0003 */
+ prs_uint32("unknown_4 ", ps, depth, &u_2->unknown_4); /* 0x0000 0001 */
+ prs_uint32("unknown_5 ", ps, depth, &u_2->unknown_5); /* 0x0000 0003 */
+ prs_uint32("unknown_6 ", ps, depth, &u_2->unknown_6); /* 0x0000 0001 */
+ prs_uint32("num_domain_usrs ", ps, depth, &u_2->num_domain_usrs);
+ prs_uint32("num_domain_grps", ps, depth, &u_2->num_domain_grps);
+ prs_uint32("num_local_grps", ps, depth, &u_2->num_local_grps);
- prs_uint8s(False, "padding", ps, depth, u_2->padding, sizeof(u_2->padding)); /* 12 bytes zeros */
+ prs_uint8s(False, "padding", ps, depth, u_2->padding, sizeof(u_2->padding));
smb_io_unistr2("uni_domain", &u_2->uni_domain, u_2->hdr_domain.buffer,
- ps, depth); /* domain name unicode string */
+ ps, depth);
prs_align(ps);
smb_io_unistr2("uni_server", &u_2->uni_server, u_2->hdr_server.buffer,
- ps, depth); /* server name unicode string */
+ ps, depth);
prs_align(ps);
prs_debug(ps, depth, desc, "sam_io_unk_info1");
depth++;
- prs_uint8s(False, "padding", ps, depth, u_1->padding, sizeof(u_1->padding)); /* 12 bytes zeros */
+ prs_uint8s(False, "padding", ps, depth, u_1->padding, sizeof(u_1->padding));
- prs_uint32("unknown_1", ps, depth, &u_1->unknown_1); /* 0x8000 0000 */
- prs_uint32("unknown_2", ps, depth, &u_1->unknown_2); /* 0x0000 0000 */
+ prs_uint32("unknown_1", ps, depth, &u_1->unknown_1); /* 0x8000 0000 */
+ prs_uint32("unknown_2", ps, depth, &u_1->unknown_2); /* 0x0000 0000 */
prs_align(ps);
switch (r_u->switch_value)
{
+ case 0x0c:
+ {
+ sam_io_unk_info12("unk_inf12",
+ &r_u->ctr->info.inf12, ps,
+ depth);
+ break;
+ }
case 0x07:
{
sam_io_unk_info7("unk_inf7",