diff options
Diffstat (limited to 'protocols')
| -rw-r--r-- | protocols/WhatsApp/WhatsApp_11.vcxproj | 8 | ||||
| -rw-r--r-- | protocols/WhatsApp/WhatsApp_11.vcxproj.filters | 23 | ||||
| -rw-r--r-- | protocols/WhatsApp/res/WART-1.5.0.0.exe | bin | 0 -> 3171328 bytes | |||
| -rw-r--r-- | protocols/WhatsApp/res/whatsapp.rc | 41 | ||||
| -rw-r--r-- | protocols/WhatsApp/src/dialogs.cpp | 14 | ||||
| -rw-r--r-- | protocols/WhatsApp/src/main.cpp | 141 | ||||
| -rw-r--r-- | protocols/WhatsApp/src/resource.h | 22 | 
7 files changed, 221 insertions, 28 deletions
| 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 @@      <ResourceCompile Include="res\version.rc" />
      <ResourceCompile Include="res\whatsapp.rc" />
    </ItemGroup>
 +  <ItemGroup>
 +    <Image Include="res\add-group.ico" />
 +    <Image Include="res\add-user-to-group.ico" />
 +    <Image Include="res\change-group-subject.ico" />
 +    <Image Include="res\leave-group.ico" />
 +    <Image Include="res\remove-user-from-group.ico" />
 +    <Image Include="res\whatsapp.ico" />
 +  </ItemGroup>
    <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
    <ImportGroup Label="ExtensionTargets">
    </ImportGroup>
 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 @@      <Filter Include="WhatsAPI++\OpenSSL">
        <UniqueIdentifier>{eaedb8f8-8e43-4360-9007-b1a3448d2d16}</UniqueIdentifier>
      </Filter>
 +    <Filter Include="Resources\Icons">
 +      <UniqueIdentifier>{06318065-d7dc-4678-b6d0-8c5feca76d8f}</UniqueIdentifier>
 +    </Filter>
    </ItemGroup>
    <ItemGroup>
      <ClCompile Include="src\chat.cpp">
 @@ -199,4 +202,24 @@        <Filter>Resources</Filter>
      </ResourceCompile>
    </ItemGroup>
 +  <ItemGroup>
 +    <Image Include="res\add-group.ico">
 +      <Filter>Resources\Icons</Filter>
 +    </Image>
 +    <Image Include="res\add-user-to-group.ico">
 +      <Filter>Resources\Icons</Filter>
 +    </Image>
 +    <Image Include="res\change-group-subject.ico">
 +      <Filter>Resources\Icons</Filter>
 +    </Image>
 +    <Image Include="res\leave-group.ico">
 +      <Filter>Resources\Icons</Filter>
 +    </Image>
 +    <Image Include="res\remove-user-from-group.ico">
 +      <Filter>Resources\Icons</Filter>
 +    </Image>
 +    <Image Include="res\whatsapp.ico">
 +      <Filter>Resources\Icons</Filter>
 +    </Image>
 +  </ItemGroup>
  </Project>
\ 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.exeBinary files differ new file mode 100644 index 0000000000..3a989ee74f --- /dev/null +++ b/protocols/WhatsApp/res/WART-1.5.0.0.exe 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<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
 | 
