summaryrefslogtreecommitdiff
path: root/protocols
diff options
context:
space:
mode:
authorRobert Pösel <robyer@seznam.cz>2014-08-24 15:46:24 +0000
committerRobert Pösel <robyer@seznam.cz>2014-08-24 15:46:24 +0000
commit9afd590f4fd860d3d023203137129c8870bb8579 (patch)
treea8cb541e41f5b72bfde3309e0a9f46794151a104 /protocols
parentaa28fe4f758a20680b63d0bda40207548ab93fdb (diff)
Facebook: Support for showing captcha codes; Raise version bump from previous commit
git-svn-id: http://svn.miranda-ng.org/main/trunk@10319 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'protocols')
-rw-r--r--protocols/FacebookRM/facebook_10.vcxproj2
-rw-r--r--protocols/FacebookRM/facebook_10.vcxproj.filters6
-rw-r--r--protocols/FacebookRM/facebook_12.vcxproj4
-rw-r--r--protocols/FacebookRM/facebook_12.vcxproj.filters8
-rw-r--r--protocols/FacebookRM/res/facebook.rc25
-rw-r--r--protocols/FacebookRM/res/key.icobin0 -> 1150 bytes
-rw-r--r--protocols/FacebookRM/src/captcha.cpp144
-rw-r--r--protocols/FacebookRM/src/client.h2
-rw-r--r--protocols/FacebookRM/src/common.h1
-rw-r--r--protocols/FacebookRM/src/communication.cpp51
-rw-r--r--protocols/FacebookRM/src/constants.h5
-rw-r--r--protocols/FacebookRM/src/messages.cpp8
-rw-r--r--protocols/FacebookRM/src/proto.h1
-rw-r--r--protocols/FacebookRM/src/resource.h14
-rw-r--r--protocols/FacebookRM/src/theme.cpp1
-rw-r--r--protocols/FacebookRM/src/version.h4
16 files changed, 252 insertions, 24 deletions
diff --git a/protocols/FacebookRM/facebook_10.vcxproj b/protocols/FacebookRM/facebook_10.vcxproj
index 3256202fad..469ed2f29e 100644
--- a/protocols/FacebookRM/facebook_10.vcxproj
+++ b/protocols/FacebookRM/facebook_10.vcxproj
@@ -175,6 +175,7 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="src\avatars.cpp" />
+ <ClCompile Include="src\captcha.cpp" />
<ClCompile Include="src\chat.cpp" />
<ClCompile Include="src\communication.cpp" />
<ClCompile Include="src\connection.cpp" />
@@ -223,6 +224,7 @@
<Image Include="res\poke.ico" />
<Image Include="res\conversation.ico" />
<Image Include="res\read.ico" />
+ <Image Include="res\key.ico" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
diff --git a/protocols/FacebookRM/facebook_10.vcxproj.filters b/protocols/FacebookRM/facebook_10.vcxproj.filters
index aceb1bb5f1..b27274028e 100644
--- a/protocols/FacebookRM/facebook_10.vcxproj.filters
+++ b/protocols/FacebookRM/facebook_10.vcxproj.filters
@@ -66,6 +66,9 @@
<ClCompile Include="src\stdafx.cpp">
<Filter>Source Files</Filter>
</ClCompile>
+ <ClCompile Include="src\captcha.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\client.h">
@@ -147,5 +150,8 @@
<Image Include="res\read.ico">
<Filter>Resource Files\Icons</Filter>
</Image>
+ <Image Include="res\key.ico">
+ <Filter>Resource Files\Icons</Filter>
+ </Image>
</ItemGroup>
</Project> \ No newline at end of file
diff --git a/protocols/FacebookRM/facebook_12.vcxproj b/protocols/FacebookRM/facebook_12.vcxproj
index fab3f3f641..efd175f947 100644
--- a/protocols/FacebookRM/facebook_12.vcxproj
+++ b/protocols/FacebookRM/facebook_12.vcxproj
@@ -178,6 +178,7 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="src\avatars.cpp" />
+ <ClCompile Include="src\captcha.cpp" />
<ClCompile Include="src\chat.cpp" />
<ClCompile Include="src\communication.cpp" />
<ClCompile Include="src\connection.cpp" />
@@ -225,7 +226,8 @@
<Image Include="res\notification.ico" />
<Image Include="res\poke.ico" />
<Image Include="res\conversation.ico" />
- <Image Include="res\read.ico" />
+ <Image Include="res\read.ico" />
+ <Image Include="res\key.ico" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
diff --git a/protocols/FacebookRM/facebook_12.vcxproj.filters b/protocols/FacebookRM/facebook_12.vcxproj.filters
index 235840f852..b27274028e 100644
--- a/protocols/FacebookRM/facebook_12.vcxproj.filters
+++ b/protocols/FacebookRM/facebook_12.vcxproj.filters
@@ -66,6 +66,9 @@
<ClCompile Include="src\stdafx.cpp">
<Filter>Source Files</Filter>
</ClCompile>
+ <ClCompile Include="src\captcha.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\client.h">
@@ -144,7 +147,10 @@
<Image Include="res\conversation.ico">
<Filter>Resource Files\Icons</Filter>
</Image>
- <Image Include="res\read.ico">
+ <Image Include="res\read.ico">
+ <Filter>Resource Files\Icons</Filter>
+ </Image>
+ <Image Include="res\key.ico">
<Filter>Resource Files\Icons</Filter>
</Image>
</ItemGroup>
diff --git a/protocols/FacebookRM/res/facebook.rc b/protocols/FacebookRM/res/facebook.rc
index 0d781f5bae..9d1fbd0ec9 100644
--- a/protocols/FacebookRM/res/facebook.rc
+++ b/protocols/FacebookRM/res/facebook.rc
@@ -176,6 +176,23 @@ BEGIN
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,210,281,10
END
+IDD_CAPTCHAFORM DIALOGEX 0, 0, 258, 224
+STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_CONTROLPARENT
+CAPTION "Bots challenge test"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ EDITTEXT IDC_VALUE,4,203,137,14,ES_AUTOHSCROLL
+ CONTROL "",IDC_WHITERECT,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,0,0,258,25
+ LTEXT "Instruction:",IDC_TITLE,7,7,243,8,NOT WS_GROUP
+ EDITTEXT IDC_INSTRUCTION,17,16,233,8,ES_MULTILINE | ES_READONLY | NOT WS_BORDER
+ CONTROL "",IDC_FRAME1,"Static",SS_ETCHEDHORZ,0,26,258,1
+ CONTROL "",IDC_FRAME2,"Static",SS_ETCHEDHORZ,0,197,258,1
+ DEFPUSHBUTTON "Submit",IDOK,146,203,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,200,203,50,14
+END
+
+
/////////////////////////////////////////////////////////////////////////////
//
@@ -249,6 +266,14 @@ BEGIN
TOPMARGIN, 7
BOTTOMMARGIN, 228
END
+
+ IDD_CAPTCHA, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 226
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 103
+ END
END
#endif // APSTUDIO_INVOKED
diff --git a/protocols/FacebookRM/res/key.ico b/protocols/FacebookRM/res/key.ico
new file mode 100644
index 0000000000..44df000c12
--- /dev/null
+++ b/protocols/FacebookRM/res/key.ico
Binary files differ
diff --git a/protocols/FacebookRM/src/captcha.cpp b/protocols/FacebookRM/src/captcha.cpp
new file mode 100644
index 0000000000..3abec878f7
--- /dev/null
+++ b/protocols/FacebookRM/src/captcha.cpp
@@ -0,0 +1,144 @@
+/*
+
+Facebook plugin for Miranda Instant Messenger
+_____________________________________________
+
+Copyright © 2014 Robert Pösel
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include "common.h"
+#include "resource.h"
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// Captcha form
+
+struct CAPTCHA_FORM_PARAMS
+{
+ HBITMAP bmp;
+ int w,h;
+ char Result[100];
+};
+
+static INT_PTR CALLBACK CaptchaFormDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ CAPTCHA_FORM_PARAMS *params = (CAPTCHA_FORM_PARAMS*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+ switch (msg) {
+ case WM_INITDIALOG: {
+ TranslateDialogDefault(hwndDlg);
+ SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)Skin_GetIconByHandle( GetIconHandle("key"), TRUE));
+ SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)Skin_GetIconByHandle( GetIconHandle("key")));
+ params = (CAPTCHA_FORM_PARAMS*)lParam;
+
+ SetDlgItemText(hwndDlg, IDC_INSTRUCTION, TranslateT("Enter the text you see"));
+ SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)params);
+
+ return TRUE;
+ }
+ case WM_CTLCOLORSTATIC:
+ switch(GetWindowLongPtr((HWND)lParam, GWL_ID)) {
+ case IDC_WHITERECT:
+ case IDC_INSTRUCTION:
+ case IDC_TITLE:
+ return (BOOL)GetStockObject(WHITE_BRUSH);
+ }
+ return NULL;
+
+ case WM_PAINT:
+ if (params) {
+ PAINTSTRUCT ps;
+ HDC hdc, hdcMem;
+ RECT rc;
+
+ GetClientRect(hwndDlg, &rc);
+ hdc = BeginPaint(hwndDlg, &ps);
+ hdcMem = CreateCompatibleDC(hdc);
+ HGDIOBJ hOld = SelectObject(hdcMem, params->bmp);
+
+ int y = (rc.bottom + rc.top - params->h) / 2;
+ int x = (rc.right + rc.left - params->w) / 2;
+ BitBlt(hdc, x, y, params->w, params->h, hdcMem, 0,0, SRCCOPY);
+ SelectObject(hdcMem, hOld);
+ DeleteDC(hdcMem);
+
+ EndPaint(hwndDlg, &ps);
+ }
+ break;
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam)) {
+ case IDCANCEL:
+ EndDialog(hwndDlg, 0);
+ return TRUE;
+
+ case IDOK:
+ GetDlgItemTextA(hwndDlg, IDC_VALUE, params->Result, SIZEOF(params->Result));
+ EndDialog(hwndDlg, 1);
+ return TRUE;
+ }
+ break;
+
+ case WM_CLOSE:
+ EndDialog(hwndDlg, 0);
+ break;
+
+ case WM_DESTROY:
+ Skin_ReleaseIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, 0));
+ Skin_ReleaseIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, 0));
+ break;
+ }
+ return FALSE;
+}
+
+bool FacebookProto::RunCaptchaForm(std::string captchaUrl, std::string &result)
+{
+ debugLogA("RunCaptchaForm: reading picture from %s", captchaUrl.c_str());
+ result = "";
+
+ NETLIBHTTPREQUEST req = { sizeof(req) };
+ req.requestType = REQUEST_GET;
+ req.szUrl = (char*)captchaUrl.c_str();
+ req.flags = NLHRF_NODUMPHEADERS;
+
+ NETLIBHTTPREQUEST *reply = (NETLIBHTTPREQUEST*)CallService(MS_NETLIB_HTTPTRANSACTION, (WPARAM)m_hNetlibUser, (LPARAM)&req);
+ if (reply == NULL)
+ return false;
+
+ if (reply->resultCode != HTTP_CODE_OK) {
+ debugLogA("RunCaptchaForm: failed with code %d", reply->resultCode);
+ return false;
+ }
+
+ CAPTCHA_FORM_PARAMS param = { 0 };
+
+ IMGSRVC_MEMIO memio = { 0 };
+ memio.iLen = reply->dataLength;
+ memio.pBuf = reply->pData;
+ memio.fif = FIF_UNKNOWN; /* detect */
+ param.bmp = (HBITMAP)CallService(MS_IMG_LOADFROMMEM, (WPARAM)&memio, 0);
+
+ BITMAP bmp = {0};
+ GetObject(param.bmp, sizeof(bmp), &bmp);
+ param.w = bmp.bmWidth;
+ param.h = bmp.bmHeight;
+ int res = DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_CAPTCHAFORM), NULL, CaptchaFormDlgProc, (LPARAM)&param);
+ if (res == 0)
+ return false;
+
+ debugLogA("RunCaptchaForm: user entered text %s", param.Result);
+ result = param.Result;
+ return true;
+}
diff --git a/protocols/FacebookRM/src/client.h b/protocols/FacebookRM/src/client.h
index c1b3a5fc49..1bab682836 100644
--- a/protocols/FacebookRM/src/client.h
+++ b/protocols/FacebookRM/src/client.h
@@ -161,7 +161,7 @@ public:
std::map<std::string, int> messages_ignore;
bool channel();
- bool send_message(MCONTACT, std::string message_recipient, std::string message_text, std::string *error_text, MessageMethod method);
+ int send_message(MCONTACT, std::string message_recipient, std::string message_text, std::string *error_text, MessageMethod method, std::string captchaPersistData = "", std::string captcha = "");
////////////////////////////////////////////////////////////
// Status handling
diff --git a/protocols/FacebookRM/src/common.h b/protocols/FacebookRM/src/common.h
index 0972c1e7a6..744336381a 100644
--- a/protocols/FacebookRM/src/common.h
+++ b/protocols/FacebookRM/src/common.h
@@ -60,6 +60,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <m_smileyadd.h>
#include <m_toptoolbar.h>
#include <m_json.h>
+#include <m_imgsrvc.h>
class FacebookProto;
diff --git a/protocols/FacebookRM/src/communication.cpp b/protocols/FacebookRM/src/communication.cpp
index 307232cd8b..c9f8a50cf2 100644
--- a/protocols/FacebookRM/src/communication.cpp
+++ b/protocols/FacebookRM/src/communication.cpp
@@ -1141,19 +1141,26 @@ bool facebook_client::channel()
}
}
-bool facebook_client::send_message(MCONTACT hContact, std::string message_recipient, std::string message_text, std::string *error_text, MessageMethod method)
+int facebook_client::send_message(MCONTACT hContact, std::string message_recipient, std::string message_text, std::string *error_text, MessageMethod method, std::string captcha_persist_data, std::string captcha)
{
ScopedLock s(send_message_lock_);
handle_entry("send_message");
http::response resp;
+ std::string data = "";
+
+ if (!captcha.empty()) {
+ data += "&captcha_persist_data=" + captcha_persist_data;
+ data += "&recaptcha_challenge_field=";
+ data += "&captcha_response=" + captcha;
+ }
switch (method) {
case MESSAGE_INBOX:
{
parent->debugLogA(" > Sending message through INBOX");
- std::string data = "action=send";
+ data += "&action=send";
data += "&body=" + utils::url::encode(message_text);
data += "&recipients[0]=" + message_recipient;
data += "&__user=" + this->self_.user_id;
@@ -1167,7 +1174,7 @@ bool facebook_client::send_message(MCONTACT hContact, std::string message_recipi
case MESSAGE_MERCURY:
{
parent->debugLogA(" > Sending message through CHAT");
- std::string data = "message_batch[0][action_type]=ma-type:user-generated-message";
+ data += "&message_batch[0][action_type]=ma-type:user-generated-message";
data += "&message_batch[0][thread_id]";
data += "&message_batch[0][author]=fbid:" + this->self_.user_id;
data += "&message_batch[0][author_email]";
@@ -1201,7 +1208,7 @@ bool facebook_client::send_message(MCONTACT hContact, std::string message_recipi
case MESSAGE_TID:
{
parent->debugLogA(" > Sending message through MERCURY (TID)");
- std::string data = "message_batch[0][action_type]=ma-type:user-generated-message";
+ data += "&message_batch[0][action_type]=ma-type:user-generated-message";
data += "&message_batch[0][thread_id]=" + message_recipient;
data += "&message_batch[0][author]=fbid:" + this->self_.user_id;
data += "&message_batch[0][timestamp]=" + utils::time::mili_timestamp();
@@ -1225,7 +1232,7 @@ bool facebook_client::send_message(MCONTACT hContact, std::string message_recipi
case MESSAGE_ASYNC:
{
parent->debugLogA(" > Sending message through ASYNC");
- std::string data = "action=send";
+ data += "&action=send";
data += "&body=" + utils::url::encode(message_text);
data += "&recipients[0]=" + message_recipient;
data += "&lsd=";
@@ -1250,31 +1257,49 @@ bool facebook_client::send_message(MCONTACT hContact, std::string message_recipi
messages_ignore.insert(std::make_pair(mid, 0));
} break;
- //case 1356002: // You are offline - wtf??
+ //case 1356002: // You are offline (probably you can't use mercury or some other request when chat is offline)
case 1356003: // Contact is offline
{
MCONTACT hContact = parent->ContactIDToHContact(message_recipient);
if (hContact != NULL)
parent->setWord(hContact, "Status", ID_STATUS_OFFLINE);
- return false;
- } break;
+ return SEND_MESSAGE_ERROR;
+ }
case 1356026: // Contact has alternative client
{
client_notify(TranslateT("Need confirmation for sending messages to other clients.\nOpen Facebook website and try to send message to this contact again!"));
- return false;
- } break;
+ return SEND_MESSAGE_ERROR;
+ }
+
+ case 1357007: // Security check (captcha) is required
+ {
+ std::string imageUrl = utils::text::html_entities_decode(utils::text::slashu_to_utf8(utils::text::source_get_value(&resp.data, 3, "img class=\\\"img\\\"", "src=\\\"", "\\\"")));
+ std::string captchaPersistData = utils::text::source_get_value(&resp.data, 3, "\\\"captcha_persist_data\\\"", "value=\\\"", "\\\"");
+
+ parent->debugLogA("Got imageUrl: %s", imageUrl.c_str());
+ parent->debugLogA("Got captchaPersistData: %s", captchaPersistData.c_str());
+
+ std::string result;
+ if (!parent->RunCaptchaForm(imageUrl, result)) {
+ *error_text = Translate("User cancel captcha challenge.");
+ return SEND_MESSAGE_CANCEL;
+ }
+
+ return send_message(hContact, message_recipient, message_text, error_text, method, captchaPersistData, result);
+ }
default: // Other error
parent->debugLogA(" !!! Send message error #%d: %s", resp.error_number, resp.error_text);
- return false;
+ return SEND_MESSAGE_ERROR;
}
switch (resp.code)
{
case HTTP_CODE_OK:
- return handle_success("send_message");
+ handle_success("send_message");
+ return SEND_MESSAGE_OK;
case HTTP_CODE_FAKE_ERROR:
case HTTP_CODE_FAKE_DISCONNECTED:
@@ -1282,7 +1307,7 @@ bool facebook_client::send_message(MCONTACT hContact, std::string message_recipi
*error_text = Translate("Timeout when sending message.");
handle_error("send_message");
- return false;
+ return SEND_MESSAGE_ERROR;
}
}
diff --git a/protocols/FacebookRM/src/constants.h b/protocols/FacebookRM/src/constants.h
index 64b90f789a..d9f9502662 100644
--- a/protocols/FacebookRM/src/constants.h
+++ b/protocols/FacebookRM/src/constants.h
@@ -95,6 +95,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define FACEBOOK_EVENT_NOTIFICATION 0x40000000 // Facebook new notification
#define FACEBOOK_EVENT_OTHER 0x80000000 // Facebook other event - friend requests/new messages
+// Send message return values
+#define SEND_MESSAGE_OK 0
+#define SEND_MESSAGE_ERROR 1
+#define SEND_MESSAGE_CANCEL -1
+
// Facebook request types // TODO: Provide MS_ and release in FB plugin API?
enum RequestType {
REQUEST_LOGIN, // connecting physically
diff --git a/protocols/FacebookRM/src/messages.cpp b/protocols/FacebookRM/src/messages.cpp
index ec11ba3dec..c4f066ed0c 100644
--- a/protocols/FacebookRM/src/messages.cpp
+++ b/protocols/FacebookRM/src/messages.cpp
@@ -49,12 +49,12 @@ void FacebookProto::SendMsgWorker(void *p)
} else {
int retries = 5;
std::string error_text = "";
- bool result = false;
- while (!result && retries > 0) {
+ int result = SEND_MESSAGE_ERROR;
+ while (result == SEND_MESSAGE_ERROR && retries > 0) {
result = facy.send_message(data->hContact, std::string(id), data->msg, &error_text, retries % 2 == 0 ? MESSAGE_INBOX : MESSAGE_MERCURY);
retries--;
}
- if (result) {
+ if (result == SEND_MESSAGE_OK) {
ProtoBroadcastAck(data->hContact, ACKTYPE_MESSAGE, ACKRESULT_SUCCESS, data->msgid, 0);
// Remove from "readers" list and clear statusbar
@@ -100,7 +100,7 @@ void FacebookProto::SendChatMsgWorker(void *p)
}
if (!tid.empty()) {
- if (facy.send_message(hContact, tid, data->msg, &err_message, MESSAGE_TID))
+ if (facy.send_message(hContact, tid, data->msg, &err_message, MESSAGE_TID) == SEND_MESSAGE_OK)
UpdateChat(_A2T(data->chat_id.c_str()), facy.self_.user_id.c_str(), facy.self_.real_name.c_str(), data->msg.c_str());
else
UpdateChat(_A2T(data->chat_id.c_str()), NULL, NULL, err_message.c_str());
diff --git a/protocols/FacebookRM/src/proto.h b/protocols/FacebookRM/src/proto.h
index 56177acb86..1b87bc10de 100644
--- a/protocols/FacebookRM/src/proto.h
+++ b/protocols/FacebookRM/src/proto.h
@@ -233,6 +233,7 @@ public:
void OpenUrl(std::string url);
void __cdecl OpenUrlThread(void*);
void MessageRead(MCONTACT hContact);
+ bool RunCaptchaForm(std::string imageUrl, std::string &result);
// Handles, Locks
HGENMENU m_hMenuRoot, m_hMenuServicesRoot, m_hStatusMind;
diff --git a/protocols/FacebookRM/src/resource.h b/protocols/FacebookRM/src/resource.h
index 5fb781e678..90fa4d1472 100644
--- a/protocols/FacebookRM/src/resource.h
+++ b/protocols/FacebookRM/src/resource.h
@@ -10,12 +10,14 @@
#define IDD_OPTIONS 113
#define IDD_OPTIONS_EVENTS 114
#define IDD_OPTIONS_ADVANCED 115
+#define IDD_CAPTCHAFORM 116
#define IDI_POKE 127
#define IDI_NOTIFICATION 128
#define IDI_NEWSFEED 129
#define IDI_FRIENDS 130
#define IDI_CONVERSATION 131
#define IDI_READ 132
+#define IDI_KEYS 133
#define IDC_UN 1001
#define IDC_PW 1002
#define IDC_NEWACCOUNTLINK 1003
@@ -54,14 +56,22 @@
#define IDC_CCLIST_LABEL 1208
#define IDC_MESSAGES_COUNT 1209
#define IDC_MESSAGES_COUNT_SPIN 1210
+#define IDC_VALUE 1211
+#define IDC_WHITERECT 1212
+#define IDC_TITLE 1213
+#define IDC_INSTRUCTION 1214
+#define IDC_FRAME1 1215
+#define IDC_FRAME2 1216
+#define IDC_SUBMIT 1217
+
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 133
+#define _APS_NEXT_RESOURCE_VALUE 134
#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1211
+#define _APS_NEXT_CONTROL_VALUE 1218
#define _APS_NEXT_SYMED_VALUE 132
#endif
#endif
diff --git a/protocols/FacebookRM/src/theme.cpp b/protocols/FacebookRM/src/theme.cpp
index 50ef5b342b..c92e1541bc 100644
--- a/protocols/FacebookRM/src/theme.cpp
+++ b/protocols/FacebookRM/src/theme.cpp
@@ -34,6 +34,7 @@ static IconItem icons[] =
{ LPGEN("Friendship details"), "friendship", IDI_FRIENDS },
{ LPGEN("Conversation"), "conversation", IDI_CONVERSATION },
{ LPGEN("Message read"), "read", IDI_READ },
+ { LPGEN("Captcha form icon"), "key", IDI_KEYS }
};
// TODO: uninit
diff --git a/protocols/FacebookRM/src/version.h b/protocols/FacebookRM/src/version.h
index 9ea1484017..a4018228d9 100644
--- a/protocols/FacebookRM/src/version.h
+++ b/protocols/FacebookRM/src/version.h
@@ -1,7 +1,7 @@
#define __MAJOR_VERSION 0
#define __MINOR_VERSION 2
-#define __RELEASE_NUM 8
-#define __BUILD_NUM 1
+#define __RELEASE_NUM 9
+#define __BUILD_NUM 0
#include <stdver.h>