|
|
|
@ -157,28 +157,18 @@ static TGUNIXAppClose pTGUNIXAppClose;
|
|
|
|
|
// LoginDialogParam
|
|
|
|
|
//============================================================================
|
|
|
|
|
struct LoginDialogParam { |
|
|
|
|
bool fromGT; |
|
|
|
|
ENetError authError; |
|
|
|
|
wchar accountName[kMaxAccountNameLength]; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
bool AuthenticateNetClientComm(ENetError* result, HWND parentWnd); |
|
|
|
|
bool IsExpired(); |
|
|
|
|
void GetCryptKey(UInt32* cryptKey, unsigned size); |
|
|
|
|
static void SaveUserPass (char *username, char *password, ShaDigest *pNamePassHash, bool remember_password, |
|
|
|
|
bool fromGT); |
|
|
|
|
static void LoadUserPass (const wchar *accountName, char *username, ShaDigest *pNamePassHash, bool *pRemember, |
|
|
|
|
bool fromGT, int *pFocus); |
|
|
|
|
static void AuthFailedStrings (ENetError authError, bool fromGT, |
|
|
|
|
static bool AuthenticateNetClientComm(ENetError* result, HWND parentWnd); |
|
|
|
|
static void GetCryptKey(UInt32* cryptKey, unsigned size); |
|
|
|
|
static void SaveUserPass (char *username, char *password, ShaDigest *pNamePassHash, bool remember_password); |
|
|
|
|
static void LoadUserPass (const wchar *accountName, char *username, ShaDigest *pNamePassHash, bool *pRemember, int *pFocus); |
|
|
|
|
static void AuthFailedStrings (ENetError authError, |
|
|
|
|
const char **ppStr1, const char **ppStr2, |
|
|
|
|
const wchar **ppWStr); |
|
|
|
|
|
|
|
|
|
#if 0 |
|
|
|
|
// For networking
|
|
|
|
|
const GUID NEXUS_GUID = {
|
|
|
|
|
0x5bfdb060, 0x6a4, 0x11d0, 0x9c, 0x4f, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e}; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Detect whether we're running under TRANSGAMING Cider
|
|
|
|
|
//==============================================================================
|
|
|
|
@ -206,14 +196,14 @@ static void TGDoCiderDetection ()
|
|
|
|
|
pTGUNIXAppClose = (TGUNIXAppClose)GetProcAddress (hMod, "TGUNIXAppClose"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static bool TGRunLoginDialog (const wchar *accountName, bool fromGT) |
|
|
|
|
static bool TGRunLoginDialog (const wchar *accountName) |
|
|
|
|
{ |
|
|
|
|
ShaDigest NamePassHash; |
|
|
|
|
char Username[kMaxAccountNameLength + 5]; |
|
|
|
|
int Focus; |
|
|
|
|
bool bRemember = false; |
|
|
|
|
|
|
|
|
|
LoadUserPass (accountName, Username, &NamePassHash, &bRemember, fromGT, &Focus); |
|
|
|
|
LoadUserPass (accountName, Username, &NamePassHash, &bRemember, &Focus); |
|
|
|
|
|
|
|
|
|
while (true) |
|
|
|
|
{ |
|
|
|
@ -282,7 +272,7 @@ static bool TGRunLoginDialog (const wchar *accountName, bool fromGT)
|
|
|
|
|
if (Remember[0] == 'y') |
|
|
|
|
bRemember = true; |
|
|
|
|
|
|
|
|
|
SaveUserPass (Username, Password, &NamePassHash, bRemember, fromGT); |
|
|
|
|
SaveUserPass (Username, Password, &NamePassHash, bRemember); |
|
|
|
|
|
|
|
|
|
// Do login & see if it failed
|
|
|
|
|
ENetError auth; |
|
|
|
@ -298,7 +288,7 @@ static bool TGRunLoginDialog (const wchar *accountName, bool fromGT)
|
|
|
|
|
unsigned int Len; |
|
|
|
|
char *pTmpStr; |
|
|
|
|
|
|
|
|
|
AuthFailedStrings (auth, fromGT, &pStr1, &pStr2, &pWStr); |
|
|
|
|
AuthFailedStrings (auth, &pStr1, &pStr2, &pWStr); |
|
|
|
|
|
|
|
|
|
Len = StrLen (pStr1) + 1; |
|
|
|
|
if (pStr2) |
|
|
|
@ -645,7 +635,7 @@ BOOL CALLBACK AuthDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
|
|
|
|
|
return DefWindowProc(hwndDlg, uMsg, wParam, lParam); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool AuthenticateNetClientComm(ENetError* result, HWND parentWnd) |
|
|
|
|
static bool AuthenticateNetClientComm(ENetError* result, HWND parentWnd) |
|
|
|
|
{ |
|
|
|
|
if (!NetCliAuthQueryConnected()) |
|
|
|
|
NetCommConnect(); |
|
|
|
@ -878,7 +868,7 @@ inline static dword ToBigEndian (dword value) {
|
|
|
|
|
return ((value) << 24) | ((value & 0x0000ff00) << 8) | ((value & 0x00ff0000) >> 8) | ((value) >> 24); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void AuthFailedStrings (ENetError authError, bool fromGT, |
|
|
|
|
static void AuthFailedStrings (ENetError authError, |
|
|
|
|
const char **ppStr1, const char **ppStr2, |
|
|
|
|
const wchar **ppWStr) |
|
|
|
|
{ |
|
|
|
@ -912,9 +902,6 @@ static void AuthFailedStrings (ENetError authError, bool fromGT,
|
|
|
|
|
*ppStr2 = "Disconnected from Myst Online."; |
|
|
|
|
break; |
|
|
|
|
case kNetErrAuthenticationFailed: |
|
|
|
|
if (fromGT) |
|
|
|
|
*ppStr2 = "GameTap authentication failed, please enter your GameTap username and password."; |
|
|
|
|
else |
|
|
|
|
*ppStr2 = "Incorrect password.\n\nMake sure CAPS LOCK is not on."; |
|
|
|
|
break; |
|
|
|
|
case kNetErrGTServerError: |
|
|
|
@ -943,7 +930,7 @@ BOOL CALLBACK AuthFailedDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPAR
|
|
|
|
|
const char *pStr1, *pStr2; |
|
|
|
|
const wchar *pWStr; |
|
|
|
|
|
|
|
|
|
AuthFailedStrings (loginParam->authError, loginParam->fromGT, |
|
|
|
|
AuthFailedStrings (loginParam->authError, |
|
|
|
|
&pStr1, &pStr2, &pWStr); |
|
|
|
|
|
|
|
|
|
if (pStr1) |
|
|
|
@ -1014,8 +1001,7 @@ BOOL CALLBACK UruTOSDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
|
|
|
|
|
return FALSE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void SaveUserPass (char *username, char *password, ShaDigest *pNamePassHash, bool remember_password, |
|
|
|
|
bool fromGT) |
|
|
|
|
static void SaveUserPass (char *username, char *password, ShaDigest *pNamePassHash, bool remember_password) |
|
|
|
|
{ |
|
|
|
|
UInt32 cryptKey[4]; |
|
|
|
|
ZeroMemory(cryptKey, sizeof(cryptKey)); |
|
|
|
@ -1061,7 +1047,6 @@ static void SaveUserPass (char *username, char *password, ShaDigest *pNamePassHa
|
|
|
|
|
else |
|
|
|
|
NetCommSetAuthTokenAndOS(nil, L"win"); |
|
|
|
|
|
|
|
|
|
if (!fromGT) { |
|
|
|
|
wchar fileAndPath[MAX_PATH]; |
|
|
|
|
PathGetInitDirectory(fileAndPath, arrsize(fileAndPath)); |
|
|
|
|
PathAddFilename(fileAndPath, fileAndPath, L"login.dat", arrsize(fileAndPath)); |
|
|
|
@ -1084,11 +1069,10 @@ static void SaveUserPass (char *username, char *password, ShaDigest *pNamePassHa
|
|
|
|
|
delete stream; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void LoadUserPass (const wchar *accountName, char *username, ShaDigest *pNamePassHash, bool *pRemember, |
|
|
|
|
bool fromGT, int *pFocus) |
|
|
|
|
int *pFocus) |
|
|
|
|
{ |
|
|
|
|
UInt32 cryptKey[4]; |
|
|
|
|
ZeroMemory(cryptKey, sizeof(cryptKey)); |
|
|
|
@ -1098,8 +1082,6 @@ static void LoadUserPass (const wchar *accountName, char *username, ShaDigest *p
|
|
|
|
|
*pRemember = false; |
|
|
|
|
username[0] = '\0'; |
|
|
|
|
|
|
|
|
|
if (!fromGT) |
|
|
|
|
{ |
|
|
|
|
wchar fileAndPath[MAX_PATH]; |
|
|
|
|
PathGetInitDirectory(fileAndPath, arrsize(fileAndPath)); |
|
|
|
|
PathAddFilename(fileAndPath, fileAndPath, L"login.dat", arrsize(fileAndPath)); |
|
|
|
@ -1143,12 +1125,6 @@ static void LoadUserPass (const wchar *accountName, char *username, ShaDigest *p
|
|
|
|
|
delete stream; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
StrToAnsi (username, accountName, kMaxAccountNameLength); |
|
|
|
|
*pFocus = IDC_URULOGIN_PASSWORD; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static size_t CurlCallback(void *buffer, size_t size, size_t nmemb, void *param) |
|
|
|
|
{ |
|
|
|
@ -1219,14 +1195,12 @@ BOOL CALLBACK UruLoginDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
|
|
|
|
|
|
|
|
|
|
int focus_control = IDC_URULOGIN_USERNAME; |
|
|
|
|
|
|
|
|
|
LoadUserPass (loginParam->accountName, username, &namePassHash, &remember_password, loginParam->fromGT, &focus_control); |
|
|
|
|
LoadUserPass (loginParam->accountName, username, &namePassHash, &remember_password, &focus_control); |
|
|
|
|
|
|
|
|
|
SetDlgItemText(hwndDlg, IDC_URULOGIN_USERNAME, username); |
|
|
|
|
CheckDlgButton(hwndDlg, IDC_URULOGIN_REMEMBERPASS, remember_password ? BST_CHECKED : BST_UNCHECKED); |
|
|
|
|
if (remember_password) |
|
|
|
|
SetDlgItemText(hwndDlg, IDC_URULOGIN_PASSWORD, FAKE_PASS_STRING); |
|
|
|
|
if (loginParam->fromGT) |
|
|
|
|
EnableWindow(GetDlgItem(hwndDlg, IDC_URULOGIN_REMEMBERPASS), FALSE); |
|
|
|
|
|
|
|
|
|
SetFocus(GetDlgItem(hwndDlg, focus_control)); |
|
|
|
|
|
|
|
|
@ -1288,7 +1262,7 @@ BOOL CALLBACK UruLoginDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
|
|
|
|
|
GetDlgItemText(hwndDlg, IDC_URULOGIN_PASSWORD, password, kMaxPasswordLength); |
|
|
|
|
remember_password = (IsDlgButtonChecked(hwndDlg, IDC_URULOGIN_REMEMBERPASS) == BST_CHECKED); |
|
|
|
|
|
|
|
|
|
SaveUserPass (username, password, &namePassHash, remember_password, loginParam->fromGT); |
|
|
|
|
SaveUserPass (username, password, &namePassHash, remember_password); |
|
|
|
|
|
|
|
|
|
LoginDialogParam loginParam; |
|
|
|
|
MemSet(&loginParam, 0, sizeof(loginParam)); |
|
|
|
@ -1589,16 +1563,10 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nC
|
|
|
|
|
return PARABLE_NORMAL_EXIT; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (IsExpired()) |
|
|
|
|
{ |
|
|
|
|
hsMessageBox("This client is over 30 days old. You need to get a new one.", "Error", hsMessageBoxNormal); |
|
|
|
|
return PARABLE_NORMAL_EXIT; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FILE *serverini = _wfopen(serverIni, L"rb"); |
|
|
|
|
if (serverini) |
|
|
|
|
FILE *serverIniFile = _wfopen(serverIni, L"rb"); |
|
|
|
|
if (serverIniFile) |
|
|
|
|
{ |
|
|
|
|
fclose(serverini); |
|
|
|
|
fclose(serverIniFile); |
|
|
|
|
pfConsoleEngine tempConsole; |
|
|
|
|
tempConsole.ExecuteFile(serverIni); |
|
|
|
|
} |
|
|
|
@ -1616,46 +1584,6 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nC
|
|
|
|
|
curl_global_init(CURL_GLOBAL_ALL); |
|
|
|
|
|
|
|
|
|
wchar acctName[kMaxAccountNameLength]; |
|
|
|
|
|
|
|
|
|
// if we're being launched from gametap then don't use the intro dialogs
|
|
|
|
|
if (StrStrI(lpCmdLine, "screenname=")) { |
|
|
|
|
doIntroDialogs = false; |
|
|
|
|
|
|
|
|
|
wchar authToken[kMaxPublisherAuthKeyLength]; |
|
|
|
|
wchar os[kMaxGTOSIdLength]; |
|
|
|
|
ShaDigest emptyDigest; |
|
|
|
|
|
|
|
|
|
MemSet(acctName, 0, sizeof(acctName)); |
|
|
|
|
MemSet(authToken, 0, sizeof(authToken)); |
|
|
|
|
MemSet(os, 0, sizeof(os)); |
|
|
|
|
|
|
|
|
|
const char* temp = lpCmdLine; |
|
|
|
|
char token[128]; |
|
|
|
|
while (StrTokenize(&temp, token, arrsize(token), " =")) { |
|
|
|
|
if (StrCmpI(token, "screenname") == 0) { |
|
|
|
|
if (!StrTokenize(&temp, token, arrsize(token), " =")) |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
StrToUnicode(acctName, token, arrsize(acctName)); |
|
|
|
|
} |
|
|
|
|
else if (StrCmpI(token, "authtoken") == 0) { |
|
|
|
|
if (!StrTokenize(&temp, token, arrsize(token), " =")) |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
StrToUnicode(authToken, token, arrsize(authToken)); |
|
|
|
|
} |
|
|
|
|
else if (StrCmpI(token, "os") == 0) { |
|
|
|
|
if (!StrTokenize(&temp, token, arrsize(token), " =")) |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
StrToUnicode(os, token, arrsize(os)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
NetCommSetAccountUsernamePassword(acctName, emptyDigest); |
|
|
|
|
NetCommSetAuthTokenAndOS(authToken, os); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool needExit = false; |
|
|
|
|
LoginDialogParam loginParam; |
|
|
|
|
MemSet(&loginParam, 0, sizeof(loginParam)); |
|
|
|
@ -1668,7 +1596,6 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nC
|
|
|
|
|
if (IS_NET_ERROR(auth) || cancelled) { |
|
|
|
|
doIntroDialogs = true; |
|
|
|
|
|
|
|
|
|
loginParam.fromGT = true; |
|
|
|
|
loginParam.authError = auth; |
|
|
|
|
StrCopy(loginParam.accountName, acctName, arrsize(loginParam.accountName)); |
|
|
|
|
|
|
|
|
@ -1681,7 +1608,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nC
|
|
|
|
|
|
|
|
|
|
if (doIntroDialogs) { |
|
|
|
|
if (TGIsCider) |
|
|
|
|
needExit = !TGRunLoginDialog (loginParam.accountName, loginParam.fromGT); |
|
|
|
|
needExit = !TGRunLoginDialog (loginParam.accountName); |
|
|
|
|
else if (::DialogBoxParam( hInst, MAKEINTRESOURCE( IDD_URULOGIN_MAIN ), NULL, UruLoginDialogProc, (LPARAM)&loginParam ) <= 0) |
|
|
|
|
needExit = true; |
|
|
|
|
} |
|
|
|
@ -1867,76 +1794,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nC
|
|
|
|
|
return PARABLE_NORMAL_EXIT; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool IsExpired() |
|
|
|
|
{ |
|
|
|
|
bool expired = false; |
|
|
|
|
|
|
|
|
|
#ifndef PLASMA_EXTERNAL_RELEASE |
|
|
|
|
char ourPath[MAX_PATH]; |
|
|
|
|
GetModuleFileName(NULL, ourPath, sizeof(ourPath)); |
|
|
|
|
DWORD ok = 0; |
|
|
|
|
DWORD size = GetFileVersionInfoSize(ourPath, &ok); |
|
|
|
|
if (size > 0) |
|
|
|
|
{ |
|
|
|
|
void* data = TRACKED_NEW UInt8[size]; |
|
|
|
|
GetFileVersionInfo(ourPath, ok, size, data); |
|
|
|
|
|
|
|
|
|
unsigned int descLen = 0; |
|
|
|
|
void* desc = nil; |
|
|
|
|
if (VerQueryValue(data, "\\StringFileInfo\\040904B0\\FileDescription", &desc, &descLen)) |
|
|
|
|
{ |
|
|
|
|
const char* buildDateStart = strstr((const char*)desc, " - Built "); |
|
|
|
|
if (buildDateStart) |
|
|
|
|
{ |
|
|
|
|
buildDateStart += strlen(" - Built "); |
|
|
|
|
const char* buildDateEnd = strstr(buildDateStart, " at"); |
|
|
|
|
if (buildDateEnd) |
|
|
|
|
{ |
|
|
|
|
int len = buildDateEnd-buildDateStart; |
|
|
|
|
|
|
|
|
|
char buf[32]; |
|
|
|
|
strncpy(buf, buildDateStart, len); |
|
|
|
|
buf[len] = '\0'; |
|
|
|
|
|
|
|
|
|
int month = atoi(strtok(buf, "/")); |
|
|
|
|
int day = atoi(strtok(nil, "/")); |
|
|
|
|
int year = atoi(strtok(nil, "/")); |
|
|
|
|
|
|
|
|
|
SYSTEMTIME curTime, buildTime; |
|
|
|
|
GetLocalTime(&buildTime); |
|
|
|
|
GetLocalTime(&curTime); |
|
|
|
|
buildTime.wDay = day; |
|
|
|
|
buildTime.wMonth = month; |
|
|
|
|
buildTime.wYear = year; |
|
|
|
|
|
|
|
|
|
ULARGE_INTEGER iCurTime, iBuildTime; |
|
|
|
|
FILETIME ft; |
|
|
|
|
|
|
|
|
|
SystemTimeToFileTime(&curTime, &ft); |
|
|
|
|
iCurTime.LowPart = ft.dwLowDateTime; |
|
|
|
|
iCurTime.HighPart = ft.dwHighDateTime; |
|
|
|
|
|
|
|
|
|
SystemTimeToFileTime(&buildTime, &ft); |
|
|
|
|
iBuildTime.LowPart = ft.dwLowDateTime; |
|
|
|
|
iBuildTime.HighPart = ft.dwHighDateTime; |
|
|
|
|
|
|
|
|
|
int secsOld = (int)((iCurTime.QuadPart - iBuildTime.QuadPart) / 10000000); |
|
|
|
|
int daysOld = secsOld / (60 * 60 * 24); |
|
|
|
|
|
|
|
|
|
if (daysOld > 30) |
|
|
|
|
expired = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
delete [] data; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
return expired; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void GetCryptKey(UInt32* cryptKey, unsigned numElements) |
|
|
|
|
static void GetCryptKey(UInt32* cryptKey, unsigned numElements) |
|
|
|
|
{ |
|
|
|
|
char volName[] = "C:\\"; |
|
|
|
|
int index = 0; |
|
|
|
|