Пример #1
0
/**
 * This function sends a request to
 * https://api.screenname.aol.com/auth/clientLogin with the user's
 * username and password and receives the user's session key, which is
 * used to request a connection to the BOSS server.
 */
void send_client_login(OscarData *od, const char *username)
{
    PurpleConnection *gc;
    GString *request, *body;
    const char *tmp;
    char *password;
    int password_len;

    gc = od->gc;

    /*
     * We truncate ICQ passwords to 8 characters.  There is probably a
     * limit for AIM passwords, too, but we really only need to do
     * this for ICQ because older ICQ clients let you enter a password
     * as long as you wanted and then they truncated it silently.
     *
     * And we can truncate based on the number of bytes and not the
     * number of characters because passwords for AIM and ICQ are
     * supposed to be plain ASCII (I don't know if this has always been
     * the case, though).
     */
    tmp = purple_connection_get_password(gc);
    password_len = strlen(tmp);
    password = g_strndup(tmp, od->icq ? MIN(password_len, MAXICQPASSLEN) : password_len);

    /* Construct the body of the HTTP POST request */
    body = g_string_new("");
    g_string_append_printf(body, "devId=%s", get_client_key(od));
    g_string_append_printf(body, "&f=xml");
    g_string_append_printf(body, "&pwd=%s", purple_url_encode(password));
    g_string_append_printf(body, "&s=%s", purple_url_encode(username));
    g_free(password);

    /* Construct an HTTP POST request */
    request = g_string_new("POST /auth/clientLogin HTTP/1.0\r\n"
                           "Connection: close\r\n"
                           "Accept: */*\r\n");

    /* Tack on the body */
    g_string_append_printf(request, "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n");
    g_string_append_printf(request, "Content-Length: %" G_GSIZE_FORMAT "\r\n\r\n", body->len);
    g_string_append_len(request, body->str, body->len);
    g_string_free(body, TRUE);

    /* Send the POST request  */
    od->url_data = purple_util_fetch_url_request_len_with_account(
                       purple_connection_get_account(gc), URL_CLIENT_LOGIN,
                       TRUE, NULL, FALSE, request->str, FALSE, -1,
                       client_login_cb, od);
    g_string_free(request, TRUE);
}
Пример #2
0
static void send_start_oscar_session(OscarData *od, const char *token, const char *session_key, time_t hosttime)
{
    char *query_string, *signature, *url;
    PurpleAccount *account;
    gboolean use_tls;

    account = purple_connection_get_account(od->gc);
    use_tls = purple_account_get_bool(account, "use_ssl", OSCAR_DEFAULT_USE_SSL);

    /*
     * Construct the GET parameters.  0x00000611 is the distid given to
     * us by AOL for use as the default libpurple distid.
     */
    query_string = g_strdup_printf("a=%s"
                                   "&distId=%d"
                                   "&f=xml"
                                   "&k=%s"
                                   "&ts=%" PURPLE_TIME_T_MODIFIER
                                   "&useTLS=%d",
                                   purple_url_encode(token),
                                   oscar_get_ui_info_int(od->icq ? "prpl-icq-distid"
                                           : "prpl-aim-distid", 0x00000611),
                                   get_client_key(od), hosttime, use_tls);
    signature = generate_signature("GET", URL_START_OSCAR_SESSION,
                                   query_string, session_key);
    url = g_strdup_printf(URL_START_OSCAR_SESSION "?%s&sig_sha256=%s",
                          query_string, signature);
    g_free(query_string);
    g_free(signature);

    /* Make the request */
    od->url_data = purple_util_fetch_url_request_len_with_account(account,
                   url, TRUE, NULL, FALSE, NULL, FALSE, -1,
                   start_oscar_session_cb, od);
    g_free(url);
}
Пример #3
0
static void send_start_oscar_session(OscarData *od, const char *token, const char *session_key, time_t hosttime)
{
	char *query_string, *signature, *url;
	gboolean use_tls = purple_account_get_bool(purple_connection_get_account(od->gc), "use_ssl", OSCAR_DEFAULT_USE_SSL);

	/* Construct the GET parameters */
	query_string = g_strdup_printf("a=%s"
			"&f=xml"
			"&k=%s"
			"&ts=%" PURPLE_TIME_T_MODIFIER
			"&useTLS=%d",
			purple_url_encode(token), get_client_key(od), hosttime, use_tls);
	signature = generate_signature("GET", URL_START_OSCAR_SESSION,
			query_string, session_key);
	url = g_strdup_printf(URL_START_OSCAR_SESSION "?%s&sig_sha256=%s",
			query_string, signature);
	g_free(query_string);
	g_free(signature);

	/* Make the request */
	od->url_data = purple_util_fetch_url(url, TRUE, NULL, FALSE,
			start_oscar_session_cb, od);
	g_free(url);
}