From 756c6e169bb748536a8c2f92f4b281ac480f481b Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Tue, 1 Oct 2013 19:32:03 +0000 Subject: added utility for accounts registration git-svn-id: http://svn.miranda-ng.org/main/trunk@6292 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/WhatsApp/WhatsApp_11.vcxproj | 8 ++ protocols/WhatsApp/WhatsApp_11.vcxproj.filters | 23 ++++ protocols/WhatsApp/res/WART-1.5.0.0.exe | Bin 0 -> 3171328 bytes protocols/WhatsApp/res/whatsapp.rc | 41 ++++--- protocols/WhatsApp/src/dialogs.cpp | 14 +++ protocols/WhatsApp/src/main.cpp | 141 ++++++++++++++++++++++++- protocols/WhatsApp/src/resource.h | 22 ++-- 7 files changed, 221 insertions(+), 28 deletions(-) create mode 100644 protocols/WhatsApp/res/WART-1.5.0.0.exe (limited to 'protocols/WhatsApp') diff --git a/protocols/WhatsApp/WhatsApp_11.vcxproj b/protocols/WhatsApp/WhatsApp_11.vcxproj index a6b9560291..224d35989f 100644 --- a/protocols/WhatsApp/WhatsApp_11.vcxproj +++ b/protocols/WhatsApp/WhatsApp_11.vcxproj @@ -267,6 +267,14 @@ + + + + + + + + diff --git a/protocols/WhatsApp/WhatsApp_11.vcxproj.filters b/protocols/WhatsApp/WhatsApp_11.vcxproj.filters index f1a5df8f07..e79bc694be 100644 --- a/protocols/WhatsApp/WhatsApp_11.vcxproj.filters +++ b/protocols/WhatsApp/WhatsApp_11.vcxproj.filters @@ -30,6 +30,9 @@ {eaedb8f8-8e43-4360-9007-b1a3448d2d16} + + {06318065-d7dc-4678-b6d0-8c5feca76d8f} + @@ -199,4 +202,24 @@ Resources + + + Resources\Icons + + + Resources\Icons + + + Resources\Icons + + + Resources\Icons + + + Resources\Icons + + + Resources\Icons + + \ No newline at end of file diff --git a/protocols/WhatsApp/res/WART-1.5.0.0.exe b/protocols/WhatsApp/res/WART-1.5.0.0.exe new file mode 100644 index 0000000000..3a989ee74f Binary files /dev/null and b/protocols/WhatsApp/res/WART-1.5.0.0.exe differ diff --git a/protocols/WhatsApp/res/whatsapp.rc b/protocols/WhatsApp/res/whatsapp.rc index 0b4784f5a9..8d81cc154a 100644 --- a/protocols/WhatsApp/res/whatsapp.rc +++ b/protocols/WhatsApp/res/whatsapp.rc @@ -13,10 +13,11 @@ #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// Deutsch (Deutschland) resources +// Немецкий (Германия) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// @@ -52,12 +53,6 @@ END #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO BEGIN - IDD_WHATSAPPACCOUNT, DIALOG - BEGIN - BOTTOMMARGIN, 111 - HORZGUIDE, 97 - END - IDD_INPUTBOX, DIALOG BEGIN VERTGUIDE, 12 @@ -75,24 +70,28 @@ END // Dialog // -IDD_WHATSAPPACCOUNT DIALOGEX 0, 0, 185, 118 +IDD_WHATSAPPACCOUNT DIALOGEX 0, 0, 185, 168 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD FONT 8, "MS Shell Dlg", 400, 0, 0x0 BEGIN LTEXT "Phone-Number",IDC_STATIC,6,6,48,8 EDITTEXT IDC_LOGIN,84,6,95,12,ES_AUTOHSCROLL LTEXT "Including country code, without '+' or '00'",IDC_STATIC,66,21,118,17 + LTEXT "Password",IDC_STATIC,6,60,47,8 + EDITTEXT IDC_PW,60,60,119,12,ES_PASSWORD | ES_AUTOHSCROLL LTEXT "Nickname",IDC_STATIC,6,42,48,12 EDITTEXT IDC_NICK,60,42,120,12,ES_AUTOHSCROLL - PUSHBUTTON "Request Code",IDC_BUTTON_REQUEST_CODE,6,97,54,14 - PUSHBUTTON "Register Code",IDC_BUTTON_REGISTER,66,97,60,14 + PUSHBUTTON "Request Code",IDC_BUTTON_REQUEST_CODE,6,150,54,17,NOT WS_VISIBLE | WS_DISABLED + PUSHBUTTON "Register Code",IDC_BUTTON_REGISTER,66,149,60,18,NOT WS_VISIBLE | WS_DISABLED EDITTEXT IDC_CC,60,6,24,12,ES_AUTOHSCROLL - LTEXT "SMS-Code:",IDC_STATIC,6,72,36,8 - EDITTEXT IDC_REG_CODE_1,60,72,24,12,ES_AUTOHSCROLL - LTEXT "-",IDC_STATIC,86,73,8,12 - EDITTEXT IDC_REG_CODE_2,90,72,24,12,ES_AUTOHSCROLL - LTEXT "Will only be used for registration",IDC_STATIC,66,86,108,10 - CONTROL "Use SSL connection (443 port)",IDC_SSL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,58,120,10 + LTEXT "SMS-Code:",IDC_STATIC,6,120,36,8,NOT WS_VISIBLE | WS_DISABLED + EDITTEXT IDC_REG_CODE_1,60,120,24,12,ES_AUTOHSCROLL | NOT WS_VISIBLE | WS_DISABLED + LTEXT "-",IDC_STATIC,86,122,8,12,NOT WS_VISIBLE | WS_DISABLED + EDITTEXT IDC_REG_CODE_2,90,120,24,12,ES_AUTOHSCROLL | NOT WS_VISIBLE | WS_DISABLED + LTEXT "Will only be used for registration",IDC_STATIC,66,134,108,10,NOT WS_VISIBLE | WS_DISABLED + CONTROL "Use SSL connection (443 port)",IDC_SSL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,108,120,10 + LTEXT "Paste password from WART utility",IDC_STATIC,65,76,111,8 + LTEXT "Use WART utility from Plugins folder for registering your number and generating password",IDC_STATIC,6,85,174,22 END IDD_INPUTBOX DIALOGEX 0, 0, 300, 66 @@ -121,10 +120,18 @@ IDI_ADD_USER_TO_GROUP ICON "add-user-to-group.ico" IDI_CHANGE_GROUP_SUBJECT ICON "change-group-subject.ico" IDI_LEAVE_GROUP ICON "leave-group.ico" IDI_REMOVE_USER_FROM_GROUP ICON "remove-user-from-group.ico" -#endif // Deutsch (Deutschland) resources +#endif // Немецкий (Германия) resources ///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +// +// BIN +// + +IDR_REGISTERUTILITY BIN "WART-1.5.0.0.exe" + + #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// diff --git a/protocols/WhatsApp/src/dialogs.cpp b/protocols/WhatsApp/src/dialogs.cpp index ee658f8e77..9a2955b1d7 100644 --- a/protocols/WhatsApp/src/dialogs.cpp +++ b/protocols/WhatsApp/src/dialogs.cpp @@ -34,10 +34,19 @@ INT_PTR CALLBACK WhatsAppAccountProc(HWND hwnd, UINT message, WPARAM wparam, LPA db_free(&dbv); } + if ( !db_get_s(0,proto->ModuleName(),WHATSAPP_KEY_PASS,&dbv,DBVT_ASCIIZ)) + { + CallService(MS_DB_CRYPT_DECODESTRING,strlen(dbv.pszVal)+1, + reinterpret_cast(dbv.pszVal)); + SetDlgItemTextA(hwnd,IDC_PW,dbv.pszVal); + db_free(&dbv); + } + if (!proto->isOffline()) { SendMessage(GetDlgItem(hwnd,IDC_CC),EM_SETREADONLY,1,0); SendMessage(GetDlgItem(hwnd,IDC_LOGIN),EM_SETREADONLY,1,0); SendMessage(GetDlgItem(hwnd,IDC_NICK),EM_SETREADONLY,1,0); + SendMessage(GetDlgItem(hwnd,IDC_PW),EM_SETREADONLY,1,0); EnableWindow(GetDlgItem(hwnd, IDC_SSL), FALSE); } @@ -94,6 +103,7 @@ INT_PTR CALLBACK WhatsAppAccountProc(HWND hwnd, UINT message, WPARAM wparam, LPA case IDC_LOGIN: case IDC_NICK: case IDC_SSL: + case IDC_PW: SendMessage(GetParent(hwnd) ,PSM_CHANGED, 0, 0); } } @@ -116,6 +126,10 @@ INT_PTR CALLBACK WhatsAppAccountProc(HWND hwnd, UINT message, WPARAM wparam, LPA db_set_b(0, proto->ModuleName(), WHATSAPP_KEY_SSL, IsDlgButtonChecked(hwnd, IDC_SSL)); + GetDlgItemTextA(hwnd,IDC_PW,str,sizeof(str)); + CallService(MS_DB_CRYPT_ENCODESTRING,sizeof(str),reinterpret_cast(str)); + db_set_s(0,proto->ModuleName(),WHATSAPP_KEY_PASS,str); + return TRUE; } break; diff --git a/protocols/WhatsApp/src/main.cpp b/protocols/WhatsApp/src/main.cpp index d2f45c7fdf..e602ea63e1 100644 --- a/protocols/WhatsApp/src/main.cpp +++ b/protocols/WhatsApp/src/main.cpp @@ -11,7 +11,7 @@ PLUGININFOEX pluginInfo = { sizeof(PLUGININFOEX), "WhatsApp Protocol", __VERSION_DWORD, - "Provides basic support for WhatsApp. [Built: "__DATE__" "__TIME__"]", + "Provides basic support for WhatsApp.", "Uli Hecht", "uli.hecht@gmail.com", "© 2013 Uli Hecht", @@ -22,6 +22,137 @@ PLUGININFOEX pluginInfo = { }; +BOOL IsRunAsAdmin() +{ + BOOL fIsRunAsAdmin = FALSE; + DWORD dwError = ERROR_SUCCESS; + PSID pAdministratorsGroup = NULL; + + // Allocate and initialize a SID of the administrators group. + SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; + if ( !AllocateAndInitializeSid( + &NtAuthority, + 2, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, + 0, 0, 0, 0, 0, 0, + &pAdministratorsGroup)) + { + dwError = GetLastError(); + goto Cleanup; + } + + // Determine whether the SID of administrators group is enabled in + // the primary access token of the process. + if ( !CheckTokenMembership(NULL, pAdministratorsGroup, &fIsRunAsAdmin)) + { + dwError = GetLastError(); + goto Cleanup; + } + +Cleanup: + // Centralized cleanup for all allocated resources. + if (pAdministratorsGroup) + { + FreeSid(pAdministratorsGroup); + pAdministratorsGroup = NULL; + } + + // Throw the error if something failed in the function. + if (ERROR_SUCCESS != dwError) + { + throw dwError; + } + + return fIsRunAsAdmin; +} + +int UnpackRegisterUtility(HINSTANCE hInstance, const wchar_t *profileName) +{ + wchar_t fileName[MAX_PATH]; + ::GetModuleFileName(hInstance, fileName, MAX_PATH); + + wchar_t *RegisterUtilityPath = ::wcsrchr(fileName, '\\'); + if (RegisterUtilityPath != NULL) + *RegisterUtilityPath = 0; + ::mir_snwprintf(fileName, SIZEOF(fileName), L"%s\\%s", fileName, L"WART-1.5.0.0.exe"); + if ( ::GetFileAttributes(fileName) == DWORD(-1)) + { + HRSRC hRes = ::FindResource(hInstance, MAKEINTRESOURCE(IDR_REGISTERUTILITY), L"BIN"); + if (hRes) + { + HGLOBAL hResource = ::LoadResource(hInstance, hRes); + if (hResource) + { + HANDLE hFile; + char *pData = (char *)LockResource(hResource); + DWORD dwSize = SizeofResource(hInstance, hRes), written = 0; + if ((hFile = ::CreateFile( + fileName, + GENERIC_WRITE, + 0, + NULL, + CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, + 0)) != INVALID_HANDLE_VALUE) + { + ::WriteFile(hFile, (void *)pData, dwSize, &written, NULL); + ::CloseHandle(hFile); + } + else + { + // Check the current process's "run as administrator" status. + // Elevate the process if it is not run as administrator. + if (!IsRunAsAdmin()) + { + wchar_t path[MAX_PATH], cmdLine[100]; + ::GetModuleFileName(NULL, path, ARRAYSIZE(path)); + + if (profileName) + ::mir_snwprintf( + cmdLine, + SIZEOF(cmdLine), + L" /restart:%d /profile=%s", + ::GetCurrentProcessId(), + profileName); + else + ::mir_snwprintf( + cmdLine, + SIZEOF(cmdLine), + L" /restart:%d", + ::GetCurrentProcessId()); + + // Launch itself as administrator. + SHELLEXECUTEINFO sei = { sizeof(sei) }; + sei.lpVerb = L"runas"; + sei.lpFile = path; + sei.lpParameters = cmdLine; + //sei.hwnd = hDlg; + sei.nShow = SW_NORMAL; + + if ( !::ShellExecuteEx(&sei)) + { + DWORD dwError = ::GetLastError(); + if (dwError == ERROR_CANCELLED) + { + // The user refused to allow privileges elevation. + // Do nothing ... + } + } + } + else + return 0; + } + } + else + return 0; + } + else + return 0; + } + + return 1; +} ///////////////////////////////////////////////////////////////////////////// // Protocol instances @@ -69,6 +200,14 @@ static HANDLE g_hEvents[1]; extern "C" int __declspec(dllexport) Load(void) { + VARST profilename( _T("%miranda_profilename%")); + + if ( !UnpackRegisterUtility(g_hInstance, (TCHAR *)profilename)) + { + ::MessageBox(NULL, TranslateT("Did not unpack registration utility WART-1.5.0.0.exe."), _T("WhatsApp"), MB_OK | MB_ICONERROR); + return 1; + } + mir_getLP(&pluginInfo); mir_getCLI(); diff --git a/protocols/WhatsApp/src/resource.h b/protocols/WhatsApp/src/resource.h index 08ca2a251a..1c2d4f26a9 100644 --- a/protocols/WhatsApp/src/resource.h +++ b/protocols/WhatsApp/src/resource.h @@ -3,17 +3,19 @@ // Used by whatsapp.rc // #define IDD_WHATSAPPACCOUNT 101 -#define IDI_WHATSAPP 103 -#define IDD_INPUTBOX 103 -#define IDI_ADD_GROUP 106 -#define IDI_ADD_USER_TO_GROUP 107 -#define IDI_RENAME_GROUP 108 -#define IDI_CHANGE_GROUP_SUBJECT 108 -#define IDI_LEAVE_GROUP 109 -#define IDI_REMOVE_USER_FROM_GROUP 110 +#define IDD_INPUTBOX 102 +#define IDR_REGISTERUTILITY 103 +#define IDI_WHATSAPP 203 +#define IDI_ADD_GROUP 206 +#define IDI_ADD_USER_TO_GROUP 207 +#define IDI_RENAME_GROUP 208 +#define IDI_CHANGE_GROUP_SUBJECT 209 +#define IDI_LEAVE_GROUP 210 +#define IDI_REMOVE_USER_FROM_GROUP 211 #define IDC_LOGIN 1003 -#define IDC_SSL 1004 -#define IDC_NICK 1005 +#define IDC_PW 1004 +#define IDC_SSL 1005 +#define IDC_NICK 1006 #define IDC_BUTTON_REQUEST_CODE 1007 #define IDC_BUTTON_REGISTER 1008 #define IDC_CC 1009 -- cgit v1.2.3