summaryrefslogtreecommitdiff
path: root/protocols/WhatsApp/src
diff options
context:
space:
mode:
authorKirill Volinsky <mataes2007@gmail.com>2013-10-01 19:32:03 +0000
committerKirill Volinsky <mataes2007@gmail.com>2013-10-01 19:32:03 +0000
commit756c6e169bb748536a8c2f92f4b281ac480f481b (patch)
tree096a76930de0987236784a667ef342ef03ea37e7 /protocols/WhatsApp/src
parent14a74931f1745787956e6428dfd9ae45c9cebf4f (diff)
added utility for accounts registration
git-svn-id: http://svn.miranda-ng.org/main/trunk@6292 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'protocols/WhatsApp/src')
-rw-r--r--protocols/WhatsApp/src/dialogs.cpp14
-rw-r--r--protocols/WhatsApp/src/main.cpp141
-rw-r--r--protocols/WhatsApp/src/resource.h22
3 files changed, 166 insertions, 11 deletions
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<LPARAM>(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<LPARAM>(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