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/src/dialogs.cpp | 14 ++++ protocols/WhatsApp/src/main.cpp | 141 ++++++++++++++++++++++++++++++++++++- protocols/WhatsApp/src/resource.h | 22 +++--- 3 files changed, 166 insertions(+), 11 deletions(-) (limited to 'protocols/WhatsApp/src') 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