Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/EionRobb/skype4pidgin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunker <dk-junker@ya.ru>2017-02-26 00:18:13 +0300
committerJunker <dk-junker@ya.ru>2017-02-26 00:18:13 +0300
commit9a6496c2fec8fdd96f27cbd47bd42e92181e9b32 (patch)
tree647c906c34c8e1f78c96ce8533c45904ad29db8a /skypeweb
parent9a4e99fd7dc4acc0e6f640983f402708d350fc64 (diff)
add receive Moji (RichText/Media_FlikMsg) function
Diffstat (limited to 'skypeweb')
-rw-r--r--skypeweb/libskypeweb.c4
-rw-r--r--skypeweb/libskypeweb.h7
-rw-r--r--skypeweb/skypeweb_contacts.c30
-rw-r--r--skypeweb/skypeweb_contacts.h1
-rw-r--r--skypeweb/skypeweb_messages.c81
-rw-r--r--skypeweb/skypeweb_messages.h1
6 files changed, 123 insertions, 1 deletions
diff --git a/skypeweb/libskypeweb.c b/skypeweb/libskypeweb.c
index 238d202..38f7179 100644
--- a/skypeweb/libskypeweb.c
+++ b/skypeweb/libskypeweb.c
@@ -26,6 +26,8 @@
void
skypeweb_do_all_the_things(SkypeWebAccount *sa)
{
+ skypeweb_get_vdms_token(sa);
+
if (!sa->username) {
skypeweb_get_self_details(sa);
} else
@@ -48,6 +50,8 @@ skypeweb_do_all_the_things(SkypeWebAccount *sa)
//Too soon!
skypeweb_get_registration_token(sa);
}
+
+
}
diff --git a/skypeweb/libskypeweb.h b/skypeweb/libskypeweb.h
index 52de55e..0c28720 100644
--- a/skypeweb/libskypeweb.h
+++ b/skypeweb/libskypeweb.h
@@ -179,6 +179,7 @@
#define purple_xmlnode_get_child xmlnode_get_child
#define purple_xmlnode_get_next_twin xmlnode_get_next_twin
#define purple_xmlnode_get_data xmlnode_get_data
+ #define purple_xmlnode_get_data_unescaped xmlnode_get_data_unescaped
#define purple_xmlnode_get_attrib xmlnode_get_attrib
#define purple_xmlnode_free xmlnode_free
#define PurpleHash PurpleCipherContext
@@ -264,6 +265,10 @@ G_MODULE_EXPORT GType skypeweb_protocol_get_type(void);
#define SKYPEWEB_VIDEOMAIL_HOST "vm.skype.com"
#define SKYPEWEB_XFER_HOST "api.asm.skype.com"
#define SKYPEWEB_GRAPH_HOST "skypegraph.skype.com"
+#define SKYPEWEB_STATIC_HOST "static.asm.skype.com"
+#define SKYPEWEB_STATIC_CDN_HOST "static-asm.secure.skypeassets.com"
+
+#define SKYPEWEB_VDMS_TTL 300
#define SKYPEWEB_CLIENTINFO_NAME "swx-skype.com"
#define SKYPEWEB_CLIENTINFO_VERSION "908/1.63.51"
@@ -298,8 +303,10 @@ struct _SkypeWebAccount {
gchar *skype_token;
gchar *registration_token;
+ gchar *vdms_token;
gchar *endpoint;
gint registration_expiry;
+ gint vdms_expiry;
GSList *url_datas; /**< PurpleUtilFetchUrlData to be cancelled on logout */
};
diff --git a/skypeweb/skypeweb_contacts.c b/skypeweb/skypeweb_contacts.c
index 491c8fc..7c62fb9 100644
--- a/skypeweb/skypeweb_contacts.c
+++ b/skypeweb/skypeweb_contacts.c
@@ -186,6 +186,36 @@ skypeweb_download_uri_to_conv(SkypeWebAccount *sa, const gchar *uri, PurpleConve
purple_conversation_write(conv, conv->name, text, PURPLE_MESSAGE_SYSTEM, time(NULL));
}
+void
+skypeweb_download_moji_to_conv(SkypeWebAccount *sa, const gchar *text, const gchar *url_thumbnail, PurpleConversation *conv)
+{
+ gchar *headers, *cdn_url_thumbnail;
+ gpointer requestdata;
+ PurpleHttpURL *httpurl;
+
+ httpurl = purple_http_url_parse(url_thumbnail);
+
+ cdn_url_thumbnail = g_strdup_printf("https://%s/%s", SKYPEWEB_STATIC_CDN_HOST, purple_http_url_get_path(httpurl));
+
+ headers = g_strdup_printf("GET /%s HTTP/1.0\r\n"
+ "Connection: close\r\n"
+ "Accept: image/*\r\n"
+ "Cookie: vdms-skype-token=%s\r\n"
+ "Host: %s\r\n"
+ "\r\n",
+ purple_http_url_get_path(httpurl), sa->vdms_token,
+ SKYPEWEB_STATIC_CDN_HOST);
+
+ requestdata = skypeweb_fetch_url_request(sa, cdn_url_thumbnail, TRUE, NULL, FALSE, headers, FALSE, -1, skypeweb_got_imagemessage, conv);
+
+ skypeweb_url_prevent_follow_redirects(requestdata);
+
+ purple_conversation_write(conv, conv->name, text, PURPLE_MESSAGE_SYSTEM, time(NULL));
+
+ g_free(headers);
+ g_free(cdn_url_thumbnail);
+ purple_http_url_free(httpurl);
+}
static void
skypeweb_got_vm_file(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message)
diff --git a/skypeweb/skypeweb_contacts.h b/skypeweb/skypeweb_contacts.h
index 244cdea..505a908 100644
--- a/skypeweb/skypeweb_contacts.h
+++ b/skypeweb/skypeweb_contacts.h
@@ -24,6 +24,7 @@
void skypeweb_get_icon(PurpleBuddy *buddy);
void skypeweb_download_uri_to_conv(SkypeWebAccount *sa, const gchar *uri, PurpleConversation *conv);
void skypeweb_download_video_message(SkypeWebAccount *sa, const gchar *sid, PurpleConversation *conv);
+void skypeweb_download_moji_to_conv(SkypeWebAccount *sa, const gchar *text, const gchar *url_thumbnail, PurpleConversation *conv);
void skypeweb_present_uri_as_filetransfer(SkypeWebAccount *sa, const gchar *uri, const gchar *from);
PurpleXfer *skypeweb_new_xfer(PurpleConnection *pc, const char *who);
diff --git a/skypeweb/skypeweb_messages.c b/skypeweb/skypeweb_messages.c
index b555c88..daa25b2 100644
--- a/skypeweb/skypeweb_messages.c
+++ b/skypeweb/skypeweb_messages.c
@@ -515,6 +515,37 @@ process_message_resource(SkypeWebAccount *sa, JsonObject *resource)
skypeweb_received_contacts(sa, contacts);
purple_xmlnode_free(contacts);
+ } else if (g_str_equal(messagetype, "RichText/Media_FlikMsg")) {
+
+
+ PurpleXmlNode *blob = purple_xmlnode_from_str(content, -1);
+
+ const gchar *url_thumbnail = purple_xmlnode_get_attrib(blob, "url_thumbnail");
+ gchar *text = purple_markup_strip_html(content); //purple_xmlnode_get_data_unescaped doesn't work properly in this situation
+
+ PurpleIMConversation *imconv;
+
+ if (skypeweb_is_user_self(sa, from)) {
+ from = convbuddyname;
+ }
+ if (from != NULL) {
+ imconv = purple_conversations_find_im_with_account(from, sa->account);
+ if (imconv == NULL) {
+ imconv = purple_im_conversation_new(sa->account, from);
+ }
+
+ conv = PURPLE_CONVERSATION(imconv);
+
+ skypeweb_download_moji_to_conv(sa, text, url_thumbnail, conv);
+
+ const gchar *message = _("The user sent a Moji");
+
+ purple_serv_got_im(sa->pc, from, message, PURPLE_MESSAGE_NO_LOG, composetimestamp);
+
+ g_free(text);
+ }
+
+ purple_xmlnode_free(blob);
} else if (g_str_equal(messagetype, "RichText/Files")) {
purple_serv_got_im(sa->pc, convbuddyname, _("The user sent files in an unsupported way"), PURPLE_MESSAGE_RECV | PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_ERROR, composetimestamp);
} else {
@@ -635,10 +666,16 @@ skypeweb_poll_cb(SkypeWebAccount *sa, JsonNode *node, gpointer user_data)
gint index, length;
JsonObject *obj = NULL;
+
+ if (((int)time(NULL)) > sa->vdms_expiry) {
+ skypeweb_get_vdms_token(sa);
+ }
+
if (node == NULL && ((int)time(NULL)) > sa->registration_expiry) {
skypeweb_get_registration_token(sa);
return;
- }
+ }
+
if (node != NULL && json_node_get_node_type(node) == JSON_NODE_OBJECT)
obj = json_node_get_object(node);
@@ -1104,6 +1141,28 @@ skypeweb_got_registration_token(PurpleUtilFetchUrlData *url_data, gpointer user_
skypeweb_subscribe(sa);
}
+static void
+skypeweb_got_vdms_token(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message)
+{
+ const gchar *token;
+
+ SkypeWebAccount *sa = user_data;
+
+ JsonParser *parser = json_parser_new();
+
+ if (json_parser_load_from_data(parser, url_text, -1, NULL)) {
+ JsonNode *root = json_parser_get_root(parser);
+ JsonObject *obj = json_node_get_object(root);
+
+ token = json_object_get_string_member(obj, "token");
+ sa->vdms_token = g_strdup(token);
+ sa->vdms_expiry = (int)time(NULL) + SKYPEWEB_VDMS_TTL;
+ }
+
+ g_object_unref(parser);
+
+}
+
void
skypeweb_get_registration_token(SkypeWebAccount *sa)
{
@@ -1145,7 +1204,27 @@ skypeweb_get_registration_token(SkypeWebAccount *sa)
g_free(messages_url);
}
+void
+skypeweb_get_vdms_token(SkypeWebAccount *sa)
+{
+ gchar *request;
+ const gchar *messages_url = "https://" SKYPEWEB_STATIC_HOST "/pes/v1/petoken";
+
+ request = g_strdup_printf("GET /pes/v1/petoken HTTP/1.0\r\n"
+ "Connection: close\r\n"
+ "Accept: */*\r\n"
+ "Host: %s\r\n"
+ "Origin: https://web.skype.com\r\n"
+ "Authorization: skype_token %s\r\n"
+ "Content-Type: application/x-www-form-urlencoded\r\n"
+ "Content-Length: 2\r\n\r\n{}",
+ SKYPEWEB_STATIC_HOST, sa->skype_token);
+
+ skypeweb_fetch_url_request(sa, messages_url, TRUE, NULL, FALSE, request, FALSE, 524288, skypeweb_got_vdms_token, sa);
+
+ g_free(request);
+}
guint
diff --git a/skypeweb/skypeweb_messages.h b/skypeweb/skypeweb_messages.h
index 95fda7c..c4722d7 100644
--- a/skypeweb/skypeweb_messages.h
+++ b/skypeweb/skypeweb_messages.h
@@ -29,6 +29,7 @@ guint skypeweb_conv_send_typing(PurpleConversation *conv, PurpleIMTypingState st
guint skypeweb_send_typing(PurpleConnection *pc, const gchar *name, PurpleIMTypingState state);
void skypeweb_poll(SkypeWebAccount *sa);
void skypeweb_get_registration_token(SkypeWebAccount *sa);
+void skypeweb_get_vdms_token(SkypeWebAccount *sa);
void skypeweb_chat_kick(PurpleConnection *pc, int id, const char *who);
void skypeweb_chat_invite(PurpleConnection *pc, int id, const char *message, const char *who);
void skypeweb_initiate_chat(SkypeWebAccount *sa, const gchar *who);