From ceb5a959c77bbfdb5f5054d6d694032aa323f674 Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Mon, 23 Mar 2015 18:04:59 +0000 Subject: SkypeWeb: status support pt2 (patch from MikalaiR) git-svn-id: http://svn.miranda-ng.org/main/trunk@12487 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/SkypeWeb/src/http_request.h | 4 +- protocols/SkypeWeb/src/requests/endpoint.h | 5 ++- protocols/SkypeWeb/src/requests/login.h | 8 +++- protocols/SkypeWeb/src/requests/reg_info.h | 6 ++- protocols/SkypeWeb/src/requests/status.h | 4 +- protocols/SkypeWeb/src/skype_contacts.cpp | 1 + protocols/SkypeWeb/src/skype_events.cpp | 67 +++++++++++++++++++++++------- protocols/SkypeWeb/src/skype_proto.cpp | 14 +++++-- protocols/SkypeWeb/src/skype_proto.h | 2 +- 9 files changed, 83 insertions(+), 28 deletions(-) (limited to 'protocols/SkypeWeb') diff --git a/protocols/SkypeWeb/src/http_request.h b/protocols/SkypeWeb/src/http_request.h index 5d34d04e3f..db6c2caeec 100644 --- a/protocols/SkypeWeb/src/http_request.h +++ b/protocols/SkypeWeb/src/http_request.h @@ -245,7 +245,7 @@ public: this->HttpRequest::HttpRequest(REQUEST_POST, urlFormat, args); va_end(args); - Headers << CHAR_VALUE("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); + //Headers << CHAR_VALUE("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); } }; @@ -291,7 +291,7 @@ public: this->HttpsRequest::HttpsRequest(REQUEST_POST, urlFormat, args); va_end(args); - Headers << CHAR_VALUE("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); + //Headers << CHAR_VALUE("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); } }; diff --git a/protocols/SkypeWeb/src/requests/endpoint.h b/protocols/SkypeWeb/src/requests/endpoint.h index a6878f3f1f..3bd6827ac4 100644 --- a/protocols/SkypeWeb/src/requests/endpoint.h +++ b/protocols/SkypeWeb/src/requests/endpoint.h @@ -8,11 +8,12 @@ public: HttpsRequest(REQUEST_PUT, endpointURL) { flags |= NLHRF_SSL; - + CMStringA auth = "registrationToken="; + auth += regToken; Headers << CHAR_VALUE("Accept", "application/json, text/javascript") << CHAR_VALUE("Expires", "0") - << FORMAT_VALUE("RegistrationToken", "registrationToken=%s", regToken) + << CHAR_VALUE("RegistrationToken", auth) << CHAR_VALUE("Content-Type", "application/json; charset=UTF-8") << CHAR_VALUE("Referer", "https://web.skype.com/main") << CHAR_VALUE("Origin", "https://web.skype.com") diff --git a/protocols/SkypeWeb/src/requests/login.h b/protocols/SkypeWeb/src/requests/login.h index 8c45c7237c..c7924a842c 100644 --- a/protocols/SkypeWeb/src/requests/login.h +++ b/protocols/SkypeWeb/src/requests/login.h @@ -7,24 +7,28 @@ public: LoginRequest() : HttpsPostRequest("login.skype.com/login") { + //flags = NLHRF_SSL | NLHRF_NODUMPSEND | NLHRF_DUMPASTEXT; Url << INT_VALUE("client_id", 578134) << CHAR_VALUE("redirect_uri", "https%3A%2F%2Fweb.skype.com"); Headers - << CHAR_VALUE("Host", "login.skype.com"); + << CHAR_VALUE("Host", "login.skype.com") + << CHAR_VALUE("Connection", "keep-alive"); } LoginRequest(const char *skypename, const char *password, const char *pie, const char *etm) : HttpsPostRequest("login.skype.com/login") { + //flags = NLHRF_SSL | NLHRF_NODUMPSEND | NLHRF_DUMPASTEXT; Url << INT_VALUE("client_id", 578134) << CHAR_VALUE("redirect_uri", "https%3A%2F%2Fweb.skype.com"); Headers << CHAR_VALUE("Host", "login.skype.com") - << CHAR_VALUE("Referer", "https://login.skype.com/login?method=skype&client_id=578134&redirect_uri=https%3A%2F%2Fweb.skype.com"); + << CHAR_VALUE("Referer", "https://login.skype.com/login?method=skype&client_id=578134&redirect_uri=https%3A%2F%2Fweb.skype.com") + << CHAR_VALUE("Connection", "keep-alive"); LPTIME_ZONE_INFORMATION tzi = tmi.getTziByContact(NULL); char sign = tzi->Bias > 0 ? '-' : '+'; diff --git a/protocols/SkypeWeb/src/requests/reg_info.h b/protocols/SkypeWeb/src/requests/reg_info.h index 6ba0518524..888ce987b0 100644 --- a/protocols/SkypeWeb/src/requests/reg_info.h +++ b/protocols/SkypeWeb/src/requests/reg_info.h @@ -7,10 +7,12 @@ public: GetRegInfoRequest(const char *token) : HttpsPostRequest("client-s.gateway.messenger.live.com/v1/users/ME/endpoints") { - Headers + CMStringA auth = "skypetoken="; + auth += token; + Headers << CHAR_VALUE("Accept", "application/json, text/javascript") << CHAR_VALUE("Expires", "0") - << FORMAT_VALUE("Authentication", "skypetoken=%s", token) + << CHAR_VALUE("Authentication", auth) << CHAR_VALUE("Content-Type", "application/json; charset = UTF-8") << CHAR_VALUE("Referer", "https://web.skype.com/main") << CHAR_VALUE("Origin", "https://web.skype.com") diff --git a/protocols/SkypeWeb/src/requests/status.h b/protocols/SkypeWeb/src/requests/status.h index 07703e84ae..a8c40a492b 100644 --- a/protocols/SkypeWeb/src/requests/status.h +++ b/protocols/SkypeWeb/src/requests/status.h @@ -7,10 +7,12 @@ public: SetStatusRequest(const char *regToken, bool status) : HttpsRequest(REQUEST_PUT, "client-s.gateway.messenger.live.com/v1/users/ME/presenceDocs/messagingService") { + CMStringA auth = "registrationToken="; + auth += regToken; Headers << CHAR_VALUE("Accept", "application / json, text / javascript") << CHAR_VALUE("Expires", "0") - << FORMAT_VALUE("RegistrationToken", "registrationToken=%s", regToken) + << CHAR_VALUE("RegistrationToken", auth) << CHAR_VALUE("Content-Type", "application/json; charset = UTF-8") << CHAR_VALUE("Referer", "https://web.skype.com/main") << CHAR_VALUE("Origin", "https://web.skype.com") diff --git a/protocols/SkypeWeb/src/skype_contacts.cpp b/protocols/SkypeWeb/src/skype_contacts.cpp index 08b0a6f063..c8a889d316 100644 --- a/protocols/SkypeWeb/src/skype_contacts.cpp +++ b/protocols/SkypeWeb/src/skype_contacts.cpp @@ -88,6 +88,7 @@ void CSkypeProto::LoadContactsAuth(const NETLIBHTTPREQUEST *response) if (response == NULL) return; + JSONROOT root(response->pData); if (root == NULL) return; diff --git a/protocols/SkypeWeb/src/skype_events.cpp b/protocols/SkypeWeb/src/skype_events.cpp index 309110b285..ff2efa5fef 100644 --- a/protocols/SkypeWeb/src/skype_events.cpp +++ b/protocols/SkypeWeb/src/skype_events.cpp @@ -98,31 +98,68 @@ void CSkypeProto::OnLoginSecond(const NETLIBHTTPREQUEST *response) void CSkypeProto::OnGetRegInfo(const NETLIBHTTPREQUEST *response) { + if (response == NULL) + return; + std::regex regex; std::smatch match; std::string content = response->pData; for (int i = 0; i < response->headersCount; i++) { - if (mir_strcmpi(response->headers[i].szName, "Set-RegistrationToken")) + if (mir_strcmpi(response->headers[i].szName, "Set-RegistrationToken") == 0) + { + regex = "^(.+?)=(.+?);"; + content = response->headers[i].szValue; + if (std::regex_search(content, match, regex)) + RegInfo[match[1]] = match[2]; + } + else if (mir_strcmpi(response->headers[i].szName, "Location") == 0) + { + content = response->headers[i].szValue; + RegInfo["Location"] = content; + } + else continue; - - regex = "^(.+?)=(.+?);"; - content = response->headers[i].szValue; - - if (std::regex_search(content, match, regex)) - RegInfo[match[1]] = match[2]; } setString("RegistrationToken", RegInfo["registrationToken"].c_str()); + setString("Endpoint", urlDecode(RegInfo["Location"].c_str()).c_str()); - for (int i = 0; i < response->headersCount; i++) - { - if (mir_strcmpi(response->headers[i].szName, "Location")) - continue; - content = response->headers[i].szValue; - } - setString("Endpoint", urlDecode(content.c_str()).c_str()); debugLogA(getStringA("RegistrationToken")); debugLogA(getStringA("Endpoint")); - PushRequest(new GetEndpointRequest(ptrA(getStringA("RegistrationToken")), ptrA(getStringA("Endpoint")))); + CMStringA endpointURL = getStringA("Endpoint"); + endpointURL += "/presenceDocs/messagingService"; + PushRequest(new GetEndpointRequest(ptrA(getStringA("RegistrationToken")), endpointURL)); PushRequest(new SetStatusRequest(ptrA(getStringA("RegistrationToken")), true)); +} + +void CSkypeProto::OnSetStatus(const NETLIBHTTPREQUEST *response) +{ + if (response == NULL) + return; + + JSONROOT root(response->pData); + if (root == NULL) + return; + JSONNODE *status_json = json_get(root, "status"); + debugLog(json_as_string(status_json)); + + const char* status = (const char *)json_as_string(status_json); + debugLogA(status); + + int old_status = m_iStatus; + int iNewStatus; + if (mir_strcmp(status, "O")==0) + { + iNewStatus = ID_STATUS_ONLINE; + } + else if (mir_strcmp(status,"H")==0) + { + iNewStatus = ID_STATUS_INVISIBLE; + } + else + { + iNewStatus = ID_STATUS_ONLINE; + } + m_iStatus = iNewStatus; + ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)old_status, m_iStatus); } \ No newline at end of file diff --git a/protocols/SkypeWeb/src/skype_proto.cpp b/protocols/SkypeWeb/src/skype_proto.cpp index 82a3ec1b00..4f3adf6462 100644 --- a/protocols/SkypeWeb/src/skype_proto.cpp +++ b/protocols/SkypeWeb/src/skype_proto.cpp @@ -133,6 +133,8 @@ int CSkypeProto::SetStatus(int iNewStatus) int old_status = m_iStatus; m_iDesiredStatus = iNewStatus; + CMStringA endpointURL = getStringA("Endpoint"); + endpointURL += "/presenceDocs/messagingService"; if (iNewStatus == ID_STATUS_OFFLINE) { @@ -149,8 +151,8 @@ int CSkypeProto::SetStatus(int iNewStatus) } else if (iNewStatus == ID_STATUS_INVISIBLE) { - PushRequest(new GetEndpointRequest(ptrA(getStringA("RegistrationToken")), ptrA(getStringA("Endpoint")))); - PushRequest(new SetStatusRequest(ptrA(getStringA("RegistrationToken")), false)); + PushRequest(new GetEndpointRequest(ptrA(getStringA("RegistrationToken")), endpointURL)); + PushRequest(new SetStatusRequest(ptrA(getStringA("RegistrationToken")), false), &CSkypeProto::OnSetStatus); } else { @@ -159,7 +161,12 @@ int CSkypeProto::SetStatus(int iNewStatus) return 0; } - if (old_status == ID_STATUS_OFFLINE && m_iStatus == ID_STATUS_OFFLINE) + if (m_iStatus == ID_STATUS_INVISIBLE) + { + PushRequest(new GetEndpointRequest(ptrA(getStringA("RegistrationToken")), endpointURL)); + PushRequest(new SetStatusRequest(ptrA(getStringA("RegistrationToken")), true), &CSkypeProto::OnSetStatus); + } + else if (old_status == ID_STATUS_OFFLINE && m_iStatus == ID_STATUS_OFFLINE) { // login m_iStatus = ID_STATUS_CONNECTING; @@ -178,6 +185,7 @@ int CSkypeProto::SetStatus(int iNewStatus) return 0; } + HANDLE CSkypeProto::GetAwayMsg(MCONTACT) { return 0; } int CSkypeProto::RecvAwayMsg(MCONTACT, int, PROTORECVEVENT*) { return 0; } diff --git a/protocols/SkypeWeb/src/skype_proto.h b/protocols/SkypeWeb/src/skype_proto.h index 4310050bad..32bcd1f411 100644 --- a/protocols/SkypeWeb/src/skype_proto.h +++ b/protocols/SkypeWeb/src/skype_proto.h @@ -122,8 +122,8 @@ private: // events void OnLoginFirst(const NETLIBHTTPREQUEST *response); void OnLoginSecond(const NETLIBHTTPREQUEST *response); - void OnGetRegInfo(const NETLIBHTTPREQUEST *response); + void OnSetStatus(const NETLIBHTTPREQUEST *response); // profile void UpdateProfileFirstName(JSONNODE *root, MCONTACT hContact = NULL); -- cgit v1.2.3