// Save the Unicode cache void SaveUnicodeCache(wchar_t *strfilename, UINT strfilesize, UCHAR *hash) { UNICODE_CACHE c; BUF *b; UINT i; IO *io; wchar_t name[MAX_PATH]; UCHAR binhash[MD5_SIZE]; // Validate arguments if (strfilename == NULL || hash == NULL) { return; } Zero(&c, sizeof(c)); UniToStr(c.StrFileName, sizeof(c.StrFileName), strfilename); c.StrFileSize = strfilesize; GetMachineName(c.MachineName, sizeof(c.MachineName)); c.OsType = GetOsInfo()->OsType; Copy(c.hash, hash, MD5_SIZE); #ifdef OS_UNIX GetCurrentCharSet(c.CharSet, sizeof(c.CharSet)); #else // OS_UNIX { UINT id = MsGetThreadLocale(); Copy(c.CharSet, &id, sizeof(id)); } #endif // OS_UNIX b = NewBuf(); WriteBuf(b, &c, sizeof(c)); WriteBufInt(b, LIST_NUM(TableList)); for (i = 0;i < LIST_NUM(TableList);i++) { TABLE *t = LIST_DATA(TableList, i); WriteBufInt(b, StrLen(t->name)); WriteBuf(b, t->name, StrLen(t->name)); WriteBufInt(b, StrLen(t->str)); WriteBuf(b, t->str, StrLen(t->str)); WriteBufInt(b, UniStrLen(t->unistr)); WriteBuf(b, t->unistr, UniStrLen(t->unistr) * sizeof(wchar_t)); } Hash(binhash, b->Buf, b->Size, false); WriteBuf(b, binhash, MD5_SIZE); GenerateUnicodeCacheFileName(name, sizeof(name), strfilename, strfilesize, hash); io = FileCreateW(name); if (io != NULL) { SeekBuf(b, 0, 0); BufToFile(io, b); FileClose(io); } FreeBuf(b); }
// Generate the Unicode string cache file name void GenerateUnicodeCacheFileName(wchar_t *name, UINT size, wchar_t *strfilename, UINT strfilesize, UCHAR *filehash) { wchar_t tmp[MAX_SIZE]; wchar_t hashstr[64]; wchar_t hashtemp[MAX_SIZE]; wchar_t exe[MAX_SIZE]; UCHAR hash[SHA1_SIZE]; // Validate arguments if (name == NULL || strfilename == NULL || filehash == NULL) { return; } GetExeDirW(exe, sizeof(exe)); UniStrCpy(hashtemp, sizeof(hashtemp), strfilename); BinToStrW(tmp, sizeof(tmp), filehash, MD5_SIZE); UniStrCat(hashtemp, sizeof(hashtemp), tmp); UniStrCat(hashtemp, sizeof(hashtemp), exe); UniStrLower(hashtemp); Hash(hash, hashtemp, UniStrLen(hashtemp) * sizeof(wchar_t), true); BinToStrW(hashstr, sizeof(hashstr), hash, 4); UniFormat(tmp, sizeof(tmp), UNICODE_CACHE_FILE, hashstr); UniStrLower(tmp); #ifndef OS_WIN32 UniStrCpy(exe, sizeof(exe), L"/tmp"); #else // OS_WIN32 StrToUni(exe, sizeof(exe), MsGetTempDir()); #endif // OS_WIN32 UniFormat(name, size, L"%s/%s", exe, tmp); NormalizePathW(name, size, name); }
// Update the adapter list void UtSpeedMeterDlgRefreshList(HWND hWnd) { wchar_t *old; MS_ADAPTER_LIST *o; UINT i; // Validate arguments if (hWnd == NULL) { return; } if (g_ut_adapter_list_updating) { return; } g_ut_adapter_list_updating = true; // Get the current selection old = GetText(hWnd, E_LIST); if (old != NULL) { if (UniStrLen(old) == 0) { Free(old); old = NULL; } } o = MsCreateAdapterList(); CbReset(hWnd, E_LIST); CbSetHeight(hWnd, E_LIST, 18); for (i = 0;i < o->Num;i++) { wchar_t tmp[MAX_SIZE]; MS_ADAPTER *a = o->Adapters[i]; if (a->Info) { StrToUni(tmp, sizeof(tmp), a->Title); CbAddStr(hWnd, E_LIST, tmp, 0); } } // Re-select the previous selection if (old != NULL) { CbSelectIndex(hWnd, E_LIST, CbFindStr(hWnd, E_LIST, old)); Free(old); } MsFreeAdapterList(o); g_ut_adapter_list_updating = false; }
// アダプタリストの更新 void UtSpeedMeterDlgRefreshList(HWND hWnd) { wchar_t *old; MS_ADAPTER_LIST *o; UINT i; // 引数チェック if (hWnd == NULL) { return; } // 現在の選択を取得 old = GetText(hWnd, E_LIST); if (old != NULL) { if (UniStrLen(old) == 0) { Free(old); old = NULL; } } o = MsCreateAdapterList(); CbReset(hWnd, E_LIST); CbSetHeight(hWnd, E_LIST, 18); for (i = 0;i < o->Num;i++) { wchar_t tmp[MAX_SIZE]; MS_ADAPTER *a = o->Adapters[i]; if (a->Info) { StrToUni(tmp, sizeof(tmp), a->Title); CbAddStr(hWnd, E_LIST, tmp, 0); } } // 前回の選択を再選択 if (old != NULL) { CbSelectIndex(hWnd, E_LIST, CbFindStr(hWnd, E_LIST, old)); Free(old); } MsFreeAdapterList(o); }
// Get an error string in Unicode wchar_t *GetUniErrorStr(UINT err) { wchar_t *ret; char name[MAX_SIZE]; Format(name, sizeof(name), "ERR_%u", err); ret = GetTableUniStr(name); if (UniStrLen(ret) != 0) { return ret; } else { return _UU("ERR_UNKNOWN"); } }
// Plaintext password authentication of user bool SamAuthUserByPlainPassword(CONNECTION *c, HUB *hub, char *username, char *password, bool ast, UCHAR *mschap_v2_server_response_20, RADIUS_LOGIN_OPTION *opt) { bool b = false; wchar_t *name = NULL; bool auth_by_nt = false; HUB *h; // Validate arguments if (hub == NULL || c == NULL || username == NULL) { return false; } if (GetGlobalServerFlag(GSF_DISABLE_RADIUS_AUTH) != 0) { return false; } h = hub; AddRef(h->ref); // Get the user name on authentication system AcLock(hub); { USER *u; u = AcGetUser(hub, ast == false ? username : "******"); if (u) { Lock(u->lock); { if (u->AuthType == AUTHTYPE_RADIUS) { // Radius authentication AUTHRADIUS *auth = (AUTHRADIUS *)u->AuthData; if (ast || auth->RadiusUsername == NULL || UniStrLen(auth->RadiusUsername) == 0) { name = CopyStrToUni(username); } else { name = CopyUniStr(auth->RadiusUsername); } auth_by_nt = false; } else if (u->AuthType == AUTHTYPE_NT) { // NT authentication AUTHNT *auth = (AUTHNT *)u->AuthData; if (ast || auth->NtUsername == NULL || UniStrLen(auth->NtUsername) == 0) { name = CopyStrToUni(username); } else { name = CopyUniStr(auth->NtUsername); } auth_by_nt = true; } } Unlock(u->lock); ReleaseUser(u); } } AcUnlock(hub); if (name != NULL) { if (auth_by_nt == false) { // Radius authentication char radius_server_addr[MAX_SIZE]; UINT radius_server_port; char radius_secret[MAX_SIZE]; char suffix_filter[MAX_SIZE]; wchar_t suffix_filter_w[MAX_SIZE]; UINT interval; Zero(suffix_filter, sizeof(suffix_filter)); Zero(suffix_filter_w, sizeof(suffix_filter_w)); // Get the Radius server information if (GetRadiusServerEx2(hub, radius_server_addr, sizeof(radius_server_addr), &radius_server_port, radius_secret, sizeof(radius_secret), &interval, suffix_filter, sizeof(suffix_filter))) { Unlock(hub->lock); StrToUni(suffix_filter_w, sizeof(suffix_filter_w), suffix_filter); if (UniIsEmptyStr(suffix_filter_w) || UniEndWith(name, suffix_filter_w)) { // Attempt to login b = RadiusLogin(c, radius_server_addr, radius_server_port, radius_secret, StrLen(radius_secret), name, password, interval, mschap_v2_server_response_20, opt); } Lock(hub->lock); } else { HLog(hub, "LH_NO_RADIUS_SETTING", name); } } else { // NT authentication (Not available for non-Win32) #ifdef OS_WIN32 IPC_MSCHAP_V2_AUTHINFO mschap; Unlock(hub->lock); if (ParseAndExtractMsChapV2InfoFromPassword(&mschap, password) == false) { // Plaintext password authentication b = MsCheckLogon(name, password); } else { UCHAR challenge8[8]; UCHAR nt_pw_hash_hash[16]; char nt_name[MAX_SIZE]; UniToStr(nt_name, sizeof(nt_name), name); // MS-CHAPv2 authentication MsChapV2_GenerateChallenge8(challenge8, mschap.MsChapV2_ClientChallenge, mschap.MsChapV2_ServerChallenge, mschap.MsChapV2_PPPUsername); Debug("MsChapV2_PPPUsername = %s, nt_name = %s\n", mschap.MsChapV2_PPPUsername, nt_name); b = MsPerformMsChapV2AuthByLsa(nt_name, challenge8, mschap.MsChapV2_ClientResponse, nt_pw_hash_hash); if (b) { if (mschap_v2_server_response_20 != NULL) { MsChapV2Server_GenerateResponse(mschap_v2_server_response_20, nt_pw_hash_hash, mschap.MsChapV2_ClientResponse, challenge8); } } } Lock(hub->lock); #else // OS_WIN32 // Nothing to do other than Win32 #endif // OS_WIN32 } // Memory release Free(name); } ReleaseHub(h); return b; }
// Split a string into specified width UNI_TOKEN_LIST *SeparateStringByWidth(wchar_t *str, UINT width) { UINT wp; wchar_t *tmp; UINT len, i; LIST *o; UNI_TOKEN_LIST *ret; // Validate arguments if (str == NULL) { return UniNullToken(); } if (width == 0) { width = 1; } o = NewListFast(NULL); len = UniStrLen(str); tmp = ZeroMalloc(sizeof(wchar_t) * (len + 32)); wp = 0; for (i = 0;i < (len + 1);i++) { wchar_t c = str[i]; UINT next_word_width; UINT remain_width; switch (c) { case 0: case L'\r': case L'\n': if (c == L'\r') { if (str[i + 1] == L'\n') { i++; } } tmp[wp++] = 0; wp = 0; Insert(o, UniCopyStr(tmp)); break; default: next_word_width = GetNextWordWidth(&str[i]); remain_width = (width - UniStrWidth(tmp)); if ((remain_width >= 1) && (next_word_width > remain_width) && (next_word_width <= width)) { tmp[wp++] = 0; wp = 0; Insert(o, UniCopyStr(tmp)); } tmp[wp++] = c; tmp[wp] = 0; if (UniStrWidth(tmp) >= width) { tmp[wp++] = 0; wp = 0; Insert(o, UniCopyStr(tmp)); } break; } } if (LIST_NUM(o) == 0) { Insert(o, CopyUniStr(L"")); } ret = ZeroMalloc(sizeof(UNI_TOKEN_LIST)); ret->NumTokens = LIST_NUM(o); ret->Token = ZeroMalloc(sizeof(wchar_t *) * ret->NumTokens); for (i = 0;i < LIST_NUM(o);i++) { wchar_t *s = LIST_DATA(o, i); UniTrimLeft(s); ret->Token[i] = s; } ReleaseList(o); Free(tmp); return ret; }
// Show the prompt wchar_t *Prompt(wchar_t *prompt_str) { wchar_t *ret = NULL; wchar_t *tmp = NULL; // Validate arguments if (prompt_str == NULL) { prompt_str = L""; } #ifdef OS_WIN32 UniPrint(L"%s", prompt_str); tmp = Malloc(MAX_PROMPT_STRSIZE); if (fgetws(tmp, MAX_PROMPT_STRSIZE - 1, stdin) != NULL) { bool escape = false; UINT i, len; len = UniStrLen(tmp); for (i = 0;i < len;i++) { if (tmp[i] == 0x04 || tmp[i] == 0x1A) { escape = true; break; } } if (escape == false) { UniTrimCrlf(tmp); ret = UniCopyStr(tmp); } } Free(tmp); #else // OS_WIN32 { char *prompt = CopyUniToStr(prompt_str); char *s = readline(prompt); Free(prompt); if (s != NULL) { TrimCrlf(s); Trim(s); if (IsEmptyStr(s) == false) { add_history(s); } ret = CopyStrToUni(s); free(s); } } #endif // OS_WIN32 if (ret == NULL) { Print("\n"); } return ret; }
// Separate the command line into the command and the parameters bool SeparateCommandAndParam(wchar_t *src, char **cmd, wchar_t **param) { UINT i, len, wp; wchar_t *tmp; wchar_t *src_tmp; // Validate arguments if (src == NULL) { return false; } if (cmd != NULL) { *cmd = NULL; } if (param != NULL) { *param = NULL; } src_tmp = UniCopyStr(src); UniTrimCrlf(src_tmp); UniTrim(src_tmp); len = UniStrLen(src_tmp); tmp = Malloc(sizeof(wchar_t) * (len + 32)); wp = 0; for (i = 0;i < (len + 1);i++) { wchar_t c = src_tmp[i]; switch (c) { case 0: case L' ': case L'\t': tmp[wp] = 0; if (UniIsEmptyStr(tmp)) { Free(tmp); Free(src_tmp); return false; } if (cmd != NULL) { *cmd = CopyUniToStr(tmp); Trim(*cmd); } goto ESCAPE; default: tmp[wp++] = c; break; } } ESCAPE: if (param != NULL) { *param = CopyUniStr(&src_tmp[wp]); UniTrim(*param); } Free(tmp); Free(src_tmp); return true; }