/*The following definitions come from lib/util_unistr.c */
int dos_PutUniCode(char *dst,const char *src, ssize_t len, BOOL null_terminate);
-void ascii_to_unistr(char *dest, const char *src, int maxlen);
-void unistr_to_ascii(char *dest, char *src, int len);
+void ascii_to_unistr(char *dest, const char *src, size_t maxlen);
+void unistr_to_dos(char *dest, char *src, size_t len);
char *skip_unibuf(char *src, size_t len);
char *dos_unistrn2(uint16 *src, int len);
char *dos_unistr2(uint16 *src);
/*The following definitions come from libsmb/pwd_cache.c */
void pwd_init(struct pwd_info *pwd);
-void pwd_obfuscate_key(struct pwd_info *pwd, uint32 int_key, char *str_key);
BOOL pwd_compare(struct pwd_info *pwd1, struct pwd_info *pwd2);
void pwd_read(struct pwd_info *pwd, char *passwd_report, BOOL do_encrypt);
void pwd_set_nullpwd(struct pwd_info *pwd);
int dfs_path_error(char* inbuf, char* outbuf);
int setup_dfs_referral(char* pathname, int max_referral_level,
char** ppdata);
-void unistr_to_dos(char* dst,char* src) ;
/*The following definitions come from msdfs/msdfs_tdb.c */
Help ! Fix Me ! Fix Me !
********************************************************************/
-void ascii_to_unistr(char *dest, const char *src, int maxlen)
+void ascii_to_unistr(char *dest, const char *src, size_t maxlen)
{
char *destend = dest + maxlen;
char c;
}
/*******************************************************************
- Pull an ASCII string out of a UNICODE array .
-
- Warning: doesn't do any codepage !!! BAD !!!
-
- Help ! Fix Me ! Fix Me !
+ Pull a DOS codepage string out of a UNICODE array. len is in bytes.
********************************************************************/
-void unistr_to_ascii(char *dest, char *src, int len)
+void unistr_to_dos(char *dest, char *src, size_t len)
{
char *destend = dest + len;
- uint16 c;
while (dest < destend) {
- c = SVAL(src, 0);
+ uint16 ucs2_val = SVAL(src,0);
+ uint16 cp_val = ucs2_to_doscp[ucs2_val];
+
src += 2;
- if (c == 0) break;
- *(dest++) = (char)c;
+ if (ucs2_val == 0)
+ break;
+
+ if (cp_val < 256)
+ *dest++ = (char)cp_val;
+ else {
+ *dest++ = (cp_val >> 8) & 0xff;
+ *dest++ = (cp_val & 0xff);
+ }
}
*dest = 0;
p += 2;
if (p[1] == 0 && slen > 1) {
/* NT has stuffed up again */
- unistr_to_ascii(finfo->short_name, p, slen/2);
+ unistr_to_dos(finfo->short_name, p, slen/2);
} else {
strncpy(finfo->short_name, p, 12);
finfo->short_name[12] = 0;
pwd->crypted = False;
}
-/****************************************************************************
-de-obfuscates a password
-****************************************************************************/
-static void pwd_deobfuscate(struct pwd_info *pwd)
-{
-}
-
-/****************************************************************************
-obfuscates a password
-****************************************************************************/
-static void pwd_obfuscate(struct pwd_info *pwd)
-{
-}
-
-/****************************************************************************
-sets the obfuscation key info
-****************************************************************************/
-void pwd_obfuscate_key(struct pwd_info *pwd, uint32 int_key, char *str_key)
-{
-}
-
/****************************************************************************
compares two passwords. hmm, not as trivial as expected. hmm.
****************************************************************************/
BOOL pwd_compare(struct pwd_info *pwd1, struct pwd_info *pwd2)
{
- pwd_deobfuscate(pwd1);
- pwd_deobfuscate(pwd2);
if (pwd1->cleartext && pwd2->cleartext)
{
if (strequal(pwd1->password, pwd2->password))
{
- pwd_obfuscate(pwd1);
- pwd_obfuscate(pwd2);
return True;
}
}
if (pwd1->null_pwd && pwd2->null_pwd)
{
- pwd_obfuscate(pwd1);
- pwd_obfuscate(pwd2);
return True;
}
#endif
if (memcmp(pwd1->smb_nt_pwd, pwd2->smb_nt_pwd, 16) == 0)
{
- pwd_obfuscate(pwd1);
- pwd_obfuscate(pwd2);
return True;
}
#ifdef DEBUG_PASSWORD
#endif
if (memcmp(pwd1->smb_lm_pwd, pwd2->smb_lm_pwd, 16) == 0)
{
- pwd_obfuscate(pwd1);
- pwd_obfuscate(pwd2);
return True;
}
}
- pwd_obfuscate(pwd1);
- pwd_obfuscate(pwd2);
return False;
}
pwd->cleartext = True;
pwd->null_pwd = False;
pwd->crypted = False;
-
- pwd_obfuscate(pwd);
}
/****************************************************************************
****************************************************************************/
void pwd_get_cleartext(struct pwd_info *pwd, char *clr)
{
- pwd_deobfuscate(pwd);
if (pwd->cleartext)
{
fstrcpy(clr, pwd->password);
{
clr[0] = 0;
}
- pwd_obfuscate(pwd);
}
/****************************************************************************
pwd->null_pwd = False;
pwd->cleartext = False;
pwd->crypted = False;
-
- pwd_obfuscate(pwd);
}
/****************************************************************************
****************************************************************************/
void pwd_get_lm_nt_16(struct pwd_info *pwd, uchar lm_pwd[16], uchar nt_pwd[16])
{
- pwd_deobfuscate(pwd);
if (lm_pwd != NULL)
{
memcpy(lm_pwd, pwd->smb_lm_pwd, 16);
{
memcpy(nt_pwd, pwd->smb_nt_pwd, 16);
}
- pwd_obfuscate(pwd);
}
/****************************************************************************
pwd->null_pwd = False;
pwd->cleartext = False;
pwd->crypted = False;
-
- pwd_obfuscate(pwd);
}
/****************************************************************************
****************************************************************************/
void pwd_make_lm_nt_owf(struct pwd_info *pwd, uchar cryptkey[8])
{
- pwd_deobfuscate(pwd);
#ifdef DEBUG_PASSWORD
DEBUG(100,("client cryptkey: "));
#endif
pwd->crypted = True;
-
- pwd_obfuscate(pwd);
}
/****************************************************************************
****************************************************************************/
void pwd_get_lm_nt_owf(struct pwd_info *pwd, uchar lm_owf[24], uchar nt_owf[24])
{
- pwd_deobfuscate(pwd);
if (lm_owf != NULL)
{
memcpy(lm_owf, pwd->smb_lm_owf, 24);
{
memcpy(nt_owf, pwd->smb_nt_owf, 24);
}
- pwd_obfuscate(pwd);
}
}
#endif
-
-/* Trivial fn that chops off upper bytes to convert unicode to dos */
-void unistr_to_dos(char* dst,char* src)
-{
- pstring s;
- int i=0;
-
- for(i=0;SVAL(src,i*2) && i<1024;i++)
- {
- s[i]= SVAL(src,i*2) & 0xff;
- }
- s[i]=0;
-
- safe_strcpy(dst,s,1024);
- DEBUG(10,("converted unistring to %s\n",s));
-}
static BOOL convert_devicemode(DEVICEMODE devmode, NT_DEVICEMODE *nt_devmode)
{
- unistr_to_ascii(nt_devmode->devicename, (char *)devmode.devicename.buffer, 31);
- unistr_to_ascii(nt_devmode->formname, (char *)devmode.formname.buffer, 31);
+ unistr_to_dos(nt_devmode->devicename, (char *)devmode.devicename.buffer, 31);
+ unistr_to_dos(nt_devmode->formname, (char *)devmode.formname.buffer, 31);
nt_devmode->specversion=devmode.specversion;
nt_devmode->driverversion=devmode.driverversion;
/* NT always sends in UNICODE, may not set UNICODE flag */
if(NT_arch || (SVAL(inbuf,smb_flg2) & FLAGS2_UNICODE_STRINGS))
{
- unistr_to_dos(pathname, ¶ms[2]);
+ unistr_to_dos(pathname, ¶ms[2], sizeof(pathname));
DEBUG(10,("UNICODE referral for %s\n",pathname));
}
else