diff options
author | Luke Leighton <lkcl@samba.org> | 2000-02-04 05:16:57 +0000 |
---|---|---|
committer | Luke Leighton <lkcl@samba.org> | 2000-02-04 05:16:57 +0000 |
commit | 1cc42831d37417035188cedf9b36a638cc754160 (patch) | |
tree | f84b900aa9639b9250cee23b3552dcc400042c71 | |
parent | cbac99425b0b230788ea71ca716806b1332b5006 (diff) | |
download | samba-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!
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; } |