mirror of
https://github.com/samba-team/samba.git
synced 2025-01-22 22:04:08 +03:00
clientgen.c ipc.c smbpasswd.c: Fixes for warnings (from Herb).
quotas.c: Linux quota fix. util.c: Ensure smb_read_error is zero in all calls that can set it. lib/rpc/include/rpc_misc.h lib/rpc/include/rpc_netlogon.h lib/rpc/parse/parse_misc.c lib/rpc/parse/parse_net.c lib/rpc/server/srv_netlog.c : Modify Luke's code to call SamOEMhash(). Jeremy.
This commit is contained in:
parent
94d5b33559
commit
7f74970838
@ -293,8 +293,8 @@ void make_clnt_info(DOM_CLNT_INFO *clnt,
|
||||
void smb_io_clnt_info(char *desc, DOM_CLNT_INFO *clnt, prs_struct *ps, int depth);
|
||||
void make_logon_id(DOM_LOGON_ID *log, uint32 log_id_low, uint32 log_id_high);
|
||||
void smb_io_logon_id(char *desc, DOM_LOGON_ID *log, prs_struct *ps, int depth);
|
||||
void make_arc4_owf(ARC4_OWF *hash, uint8 data[16]);
|
||||
void smb_io_arc4_owf(char *desc, ARC4_OWF *hash, prs_struct *ps, int depth);
|
||||
void make_owf_info(OWF_INFO *hash, uint8 data[16]);
|
||||
void smb_io_owf_info(char *desc, OWF_INFO *hash, prs_struct *ps, int depth);
|
||||
void smb_io_gid(char *desc, DOM_GID *gid, prs_struct *ps, int depth);
|
||||
void smb_io_pol_hnd(char *desc, POLICY_HND *pol, prs_struct *ps, int depth);
|
||||
void smb_io_dom_query_3(char *desc, DOM_QUERY_3 *d_q, prs_struct *ps, int depth);
|
||||
|
@ -243,12 +243,12 @@ typedef struct logon_info
|
||||
|
||||
} DOM_LOGON_ID;
|
||||
|
||||
/* ARC4_OWF */
|
||||
typedef struct arc4_owf_info
|
||||
/* OWF INFO */
|
||||
typedef struct owf_info
|
||||
{
|
||||
uint8 data[16];
|
||||
|
||||
} ARC4_OWF;
|
||||
} OWF_INFO;
|
||||
|
||||
|
||||
/* DOM_GID - group id + user attributes */
|
||||
|
@ -293,8 +293,8 @@ typedef struct id_info_1
|
||||
DOM_LOGON_ID logon_id; /* logon ID */
|
||||
UNIHDR hdr_user_name; /* user name unicode header */
|
||||
UNIHDR hdr_wksta_name; /* workstation name unicode header */
|
||||
ARC4_OWF arc4_lm_owf; /* arc4 LM OWF Password */
|
||||
ARC4_OWF arc4_nt_owf; /* arc4 NT OWF Password */
|
||||
OWF_INFO lm_owf; /* LM OWF Password */
|
||||
OWF_INFO nt_owf; /* NT OWF Password */
|
||||
UNISTR2 uni_domain_name; /* domain name unicode string */
|
||||
UNISTR2 uni_user_name; /* user name unicode string */
|
||||
UNISTR2 uni_wksta_name; /* workgroup name unicode string */
|
||||
|
@ -2492,6 +2492,8 @@ BOOL receive_local_message(int fd, char *buffer, int buffer_len, int timeout)
|
||||
int fromlen = sizeof(from);
|
||||
int32 msg_len = 0;
|
||||
|
||||
smb_read_error = 0;
|
||||
|
||||
if(timeout != 0)
|
||||
{
|
||||
struct timeval to;
|
||||
@ -2643,6 +2645,8 @@ BOOL receive_message_or_smb(int smbfd, int oplock_fd,
|
||||
int selrtn;
|
||||
struct timeval to;
|
||||
|
||||
smb_read_error = 0;
|
||||
|
||||
*got_smb = False;
|
||||
|
||||
/*
|
||||
|
@ -1280,7 +1280,7 @@ BOOL cli_oem_change_password(struct cli_state *cli, char *user, char *new_passwo
|
||||
|
||||
E_P16((uchar *)upper_case_new_pw, new_pw_hash);
|
||||
|
||||
E_old_pw_hash( new_pw_hash, old_pw_hash, &data[516]);
|
||||
E_old_pw_hash( new_pw_hash, old_pw_hash, (uchar *)&data[516]);
|
||||
|
||||
data_len = 532;
|
||||
|
||||
|
@ -848,13 +848,13 @@ void smb_io_logon_id(char *desc, DOM_LOGON_ID *log, prs_struct *ps, int depth)
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
makes an ARC4_OWF structure.
|
||||
makes an OWF_INFO structure.
|
||||
********************************************************************/
|
||||
void make_arc4_owf(ARC4_OWF *hash, uint8 data[16])
|
||||
void make_owf_info(OWF_INFO *hash, uint8 data[16])
|
||||
{
|
||||
if (hash == NULL) return;
|
||||
|
||||
DEBUG(5,("make_arc4_owf: %d\n", __LINE__));
|
||||
DEBUG(5,("make_owf_info: %d\n", __LINE__));
|
||||
|
||||
if (data != NULL)
|
||||
{
|
||||
@ -867,13 +867,13 @@ void make_arc4_owf(ARC4_OWF *hash, uint8 data[16])
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
reads or writes an ARC4_OWF structure.
|
||||
reads or writes an OWF_INFO structure.
|
||||
********************************************************************/
|
||||
void smb_io_arc4_owf(char *desc, ARC4_OWF *hash, prs_struct *ps, int depth)
|
||||
void smb_io_owf_info(char *desc, OWF_INFO *hash, prs_struct *ps, int depth)
|
||||
{
|
||||
if (hash == NULL) return;
|
||||
|
||||
prs_debug(ps, depth, desc, "smb_io_arc4_owf");
|
||||
prs_debug(ps, depth, desc, "smb_io_owf_info");
|
||||
depth++;
|
||||
|
||||
prs_align(ps);
|
||||
|
@ -580,8 +580,8 @@ void make_id_info1(NET_ID_INFO_1 *id, char *domain_name,
|
||||
int len_user_name = strlen(user_name );
|
||||
int len_wksta_name = strlen(wksta_name );
|
||||
|
||||
unsigned char arc4_lm_owf[16];
|
||||
unsigned char arc4_nt_owf[16];
|
||||
unsigned char lm_owf[16];
|
||||
unsigned char nt_owf[16];
|
||||
|
||||
if (id == NULL) return;
|
||||
|
||||
@ -597,12 +597,10 @@ void make_id_info1(NET_ID_INFO_1 *id, char *domain_name,
|
||||
make_uni_hdr(&(id->hdr_user_name ), len_user_name , len_user_name , 4);
|
||||
make_uni_hdr(&(id->hdr_wksta_name ), len_wksta_name , len_wksta_name , 4);
|
||||
|
||||
#ifdef USE_ARCFOUR
|
||||
|
||||
if (lm_cypher && nt_cypher)
|
||||
{
|
||||
void arcfour(uint8 key[16], uint8 out[16], uint8 in[16]);
|
||||
unsigned char arc4_key[16];
|
||||
unsigned char owf_key[16];
|
||||
#ifdef DEBUG_PASSWORD
|
||||
DEBUG(100,("lm cypher:"));
|
||||
dump_data(100, lm_cypher, 16);
|
||||
@ -611,43 +609,27 @@ void make_id_info1(NET_ID_INFO_1 *id, char *domain_name,
|
||||
dump_data(100, nt_cypher, 16);
|
||||
#endif
|
||||
|
||||
memset(arc4_key, 0, 16);
|
||||
memcpy(arc4_key, sess_key, 16);
|
||||
memcpy(owf_key, sess_key, 16);
|
||||
|
||||
arcfour(arc4_key, arc4_lm_owf, lm_cypher);
|
||||
arcfour(arc4_key, arc4_nt_owf, nt_cypher);
|
||||
memcpy(lm_owf, lm_cypher, 16);
|
||||
memcpy(nt_owf, nt_cypher, 16);
|
||||
SamOEMhash(lm_owf, owf_key, False);
|
||||
SamOEMhash(nt_owf, owf_key, False);
|
||||
|
||||
#ifdef DEBUG_PASSWORD
|
||||
DEBUG(100,("arcfour encrypt of lm owf password:"));
|
||||
dump_data(100, arc4_lm_owf, 16);
|
||||
DEBUG(100,("hash of lm owf password:"));
|
||||
dump_data(100, lm_owf, 16);
|
||||
|
||||
DEBUG(100,("arcfour encrypt of nt owf password:"));
|
||||
dump_data(100, arc4_nt_owf, 16);
|
||||
DEBUG(100,("hash of nt owf password:"));
|
||||
dump_data(100, nt_owf, 16);
|
||||
#endif
|
||||
/* set up pointers to cypher blocks */
|
||||
lm_cypher = arc4_lm_owf;
|
||||
nt_cypher = arc4_nt_owf;
|
||||
/* set up pointers to blocks */
|
||||
lm_cypher = lm_owf;
|
||||
nt_cypher = nt_owf;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
if (lm_cypher)
|
||||
{
|
||||
/* oops. can only send what-ever-it-is direct */
|
||||
memcpy(arc4_lm_owf, lm_cypher, 16);
|
||||
lm_cypher = arc4_lm_owf;
|
||||
}
|
||||
if (nt_cypher)
|
||||
{
|
||||
/* oops. can only send what-ever-it-is direct */
|
||||
memcpy(arc4_nt_owf, nt_cypher, 16);
|
||||
nt_cypher = arc4_nt_owf;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
make_arc4_owf(&(id->arc4_lm_owf), lm_cypher);
|
||||
make_arc4_owf(&(id->arc4_nt_owf), nt_cypher);
|
||||
make_owf_info(&(id->lm_owf), lm_cypher);
|
||||
make_owf_info(&(id->nt_owf), nt_cypher);
|
||||
|
||||
make_unistr2(&(id->uni_domain_name), domain_name, len_domain_name);
|
||||
make_unistr2(&(id->uni_user_name ), user_name , len_user_name );
|
||||
@ -678,8 +660,8 @@ void net_io_id_info1(char *desc, NET_ID_INFO_1 *id, prs_struct *ps, int depth)
|
||||
smb_io_unihdr("unihdr", &(id->hdr_user_name ), ps, depth);
|
||||
smb_io_unihdr("unihdr", &(id->hdr_wksta_name ), ps, depth);
|
||||
|
||||
smb_io_arc4_owf("", &(id->arc4_lm_owf), ps, depth);
|
||||
smb_io_arc4_owf("", &(id->arc4_nt_owf), ps, depth);
|
||||
smb_io_owf_info("", &(id->lm_owf), ps, depth);
|
||||
smb_io_owf_info("", &(id->nt_owf), ps, depth);
|
||||
|
||||
smb_io_unistr2("unistr2", &(id->uni_domain_name), id->hdr_domain_name.buffer, ps, depth);
|
||||
smb_io_unistr2("unistr2", &(id->uni_user_name ), id->hdr_user_name.buffer, ps, depth);
|
||||
@ -701,8 +683,8 @@ void make_id_info2(NET_ID_INFO_2 *id, char *domain_name,
|
||||
int len_user_name = strlen(user_name );
|
||||
int len_wksta_name = strlen(wksta_name );
|
||||
|
||||
unsigned char arc4_lm_owf[24];
|
||||
unsigned char arc4_nt_owf[24];
|
||||
unsigned char lm_owf[24];
|
||||
unsigned char nt_owf[24];
|
||||
|
||||
if (id == NULL) return;
|
||||
|
||||
@ -721,14 +703,14 @@ void make_id_info2(NET_ID_INFO_2 *id, char *domain_name,
|
||||
if (nt_chal_resp)
|
||||
{
|
||||
/* oops. can only send what-ever-it-is direct */
|
||||
memcpy(arc4_nt_owf, nt_chal_resp, 24);
|
||||
nt_chal_resp = arc4_nt_owf;
|
||||
memcpy(nt_owf, nt_chal_resp, 24);
|
||||
nt_chal_resp = nt_owf;
|
||||
}
|
||||
if (lm_chal_resp)
|
||||
{
|
||||
/* oops. can only send what-ever-it-is direct */
|
||||
memcpy(arc4_lm_owf, lm_chal_resp, 24);
|
||||
lm_chal_resp = arc4_lm_owf;
|
||||
memcpy(lm_owf, lm_chal_resp, 24);
|
||||
lm_chal_resp = lm_owf;
|
||||
}
|
||||
|
||||
memcpy(&(id->lm_chal), lm_challenge, sizeof(id->lm_chal));
|
||||
|
@ -485,22 +485,22 @@ static uint32 net_login_interactive(NET_ID_INFO_1 *id1,
|
||||
{
|
||||
uint32 status = 0x0;
|
||||
|
||||
#ifdef USE_ARCFOUR
|
||||
extern void arcfour(uint8 key[16], uint8 out[16], uint8 in[16]);
|
||||
char nt_pwd[16];
|
||||
char lm_pwd[16];
|
||||
unsigned char arc4_key[16];
|
||||
memset(arc4_key, 0, 16);
|
||||
memcpy(arc4_key, vuser->dc.sess_key, 8);
|
||||
unsigned char key[16];
|
||||
memset(key, 0, 16);
|
||||
memcpy(key, vuser->dc.sess_key, 8);
|
||||
|
||||
arcfour(arc4_key, lm_pwd, id1->arc4_lm_owf.data);
|
||||
arcfour(arc4_key, nt_pwd, id1->arc4_nt_owf.data);
|
||||
memcpy(lm_pwd, id1->lm_owf.data, 16);
|
||||
memcpy(nt_pwd, id1->nt_owf.data, 16);
|
||||
SamOEMhash(lm_pwd, key, False);
|
||||
SamOEMhash(nt_pwd, key, False);
|
||||
|
||||
#ifdef DEBUG_PASSWORD
|
||||
DEBUG(100,("arcfour decrypt of lm owf password:"));
|
||||
DEBUG(100,("decrypt of lm owf password:"));
|
||||
dump_data(100, lm_pwd, 16);
|
||||
|
||||
DEBUG(100,("arcfour decrypt of nt owf password:"));
|
||||
DEBUG(100,("decrypt of nt owf password:"));
|
||||
dump_data(100, nt_pwd, 16);
|
||||
#endif
|
||||
|
||||
@ -509,13 +509,6 @@ static uint32 net_login_interactive(NET_ID_INFO_1 *id1,
|
||||
{
|
||||
status = 0xC0000000 | NT_STATUS_WRONG_PASSWORD;
|
||||
}
|
||||
#else
|
||||
/* sorry. have to assume that the password is always ok.
|
||||
this _is_ ok, because the LSA SAM Logon is nothing to do
|
||||
with SMB connections to shares.
|
||||
*/
|
||||
DEBUG(3,("SAM Logon. Password not being checked\n"));
|
||||
#endif
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@ -1701,7 +1701,8 @@ static BOOL api_SamOEMChangePassword(int cnum,uint16 vuid, char *param,char *dat
|
||||
fstrcpy(user,p);
|
||||
p = skip_string(p,1);
|
||||
|
||||
if(check_oem_password( user, data, &smbpw, new_passwd, sizeof(new_passwd)) == False) {
|
||||
if(check_oem_password( user, (unsigned char *)data, &smbpw,
|
||||
new_passwd, (int)sizeof(new_passwd)) == False) {
|
||||
return True;
|
||||
}
|
||||
|
||||
|
@ -115,6 +115,8 @@ BOOL disk_quotas(char *path, int *bsize, int *dfree, int *dsize)
|
||||
return(False);
|
||||
}
|
||||
else {
|
||||
if (D.dqb_bsoftlimit == 0)
|
||||
D.dqb_bsoftlimit = D.dqb_bhardlimit;
|
||||
*dfree = D.dqb_bsoftlimit - D.dqb_curblocks;
|
||||
*dsize = D.dqb_bsoftlimit;
|
||||
}
|
||||
|
@ -248,6 +248,7 @@ int main(int argc, char **argv)
|
||||
int pwfd;
|
||||
char ascii_p16[66];
|
||||
char c;
|
||||
int ch;
|
||||
int ret, i, err, writelen;
|
||||
int lockfd = -1;
|
||||
char *pfile = SMB_PASSWD_FILE;
|
||||
@ -257,6 +258,7 @@ int main(int argc, char **argv)
|
||||
char *remote_machine = NULL;
|
||||
BOOL add_user = False;
|
||||
BOOL got_new_pass = False;
|
||||
BOOL machine_account = False;
|
||||
pstring servicesf = CONFIGFILE;
|
||||
|
||||
new_passwd[0] = '\0';
|
||||
@ -290,14 +292,17 @@ int main(int argc, char **argv)
|
||||
|
||||
is_root = (real_uid == 0);
|
||||
|
||||
while ((c = getopt(argc, argv, "ahr:")) != EOF) {
|
||||
switch(c) {
|
||||
while ((ch = getopt(argc, argv, "ahr:m:")) != EOF) {
|
||||
switch(ch) {
|
||||
case 'a':
|
||||
add_user = True;
|
||||
break;
|
||||
case 'r':
|
||||
remote_machine = optarg;
|
||||
break;
|
||||
case 'm':
|
||||
machine_account = True;
|
||||
break;
|
||||
case 'h':
|
||||
default:
|
||||
usage(prog_name, is_root);
|
||||
@ -314,6 +319,14 @@ int main(int argc, char **argv)
|
||||
if(add_user && (remote_machine != NULL))
|
||||
usage(prog_name, True);
|
||||
|
||||
/*
|
||||
* If we are adding a machine account then pretend
|
||||
* we already have the new password, we will be using
|
||||
* the machinename as the password.
|
||||
*/
|
||||
if(add_user && machine_account)
|
||||
got_new_pass = True;
|
||||
|
||||
if( is_root ) {
|
||||
|
||||
/*
|
||||
@ -488,6 +501,24 @@ int main(int argc, char **argv)
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for a machine account flag - make sure the username ends in
|
||||
* a '$' etc....
|
||||
*/
|
||||
|
||||
if(machine_account) {
|
||||
int username_len = strlen(user_name);
|
||||
if(username_len >= sizeof(pstring) - 1) {
|
||||
fprintf(stderr, "%s: machine account name too long.\n", user_name);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if(user_name[username_len] != '$') {
|
||||
user_name[username_len] = '$';
|
||||
user_name[username_len+1] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
/* Calculate the MD4 hash (NT compatible) of the old and new passwords */
|
||||
memset(old_nt_p16, '\0', 16);
|
||||
E_md4hash((uchar *)old_passwd, old_nt_p16);
|
||||
@ -575,13 +606,13 @@ int main(int argc, char **argv)
|
||||
|
||||
if((offpos = lseek(fd, 0, SEEK_END)) == -1) {
|
||||
fprintf(stderr, "%s: Failed to add entry for user %s to file %s. \
|
||||
Error was %s\n", prog_name, pwd->pw_name, pfile, strerror(errno));
|
||||
Error was %s\n", prog_name, user_name, pfile, strerror(errno));
|
||||
fclose(fp);
|
||||
pw_file_unlock(lockfd);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
new_entry_length = strlen(pwd->pw_name) + 1 + 15 + 1 +
|
||||
new_entry_length = strlen(user_name) + 1 + 15 + 1 +
|
||||
32 + 1 + 32 + 1 + strlen(pwd->pw_gecos) +
|
||||
1 + strlen(pwd->pw_dir) + 1 +
|
||||
strlen(pwd->pw_shell) + 1;
|
||||
|
Loading…
x
Reference in New Issue
Block a user