static void skypeweb_login_did_auth(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message) { gchar *refresh_token; SkypeWebAccount *sa = user_data; if (url_text == NULL) { url_text = url_data->webdata; len = url_data->data_len; } refresh_token = skypeweb_string_get_chunk(url_text, len, "=\"skypetoken\" value=\"", "\""); if (refresh_token == NULL) { if (g_strstr_len(url_text, len, "recaptcha_response_field")) { purple_connection_error(sa->pc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Captcha required.\nTry logging into web.skype.com and try again.")); return; } else { purple_debug_info("skypeweb", "login response was %s\r\n", url_text); purple_connection_error(sa->pc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Failed getting Skype Token")); return; } } sa->skype_token = refresh_token; skypeweb_update_cookies(sa, url_text); skypeweb_do_all_the_things(sa); }
static void skypeweb_connection_process_data(SkypeWebConnection *skypewebcon) { gssize len; gchar *tmp; len = skypewebcon->rx_len; tmp = g_strstr_len(skypewebcon->rx_buf, len, "\r\n\r\n"); if (tmp == NULL) { /* This is a corner case that occurs when the connection is * prematurely closed either on the client or the server. * This can either be no data at all or a partial set of * headers. We pass along the data to be good, but don't * do any fancy massaging. In all likelihood the result will * be tossed by the connection callback func anyways */ tmp = g_strndup(skypewebcon->rx_buf, len); } else { tmp += 4; len -= g_strstr_len(skypewebcon->rx_buf, len, "\r\n\r\n") - skypewebcon->rx_buf + 4; tmp = g_memdup(tmp, len + 1); tmp[len] = '\0'; skypewebcon->rx_buf[skypewebcon->rx_len - len] = '\0'; skypeweb_update_cookies(skypewebcon->sa, skypewebcon->rx_buf); if (strstr(skypewebcon->rx_buf, "Content-Encoding: gzip")) { /* we've received compressed gzip data, decompress */ gchar *gunzipped; gunzipped = skypeweb_gunzip((const guchar *)tmp, &len); g_free(tmp); tmp = gunzipped; } } g_free(skypewebcon->rx_buf); skypewebcon->rx_buf = NULL; if (skypewebcon->callback != NULL) { if (!len) { purple_debug_info("skypeweb", "No data in response\n"); skypewebcon->callback(skypewebcon->sa, NULL, skypewebcon->user_data); } else { JsonParser *parser = json_parser_new(); if (!json_parser_load_from_data(parser, tmp, len, NULL)) { if (skypewebcon->error_callback != NULL) { skypewebcon->error_callback(skypewebcon->sa, tmp, len, skypewebcon->user_data); } else { purple_debug_error("skypeweb", "Error parsing response: %s\n", tmp); } } else { JsonNode *root = json_parser_get_root(parser); //TODO purple_debug_info("skypeweb", "Got response: %s\n", tmp); purple_debug_info("skypeweb", "executing callback for %s\n", skypewebcon->url); skypewebcon->callback(skypewebcon->sa, root, skypewebcon->user_data); } g_object_unref(parser); } } g_free(tmp); }