diff options
-rw-r--r-- | protocols/FacebookRM/src/communication.cpp | 38 | ||||
-rw-r--r-- | protocols/FacebookRM/src/version.h | 2 |
2 files changed, 30 insertions, 10 deletions
diff --git a/protocols/FacebookRM/src/communication.cpp b/protocols/FacebookRM/src/communication.cpp index 5ead6bedb2..307232cd8b 100644 --- a/protocols/FacebookRM/src/communication.cpp +++ b/protocols/FacebookRM/src/communication.cpp @@ -822,16 +822,26 @@ bool facebook_client::login(const char *username, const char *password) inner_data += "&fb_dtsg=" + utils::url::encode(utils::text::source_get_value(&resp.data, 3, "name=\"fb_dtsg\"", "value=\"", "\"")); inner_data += "&name_action_selected=save_device"; // Save device - or "dont_save" resp = flap(REQUEST_SETUP_MACHINE, &inner_data); - } - // Save actual machine name - // inner_data = "machine_name=Miranda%20NG&submit[Don't%20Save]=Don't%20Save"; // Don't save - inner_data = "machine_name=Miranda%20NG&submit[Save%20Device]=Save%20Device"; // Save - inner_data += "&lsd=" + utils::text::source_get_value(&resp.data, 3, "name=\"lsd\"", "value=\"", "\""); - inner_data += "&nh=" + utils::text::source_get_value(&resp.data, 3, "name=\"nh\"", "value=\"", "\""); - inner_data += "&fb_dtsg=" + utils::url::encode(utils::text::source_get_value(&resp.data, 3, "name=\"fb_dtsg\"", "value=\"", "\"")); + } else if (resp.data.find("name=\"submit[OK]\"") != std::string::npos) { + + inner_data = "submit[OK]=OK"; + inner_data += "&nh=" + utils::text::source_get_value(&resp.data, 3, "name=\"nh\"", "value=\"", "\""); + inner_data += "&fb_dtsg=" + utils::url::encode(utils::text::source_get_value(&resp.data, 3, "name=\"fb_dtsg\"", "value=\"", "\"")); + resp = flap(REQUEST_SETUP_MACHINE, &inner_data); + + if (resp.data.find("security-essentials") != std::string::npos) { + // Computer was probably infected by malware and needs cleaning (actually this may happen because Miranda doesn't support FB's captcha) + inner_data = "submit[Continue]=Continue"; + inner_data += "&nh=" + utils::text::source_get_value(&resp.data, 3, "name=\"nh\"", "value=\"", "\""); + inner_data += "&fb_dtsg=" + utils::url::encode(utils::text::source_get_value(&resp.data, 3, "name=\"fb_dtsg\"", "value=\"", "\"")); + + // Mark that used cleaned his computer already, because he must confirm it anyway to be able to continue + inner_data += "&confirm=1"; - resp = flap(REQUEST_SETUP_MACHINE, &inner_data); + resp = flap(REQUEST_SETUP_MACHINE, &inner_data); + } + } } } @@ -867,9 +877,19 @@ bool facebook_client::login(const char *username, const char *password) default: return handle_error("login", FORCE_QUIT); - case HTTP_CODE_FOUND: // Found and redirected to Home, Logged in, everything is OK + case HTTP_CODE_FOUND: // Found and redirected somewhere { + if (resp.headers.find("Location") != resp.headers.end()) { + std::string url = (this->https_ ? "https://"FACEBOOK_SERVER_REGULAR"/" : "http://"FACEBOOK_SERVER_REGULAR"/"); + + if (resp.headers["Location"] != url) { + // Unexpected redirect, but we try to ignore it - maybe we were logged in anyway + parent->debugLogA(" ! ! Login error: Unexpected redirect: %s", resp.headers["Location"].c_str()); + } + } + if (cookies.find("c_user") != cookies.end()) { + // Probably logged in, everything seems OK this->self_.user_id = cookies.find("c_user")->second; parent->setString(FACEBOOK_KEY_ID, this->self_.user_id.c_str()); parent->debugLogA(" Got self user id: %s", this->self_.user_id.c_str()); diff --git a/protocols/FacebookRM/src/version.h b/protocols/FacebookRM/src/version.h index f4cb3da2a8..9ea1484017 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 0
+#define __BUILD_NUM 1
#include <stdver.h>
|