Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}