void hangouts_oauth_with_code(HangoutsAccount *ha, const gchar *auth_code) { PurpleHttpRequest *request; PurpleConnection *pc; GString *postdata; pc = ha->pc; postdata = g_string_new(NULL); g_string_append_printf(postdata, "client_id=%s&", purple_url_encode(GOOGLE_CLIENT_ID)); g_string_append_printf(postdata, "client_secret=%s&", purple_url_encode(GOOGLE_CLIENT_SECRET)); g_string_append_printf(postdata, "code=%s&", purple_url_encode(auth_code)); g_string_append_printf(postdata, "redirect_uri=%s&", purple_url_encode(HANGOUTS_API_OAUTH2_REDIRECT_URI)); g_string_append(postdata, "grant_type=authorization_code&"); request = purple_http_request_new(HANGOUTS_API_OAUTH2_TOKEN_URL); purple_http_request_set_cookie_jar(request, ha->cookie_jar); purple_http_request_set_method(request, "POST"); purple_http_request_header_set(request, "Content-Type", "application/x-www-form-urlencoded"); purple_http_request_set_contents(request, postdata->str, postdata->len); purple_http_request(pc, request, hangouts_oauth_with_code_cb, ha); purple_http_request_unref(request); g_string_free(postdata, TRUE); }
static void hangouts_auth_get_session_cookies_uberauth_cb(PurpleHttpConnection *http_conn, PurpleHttpResponse *response, gpointer user_data) { HangoutsAccount *ha = user_data; PurpleHttpRequest *request; const gchar *uberauth; uberauth = purple_http_response_get_data(response, NULL); if (purple_http_response_get_error(response) != NULL) { purple_connection_error(ha->pc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Auth error")); return; } purple_debug_misc("hangouts-prpl", "uberauth: %s", uberauth); request = purple_http_request_new(NULL); purple_http_request_set_url_printf(request, "https://accounts.google.com/MergeSession" "?service=mail&continue=http://www.google.com&uberauth=%s", purple_url_encode(uberauth)); purple_http_request_set_cookie_jar(request, ha->cookie_jar); purple_http_request_header_set_printf(request, "Authorization", "Bearer %s", ha->access_token); purple_http_request_set_max_redirects(request, 0); purple_http_request(ha->pc, request, hangouts_auth_get_session_cookies_got_cb, ha); purple_http_request_unref(request); }
static void ggp_edisc_xfer_recv_ack(PurpleXfer *xfer, gboolean accept) { ggp_edisc_xfer *edisc_xfer = purple_xfer_get_protocol_data(xfer); ggp_edisc_session_data *sdata = ggp_edisc_get_sdata(edisc_xfer->gc); PurpleHttpRequest *req; g_return_if_fail(sdata != NULL); edisc_xfer->allowed = accept; req = purple_http_request_new(ggp_edisc_xfer_ticket_url( edisc_xfer->ticket_id)); purple_http_request_set_method(req, "PUT"); ggp_edisc_set_defaults(req); purple_http_request_set_cookie_jar(req, sdata->cookies); purple_http_request_header_set(req, "X-gged-security-token", sdata->security_token); purple_http_request_header_set(req, "X-gged-ack-status", accept ? "allow" : "reject"); edisc_xfer->hc = purple_http_request(edisc_xfer->gc, req, accept ? ggp_edisc_xfer_recv_ack_done : NULL, xfer); purple_http_request_unref(req); if (!accept) { edisc_xfer->hc = NULL; ggp_edisc_xfer_free(xfer); } }
void hangouts_oauth_refresh_token(HangoutsAccount *ha) { PurpleHttpRequest *request; PurpleConnection *pc; GString *postdata; pc = ha->pc; postdata = g_string_new(NULL); g_string_append_printf(postdata, "client_id=%s&", purple_url_encode(GOOGLE_CLIENT_ID)); g_string_append_printf(postdata, "client_secret=%s&", purple_url_encode(GOOGLE_CLIENT_SECRET)); g_string_append_printf(postdata, "refresh_token=%s&", purple_url_encode(ha->refresh_token)); g_string_append(postdata, "grant_type=refresh_token&"); request = purple_http_request_new(HANGOUTS_API_OAUTH2_TOKEN_URL); purple_http_request_set_cookie_jar(request, ha->cookie_jar); purple_http_request_set_method(request, "POST"); purple_http_request_header_set(request, "Content-Type", "application/x-www-form-urlencoded"); purple_http_request_set_contents(request, postdata->str, postdata->len); purple_http_request(pc, request, hangouts_oauth_refresh_token_cb, ha); purple_http_request_unref(request); purple_debug_info("hangouts", "Postdata: %s\n", postdata->str); g_string_free(postdata, TRUE); }
static void ggp_edisc_xfer_recv_ticket_update_authenticated( PurpleConnection *gc, gboolean success, gpointer _ticket) { ggp_edisc_session_data *sdata = ggp_edisc_get_sdata(gc); PurpleHttpRequest *req; gchar *ticket = _ticket; g_return_if_fail(sdata != NULL); if (!success) { purple_debug_warning("gg", "ggp_edisc_xfer_recv_ticket_update_authenticated: " "update of ticket %s aborted due to authentication " "failure\n", ticket); g_free(ticket); return; } req = purple_http_request_new(ggp_edisc_xfer_ticket_url(ticket)); g_free(ticket); ggp_edisc_set_defaults(req); purple_http_request_set_cookie_jar(req, sdata->cookies); purple_http_request_header_set(req, "X-gged-security-token", sdata->security_token); purple_http_request(gc, req, ggp_edisc_xfer_recv_ticket_update_got, NULL); purple_http_request_unref(req); }
static void ggp_ggdrive_auth(PurpleConnection *gc, ggp_ggdrive_auth_cb cb, gpointer user_data) { GGPInfo *accdata = purple_connection_get_protocol_data(gc); ggp_edisc_session_data *sdata = ggp_edisc_get_sdata(gc); ggp_edisc_auth_data *auth; const gchar *imtoken; gchar *metadata; PurpleHttpRequest *req; g_return_if_fail(sdata != NULL); imtoken = ggp_get_imtoken(gc); if (!imtoken) { cb(gc, FALSE, user_data); return; } if (sdata->auth_done) { cb(gc, sdata->security_token != NULL, user_data); return; } auth = g_new0(ggp_edisc_auth_data, 1); auth->cb = cb; auth->user_data = user_data; sdata->auth_pending = g_list_prepend(sdata->auth_pending, auth); if (sdata->auth_request) return; purple_debug_info("gg", "ggp_ggdrive_auth(gc=%p)\n", gc); req = purple_http_request_new("https://drive.mpa.gg.pl/signin"); purple_http_request_set_method(req, "PUT"); ggp_edisc_set_defaults(req); purple_http_request_set_cookie_jar(req, sdata->cookies); metadata = g_strdup_printf("{" "\"id\": \"%032x\", " "\"name\": \"%s\", " "\"os_version\": \"" GGP_EDISC_OS "\", " "\"client_version\": \"%s\", " "\"type\": \"" GGP_EDISC_TYPE "\"}", g_random_int_range(1, 1 << 16), purple_get_host_name(), ggp_libgaduw_version(gc)); purple_http_request_header_set_printf(req, "Authorization", "IMToken %s", imtoken); purple_http_request_header_set_printf(req, "X-gged-user", "gg/pl:%u", accdata->session->uin); purple_http_request_header_set(req, "X-gged-client-metadata", metadata); g_free(metadata); sdata->auth_request = purple_http_request(gc, req, ggp_ggdrive_auth_done, NULL); purple_http_request_unref(req); }
void hangouts_auth_get_session_cookies(HangoutsAccount *ha) { PurpleHttpRequest *request; request = purple_http_request_new("https://accounts.google.com/accounts/OAuthLogin" "?source=pidgin&issueuberauth=1"); purple_http_request_set_cookie_jar(request, ha->cookie_jar); purple_http_request_header_set_printf(request, "Authorization", "Bearer %s", ha->access_token); purple_http_request(ha->pc, request, hangouts_auth_get_session_cookies_uberauth_cb, ha); purple_http_request_unref(request); }
static void ggp_edisc_xfer_send_init_authenticated(PurpleConnection *gc, gboolean success, gpointer _xfer) { ggp_edisc_session_data *sdata = ggp_edisc_get_sdata(gc); PurpleHttpRequest *req; PurpleXfer *xfer = _xfer; ggp_edisc_xfer *edisc_xfer = purple_xfer_get_protocol_data(xfer); gchar *data; if (purple_xfer_is_cancelled(xfer)) return; if (!success) { ggp_edisc_xfer_error(xfer, _("Authentication failed")); return; } g_return_if_fail(sdata != NULL); req = purple_http_request_new("https://drive.mpa.gg.pl/send_ticket"); purple_http_request_set_method(req, "PUT"); ggp_edisc_set_defaults(req); purple_http_request_set_cookie_jar(req, sdata->cookies); purple_http_request_header_set(req, "X-gged-security-token", sdata->security_token); data = g_strdup_printf("{\"send_ticket\":{" "\"recipient\":\"%s\"," "\"file_name\":\"%s\"," "\"file_size\":\"%u\"" "}}", purple_xfer_get_remote_user(xfer), edisc_xfer->filename, (int)purple_xfer_get_size(xfer)); purple_http_request_set_contents(req, data, -1); g_free(data); edisc_xfer->hc = purple_http_request(gc, req, ggp_edisc_xfer_send_init_ticket_created, xfer); purple_http_request_unref(req); }
static void ggp_edisc_xfer_send_start(PurpleXfer *xfer) { ggp_edisc_session_data *sdata; ggp_edisc_xfer *edisc_xfer; gchar *upload_url, *filename_e; PurpleHttpRequest *req; g_return_if_fail(xfer != NULL); edisc_xfer = purple_xfer_get_protocol_data(xfer); g_return_if_fail(edisc_xfer != NULL); sdata = ggp_edisc_get_sdata(edisc_xfer->gc); g_return_if_fail(sdata != NULL); filename_e = purple_strreplace(edisc_xfer->filename, " ", "%20"); upload_url = g_strdup_printf("https://drive.mpa.gg.pl/me/file/outbox/" "%s%%2C%s", edisc_xfer->ticket_id, filename_e); g_free(filename_e); req = purple_http_request_new(upload_url); g_free(upload_url); purple_http_request_set_method(req, "PUT"); purple_http_request_set_timeout(req, -1); ggp_edisc_set_defaults(req); purple_http_request_set_cookie_jar(req, sdata->cookies); purple_http_request_header_set(req, "X-gged-local-revision", "0"); purple_http_request_header_set(req, "X-gged-security-token", sdata->security_token); purple_http_request_header_set(req, "X-gged-metadata", "{\"node_type\": \"file\"}"); purple_http_request_set_contents_reader(req, ggp_edisc_xfer_send_reader, purple_xfer_get_size(xfer), xfer); edisc_xfer->hc = purple_http_request(edisc_xfer->gc, req, ggp_edisc_xfer_send_done, xfer); purple_http_request_unref(req); purple_http_conn_set_progress_watcher(edisc_xfer->hc, ggp_edisc_xfer_progress_watcher, xfer, 250000); }
static void ggp_edisc_xfer_recv_start(PurpleXfer *xfer) { ggp_edisc_session_data *sdata; ggp_edisc_xfer *edisc_xfer; gchar *upload_url; PurpleHttpRequest *req; g_return_if_fail(xfer != NULL); edisc_xfer = purple_xfer_get_protocol_data(xfer); g_return_if_fail(edisc_xfer != NULL); sdata = ggp_edisc_get_sdata(edisc_xfer->gc); g_return_if_fail(sdata != NULL); upload_url = g_strdup_printf("https://drive.mpa.gg.pl/me/file/inbox/" "%s,%s?api_version=%s&security_token=%s", edisc_xfer->ticket_id, purple_url_encode(purple_xfer_get_filename(xfer)), GGP_EDISC_API, sdata->security_token); req = purple_http_request_new(upload_url); g_free(upload_url); purple_http_request_set_timeout(req, -1); ggp_edisc_set_defaults(req); purple_http_request_set_max_len(req, purple_xfer_get_size(xfer) + 1); purple_http_request_set_cookie_jar(req, sdata->cookies); purple_http_request_set_response_writer(req, ggp_edisc_xfer_recv_writer, xfer); edisc_xfer->hc = purple_http_request(edisc_xfer->gc, req, ggp_edisc_xfer_recv_done, xfer); purple_http_request_unref(req); purple_http_conn_set_progress_watcher(edisc_xfer->hc, ggp_edisc_xfer_progress_watcher, xfer, 250000); }