summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Leighton <lkcl@samba.org>2000-02-04 05:16:57 +0000
committerLuke Leighton <lkcl@samba.org>2000-02-04 05:16:57 +0000
commit1cc42831d37417035188cedf9b36a638cc754160 (patch)
treef84b900aa9639b9250cee23b3552dcc400042c71
parentcbac99425b0b230788ea71ca716806b1332b5006 (diff)
downloadsamba-1cc42831d37417035188cedf9b36a638cc754160.tar.gz
ok, this _is_ as big as it looks, conceptually, and i haven't even
done what i wanted to: this is only preparation!!!! i started off in smbd/lanman.c, and noticed that api_NetUserGetInfo takes all its info from user_struct *vuser. i thought, that's odd, that doesn't look right. then i realised that the info there is exactly what is contained in the NET_USER_INFO_3 structure: the return result from an NT Domain User Logon. various lights went on, and i realised that when an SMBsesssetupX is carried out, internally, NT must do an NT Domain User Logon with the SMB user's challenge/response password, and then store the return result associated with the SMB session. in this way, when an api_NetUserGetInfo call comes in, the CORRECT info can be returned, not some faked-up information. anyway, this commit is all the consequences of putting NET_USER_INFO_3 into user_struct, which feeds up through _several_ layers of function calls. i sort-of understood that i needed to do this, but not quite. the upshot of this is that user_struct now contains the REAL nt domain username (in NET_USER_INFO_3) so the confusion between nt user names and unix usernames now can be removed from samba code. if you want a unix user name, you use vuser->unix_name. if you want an NT user name, you use (UNISTR2*)vuser->usr.uni_user_name. p.s it's in UNICODE :) p.p.s if you want the RID of the user, it's vuser->usr.user_rid. p.p.p.s there's over 25 NT-specific other bits of info in NET_USER_INFO_3 too!
-rw-r--r--source/Makefile.in2
-rw-r--r--source/auth/pass_check.c30
-rw-r--r--source/include/lib_smb_proto.h176
-rw-r--r--source/include/proto.h228
-rw-r--r--source/include/rpc_client_proto.h24
-rw-r--r--source/include/rpc_creds.h13
-rw-r--r--source/include/rpc_parse_proto.h164
-rw-r--r--source/include/smb.h38
-rw-r--r--source/lib/vuser.c12
-rw-r--r--source/msrpc/msrpcd_process.c2
-rw-r--r--source/netlogond/srv_netlogon_nt.c8
-rw-r--r--source/passdb/pass_check.c30
-rw-r--r--source/passdb/smbpassfile.c7
-rw-r--r--source/rpc_client/cli_login.c27
-rw-r--r--source/rpc_client/msrpc_netlogon.c59
-rw-r--r--source/rpc_client/msrpc_samr.c68
-rw-r--r--source/rpc_parse/parse_creds.c127
-rw-r--r--source/rpc_parse/parse_misc.c2
-rw-r--r--source/rpc_parse/parse_net.c24
-rw-r--r--source/rpc_server/srv_pipe_hnd.c4
-rw-r--r--source/rpc_server/srv_pipe_ntlmssp.c31
-rw-r--r--source/smbd/chgpasswd.c2
-rw-r--r--source/smbd/lanman.c12
-rw-r--r--source/smbd/negprot.c27
-rw-r--r--source/smbd/password.c173
-rw-r--r--source/smbd/process.c5
-rw-r--r--source/smbd/reply.c9
-rw-r--r--source/tdb/tdb.c6
28 files changed, 622 insertions, 688 deletions
diff --git a/source/Makefile.in b/source/Makefile.in
index 37f5032ed74..127ae3c22d9 100644
--- a/source/Makefile.in
+++ b/source/Makefile.in
@@ -170,6 +170,7 @@ LIBSMB_OBJ = libsmb/clientgen.o \
libsmb/pwd_cache.o \
lib/crc32.o lib/md5.o lib/hmacmd5.o \
rpc_parse/parse_creds.o \
+ rpc_parse/parse_net.o \
rpc_parse/parse_ntlmssp.o rpc_parse/parse_prs.o \
rpc_parse/parse_misc.o
@@ -181,7 +182,6 @@ RPC_SERVER_OBJ = \
rpc_server/srv_pipe.o
RPC_PARSE_OBJ1 = rpc_parse/parse_lsa.o \
- rpc_parse/parse_net.o \
rpc_parse/parse_reg.o \
rpc_parse/parse_samr.o \
rpc_parse/parse_srv.o \
diff --git a/source/auth/pass_check.c b/source/auth/pass_check.c
index 7effbfef8dd..d89ef2e6c9d 100644
--- a/source/auth/pass_check.c
+++ b/source/auth/pass_check.c
@@ -748,39 +748,51 @@ the function pointer fn() points to a function to call when a successful
match is found and is used to update the encrypted password file
return True on correct match, False otherwise
****************************************************************************/
-BOOL pass_check(char *user,char *password, int pwlen, struct passwd *pwd,
- BOOL (*fn)(char *, char *))
+BOOL pass_check(const char *_user, const char *_password,
+ int pwlen, const struct passwd *pwd,
+ BOOL (*fn)(const char *, const char *))
{
pstring pass2;
int level = lp_passwordlevel();
const struct passwd *pass;
+ fstring password;
+ fstring user;
- if (password) password[pwlen] = 0;
+ fstrcpy(user, _user);
#if DEBUG_PASSWORD
DEBUG(100,("checking user=[%s] pass=",user));
dump_data(100, password, strlen(password));
#endif
- if (!password) {
+ if (!_password)
+ {
return(False);
}
+ pwlen = MIN(sizeof(password)-1, pwlen);
+ memset(password, 0, sizeof(password));
+ memcpy(password, _password, pwlen);
+
if (((!*password) || (!pwlen)) && !lp_null_passwords()) {
return(False);
}
- if (pwd && !user) {
- pass = (struct passwd *) pwd;
- user = pass->pw_name;
- } else {
+ if (pwd != NULL && _user == NULL)
+ {
+ pass = (const struct passwd *) pwd;
+ fstrcpy(user, pass->pw_name);
+ }
+ else
+ {
pass = Get_Pwnam(user,True);
}
DEBUG(4,("Checking password for user %s (l=%d)\n",user,pwlen));
- if (!pass) {
+ if (pass == NULL)
+ {
DEBUG(3,("Couldn't find user %s\n",user));
return(False);
}
diff --git a/source/include/lib_smb_proto.h b/source/include/lib_smb_proto.h
index caebb9fbc37..01d65fed265 100644
--- a/source/include/lib_smb_proto.h
+++ b/source/include/lib_smb_proto.h
@@ -255,16 +255,11 @@ BOOL make_creds_unix_sec(CREDS_UNIX_SEC *r_u,
uint32 uid, uint32 gid, uint32 num_grps, gid_t *grps);
BOOL creds_io_unix_sec(char *desc, CREDS_UNIX_SEC *r_u, prs_struct *ps, int depth);
void creds_free_unix_sec(CREDS_UNIX_SEC *r_u);
-BOOL make_creds_nt_sec(CREDS_NT_SEC *r_u,
- DOM_SID *sid, uint32 num_grps, uint32 *grps);
-BOOL creds_io_nt_sec(char *desc, CREDS_NT_SEC *r_u, prs_struct *ps, int depth);
-void creds_free_nt_sec(CREDS_NT_SEC *r_u);
BOOL creds_io_pwd_info(char *desc, struct pwd_info *pwd, prs_struct *ps, int depth);
BOOL creds_io_nt(char *desc, CREDS_NT *r_u, prs_struct *ps, int depth);
void creds_free_nt(CREDS_NT *r_u);
BOOL creds_io_hybrid(char *desc, CREDS_HYBRID *r_u, prs_struct *ps, int depth);
void copy_unix_creds(CREDS_UNIX *to, const CREDS_UNIX *from);
-void copy_nt_sec_creds(CREDS_NT_SEC *to, const CREDS_NT_SEC *from);
void copy_unix_sec_creds(CREDS_UNIX_SEC *to, const CREDS_UNIX_SEC *from);
void copy_nt_creds(struct ntuser_creds *to,
const struct ntuser_creds *from);
@@ -353,7 +348,7 @@ BOOL make_clnt_info(DOM_CLNT_INFO *clnt,
uint16 sec_chan, const char *comp_name,
DOM_CRED *cred);
BOOL smb_io_clnt_info(char *desc, DOM_CLNT_INFO *clnt, prs_struct *ps, int depth);
-BOOL make_owf_info(OWF_INFO *hash, uint8 data[16]);
+BOOL make_owf_info(OWF_INFO *hash, const uint8 data[16]);
BOOL smb_io_owf_info(char *desc, OWF_INFO *hash, prs_struct *ps, int depth);
BOOL smb_io_gid(char *desc, DOM_GID *gid, prs_struct *ps, int depth);
BOOL smb_io_pol_hnd(char *desc, POLICY_HND *pol, prs_struct *ps, int depth);
@@ -361,6 +356,175 @@ BOOL smb_io_dom_query_3(char *desc, DOM_QUERY_3 *d_q, prs_struct *ps, int depth
BOOL smb_io_dom_query_5(char *desc, DOM_QUERY_3 *d_q, prs_struct *ps, int depth);
BOOL smb_io_unistr3(char *desc, UNISTR3 *name, prs_struct *ps, int depth);
+/*The following definitions come from rpc_parse/parse_net.c */
+
+BOOL make_q_logon_ctrl2(NET_Q_LOGON_CTRL2 *q_l,
+ const char* srv_name,
+ uint32 function_code,
+ uint32 query_level,
+ uint32 switch_value);
+BOOL net_io_q_logon_ctrl2(char *desc, NET_Q_LOGON_CTRL2 *q_l, prs_struct *ps, int depth);
+BOOL make_r_logon_ctrl2(NET_R_LOGON_CTRL2 *r_l,
+ uint32 switch_value,
+ NETLOGON_INFO *logon_info,
+ uint32 status);
+BOOL net_io_r_logon_ctrl2(char *desc, NET_R_LOGON_CTRL2 *r_l, prs_struct *ps, int depth);
+BOOL net_io_r_trust_dom(char *desc, NET_R_TRUST_DOM_LIST *r_t, prs_struct *ps, int depth);
+BOOL net_io_q_trust_dom(char *desc, NET_Q_TRUST_DOM_LIST *q_l, prs_struct *ps, int depth);
+BOOL make_q_req_chal(NET_Q_REQ_CHAL *q_c,
+ const char *logon_srv, const char *logon_clnt,
+ DOM_CHAL *clnt_chal);
+BOOL net_io_q_req_chal(char *desc, NET_Q_REQ_CHAL *q_c, prs_struct *ps, int depth);
+BOOL net_io_r_req_chal(char *desc, NET_R_REQ_CHAL *r_c, prs_struct *ps, int depth);
+BOOL make_q_auth(NET_Q_AUTH *q_a,
+ const char *logon_srv, const char *acct_name,
+ uint16 sec_chan, const char *comp_name,
+ DOM_CHAL *clnt_chal);
+BOOL net_io_q_auth(char *desc, NET_Q_AUTH *q_a, prs_struct *ps, int depth);
+BOOL net_io_r_auth(char *desc, NET_R_AUTH *r_a, prs_struct *ps, int depth);
+BOOL make_q_auth_2(NET_Q_AUTH_2 *q_a,
+ const char *logon_srv, const char *acct_name,
+ uint16 sec_chan, const char *comp_name,
+ DOM_CHAL *clnt_chal, uint32 clnt_flgs);
+BOOL net_io_q_auth_2(char *desc, NET_Q_AUTH_2 *q_a, prs_struct *ps, int depth);
+BOOL net_io_r_auth_2(char *desc, NET_R_AUTH_2 *r_a, prs_struct *ps, int depth);
+BOOL make_q_srv_pwset(NET_Q_SRV_PWSET *q_s,
+ const char *logon_srv, const char *acct_name,
+ uint16 sec_chan, const char *comp_name,
+ DOM_CRED *cred, char nt_cypher[16]);
+BOOL net_io_q_srv_pwset(char *desc, NET_Q_SRV_PWSET *q_s, prs_struct *ps, int depth);
+BOOL net_io_r_srv_pwset(char *desc, NET_R_SRV_PWSET *r_s, prs_struct *ps, int depth);
+BOOL make_id_info1(NET_ID_INFO_1 *id, const char *domain_name,
+ uint32 param_ctrl,
+ uint32 log_id_low,
+ uint32 log_id_high,
+ const char *user_name,
+ const char *wksta_name,
+ const char sess_key[16],
+ const uchar lm_cypher[16],
+ const uchar nt_cypher[16]);
+BOOL make_id_info4(NET_ID_INFO_4 *id, const char *domain_name,
+ uint32 param_ctrl,
+ uint32 log_id_low, uint32 log_id_high,
+ const char *user_name, const char *wksta_name,
+ const char *general);
+BOOL make_id_info2(NET_ID_INFO_2 *id, const char *domain_name,
+ uint32 param_ctrl,
+ uint32 log_id_low, uint32 log_id_high,
+ const char *user_name, const char *wksta_name,
+ const uchar lm_challenge[8],
+ const uchar *lm_chal_resp,
+ int lm_chal_len,
+ const uchar *nt_chal_resp,
+ int nt_chal_len);
+BOOL make_sam_info(DOM_SAM_INFO *sam,
+ const char *logon_srv, const char *comp_name,
+ DOM_CRED *clnt_cred,
+ DOM_CRED *rtn_cred, uint16 logon_level,
+ NET_ID_INFO_CTR *ctr);
+BOOL make_net_user_info3W(NET_USER_INFO_3 *usr,
+
+ const NTTIME *logon_time,
+ const NTTIME *logoff_time,
+ const NTTIME *kickoff_time,
+ const NTTIME *pass_last_set_time,
+ const NTTIME *pass_can_change_time,
+ const NTTIME *pass_must_change_time,
+
+ const UNISTR2 *user_name,
+ const UNISTR2 *full_name,
+ const UNISTR2 *log_scr,
+ const UNISTR2 *prof_path,
+ const UNISTR2 *home_dir,
+ const UNISTR2 *dir_drive,
+
+ uint16 logon_count,
+ uint16 bad_pw_count,
+
+ uint32 user_id,
+ uint32 group_id,
+ uint32 num_groups,
+ const DOM_GID *gids,
+ uint32 user_flgs,
+
+ const char sess_key[16],
+
+ const UNISTR2 *logon_srv,
+ const UNISTR2 *logon_dom,
+
+ const char *padding,
+
+ const DOM_SID *dom_sid,
+ const char *other_sids);
+BOOL make_net_user_info3(NET_USER_INFO_3 *usr,
+
+ NTTIME *logon_time,
+ NTTIME *logoff_time,
+ NTTIME *kickoff_time,
+ NTTIME *pass_last_set_time,
+ NTTIME *pass_can_change_time,
+ NTTIME *pass_must_change_time,
+
+ char *user_name,
+ char *full_name,
+ char *logon_script,
+ char *profile_path,
+ char *home_dir,
+ char *dir_drive,
+
+ uint16 logon_count,
+ uint16 bad_pw_count,
+
+ uint32 user_id,
+ uint32 group_id,
+ uint32 num_groups,
+ DOM_GID *gids,
+ uint32 user_flgs,
+
+ char sess_key[16],
+
+ char *logon_srv,
+ char *logon_dom,
+
+ char *padding,
+
+ DOM_SID *dom_sid,
+ char *other_sids);
+BOOL net_io_user_info3(char *desc, NET_USER_INFO_3 *usr, prs_struct *ps, int depth);
+BOOL net_io_q_sam_logon(char *desc, NET_Q_SAM_LOGON *q_l, prs_struct *ps, int depth);
+BOOL make_r_sam_logon(NET_R_SAM_LOGON *r_s,
+ const DOM_CRED *srv_creds,
+ uint16 switch_value,
+ NET_USER_INFO_3 *user_info,
+ uint32 auth_resp,
+ uint32 status);
+BOOL net_io_r_sam_logon(char *desc, NET_R_SAM_LOGON *r_l, prs_struct *ps, int depth);
+BOOL net_io_q_sam_logoff(char *desc, NET_Q_SAM_LOGOFF *q_l, prs_struct *ps, int depth);
+BOOL make_r_sam_logoff(NET_R_SAM_LOGOFF *r_s,
+ const DOM_CRED *srv_cred,
+ uint32 status);
+BOOL net_io_r_sam_logoff(char *desc, NET_R_SAM_LOGOFF *r_l, prs_struct *ps, int depth);
+BOOL make_q_sam_sync(NET_Q_SAM_SYNC *q_s,
+ const char *srv_name,
+ const char *cli_name,
+ DOM_CRED *cli_creds, uint32 database_id);
+BOOL net_io_q_sam_sync(char *desc, NET_Q_SAM_SYNC *q_s, prs_struct *ps, int depth);
+BOOL make_sam_delta_hdr(SAM_DELTA_HDR *delta, uint16 type, uint32 rid);
+BOOL make_sam_account_info(SAM_ACCOUNT_INFO *info, char *user_name,
+ char *full_name, uint32 user_rid, uint32 group_rid,
+ char *home_dir, char *dir_drive, char *logon_script,
+ char *acct_desc, uint32 acb_info, char *profile);
+BOOL make_r_sam_sync(NET_R_SAM_SYNC *r_s,
+ const DOM_CRED *srv_cred,
+ uint32 sync_context,
+ uint32 num_deltas,
+ uint32 num_deltas2,
+ SAM_DELTA_HDR *hdr_deltas,
+ SAM_DELTA_CTR *deltas,
+ uint32 status);
+BOOL net_io_r_sam_sync(char *desc, uint8 sess_key[16],
+ NET_R_SAM_SYNC *r_s, prs_struct *ps, int depth);
+
/*The following definitions come from rpc_parse/parse_ntlmssp.c */
BOOL rpc_hdr_ntlmssp_auth_chk(RPC_HDR_AUTH *rai);
diff --git a/source/include/proto.h b/source/include/proto.h
index 97495c6f199..38ee4a5f206 100644
--- a/source/include/proto.h
+++ b/source/include/proto.h
@@ -760,8 +760,8 @@ char *validated_username(uint16 vuid);
uint16 create_vuid(uid_t uid, gid_t gid, int n_groups, gid_t *groups,
char *unix_name, char *requested_name,
char *real_name,
- BOOL guest, uchar user_sess_key[16]);
-uint16 register_vuid(uid_t uid,gid_t gid, char *unix_name, char *requested_name, BOOL guest, uchar user_sess_key[16]);
+ BOOL guest, const NET_USER_INFO_3 *info3);
+uint16 register_vuid(uid_t uid,gid_t gid, char *unix_name, char *requested_name, BOOL guest, const NET_USER_INFO_3 *info3);
BOOL check_vuser_ok(struct uid_cache *cache, user_struct *vuser,int snum);
/*The following definitions come from libsmb/clientgen.c */
@@ -1788,8 +1788,9 @@ struct passdb_ops *nisplus_initialise_password_db(void);
/*The following definitions come from passdb/pass_check.c */
void dfs_unlogin(void);
-BOOL pass_check(char *user,char *password, int pwlen, struct passwd *pwd,
- BOOL (*fn)(char *, char *));
+BOOL pass_check(const char *_user, const char *_password,
+ int pwlen, const struct passwd *pwd,
+ BOOL (*fn)(const char *, const char *));
/*The following definitions come from passdb/passdb.c */
@@ -1889,9 +1890,10 @@ BOOL local_password_change(char *user_name,
BOOL trust_password_lock( char *domain, char *name, BOOL update);
BOOL trust_password_unlock(void);
BOOL trust_password_delete( char *domain, char *name );
-BOOL get_trust_account_password( unsigned char *ret_pwd, time_t *pass_last_set_time);
-BOOL set_trust_account_password( unsigned char *md4_new_pwd);
-BOOL trust_get_passwd( unsigned char trust_passwd[16], char *domain, char *myname);
+BOOL get_trust_account_password( uchar *ret_pwd, time_t *pass_last_set_time);
+BOOL set_trust_account_password( uchar *md4_new_pwd);
+BOOL trust_get_passwd( uchar trust_passwd[16],
+ const char *domain, const char *myname);
BOOL create_trust_account_file(char *domain, char *name, uchar pass[16]);
/*The following definitions come from passdb/smbpassgroup.c */
@@ -2051,16 +2053,16 @@ BOOL cli_nt_login_general(const char* srv_name, const char* myhostname,
BOOL cli_nt_login_interactive(const char* srv_name, const char* myhostname,
const char *domain, const char *username,
uint32 luid_low,
- uchar *lm_owf_user_pwd,
- uchar *nt_owf_user_pwd,
+ const uchar *lm_owf_user_pwd,
+ const uchar *nt_owf_user_pwd,
NET_ID_INFO_CTR *ctr,
NET_USER_INFO_3 *user_info3);
BOOL cli_nt_login_network(const char* srv_name, const char* myhostname,
const char *domain, const char *username,
- uint32 luid_low, char lm_chal[8],
- char *lm_chal_resp,
+ uint32 luid_low, const char lm_chal[8],
+ const char *lm_chal_resp,
int lm_chal_len,
- char *nt_chal_resp,
+ const char *nt_chal_resp,
int nt_chal_len,
NET_ID_INFO_CTR *ctr,
NET_USER_INFO_3 *user_info3);
@@ -2444,12 +2446,11 @@ BOOL msrpc_lsa_query_secret(const char* srv_name,
/*The following definitions come from rpc_client/msrpc_netlogon.c */
-uint32 check_domain_security(char *orig_user, char *domain,
- uchar *challenge,
- char *smb_apasswd, int smb_apasslen,
- char *smb_ntpasswd, int smb_ntpasslen,
- uchar user_sess_key[16],
- char lm_pw8[8]);
+uint32 check_domain_security(const char *orig_user, const char *domain,
+ const uchar *challenge,
+ const char *smb_apasswd, int smb_apasslen,
+ const char *smb_ntpasswd, int smb_ntpasslen,
+ NET_USER_INFO_3 *info3);
/*The following definitions come from rpc_client/msrpc_samr.c */
@@ -2628,6 +2629,9 @@ BOOL msrpc_sam_ntpasswd_set(const char* srv_name, const char *user,
const uchar lm_hshhash[16],
const uchar nt_newpass[516],
const uchar nt_hshhash[16]);
+BOOL msrpc_sam_query_userinfo(const char* srv_name, const DOM_SID *sid,
+ const char *user_name, uint16 info_level,
+ SAM_USERINFO_CTR *ctr);
/*The following definitions come from rpc_parse/parse_creds.c */
@@ -2641,16 +2645,11 @@ BOOL make_creds_unix_sec(CREDS_UNIX_SEC *r_u,
uint32 uid, uint32 gid, uint32 num_grps, gid_t *grps);
BOOL creds_io_unix_sec(char *desc, CREDS_UNIX_SEC *r_u, prs_struct *ps, int depth);
void creds_free_unix_sec(CREDS_UNIX_SEC *r_u);
-BOOL make_creds_nt_sec(CREDS_NT_SEC *r_u,
- DOM_SID *sid, uint32 num_grps, uint32 *grps);
-BOOL creds_io_nt_sec(char *desc, CREDS_NT_SEC *r_u, prs_struct *ps, int depth);
-void creds_free_nt_sec(CREDS_NT_SEC *r_u);
BOOL creds_io_pwd_info(char *desc, struct pwd_info *pwd, prs_struct *ps, int depth);
BOOL creds_io_nt(char *desc, CREDS_NT *r_u, prs_struct *ps, int depth);
void creds_free_nt(CREDS_NT *r_u);
BOOL creds_io_hybrid(char *desc, CREDS_HYBRID *r_u, prs_struct *ps, int depth);
void copy_unix_creds(CREDS_UNIX *to, const CREDS_UNIX *from);
-void copy_nt_sec_creds(CREDS_NT_SEC *to, const CREDS_NT_SEC *from);
void copy_unix_sec_creds(CREDS_UNIX_SEC *to, const CREDS_UNIX_SEC *from);
void copy_nt_creds(struct ntuser_creds *to,
const struct ntuser_creds *from);
@@ -2739,7 +2738,7 @@ BOOL make_clnt_info(DOM_CLNT_INFO *clnt,
uint16 sec_chan, const char *comp_name,
DOM_CRED *cred);
BOOL smb_io_clnt_info(char *desc, DOM_CLNT_INFO *clnt, prs_struct *ps, int depth);
-BOOL make_owf_info(OWF_INFO *hash, uint8 data[16]);
+BOOL make_owf_info(OWF_INFO *hash, const uint8 data[16]);
BOOL smb_io_owf_info(char *desc, OWF_INFO *hash, prs_struct *ps, int depth);
BOOL smb_io_gid(char *desc, DOM_GID *gid, prs_struct *ps, int depth);
BOOL smb_io_pol_hnd(char *desc, POLICY_HND *pol, prs_struct *ps, int depth);
@@ -2747,6 +2746,175 @@ BOOL smb_io_dom_query_3(char *desc, DOM_QUERY_3 *d_q, prs_struct *ps, int depth
BOOL smb_io_dom_query_5(char *desc, DOM_QUERY_3 *d_q, prs_struct *ps, int depth);
BOOL smb_io_unistr3(char *desc, UNISTR3 *name, prs_struct *ps, int depth);
+/*The following definitions come from rpc_parse/parse_net.c */
+
+BOOL make_q_logon_ctrl2(NET_Q_LOGON_CTRL2 *q_l,
+ const char* srv_name,
+ uint32 function_code,
+ uint32 query_level,
+ uint32 switch_value);
+BOOL net_io_q_logon_ctrl2(char *desc, NET_Q_LOGON_CTRL2 *q_l, prs_struct *ps, int depth);
+BOOL make_r_logon_ctrl2(NET_R_LOGON_CTRL2 *r_l,
+ uint32 switch_value,
+ NETLOGON_INFO *logon_info,
+ uint32 status);
+BOOL net_io_r_logon_ctrl2(char *desc, NET_R_LOGON_CTRL2 *r_l, prs_struct *ps, int depth);
+BOOL net_io_r_trust_dom(char *desc, NET_R_TRUST_DOM_LIST *r_t, prs_struct *ps, int depth);
+BOOL net_io_q_trust_dom(char *desc, NET_Q_TRUST_DOM_LIST *q_l, prs_struct *ps, int depth);
+BOOL make_q_req_chal(NET_Q_REQ_CHAL *q_c,
+ const char *logon_srv, const char *logon_clnt,
+ DOM_CHAL *clnt_chal);
+BOOL net_io_q_req_chal(char *desc, NET_Q_REQ_CHAL *q_c, prs_struct *ps, int depth);
+BOOL net_io_r_req_chal(char *desc, NET_R_REQ_CHAL *r_c, prs_struct *ps, int depth);
+BOOL make_q_auth(NET_Q_AUTH *q_a,
+ const char *logon_srv, const char *acct_name,
+ uint16 sec_chan, const char *comp_name,
+ DOM_CHAL *clnt_chal);
+BOOL net_io_q_auth(char *desc, NET_Q_AUTH *q_a, prs_struct *ps, int depth);
+BOOL net_io_r_auth(char *desc, NET_R_AUTH *r_a, prs_struct *ps, int depth);
+BOOL make_q_auth_2(NET_Q_AUTH_2 *q_a,
+ const char *logon_srv, const char *acct_name,
+ uint16 sec_chan, const char *comp_name,
+ DOM_CHAL *clnt_chal, uint32 clnt_flgs);
+BOOL net_io_q_auth_2(char *desc, NET_Q_AUTH_2 *q_a, prs_struct *ps, int depth);
+BOOL net_io_r_auth_2(char *desc, NET_R_AUTH_2 *r_a, prs_struct *ps, int depth);
+BOOL make_q_srv_pwset(NET_Q_SRV_PWSET *q_s,
+ const char *logon_srv, const char *acct_name,
+ uint16 sec_chan, const char *comp_name,
+ DOM_CRED *cred, char nt_cypher[16]);
+BOOL net_io_q_srv_pwset(char *desc, NET_Q_SRV_PWSET *q_s, prs_struct *ps, int depth);
+BOOL net_io_r_srv_pwset(char *desc, NET_R_SRV_PWSET *r_s, prs_struct *ps, int depth);
+BOOL make_id_info1(NET_ID_INFO_1 *id, const char *domain_name,
+ uint32 param_ctrl,
+ uint32 log_id_low,
+ uint32 log_id_high,
+ const char *user_name,
+ const char *wksta_name,
+ const char sess_key[16],
+ const uchar lm_cypher[16],
+ const uchar nt_cypher[16]);
+BOOL make_id_info4(NET_ID_INFO_4 *id, const char *domain_name,
+ uint32 param_ctrl,
+ uint32 log_id_low, uint32 log_id_high,
+ const char *user_name, const char *wksta_name,
+ const char *general);
+BOOL make_id_info2(NET_ID_INFO_2 *id, const char *domain_name,
+ uint32 param_ctrl,
+ uint32 log_id_low, uint32 log_id_high,
+ const char *user_name, const char *wksta_name,
+ const uchar lm_challenge[8],
+ const uchar *lm_chal_resp,
+ int lm_chal_len,
+ const uchar *nt_chal_resp,
+ int nt_chal_len);
+BOOL make_sam_info(DOM_SAM_INFO *sam,
+ const char *logon_srv, const char *comp_name,
+ DOM_CRED *clnt_cred,
+ DOM_CRED *rtn_cred, uint16 logon_level,
+ NET_ID_INFO_CTR *ctr);
+BOOL make_net_user_info3W(NET_USER_INFO_3 *usr,
+
+ const NTTIME *logon_time,
+ const NTTIME *logoff_time,
+ const NTTIME *kickoff_time,
+ const NTTIME *pass_last_set_time,
+ const NTTIME *pass_can_change_time,
+ const NTTIME *pass_must_change_time,
+
+ const UNISTR2 *user_name,
+ const UNISTR2 *full_name,
+ const UNISTR2 *log_scr,
+ const UNISTR2 *prof_path,
+ const UNISTR2 *home_dir,
+ const UNISTR2 *dir_drive,
+
+ uint16 logon_count,
+ uint16 bad_pw_count,
+
+ uint32 user_id,
+ uint32 group_id,
+ uint32 num_groups,
+ const DOM_GID *gids,
+ uint32 user_flgs,
+
+ const char sess_key[16],
+
+ const UNISTR2 *logon_srv,
+ const UNISTR2 *logon_dom,
+
+ const char *padding,
+
+ const DOM_SID *dom_sid,
+ const char *other_sids);
+BOOL make_net_user_info3(NET_USER_INFO_3 *usr,
+
+ NTTIME *logon_time,
+ NTTIME *logoff_time,
+ NTTIME *kickoff_time,
+ NTTIME *pass_last_set_time,
+ NTTIME *pass_can_change_time,
+ NTTIME *pass_must_change_time,
+
+ char *user_name,
+ char *full_name,
+ char *logon_script,
+ char *profile_path,
+ char *home_dir,
+ char *dir_drive,
+
+ uint16 logon_count,
+ uint16 bad_pw_count,
+
+ uint32 user_id,
+ uint32 group_id,
+ uint32 num_groups,
+ DOM_GID *gids,
+ uint32 user_flgs,
+
+ char sess_key[16],
+
+ char *logon_srv,
+ char *logon_dom,
+
+ char *padding,
+
+ DOM_SID *dom_sid,
+ char *other_sids);
+BOOL net_io_user_info3(char *desc, NET_USER_INFO_3 *usr, prs_struct *ps, int depth);
+BOOL net_io_q_sam_logon(char *desc, NET_Q_SAM_LOGON *q_l, prs_struct *ps, int depth);
+BOOL make_r_sam_logon(NET_R_SAM_LOGON *r_s,
+ const DOM_CRED *srv_creds,
+ uint16 switch_value,
+ NET_USER_INFO_3 *user_info,
+ uint32 auth_resp,
+ uint32 status);
+BOOL net_io_r_sam_logon(char *desc, NET_R_SAM_LOGON *r_l, prs_struct *ps, int depth);
+BOOL net_io_q_sam_logoff(char *desc, NET_Q_SAM_LOGOFF *q_l, prs_struct *ps, int depth);
+BOOL make_r_sam_logoff(NET_R_SAM_LOGOFF *r_s,
+ const DOM_CRED *srv_cred,
+ uint32 status);
+BOOL net_io_r_sam_logoff(char *desc, NET_R_SAM_LOGOFF *r_l, prs_struct *ps, int depth);
+BOOL make_q_sam_sync(NET_Q_SAM_SYNC *q_s,
+ const char *srv_name,
+ const char *cli_name,
+ DOM_CRED *cli_creds, uint32 database_id);
+BOOL net_io_q_sam_sync(char *desc, NET_Q_SAM_SYNC *q_s, prs_struct *ps, int depth);
+BOOL make_sam_delta_hdr(SAM_DELTA_HDR *delta, uint16 type, uint32 rid);
+BOOL make_sam_account_info(SAM_ACCOUNT_INFO *info, char *user_name,
+ char *full_name, uint32 user_rid, uint32 group_rid,
+ char *home_dir, char *dir_drive, char *logon_script,
+ char *acct_desc, uint32 acb_info, char *profile);
+BOOL make_r_sam_sync(NET_R_SAM_SYNC *r_s,
+ const DOM_CRED *srv_cred,
+ uint32 sync_context,
+ uint32 num_deltas,
+ uint32 num_deltas2,
+ SAM_DELTA_HDR *hdr_deltas,
+ SAM_DELTA_CTR *deltas,
+ uint32 status);
+BOOL net_io_r_sam_sync(char *desc, uint8 sess_key[16],
+ NET_R_SAM_SYNC *r_s, prs_struct *ps, int depth);
+
/*The following definitions come from rpc_parse/parse_netsec.c */
BOOL rpc_hdr_netsec_auth_chk(RPC_HDR_AUTH *rai);
@@ -3604,7 +3772,7 @@ BOOL pass_oem_change(const char *user,
const uchar *ntdata, const uchar *nthash);
BOOL change_oem_password(struct smb_passwd *smbpw, UNISTR2 *new_passwd,
BOOL unicode, BOOL override);
-BOOL update_smbpassword_file(char *user, char *password);
+BOOL update_smbpassword_file(const char *user, const char *password);
/*The following definitions come from smbd/close.c */
@@ -3804,17 +3972,15 @@ void check_kernel_oplocks(void);
/*The following definitions come from smbd/password.c */
void add_session_user(char *user);
-BOOL password_ok(char *orig_user, char *domain,
- char *smb_apasswd, int smb_apasslen,
- char *smb_ntpasswd, int smb_ntpasslen,
+BOOL password_ok(const char *orig_user, const char *domain,
+ const char *smb_apasswd, int smb_apasslen,
+ const char *smb_ntpasswd, int smb_ntpasslen,
struct passwd *pwd,
- uchar user_sess_key[16]);
+ NET_USER_INFO_3 *info3);
BOOL authorise_login(int snum,char *user, char *domain,
char *password, int pwlen,
BOOL *guest,BOOL *force,uint16 vuid);
BOOL check_hosts_equiv(char *user);
-struct cli_state *server_client(void);
-struct cli_state *server_cryptkey(void);
/*The following definitions come from smbd/pipes.c */
diff --git a/source/include/rpc_client_proto.h b/source/include/rpc_client_proto.h
index f1e4e18ca9b..794a1216ce9 100644
--- a/source/include/rpc_client_proto.h
+++ b/source/include/rpc_client_proto.h
@@ -101,16 +101,16 @@ BOOL cli_nt_login_general(const char* srv_name, const char* myhostname,
BOOL cli_nt_login_interactive(const char* srv_name, const char* myhostname,
const char *domain, const char *username,
uint32 luid_low,
- uchar *lm_owf_user_pwd,
- uchar *nt_owf_user_pwd,
+ const uchar *lm_owf_user_pwd,
+ const uchar *nt_owf_user_pwd,
NET_ID_INFO_CTR *ctr,
NET_USER_INFO_3 *user_info3);
BOOL cli_nt_login_network(const char* srv_name, const char* myhostname,
const char *domain, const char *username,
- uint32 luid_low, char lm_chal[8],
- char *lm_chal_resp,
+ uint32 luid_low, const char lm_chal[8],
+ const char *lm_chal_resp,
int lm_chal_len,
- char *nt_chal_resp,
+ const char *nt_chal_resp,
int nt_chal_len,
NET_ID_INFO_CTR *ctr,
NET_USER_INFO_3 *user_info3);
@@ -490,12 +490,11 @@ BOOL msrpc_lsa_query_secret(const char* srv_name,
/*The following definitions come from rpc_client/msrpc_netlogon.c */
-uint32 check_domain_security(char *orig_user, char *domain,
- uchar *challenge,
- char *smb_apasswd, int smb_apasslen,
- char *smb_ntpasswd, int smb_ntpasslen,
- uchar user_sess_key[16],
- char lm_pw8[8]);
+uint32 check_domain_security(const char *orig_user, const char *domain,
+ const uchar *challenge,
+ const char *smb_apasswd, int smb_apasslen,
+ const char *smb_ntpasswd, int smb_ntpasslen,
+ NET_USER_INFO_3 *info3);
/*The following definitions come from rpc_client/msrpc_samr.c */
@@ -674,4 +673,7 @@ BOOL msrpc_sam_ntpasswd_set(const char* srv_name, const char *user,
const uchar lm_hshhash[16],
const uchar nt_newpass[516],
const uchar nt_hshhash[16]);
+BOOL msrpc_sam_query_userinfo(const char* srv_name, const DOM_SID *sid,
+ const char *user_name, uint16 info_level,
+ SAM_USERINFO_CTR *ctr);
#endif /* _RPC_CLIENT_PROTO_H_ */
diff --git a/source/include/rpc_creds.h b/source/include/rpc_creds.h
index 18ded743b53..fc84ad3b956 100644
--- a/source/include/rpc_creds.h
+++ b/source/include/rpc_creds.h
@@ -51,14 +51,6 @@ typedef struct unixsec_creds
} CREDS_UNIX_SEC;
-typedef struct ntsec_creds
-{
- DOM_SID sid;
- uint32 num_grps;
- uint32 *grp_rids;
-
-} CREDS_NT_SEC;
-
typedef struct user_creds
{
BOOL reuse;
@@ -67,16 +59,13 @@ typedef struct user_creds
uint32 ptr_uxc;
uint32 ptr_nts;
uint32 ptr_uxs;
- uint32 ptr_ssk;
CREDS_NT ntc;
CREDS_UNIX uxc;
- CREDS_NT_SEC nts;
+ NET_USER_INFO_3 nts;
CREDS_UNIX_SEC uxs;
- uchar usr_sess_key[16];
-
} CREDS_HYBRID;
typedef struct smbd_creds
diff --git a/source/include/rpc_parse_proto.h b/source/include/rpc_parse_proto.h
index 111c8831192..eeb5b7c785c 100644
--- a/source/include/rpc_parse_proto.h
+++ b/source/include/rpc_parse_proto.h
@@ -141,170 +141,6 @@ BOOL make_lsa_q_close(LSA_Q_CLOSE *q_c, POLICY_HND *hnd);
BOOL lsa_io_q_close(char *desc, LSA_Q_CLOSE *q_c, prs_struct *ps, int depth);
BOOL lsa_io_r_close(char *desc, LSA_R_CLOSE *r_c, prs_struct *ps, int depth);
-/*The following definitions come from rpc_parse/parse_net.c */
-
-BOOL make_q_logon_ctrl2(NET_Q_LOGON_CTRL2 *q_l,
- const char* srv_name,
- uint32 function_code,
- uint32 query_level,
- uint32 switch_value);
-BOOL net_io_q_logon_ctrl2(char *desc, NET_Q_LOGON_CTRL2 *q_l, prs_struct *ps, int depth);
-BOOL make_r_logon_ctrl2(NET_R_LOGON_CTRL2 *r_l,
- uint32 switch_value,
- NETLOGON_INFO *logon_info,
- uint32 status);
-BOOL net_io_r_logon_ctrl2(char *desc, NET_R_LOGON_CTRL2 *r_l, prs_struct *ps, int depth);
-BOOL net_io_r_trust_dom(char *desc, NET_R_TRUST_DOM_LIST *r_t, prs_struct *ps, int depth);
-BOOL net_io_q_trust_dom(char *desc, NET_Q_TRUST_DOM_LIST *q_l, prs_struct *ps, int depth);
-BOOL make_q_req_chal(NET_Q_REQ_CHAL *q_c,
- const char *logon_srv, const char *logon_clnt,
- DOM_CHAL *clnt_chal);
-BOOL net_io_q_req_chal(char *desc, NET_Q_REQ_CHAL *q_c, prs_struct *ps, int depth);
-BOOL net_io_r_req_chal(char *desc, NET_R_REQ_CHAL *r_c, prs_struct *ps, int depth);
-BOOL make_q_auth(NET_Q_AUTH *q_a,
- const char *logon_srv, const char *acct_name,
- uint16 sec_chan, const char *comp_name,
- DOM_CHAL *clnt_chal);
-BOOL net_io_q_auth(char *desc, NET_Q_AUTH *q_a, prs_struct *ps, int depth);
-BOOL net_io_r_auth(char *desc, NET_R_AUTH *r_a, prs_struct *ps, int depth);
-BOOL make_q_auth_2(NET_Q_AUTH_2 *q_a,
- const char *logon_srv, const char *acct_name,
- uint16 sec_chan, const char *comp_name,
- DOM_CHAL *clnt_chal, uint32 clnt_flgs);
-BOOL net_io_q_auth_2(char *desc, NET_Q_AUTH_2 *q_a, prs_struct *ps, int depth);
-BOOL net_io_r_auth_2(char *desc, NET_R_AUTH_2 *r_a, prs_struct *ps, int depth);
-BOOL make_q_srv_pwset(NET_Q_SRV_PWSET *q_s,
- const char *logon_srv, const char *acct_name,
- uint16 sec_chan, const char *comp_name,
- DOM_CRED *cred, char nt_cypher[16]);
-BOOL net_io_q_srv_pwset(char *desc, NET_Q_SRV_PWSET *q_s, prs_struct *ps, int depth);
-BOOL net_io_r_srv_pwset(char *desc, NET_R_SRV_PWSET *r_s, prs_struct *ps, int depth);
-BOOL make_id_info1(NET_ID_INFO_1 *id, const char *domain_name,
- uint32 param_ctrl, uint32 log_id_low, uint32 log_id_high,
- const char *user_name, const char *wksta_name,
- char sess_key[16],
- uchar lm_cypher[16], uchar nt_cypher[16]);
-BOOL make_id_info4(NET_ID_INFO_4 *id, const char *domain_name,
- uint32 param_ctrl,
- uint32 log_id_low, uint32 log_id_high,
- const char *user_name, const char *wksta_name,
- const char *general);
-BOOL make_id_info2(NET_ID_INFO_2 *id, const char *domain_name,
- uint32 param_ctrl,
- uint32 log_id_low, uint32 log_id_high,
- const char *user_name, const char *wksta_name,
- uchar lm_challenge[8],
- uchar *lm_chal_resp,
- int lm_chal_len,
- uchar *nt_chal_resp,
- int nt_chal_len);
-BOOL make_sam_info(DOM_SAM_INFO *sam,
- const char *logon_srv, const char *comp_name,
- DOM_CRED *clnt_cred,
- DOM_CRED *rtn_cred, uint16 logon_level,
- NET_ID_INFO_CTR *ctr);
-BOOL make_net_user_info3W(NET_USER_INFO_3 *usr,
-
- const NTTIME *logon_time,
- const NTTIME *logoff_time,
- const NTTIME *kickoff_time,
- const NTTIME *pass_last_set_time,
- const NTTIME *pass_can_change_time,
- const NTTIME *pass_must_change_time,
-
- const UNISTR2 *user_name,
- const UNISTR2 *full_name,
- const UNISTR2 *log_scr,
- const UNISTR2 *prof_path,
- const UNISTR2 *home_dir,
- const UNISTR2 *dir_drive,
-
- uint16 logon_count,
- uint16 bad_pw_count,
-
- uint32 user_id,
- uint32 group_id,
- uint32 num_groups,
- const DOM_GID *gids,
- uint32 user_flgs,
-
- const char sess_key[16],
-
- const UNISTR2 *logon_srv,
- const UNISTR2 *logon_dom,
-
- const char *padding,
-
- const DOM_SID *dom_sid,
- const char *other_sids);
-BOOL make_net_user_info3(NET_USER_INFO_3 *usr,
-
- NTTIME *logon_time,
- NTTIME *logoff_time,
- NTTIME *kickoff_time,
- NTTIME *pass_last_set_time,
- NTTIME *pass_can_change_time,
- NTTIME *pass_must_change_time,
-
- char *user_name,
- char *full_name,
- char *logon_script,
- char *profile_path,
- char *home_dir,
- char *dir_drive,
-
- uint16 logon_count,
- uint16 bad_pw_count,
-
- uint32 user_id,
- uint32 group_id,
- uint32 num_groups,
- DOM_GID *gids,
- uint32 user_flgs,
-
- char sess_key[16],
-
- char *logon_srv,
- char *logon_dom,
-
- char *padding,
-
- DOM_SID *dom_sid,
- char *other_sids);
-BOOL net_io_q_sam_logon(char *desc, NET_Q_SAM_LOGON *q_l, prs_struct *ps, int depth);
-BOOL make_r_sam_logon(NET_R_SAM_LOGON *r_s,
- const DOM_CRED *srv_creds,
- uint16 switch_value,
- NET_USER_INFO_3 *user_info,
- uint32 auth_resp,
- uint32 status);
-BOOL net_io_r_sam_logon(char *desc, NET_R_SAM_LOGON *r_l, prs_struct *ps, int depth);
-BOOL net_io_q_sam_logoff(char *desc, NET_Q_SAM_LOGOFF *q_l, prs_struct *ps, int depth);
-BOOL make_r_sam_logoff(NET_R_SAM_LOGOFF *r_s,
- const DOM_CRED *srv_cred,
- uint32 status);
-BOOL net_io_r_sam_logoff(char *desc, NET_R_SAM_LOGOFF *r_l, prs_struct *ps, int depth);
-BOOL make_q_sam_sync(NET_Q_SAM_SYNC *q_s,
- const char *srv_name,
- const char *cli_name,
- DOM_CRED *cli_creds, uint32 database_id);
-BOOL net_io_q_sam_sync(char *desc, NET_Q_SAM_SYNC *q_s, prs_struct *ps, int depth);
-BOOL make_sam_delta_hdr(SAM_DELTA_HDR *delta, uint16 type, uint32 rid);
-BOOL make_sam_account_info(SAM_ACCOUNT_INFO *info, char *user_name,
- char *full_name, uint32 user_rid, uint32 group_rid,
- char *home_dir, char *dir_drive, char *logon_script,
- char *acct_desc, uint32 acb_info, char *profile);
-BOOL make_r_sam_sync(NET_R_SAM_SYNC *r_s,
- const DOM_CRED *srv_cred,
- uint32 sync_context,
- uint32 num_deltas,
- uint32 num_deltas2,
- SAM_DELTA_HDR *hdr_deltas,
- SAM_DELTA_CTR *deltas,
- uint32 status);
-BOOL net_io_r_sam_sync(char *desc, uint8 sess_key[16],
- NET_R_SAM_SYNC *r_s, prs_struct *ps, int depth);
-
/*The following definitions come from rpc_parse/parse_netsec.c */
BOOL rpc_hdr_netsec_auth_chk(RPC_HDR_AUTH *rai);
diff --git a/source/include/smb.h b/source/include/smb.h
index 6b2eff14c51..7072d65e761 100644
--- a/source/include/smb.h
+++ b/source/include/smb.h
@@ -618,25 +618,6 @@ struct dcinfo
uchar md4pw[16]; /* md4(machine password) */
};
-typedef struct
-{
- uid_t uid; /* uid of a validated user */
- gid_t gid; /* gid of a validated user */
-
- fstring requested_name; /* user name from the client */
- fstring name; /* unix user name of a validated user */
- fstring real_name; /* to store real name from password file - simeon */
- BOOL guest;
-
- /* following groups stuff added by ih */
- /* This groups info is needed for when we become_user() for this uid */
- int n_groups;
- gid_t *groups;
-
- uchar user_sess_key[16];
-
-} user_struct;
-
enum {LPQ_QUEUED,LPQ_PAUSED,LPQ_SPOOLING,LPQ_PRINTING};
@@ -1704,6 +1685,25 @@ extern int unix_ERR_code;
#include "nt_printing.h"
#include "ntdomain.h"
+typedef struct
+{
+ uid_t uid; /* uid of a validated user */
+ gid_t gid; /* gid of a validated user */
+
+ fstring requested_name; /* user name from the client */
+ fstring name; /* unix user name of a validated user */
+ fstring real_name; /* to store real name from password file - simeon */
+ BOOL guest;
+
+ /* following groups stuff added by ih */
+ /* This groups info is needed for when we become_user() for this uid */
+ int n_groups;
+ gid_t *groups;
+
+ NET_USER_INFO_3 usr;
+
+} user_struct;
+
/* A netbios name structure. */
struct nmb_name {
char name[17];
diff --git a/source/lib/vuser.c b/source/lib/vuser.c
index a092bb505b3..013671aff1a 100644
--- a/source/lib/vuser.c
+++ b/source/lib/vuser.c
@@ -86,7 +86,7 @@ tell random client vuid's (normally zero) from valid vuids.
uint16 create_vuid(uid_t uid, gid_t gid, int n_groups, gid_t *groups,
char *unix_name, char *requested_name,
char *real_name,
- BOOL guest, uchar user_sess_key[16])
+ BOOL guest, const NET_USER_INFO_3 *info3)
{
user_struct *vuser;
uint16 vuid;
@@ -111,15 +111,15 @@ uint16 create_vuid(uid_t uid, gid_t gid, int n_groups, gid_t *groups,
fstrcpy(vuser->name,unix_name);
fstrcpy(vuser->requested_name,requested_name);
fstrcpy(vuser->real_name,real_name);
- memcpy(vuser->user_sess_key, user_sess_key, sizeof(vuser->user_sess_key));
+ memcpy(&vuser->usr, info3, sizeof(vuser->usr));
vuser->n_groups = n_groups;
vuser->groups = groups;
vuid = (uint16)((num_validated_users - 1) + VUID_OFFSET);
DEBUG(3,("uid %d vuid %d registered to name %s\n",(int)uid, vuid, unix_name));
- dump_data_pw("vuid usr sess key:\n", vuser->user_sess_key,
- sizeof(vuser->user_sess_key));
+ dump_data_pw("vuid usr sess key:\n", vuser->usr.user_sess_key,
+ sizeof(vuser->usr.user_sess_key));
return vuid;
}
@@ -129,7 +129,7 @@ register a uid/name pair as being valid and that a valid password
has been given. vuid is biased by an offset. This allows us to
tell random client vuid's (normally zero) from valid vuids.
****************************************************************************/
-uint16 register_vuid(uid_t uid,gid_t gid, char *unix_name, char *requested_name, BOOL guest, uchar user_sess_key[16])
+uint16 register_vuid(uid_t uid,gid_t gid, char *unix_name, char *requested_name, BOOL guest, const NET_USER_INFO_3 *info3)
{
int n_groups = 0;
gid_t *groups = NULL;
@@ -194,7 +194,7 @@ uint16 register_vuid(uid_t uid,gid_t gid, char *unix_name, char *requested_name,
return create_vuid(uid, gid, n_groups, groups,
unix_name, requested_name,
real_name,
- guest, user_sess_key);
+ guest, info3);
}
/*******************************************************************
diff --git a/source/msrpc/msrpcd_process.c b/source/msrpc/msrpcd_process.c
index 984d7ac95fe..0f013935b40 100644
--- a/source/msrpc/msrpcd_process.c
+++ b/source/msrpc/msrpcd_process.c
@@ -367,7 +367,7 @@ BOOL msrpcd_init(int c, msrpc_pipes_struct *p)
usr.uxc.requested_name,
usr.uxc.real_name,
usr.uxc.guest,
- usr.usr_sess_key);
+ &usr.nts);
if (vuid == UID_FIELD_INVALID)
{
diff --git a/source/netlogond/srv_netlogon_nt.c b/source/netlogond/srv_netlogon_nt.c
index 9475325dcbf..7fe6188c55e 100644
--- a/source/netlogond/srv_netlogon_nt.c
+++ b/source/netlogond/srv_netlogon_nt.c
@@ -2,10 +2,10 @@
* Unix SMB/Netbios implementation.
* Version 1.9.
* RPC Pipe client / server routines
- * Copyright (C) Andrew Tridgell 1992-1997,
- * Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
- * Copyright (C) Paul Ashton 1997,
- * Copyright (C) Jeremy Allison 1998,
+ * Copyright (C) Andrew Tridgell 1992-2000,
+ * Copyright (C) Luke Kenneth Casson Leighton 1996-2000,
+ * Copyright (C) Paul Ashton 1997-2000,
+ * Copyright (C) Jeremy Allison 1998-2000,
* Copyright (C) Sander Striker 2000
*
* This program is free software; you can redistribute it and/or modify
diff --git a/source/passdb/pass_check.c b/source/passdb/pass_check.c
index 7effbfef8dd..d89ef2e6c9d 100644
--- a/source/passdb/pass_check.c
+++ b/source/passdb/pass_check.c
@@ -748,39 +748,51 @@ the function pointer fn() points to a function to call when a successful
match is found and is used to update the encrypted password file
return True on correct match, False otherwise
****************************************************************************/
-BOOL pass_check(char *user,char *password, int pwlen, struct passwd *pwd,
- BOOL (*fn)(char *, char *))
+BOOL pass_check(const char *_user, const char *_password,
+ int pwlen, const struct passwd *pwd,
+ BOOL (*fn)(const char *, const char *))
{
pstring pass2;
int level = lp_passwordlevel();
const struct passwd *pass;
+ fstring password;
+ fstring user;
- if (password) password[pwlen] = 0;
+ fstrcpy(user, _user);
#if DEBUG_PASSWORD
DEBUG(100,("checking user=[%s] pass=",user));
dump_data(100, password, strlen(password));
#endif
- if (!password) {
+ if (!_password)
+ {
return(False);
}
+ pwlen = MIN(sizeof(password)-1, pwlen);
+ memset(password, 0, sizeof(password));
+ memcpy(password, _password, pwlen);
+
if (((!*password) || (!pwlen)) && !lp_null_passwords()) {
return(False);
}
- if (pwd && !user) {
- pass = (struct passwd *) pwd;
- user = pass->pw_name;
- } else {
+ if (pwd != NULL && _user == NULL)
+ {
+ pass = (const struct passwd *) pwd;
+ fstrcpy(user, pass->pw_name);
+ }
+ else
+ {
pass = Get_Pwnam(user,True);
}
DEBUG(4,("Checking password for user %s (l=%d)\n",user,pwlen));
- if (!pass) {
+ if (pass == NULL)
+ {
DEBUG(3,("Couldn't find user %s\n",user));
return(False);
}
diff --git a/source/passdb/smbpassfile.c b/source/passdb/smbpassfile.c
index 7127e42db62..42f8cbfbe84 100644
--- a/source/passdb/smbpassfile.c
+++ b/source/passdb/smbpassfile.c
@@ -131,7 +131,7 @@ BOOL trust_password_delete( char *domain, char *name )
The user of this function must have locked the trust password file.
************************************************************************/
-BOOL get_trust_account_password( unsigned char *ret_pwd, time_t *pass_last_set_time)
+BOOL get_trust_account_password( uchar *ret_pwd, time_t *pass_last_set_time)
{
char linebuf[256];
@@ -211,7 +211,7 @@ BOOL get_trust_account_password( unsigned char *ret_pwd, time_t *pass_last_set_t
The user of this function must have locked the trust password file.
************************************************************************/
-BOOL set_trust_account_password( unsigned char *md4_new_pwd)
+BOOL set_trust_account_password( uchar *md4_new_pwd)
{
char linebuf[64];
@@ -235,7 +235,8 @@ account is now invalid. Please recreate. Error was %s.\n", strerror(errno) ));
return True;
}
-BOOL trust_get_passwd( unsigned char trust_passwd[16], char *domain, char *myname)
+BOOL trust_get_passwd( uchar trust_passwd[16],
+ const char *domain, const char *myname)
{
time_t lct;
diff --git a/source/rpc_client/cli_login.c b/source/rpc_client/cli_login.c
index ac8561e586c..3e0c37254bf 100644
--- a/source/rpc_client/cli_login.c
+++ b/source/rpc_client/cli_login.c
@@ -198,8 +198,8 @@ given the current design of the NT Domain system. JRA.
BOOL cli_nt_login_interactive(const char* srv_name, const char* myhostname,
const char *domain, const char *username,
uint32 luid_low,
- uchar *lm_owf_user_pwd,
- uchar *nt_owf_user_pwd,
+ const uchar *lm_owf_user_pwd,
+ const uchar *nt_owf_user_pwd,
NET_ID_INFO_CTR *ctr,
NET_USER_INFO_3 *user_info3)
{
@@ -227,17 +227,6 @@ BOOL cli_nt_login_interactive(const char* srv_name, const char* myhostname,
(char *)sess_key,
lm_owf_user_pwd, nt_owf_user_pwd);
- /* Ensure we overwrite all the plaintext password
- equivalents. */
- if (lm_owf_user_pwd != NULL)
- {
- memset(lm_owf_user_pwd, 0, 16);
- }
- if (nt_owf_user_pwd != NULL)
- {
- memset(nt_owf_user_pwd, 0, 16);
- }
-
/* Send client sam-logon request - update credentials on success. */
ret = cli_net_sam_logon(srv_name, myhostname, ctr, user_info3);
@@ -257,10 +246,10 @@ password equivalents over the network. JRA.
BOOL cli_nt_login_network(const char* srv_name, const char* myhostname,
const char *domain, const char *username,
- uint32 luid_low, char lm_chal[8],
- char *lm_chal_resp,
+ uint32 luid_low, const char lm_chal[8],
+ const char *lm_chal_resp,
int lm_chal_len,
- char *nt_chal_resp,
+ const char *nt_chal_resp,
int nt_chal_len,
NET_ID_INFO_CTR *ctr,
NET_USER_INFO_3 *user_info3)
@@ -282,9 +271,9 @@ BOOL cli_nt_login_network(const char* srv_name, const char* myhostname,
make_id_info2(&ctr->auth.id2, domain, 0,
luid_low, 0,
username, myhostname,
- (uchar *)lm_chal,
- (uchar *)lm_chal_resp, lm_chal_len,
- (uchar *)nt_chal_resp, nt_chal_len);
+ lm_chal,
+ lm_chal_resp, lm_chal_len,
+ nt_chal_resp, nt_chal_len);
/* Send client sam-logon request - update credentials on success. */
ret = cli_net_sam_logon(srv_name, myhostname, ctr, user_info3);
diff --git a/source/rpc_client/msrpc_netlogon.c b/source/rpc_client/msrpc_netlogon.c
index 9cbdbe2ac36..d109100e8f8 100644
--- a/source/rpc_client/msrpc_netlogon.c
+++ b/source/rpc_client/msrpc_netlogon.c
@@ -2,10 +2,9 @@
* Unix SMB/Netbios implementation.
* Version 1.9.
* RPC Pipe client / server routines
- * Copyright (C) Andrew Tridgell 1992-1997,
- * Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
- * Copyright (C) Paul Ashton 1997.
- * Copyright (C) Jeremy Allison 1998.
+ * Copyright (C) Andrew Tridgell 1992-2000,
+ * Copyright (C) Luke Kenneth Casson Leighton 1996-2000,
+ * Copyright (C) Jeremy Allison 1998-2000.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -38,17 +37,15 @@ extern pstring global_myworkgroup;
Do the same as security=server, but using NT Domain calls and a session
key from the workstation trust account password.
************************************************************************/
-static uint32 domain_client_validate( char *user, char *domain,
- char *acct_name, uint16 acct_type,
- char *challenge,
- char *smb_apasswd, int smb_apasslen,
- char *smb_ntpasswd, int smb_ntpasslen,
- uchar user_sess_key[16],
- char lm_pw8[8])
+static uint32 domain_client_validate( const char *user, const char *domain,
+ const char *acct_name, uint16 acct_type,
+ const char *challenge,
+ const char *smb_apasswd, int smb_apasslen,
+ const char *smb_ntpasswd, int smb_ntpasslen,
+ NET_USER_INFO_3 *info3)
{
unsigned char trust_passwd[16];
NET_ID_INFO_CTR ctr;
- NET_USER_INFO_3 info3;
uint32 smb_uid_low;
uint32 status;
fstring trust_acct;
@@ -118,7 +115,7 @@ static uint32 domain_client_validate( char *user, char *domain,
domain, user,
smb_uid_low,
smb_apasswd, smb_ntpasswd,
- &ctr, &info3);
+ &ctr, info3);
}
else if (challenge == NULL)
{
@@ -127,22 +124,17 @@ static uint32 domain_client_validate( char *user, char *domain,
domain, user,
smb_uid_low,
smb_apasswd,
- &ctr, &info3);
+ &ctr, info3);
}
else
{
status = cli_nt_login_network(srv_name,
global_myname,
domain, user,
- smb_uid_low, (char *)challenge,
- (uchar*)smb_apasswd, smb_apasslen,
- (uchar*)smb_ntpasswd, smb_ntpasslen,
- &ctr, &info3);
-
- if (lm_pw8 != NULL)
- {
- memcpy(lm_pw8, info3.padding, 8);
- }
+ smb_uid_low, (const char *)challenge,
+ (const uchar*)smb_apasswd, smb_apasslen,
+ (const uchar*)smb_ntpasswd, smb_ntpasslen,
+ &ctr, info3);
}
if (status == (NT_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT|0xc0000000))
@@ -173,14 +165,6 @@ static uint32 domain_client_validate( char *user, char *domain,
return status;
}
- /* grab the user session key - really important, this */
- if (user_sess_key != NULL)
- {
- memcpy(user_sess_key, info3.user_sess_key,
- sizeof(info3.user_sess_key));
- dump_data_pw("user session key\n", user_sess_key, 16);
- }
-
/*
* Here, if we really want it, we have lots of info about the user in info3.
* LKCLXXXX - really important to check things like "is this user acct
@@ -196,12 +180,11 @@ static uint32 domain_client_validate( char *user, char *domain,
/****************************************************************************
Check for a valid username and password in security=domain mode.
****************************************************************************/
-uint32 check_domain_security(char *orig_user, char *domain,
- uchar *challenge,
- char *smb_apasswd, int smb_apasslen,
- char *smb_ntpasswd, int smb_ntpasslen,
- uchar user_sess_key[16],
- char lm_pw8[8])
+uint32 check_domain_security(const char *orig_user, const char *domain,
+ const uchar *challenge,
+ const char *smb_apasswd, int smb_apasslen,
+ const char *smb_ntpasswd, int smb_ntpasslen,
+ NET_USER_INFO_3 *info3)
{
fstring acct_name;
uint16 acct_type = 0;
@@ -236,5 +219,5 @@ uint32 check_domain_security(char *orig_user, char *domain,
challenge,
smb_apasswd, smb_apasslen,
smb_ntpasswd, smb_ntpasslen,
- user_sess_key, lm_pw8);
+ info3);
}
diff --git a/source/rpc_client/msrpc_samr.c b/source/rpc_client/msrpc_samr.c
index 5ce6dbd5bc3..a5d5cc9b8c6 100644
--- a/source/rpc_client/msrpc_samr.c
+++ b/source/rpc_client/msrpc_samr.c
@@ -155,8 +155,8 @@ uint32 lookup_sam_name(const char *domain, DOM_SID *sid,
BOOL res1 = True;
uint32 ace_perms = 0x02000000; /* absolutely no idea. */
const char *names[1];
- uint32 *rids;
- uint32 *types;
+ uint32 *rids = NULL;
+ uint32 *types = NULL;
uint32 num_rids;
POLICY_HND sam_pol;
POLICY_HND pol_dom;
@@ -505,8 +505,8 @@ BOOL msrpc_sam_query_user( const char* srv_name,
const char *names[1];
uint32 num_rids;
- uint32 *rid;
- uint32 *type;
+ uint32 *rid = NULL;
+ uint32 *type = NULL;
POLICY_HND sam_pol;
POLICY_HND pol_dom;
@@ -1245,8 +1245,8 @@ BOOL create_samr_domain_user( POLICY_HND *pol_dom,
{
uint32 num_rids;
const char *names[1];
- uint32 *types;
- uint32 *rids;
+ uint32 *types = NULL;
+ uint32 *rids = NULL;
names[0] = acct_name;
res1 = samr_query_lookup_names( pol_dom, 0x3e8,
@@ -1908,3 +1908,59 @@ BOOL msrpc_sam_ntpasswd_set(const char* srv_name, const char *user,
return res1;
}
+
+/****************************************************************************
+experimental SAM user query.
+****************************************************************************/
+BOOL msrpc_sam_query_userinfo(const char* srv_name, const DOM_SID *sid,
+ const char *user_name, uint16 info_level,
+ SAM_USERINFO_CTR *ctr)
+{
+ BOOL res = True;
+ BOOL res1 = True;
+
+ const char *names[1];
+ uint32 num_rids;
+ uint32 *rids = NULL;
+ uint32 *types = NULL;
+ POLICY_HND sam_pol;
+ POLICY_HND pol_dom;
+
+ /* establish a connection to a domain */
+ res = res ? samr_connect( srv_name, 0x02000000, &sam_pol) : False;
+ res = res ? samr_open_domain( &sam_pol, 0x304, sid, &pol_dom) : False;
+
+ /* look up user rid */
+ names[0] = user_name;
+ res1 = res ? samr_query_lookup_names( &pol_dom, 0x3e8,
+ 1, names,
+ &num_rids, &rids, &types) : False;
+
+ /* send user info query */
+ if (res1 && num_rids == 1)
+ {
+ res1 = get_samr_query_userinfo( &pol_dom,
+ info_level, rids[0], ctr);
+ }
+ else
+ {
+ res1 = False;
+ }
+
+ res = res ? samr_close( &pol_dom) : False;
+ res = res ? samr_close( &sam_pol) : False;
+
+ if (res1)
+ {
+ DEBUG(5,("msrpc_sam_query_userinfo: succeeded\n"));
+ }
+ else
+ {
+ DEBUG(5,("msrpc_sam_query_userinfo: failed\n"));
+ }
+
+ safe_free(rids);
+ safe_free(types);
+
+ return res1;
+}
diff --git a/source/rpc_parse/parse_creds.c b/source/rpc_parse/parse_creds.c
index 7d46ad0efac..3e723787689 100644
--- a/source/rpc_parse/parse_creds.c
+++ b/source/rpc_parse/parse_creds.c
@@ -23,6 +23,7 @@
#include "includes.h"
+#include "rpc_parse.h"
extern int DEBUGLEVEL;
@@ -153,82 +154,6 @@ void creds_free_unix_sec(CREDS_UNIX_SEC *r_u)
}
/*******************************************************************
-makes a CREDS_NT_SEC structure.
-********************************************************************/
-BOOL make_creds_nt_sec(CREDS_NT_SEC *r_u,
- DOM_SID *sid, uint32 num_grps, uint32 *grps)
-{
- int i;
- if (r_u == NULL) return False;
-
- DEBUG(5,("make_creds_unix_sec\n"));
-
- sid_copy(&r_u->sid, sid);
- r_u->num_grps = num_grps;
- r_u->grp_rids = (uint32*)Realloc(NULL, sizeof(r_u->grp_rids[0]) *
- r_u->num_grps);
-
- if (r_u->grp_rids == NULL && num_grps != 0)
- {
- return False;
- }
- for (i = 0; i < num_grps; i++)
- {
- r_u->grp_rids[i] = grps[i];
- }
-
- return True;
-}
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-BOOL creds_io_nt_sec(char *desc, CREDS_NT_SEC *r_u, prs_struct *ps, int depth)
-{
- int i;
- if (r_u == NULL) return False;
-
- prs_debug(ps, depth, desc, "creds_io_nt");
- depth++;
-
- prs_align(ps);
-
- smb_io_dom_sid ("sid", &r_u->sid, ps, depth);
- prs_align(ps);
-
- prs_uint32("num_grps", ps, depth, &(r_u->num_grps));
- if (r_u->num_grps != 0)
- {
- r_u->grp_rids = (uint32*)Realloc(r_u->grp_rids,
- sizeof(r_u->grp_rids[0]) *
- r_u->num_grps);
- if (r_u->grp_rids == NULL)
- {
- creds_free_nt_sec(r_u);
- return False;
- }
- }
- for (i = 0; i < r_u->num_grps; i++)
- {
- prs_uint32("", ps, depth, &(r_u->grp_rids[i]));
- }
-
- return True;
-}
-
-/*******************************************************************
-frees a structure.
-********************************************************************/
-void creds_free_nt_sec(CREDS_NT_SEC *r_u)
-{
- if (r_u->grp_rids != NULL)
- {
- free(r_u->grp_rids);
- r_u->grp_rids = NULL;
- }
-}
-
-/*******************************************************************
reads or writes a structure.
********************************************************************/
BOOL creds_io_pwd_info(char *desc, struct pwd_info *pwd, prs_struct *ps, int depth)
@@ -335,7 +260,6 @@ BOOL creds_io_hybrid(char *desc, CREDS_HYBRID *r_u, prs_struct *ps, int depth)
prs_uint32("ptr_uxc", ps, depth, &(r_u->ptr_uxc));
prs_uint32("ptr_nts", ps, depth, &(r_u->ptr_nts));
prs_uint32("ptr_uxs", ps, depth, &(r_u->ptr_uxs));
- prs_uint32("ptr_ssk", ps, depth, &(r_u->ptr_ssk));
if (r_u->ptr_ntc != 0)
{
if (!creds_io_nt ("ntc", &r_u->ntc, ps, depth)) return False;
@@ -346,20 +270,12 @@ BOOL creds_io_hybrid(char *desc, CREDS_HYBRID *r_u, prs_struct *ps, int depth)
}
if (r_u->ptr_nts != 0)
{
- if (!creds_io_nt_sec ("nts", &r_u->nts, ps, depth)) return False;
+ if (!net_io_user_info3("nts", &r_u->nts, ps, depth)) return False;
}
if (r_u->ptr_uxs != 0)
{
if (!creds_io_unix_sec("uxs", &r_u->uxs, ps, depth)) return False;
}
- if (r_u->ptr_ssk != 0)
- {
- prs_uint8s(False, "usr_sess_key", ps, depth, (char*)&r_u->usr_sess_key, sizeof(r_u->usr_sess_key));
- }
- else
- {
- memset(r_u->usr_sess_key, 0, sizeof(r_u->usr_sess_key));
- }
return True;
}
@@ -373,30 +289,6 @@ void copy_unix_creds(CREDS_UNIX *to, const CREDS_UNIX *from)
fstrcpy(to->user_name, from->user_name);
};
-void copy_nt_sec_creds(CREDS_NT_SEC *to, const CREDS_NT_SEC *from)
-{
- if (from == NULL)
- {
- ZERO_STRUCTP(to);
- return;
- }
- sid_copy(&to->sid, &from->sid);
- to->num_grps = 0;
- to->grp_rids = NULL;
-
- if (from->num_grps != 0)
- {
- size_t size = from->num_grps * sizeof(from->grp_rids[0]);
- to->grp_rids = (uint32*)malloc(size);
- if (to->grp_rids == NULL)
- {
- return;
- }
- to->num_grps = from->num_grps;
- memcpy(to->grp_rids, from->grp_rids, size);
- }
-};
-
void copy_unix_sec_creds(CREDS_UNIX_SEC *to, const CREDS_UNIX_SEC *from)
{
if (from == NULL)
@@ -457,10 +349,12 @@ void copy_user_creds(struct user_creds *to,
to->ptr_uxc = 0;
to->ptr_nts = 0;
to->ptr_uxs = 0;
- to->ptr_ssk = 0;
copy_nt_creds(&to->ntc, NULL);
copy_unix_creds(&to->uxc, NULL);
+ memset(&to->nts, 0, sizeof(to->nts));
+#if 0
copy_nt_sec_creds(&to->nts, NULL);
+#endif
copy_unix_sec_creds(&to->uxs, NULL);
to->reuse = False;
return;
@@ -472,7 +366,6 @@ void copy_user_creds(struct user_creds *to,
to->ptr_uxs = from->ptr_uxs;
to->ptr_ntc = from->ptr_ntc;
to->ptr_uxc = from->ptr_uxc;
- to->ptr_ssk = from->ptr_ssk;
if (to->ptr_ntc != 0)
{
@@ -484,17 +377,15 @@ void copy_user_creds(struct user_creds *to,
}
if (to->ptr_nts != 0)
{
+ memcpy(&to->nts, &from->nts, sizeof(to->nts));
+#if 0
copy_nt_sec_creds(&to->nts, &from->nts);
+#endif
}
if (to->ptr_uxs != 0)
{
copy_unix_sec_creds(&to->uxs, &from->uxs);
}
- if (to->ptr_ssk != 0)
- {
- memcpy(to->usr_sess_key, from->usr_sess_key,
- sizeof(to->usr_sess_key));
- }
};
void free_user_creds(struct user_creds *creds)
@@ -502,7 +393,9 @@ void free_user_creds(struct user_creds *creds)
creds_free_unix(&creds->uxc);
creds_free_nt (&creds->ntc);
creds_free_unix_sec(&creds->uxs);
+#if 0
creds_free_nt_sec (&creds->nts);
+#endif
}
/*******************************************************************
diff --git a/source/rpc_parse/parse_misc.c b/source/rpc_parse/parse_misc.c
index 653302a9691..fce42a87f7d 100644
--- a/source/rpc_parse/parse_misc.c
+++ b/source/rpc_parse/parse_misc.c
@@ -1241,7 +1241,7 @@ BOOL smb_io_clnt_info(char *desc, DOM_CLNT_INFO *clnt, prs_struct *ps, int dept
/*******************************************************************
makes an OWF_INFO structure.
********************************************************************/
-BOOL make_owf_info(OWF_INFO *hash, uint8 data[16])
+BOOL make_owf_info(OWF_INFO *hash, const uint8 data[16])
{
if (hash == NULL) return False;
diff --git a/source/rpc_parse/parse_net.c b/source/rpc_parse/parse_net.c
index 1b9df414f4e..518c2ca48ab 100644
--- a/source/rpc_parse/parse_net.c
+++ b/source/rpc_parse/parse_net.c
@@ -558,10 +558,14 @@ static int make_dom_sid2s(const char *sids_str, DOM_SID2 *sids, int max_sids)
makes a NET_ID_INFO_1 structure.
********************************************************************/
BOOL make_id_info1(NET_ID_INFO_1 *id, const char *domain_name,
- uint32 param_ctrl, uint32 log_id_low, uint32 log_id_high,
- const char *user_name, const char *wksta_name,
- char sess_key[16],
- uchar lm_cypher[16], uchar nt_cypher[16])
+ uint32 param_ctrl,
+ uint32 log_id_low,
+ uint32 log_id_high,
+ const char *user_name,
+ const char *wksta_name,
+ const char sess_key[16],
+ const uchar lm_cypher[16],
+ const uchar nt_cypher[16])
{
int len_domain_name = strlen(domain_name);
int len_user_name = strlen(user_name );
@@ -773,10 +777,10 @@ BOOL make_id_info2(NET_ID_INFO_2 *id, const char *domain_name,
uint32 param_ctrl,
uint32 log_id_low, uint32 log_id_high,
const char *user_name, const char *wksta_name,
- uchar lm_challenge[8],
- uchar *lm_chal_resp,
+ const uchar lm_challenge[8],
+ const uchar *lm_chal_resp,
int lm_chal_len,
- uchar *nt_chal_resp,
+ const uchar *nt_chal_resp,
int nt_chal_len)
{
int len_domain_name = strlen(domain_name);
@@ -821,8 +825,8 @@ BOOL make_id_info2(NET_ID_INFO_2 *id, const char *domain_name,
make_unistr2(&(id->uni_user_name ), user_name , len_user_name );
make_unistr2(&(id->uni_wksta_name ), wksta_name , len_wksta_name );
- make_string2(&(id->nt_chal_resp ), (char *)nt_chal_resp , nt_chal_len);
- make_string2(&(id->lm_chal_resp ), (char *)lm_chal_resp , lm_chal_len);
+ make_string2(&(id->nt_chal_resp ), nt_chal_resp , nt_chal_len);
+ make_string2(&(id->lm_chal_resp ), lm_chal_resp , lm_chal_len);
return True;
}
@@ -1227,7 +1231,7 @@ BOOL make_net_user_info3(NET_USER_INFO_3 *usr,
/*******************************************************************
reads or writes a structure.
********************************************************************/
-static BOOL net_io_user_info3(char *desc, NET_USER_INFO_3 *usr, prs_struct *ps, int depth)
+BOOL net_io_user_info3(char *desc, NET_USER_INFO_3 *usr, prs_struct *ps, int depth)
{
uint32 i;
diff --git a/source/rpc_server/srv_pipe_hnd.c b/source/rpc_server/srv_pipe_hnd.c
index a4af1669a23..43c86bd8cdf 100644
--- a/source/rpc_server/srv_pipe_hnd.c
+++ b/source/rpc_server/srv_pipe_hnd.c
@@ -106,8 +106,8 @@ pipes_struct *open_rpc_pipe_p(char *pipe_name,
usr.ptr_uxs = 1;
make_creds_unix_sec(&usr.uxs, vuser->uid, vuser->gid,
vuser->n_groups, vuser->groups);
- usr.ptr_ssk = 1;
- memcpy(usr.usr_sess_key, vuser->user_sess_key, sizeof(usr.usr_sess_key));
+ usr.ptr_nts = 1;
+ memcpy(&usr.nts, &vuser->usr, sizeof(usr.nts));
/* set up nt credentials from the smb side, to feed over the pipe */
/* lkclXXXX todo!
diff --git a/source/rpc_server/srv_pipe_ntlmssp.c b/source/rpc_server/srv_pipe_ntlmssp.c
index f38e99251a2..e9735150e07 100644
--- a/source/rpc_server/srv_pipe_ntlmssp.c
+++ b/source/rpc_server/srv_pipe_ntlmssp.c
@@ -218,9 +218,10 @@ static BOOL api_ntlmssp_verify(rpcsrv_struct *l,
const struct passwd *pw = NULL;
fstring unix_user;
fstring nt_user;
- uchar user_sess_key[16];
+ NET_USER_INFO_3 info3;
BOOL guest = False;
+ ZERO_STRUCT(info3);
memset(password, 0, sizeof(password));
DEBUG(5,("api_ntlmssp_verify: checking user details\n"));
@@ -280,31 +281,25 @@ static BOOL api_ntlmssp_verify(rpcsrv_struct *l,
if (anonymous)
{
DEBUG(5,("anonymous user session\n"));
- mdfour(user_sess_key, password, 16);
- l->auth_validated = True;
guest = True;
safe_strcpy(unix_user, lp_guestaccount(-1), sizeof(unix_user)-1);
nt_user[0] = 0;
pw = Get_Pwnam(unix_user, True);
- l->auth_validated = pw != NULL;
}
- else
- {
- DEBUG(5,("user: %s domain: %s wks: %s\n",
+ DEBUG(5,("user: %s domain: %s wks: %s\n",
user_name, domain, wks));
- l->auth_validated = check_domain_security(user_name, domain,
- (uchar*)a->ntlmssp_chal.challenge,
+ l->auth_validated = check_domain_security(user_name, domain,
+ (const uchar*)a->ntlmssp_chal.challenge,
lm_owf, lm_owf_len,
nt_owf, nt_owf_len,
- user_sess_key,
- password) == 0x0;
- if (l->auth_validated)
- {
- pw = map_nt_and_unix_username(domain, user_name,
- unix_user, nt_user);
- l->auth_validated = pw != NULL;
- }
+ &info3) == 0x0;
+
+ if (!anonymous && l->auth_validated)
+ {
+ pw = map_nt_and_unix_username(domain, user_name,
+ unix_user, nt_user);
+ l->auth_validated = pw != NULL;
}
if (l->auth_validated)
@@ -312,7 +307,7 @@ static BOOL api_ntlmssp_verify(rpcsrv_struct *l,
become_root(False);
l->vuid = register_vuid(pw->pw_uid, pw->pw_gid,
unix_user, nt_user,
- guest, user_sess_key);
+ guest, &info3);
unbecome_root(False);
l->auth_validated = l->vuid != UID_FIELD_INVALID;
}
diff --git a/source/smbd/chgpasswd.c b/source/smbd/chgpasswd.c
index a07723f937c..9ebc4ed2f9a 100644
--- a/source/smbd/chgpasswd.c
+++ b/source/smbd/chgpasswd.c
@@ -829,7 +829,7 @@ BOOL change_oem_password(struct smb_passwd *smbpw, UNISTR2 *new_passwd,
/****************************************************************************
update the encrypted smbpasswd file from the plaintext username and password
*****************************************************************************/
-BOOL update_smbpassword_file(char *user, char *password)
+BOOL update_smbpassword_file(const char *user, const char *password)
{
struct smb_passwd *smbpw;
UNISTR2 newpw;
diff --git a/source/smbd/lanman.c b/source/smbd/lanman.c
index 3a15e90e8fa..49f4563b34c 100644
--- a/source/smbd/lanman.c
+++ b/source/smbd/lanman.c
@@ -1630,18 +1630,6 @@ static BOOL api_SamOEMChangePassword(connection_struct *conn,uint16 vuid, char *
DEBUG(3,("api_SamOEMChangePassword: Change password for <%s>\n",user));
- /*
- * Pass the user through the NT -> unix user mapping
- * function.
- */
-
- (void)map_username(user);
-
- /*
- * Do any UNIX username case mangling.
- */
- (void)Get_Pwnam( user, True);
-
if (msrpc_sam_ntpasswd_set("\\\\.", user, NULL,
(uchar*) data, (uchar *)&data[516], /* lm pw */
NULL, NULL)) /* nt pw */
diff --git a/source/smbd/negprot.c b/source/smbd/negprot.c
index 0b48b0e2b25..4498e42950b 100644
--- a/source/smbd/negprot.c
+++ b/source/smbd/negprot.c
@@ -111,15 +111,6 @@ static int reply_lanman2(char *outbuf)
char cryptkey[8];
char crypt_len = 0;
- if (lp_security() == SEC_SERVER) {
- cli = server_cryptkey();
- }
-
- if (cli) {
- DEBUG(3,("using password server validation\n"));
- doencrypt = ((cli->sec_mode & 2) != 0);
- }
-
if (lp_security()>=SEC_USER) secword |= 1;
if (doencrypt) secword |= 2;
@@ -164,7 +155,6 @@ static int reply_nt1(char *outbuf)
BOOL doencrypt = SMBENCRYPT();
time_t t = time(NULL);
int data_len;
- struct cli_state *cli = NULL;
char cryptkey[8];
char crypt_len = 0;
@@ -190,24 +180,9 @@ static int reply_nt1(char *outbuf)
CAP_LARGE_READX|CAP_STATUS32|CAP_LEVEL_II_OPLOCKS;
*/
- if (lp_security() == SEC_SERVER)
- {
- cli = server_cryptkey();
- }
-
- if (cli) {
- DEBUG(3,("using password server validation\n"));
- doencrypt = ((cli->sec_mode & 2) != 0);
- }
-
if (doencrypt) {
crypt_len = 8;
- if (!cli) {
- generate_next_challenge(cryptkey);
- } else {
- memcpy(cryptkey, cli->cryptkey, 8);
- set_challenge(cli->cryptkey);
- }
+ generate_next_challenge(cryptkey);
}
if (lp_readraw() && lp_writeraw()) {
diff --git a/source/smbd/password.c b/source/smbd/password.c
index 7b6668c04d9..2141525bc09 100644
--- a/source/smbd/password.c
+++ b/source/smbd/password.c
@@ -55,129 +55,27 @@ void add_session_user(char *user)
}
/****************************************************************************
-validate a password with the password server
-****************************************************************************/
-static BOOL check_server_security(char *user, char *domain,
- char *pass, int passlen,
- char *ntpass, int ntpasslen)
-{
- struct cli_state *cli;
- static unsigned char badpass[24];
- static BOOL tested_password_server = False;
- static BOOL bad_password_server = False;
-
- if(lp_security() != SEC_SERVER)
- return False;
-
- DEBUG(10,("check_server_security\n"));
-
- cli = server_client();
-
- if (!cli->initialised)
- {
- DEBUG(1,("password server %s is not connected\n", cli->desthost));
- return False;
- }
-
- if(badpass[0] == 0)
- memset(badpass, 0x1f, sizeof(badpass));
-
- if((passlen == sizeof(badpass)) && !memcmp(badpass, pass, passlen)) {
- /*
- * Very unlikely, our random bad password is the same as the users
- * password. */
- memset(badpass, badpass[0]+1, sizeof(badpass));
- }
-
- /*
- * Attempt a session setup with a totally incorrect password.
- * If this succeeds with the guest bit *NOT* set then the password
- * server is broken and is not correctly setting the guest bit. We
- * need to detect this as some versions of NT4.x are broken. JRA.
- */
-
- if(!tested_password_server) {
- if (cli_session_setup(cli, global_myname,
- user, (char *)badpass, sizeof(badpass),
- (char *)badpass, sizeof(badpass), domain)) {
-
- /*
- * We connected to the password server so we
- * can say we've tested it.
- */
- tested_password_server = True;
-
- if ((SVAL(cli->inbuf,smb_vwv2) & 1) == 0) {
- DEBUG(0,("server_validate: password server %s allows users as non-guest \
-with a bad password.\n", cli->desthost));
- DEBUG(0,("server_validate: This is broken (and insecure) behaviour. Please do not \
-use this machine as the password server.\n"));
- cli_ulogoff(cli);
-
- /*
- * Password server has the bug.
- */
- bad_password_server = True;
- return False;
- }
- cli_ulogoff(cli);
- }
- } else {
-
- /*
- * We have already tested the password server.
- * Fail immediately if it has the bug.
- */
-
- if(bad_password_server) {
- DEBUG(0,("server_validate: [1] password server %s allows users as non-guest \
-with a bad password.\n", cli->desthost));
- DEBUG(0,("server_validate: [1] This is broken (and insecure) behaviour. Please do not \
-use this machine as the password server.\n"));
- return False;
- }
- }
-
- /*
- * Now we know the password server will correctly set the guest bit, or is
- * not guest enabled, we can try with the real password.
- */
-
- if (!cli_session_setup(cli, global_myname,
- user, pass, passlen, ntpass, ntpasslen, domain)) {
- DEBUG(1,("password server %s rejected the password\n", cli->desthost));
- return False;
- }
-
- /* if logged in as guest then reject */
- if ((SVAL(cli->inbuf,smb_vwv2) & 1) != 0) {
- DEBUG(1,("password server %s gave us guest only\n", cli->desthost));
- cli_ulogoff(cli);
- return False;
- }
-
-
- cli_ulogoff(cli);
-
- return(True);
-}
-
-
-/****************************************************************************
check if a username/password pair is OK either via the system password
database or the encrypted SMB password database
return True if the password is correct, False otherwise
****************************************************************************/
-BOOL password_ok(char *orig_user, char *domain,
- char *smb_apasswd, int smb_apasslen,
- char *smb_ntpasswd, int smb_ntpasslen,
+BOOL password_ok(const char *orig_user, const char *domain,
+ const char *smb_apasswd, int smb_apasslen,
+ const char *smb_ntpasswd, int smb_ntpasslen,
struct passwd *pwd,
- uchar user_sess_key[16])
+ NET_USER_INFO_3 *info3)
{
uchar last_chal[8];
BOOL cleartext = smb_apasslen != 24 && smb_ntpasslen == 0;
uchar *chal = NULL;
+ if (info3 == NULL)
+ {
+ DEBUG(0,("password_ok: no NET_USER_INFO_3 parameter!\n"));
+ return False;
+ }
+
+ ZERO_STRUCTP(info3);
/*
* SMB password check
*/
@@ -186,15 +84,7 @@ BOOL password_ok(char *orig_user, char *domain,
(lp_encrypted_passwords() && smb_apasslen == 0 &&
lp_null_passwords()))
{
- /* check security = server */
- if (!cleartext &&
- check_server_security(orig_user, domain,
- smb_apasswd, smb_apasslen,
- smb_ntpasswd, smb_ntpasslen))
- {
- DEBUG(10,("password_ok: server auth succeeded\n"));
- return True;
- }
+ DEBUG(10,("password_ok: check SMB auth\n"));
/* check security = user / domain */
if ((!cleartext) && last_challenge(last_chal))
@@ -206,7 +96,7 @@ BOOL password_ok(char *orig_user, char *domain,
chal,
smb_apasswd, smb_apasslen,
smb_ntpasswd, smb_ntpasslen,
- user_sess_key, NULL) == 0x0)
+ info3) == 0x0)
{
DEBUG(10,("password_ok: domain auth succeeded\n"));
return True;
@@ -236,7 +126,7 @@ BOOL password_ok(char *orig_user, char *domain,
validate a group username entry. Return the username or NULL
****************************************************************************/
static char *validate_group(char *group,char *password,int pwlen,int snum,
- uchar user_sess_key[16])
+ NET_USER_INFO_3 *info3)
{
#if defined(HAVE_NETGROUP) && defined(HAVE_GETNETGRENT) && defined(HAVE_SETNETGRENT) && defined(HAVE_ENDNETGRENT)
{
@@ -245,7 +135,7 @@ static char *validate_group(char *group,char *password,int pwlen,int snum,
while (getnetgrent(&host, &user, &domain)) {
if (user) {
if (user_ok(user, snum) &&
- password_ok(user,NULL,password,pwlen,NULL,0,NULL,user_sess_key))
+ password_ok(user,NULL,password,pwlen,NULL,0,NULL,info3))
{
endnetgrent();
return(user);
@@ -268,7 +158,7 @@ static char *validate_group(char *group,char *password,int pwlen,int snum,
static fstring name;
fstrcpy(name,*member);
if (user_ok(name,snum) &&
- password_ok(name,NULL,password,pwlen,NULL,0,NULL, user_sess_key))
+ password_ok(name,NULL,password,pwlen,NULL,0,NULL, info3))
return(&name[0]);
member++;
}
@@ -335,14 +225,14 @@ BOOL authorise_login(int snum,char *user, char *domain,
/* check the given username and password */
if (!ok && (*user) && user_ok(user,snum)) {
- ok = password_ok(user,domain, password, pwlen, NULL, 0, NULL, vuser->user_sess_key);
+ ok = password_ok(user,domain, password, pwlen, NULL, 0, NULL, &vuser->usr);
if (ok) DEBUG(3,("ACCEPTED: given username password ok\n"));
}
/* check for a previously registered guest username */
if (!ok && (vuser != 0) && vuser->guest) {
if (user_ok(vuser->name,snum) &&
- password_ok(vuser->name, domain, password, pwlen, NULL, 0, NULL, vuser->user_sess_key)) {
+ password_ok(vuser->name, domain, password, pwlen, NULL, 0, NULL, &vuser->usr)) {
fstrcpy(user, vuser->name);
vuser->guest = False;
DEBUG(3,("ACCEPTED: given password with registered user %s\n", user));
@@ -367,7 +257,7 @@ BOOL authorise_login(int snum,char *user, char *domain,
if (!user_ok(user2,snum)) continue;
if (password_ok(user2, domain, password, pwlen, NULL, 0, NULL,
- vuser->user_sess_key))
+ &vuser->usr))
{
ok = True;
fstrcpy(user,user2);
@@ -407,7 +297,7 @@ BOOL authorise_login(int snum,char *user, char *domain,
{
if (*auser == '@')
{
- auser = validate_group(auser+1,password,pwlen,snum, vuser->user_sess_key);
+ auser = validate_group(auser+1,password,pwlen,snum, &vuser->usr);
if (auser)
{
ok = True;
@@ -421,7 +311,7 @@ BOOL authorise_login(int snum,char *user, char *domain,
fstrcpy(user2,auser);
if (user_ok(user2,snum) &&
password_ok(user2,domain,password,pwlen,NULL, 0,
- NULL, vuser->user_sess_key))
+ NULL, &vuser->usr))
{
ok = True;
fstrcpy(user,user2);
@@ -598,24 +488,3 @@ BOOL check_hosts_equiv(char *user)
}
-/****************************************************************************
-return the client state structure
-****************************************************************************/
-struct cli_state *server_client(void)
-{
- static struct cli_state pw_cli;
- return &pw_cli;
-}
-
-/****************************************************************************
-support for server level security
-****************************************************************************/
-struct cli_state *server_cryptkey(void)
-{
- if (cli_connect_serverlist(server_client(), lp_passwordserver()))
- {
- return server_client();
- }
- return NULL;
-}
-
diff --git a/source/smbd/process.c b/source/smbd/process.c
index 6b151bf3bc6..d391914f600 100644
--- a/source/smbd/process.c
+++ b/source/smbd/process.c
@@ -884,15 +884,10 @@ void smbd_process(void)
if (keepalive && (counter-last_keepalive)>keepalive)
{
- struct cli_state *cli = server_client();
if (!send_keepalive(Client)) {
DEBUG( 2, ( "Keepalive failed - exiting.\n" ) );
return;
}
- /* also send a keepalive to the password server if its still
- connected */
- if (cli && cli->initialised)
- send_keepalive(cli->fd);
last_keepalive = counter;
}
diff --git a/source/smbd/reply.c b/source/smbd/reply.c
index 8bdbec7f127..718f0cf47f8 100644
--- a/source/smbd/reply.c
+++ b/source/smbd/reply.c
@@ -383,11 +383,12 @@ static int session_trust_account(connection_struct *conn,
if (last_challenge(last_chal))
{
+ NET_USER_INFO_3 info3;
status = check_domain_security(user, domain,
last_chal,
(uchar *)smb_passwd, smb_passlen,
(uchar *)smb_nt_passwd, smb_nt_passlen,
- NULL, NULL);
+ &info3);
}
else
{
@@ -410,7 +411,7 @@ reply to a session setup command
int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize)
{
uint16 sess_vuid;
- uchar user_sess_key[16];
+ NET_USER_INFO_3 info3;
int gid;
int uid;
int smb_bufsize;
@@ -611,7 +612,7 @@ user %s attempted down-level SMB connection\n", user));
if(!password_ok(orig_user, domain,
smb_apasswd,smb_apasslen,
smb_ntpasswd,smb_ntpasslen,
- NULL, user_sess_key))
+ NULL, &info3))
{
DEBUG(0,("SMB LM/NT Password did not match!\n"));
@@ -692,7 +693,7 @@ user %s attempted down-level SMB connection\n", user));
/* register the name and uid as being validated, so further connections
to a uid can get through without a password, on the same VC */
- sess_vuid = register_vuid(uid,gid,user,sesssetup_user,guest,user_sess_key);
+ sess_vuid = register_vuid(uid,gid,user,sesssetup_user,guest,&info3);
SSVAL(outbuf,smb_uid,sess_vuid);
SSVAL(inbuf,smb_uid,sess_vuid);
diff --git a/source/tdb/tdb.c b/source/tdb/tdb.c
index 744f5bb6be6..c469436f75d 100644
--- a/source/tdb/tdb.c
+++ b/source/tdb/tdb.c
@@ -54,6 +54,10 @@
#define BUCKET(hash) ((hash) % tdb->header.hash_size)
+#ifndef MAP_FILE
+#define MAP_FILE 0
+#endif
+
/* the body of the database is made of one list_struct for the free space
plus a separate data list for each hash value */
struct list_struct {
@@ -814,7 +818,7 @@ TDB_DATA tdb_nextkey(TDB_CONTEXT *tdb, TDB_DATA key)
}
/* Read the record. */
- if (rec_read(tdb, rec_ptr, &rec) == 0) {
+ if (rec_read(tdb, rec_ptr, &rec) == -1) {
tdb_unlock(tdb, hbucket);
return null_data;
}