libpurple/protocols/gg/oauth/oauth-purple.c

changeset 40012
d76cbf47c896
parent 39913
ce96d4639dc7
child 40021
6b1b05adda03
--- a/libpurple/protocols/gg/oauth/oauth-purple.c	Fri Oct 11 20:23:42 2019 -0400
+++ b/libpurple/protocols/gg/oauth/oauth-purple.c	Fri Oct 11 21:47:21 2019 -0400
@@ -49,17 +49,6 @@
 	gchar *sign_method, *sign_url;
 } ggp_oauth_data;
 
-static void ggp_oauth_data_free(ggp_oauth_data *data);
-
-static void ggp_oauth_request_token_got(PurpleHttpConnection *http_conn,
-	PurpleHttpResponse *response, gpointer user_data);
-
-static void ggp_oauth_authorization_done(PurpleHttpConnection *http_conn,
-	PurpleHttpResponse *response, gpointer user_data);
-
-static void ggp_oauth_access_token_got(PurpleHttpConnection *http_conn,
-	PurpleHttpResponse *response, gpointer user_data);
-
 static void ggp_oauth_data_free(ggp_oauth_data *data)
 {
 	g_free(data->token);
@@ -69,34 +58,97 @@
 	g_free(data);
 }
 
-void ggp_oauth_request(PurpleConnection *gc, ggp_oauth_request_cb callback,
-	gpointer user_data, const gchar *sign_method, const gchar *sign_url)
+static void
+ggp_oauth_access_token_got(PurpleHttpConnection *http_conn,
+                           PurpleHttpResponse *response, gpointer user_data)
 {
-	PurpleAccount *account = purple_connection_get_account(gc);
+	ggp_oauth_data *data = user_data;
+	gchar *token, *token_secret;
+	PurpleXmlNode *xml;
+	const gchar *xml_raw;
+	gboolean succ = TRUE;
+
+	xml_raw = purple_http_response_get_data(response, NULL);
+	xml = purple_xmlnode_from_str(xml_raw, -1);
+	if (xml == NULL) {
+		purple_debug_error("gg", "ggp_oauth_access_token_got: invalid xml");
+		ggp_oauth_data_free(data);
+		return;
+	}
+
+	succ &= ggp_xml_get_string(xml, "oauth_token", &token);
+	succ &= ggp_xml_get_string(xml, "oauth_token_secret", &token_secret);
+	purple_xmlnode_free(xml);
+	if (!succ || strlen(token) < 10) {
+		purple_debug_error("gg", "ggp_oauth_access_token_got: invalid xml - "
+		                         "token is not present");
+		ggp_oauth_data_free(data);
+		return;
+	}
+
+	if (data->sign_url) {
+		PurpleAccount *account;
+		gchar *auth;
+
+		purple_debug_misc("gg", "ggp_oauth_access_token_got: got access token, "
+		                        "returning signed url");
+
+		account = purple_connection_get_account(data->gc);
+		auth = gg_oauth_generate_header(
+		        data->sign_method, data->sign_url,
+		        purple_account_get_username(account),
+		        purple_connection_get_password(data->gc), token, token_secret);
+		data->callback(data->gc, auth, data->user_data);
+	} else {
+		purple_debug_misc(
+		        "gg",
+		        "ggp_oauth_access_token_got: got access token, returning it");
+		data->callback(data->gc, token, data->user_data);
+	}
+
+	g_free(token);
+	g_free(token_secret);
+	ggp_oauth_data_free(data);
+}
+
+static void
+ggp_oauth_authorization_done(PurpleHttpConnection *http_conn,
+                             PurpleHttpResponse *response, gpointer user_data)
+{
+	ggp_oauth_data *data = user_data;
+	PurpleAccount *account;
 	PurpleHttpRequest *req;
 	char *auth;
 	const char *method = "POST";
-	const char *url = "http://api.gadu-gadu.pl/request_token";
-	ggp_oauth_data *data;
+	const char *url = "http://api.gadu-gadu.pl/access_token";
+	int response_code;
+
+	PURPLE_ASSERT_CONNECTION_IS_VALID(data->gc);
+
+	account = purple_connection_get_account(data->gc);
 
-	purple_debug_misc("gg", "ggp_oauth_request: requesting token...\n");
+	response_code = purple_http_response_get_code(response);
+	if (response_code != 302) {
+		purple_debug_error("gg",
+		                   "ggp_oauth_authorization_done: failed (code = %d)",
+		                   response_code);
+		ggp_oauth_data_free(data);
+		return;
+	}
+
+	purple_debug_misc("gg", "ggp_oauth_authorization_done: authorization done, "
+	                        "requesting access token...");
 
 	auth = gg_oauth_generate_header(method, url,
-		purple_account_get_username(account),
-		purple_connection_get_password(gc), NULL, NULL);
-
-	data = g_new0(ggp_oauth_data, 1);
-	data->gc = gc;
-	data->callback = callback;
-	data->user_data = user_data;
-	data->sign_method = g_strdup(sign_method);
-	data->sign_url = g_strdup(sign_url);
+	                                purple_account_get_username(account),
+	                                purple_connection_get_password(data->gc),
+	                                data->token, data->token_secret);
 
 	req = purple_http_request_new(url);
 	purple_http_request_set_max_len(req, GGP_OAUTH_RESPONSE_MAX);
 	purple_http_request_set_method(req, method);
 	purple_http_request_header_set(req, "Authorization", auth);
-	purple_http_request(gc, req, ggp_oauth_request_token_got, data);
+	purple_http_request(data->gc, req, ggp_oauth_access_token_got, data);
 	purple_http_request_unref(req);
 
 	free(auth);
@@ -166,97 +218,37 @@
 	g_free(request_data);
 }
 
-static void ggp_oauth_authorization_done(PurpleHttpConnection *http_conn,
-	PurpleHttpResponse *response, gpointer user_data)
+void
+ggp_oauth_request(PurpleConnection *gc, ggp_oauth_request_cb callback,
+                  gpointer user_data, const gchar *sign_method,
+                  const gchar *sign_url)
 {
-	ggp_oauth_data *data = user_data;
-	PurpleAccount *account;
+	PurpleAccount *account = purple_connection_get_account(gc);
 	PurpleHttpRequest *req;
 	char *auth;
 	const char *method = "POST";
-	const char *url = "http://api.gadu-gadu.pl/access_token";
-	int response_code;
+	const char *url = "http://api.gadu-gadu.pl/request_token";
+	ggp_oauth_data *data;
 
-	PURPLE_ASSERT_CONNECTION_IS_VALID(data->gc);
-
-	account = purple_connection_get_account(data->gc);
+	purple_debug_misc("gg", "ggp_oauth_request: requesting token...\n");
 
-	response_code = purple_http_response_get_code(response);
-	if (response_code != 302) {
-		purple_debug_error("gg", "ggp_oauth_authorization_done: "
-			"failed (code = %d)", response_code);
-		ggp_oauth_data_free(data);
-		return;
-	}
+	auth = gg_oauth_generate_header(
+	        method, url, purple_account_get_username(account),
+	        purple_connection_get_password(gc), NULL, NULL);
 
-	purple_debug_misc("gg", "ggp_oauth_authorization_done: "
-		"authorization done, requesting access token...\n");
-
-	auth = gg_oauth_generate_header(method, url,
-		purple_account_get_username(account),
-		purple_connection_get_password(data->gc),
-		data->token, data->token_secret);
+	data = g_new0(ggp_oauth_data, 1);
+	data->gc = gc;
+	data->callback = callback;
+	data->user_data = user_data;
+	data->sign_method = g_strdup(sign_method);
+	data->sign_url = g_strdup(sign_url);
 
 	req = purple_http_request_new(url);
 	purple_http_request_set_max_len(req, GGP_OAUTH_RESPONSE_MAX);
 	purple_http_request_set_method(req, method);
 	purple_http_request_header_set(req, "Authorization", auth);
-	purple_http_request(data->gc, req, ggp_oauth_access_token_got, data);
+	purple_http_request(gc, req, ggp_oauth_request_token_got, data);
 	purple_http_request_unref(req);
 
 	free(auth);
 }
-
-static void ggp_oauth_access_token_got(PurpleHttpConnection *http_conn,
-	PurpleHttpResponse *response, gpointer user_data)
-{
-	ggp_oauth_data *data = user_data;
-	gchar *token, *token_secret;
-	PurpleXmlNode *xml;
-	const gchar *xml_raw;
-	gboolean succ = TRUE;
-
-	xml_raw = purple_http_response_get_data(response, NULL);
-	xml = purple_xmlnode_from_str(xml_raw, -1);
-	if (xml == NULL) {
-		purple_debug_error("gg", "ggp_oauth_access_token_got: "
-			"invalid xml\n");
-		ggp_oauth_data_free(data);
-		return;
-	}
-
-	succ &= ggp_xml_get_string(xml, "oauth_token", &token);
-	succ &= ggp_xml_get_string(xml, "oauth_token_secret",
-		&token_secret);
-	purple_xmlnode_free(xml);
-	if (!succ || strlen(token) < 10) {
-		purple_debug_error("gg", "ggp_oauth_access_token_got: "
-			"invalid xml - token is not present\n");
-		ggp_oauth_data_free(data);
-		return;
-	}
-
-	if (data->sign_url) {
-		PurpleAccount *account;
-		gchar *auth;
-
-		purple_debug_misc("gg", "ggp_oauth_access_token_got: "
-			"got access token, returning signed url\n");
-
-		account = purple_connection_get_account(data->gc);
-		auth = gg_oauth_generate_header(
-			data->sign_method, data->sign_url,
-			purple_account_get_username(account),
-			purple_connection_get_password(data->gc),
-			token, token_secret);
-		data->callback(data->gc, auth, data->user_data);
-	} else {
-		purple_debug_misc("gg", "ggp_oauth_access_token_got: "
-			"got access token, returning it\n");
-		data->callback(data->gc, token, data->user_data);
-	}
-
-	g_free(token);
-	g_free(token_secret);
-	ggp_oauth_data_free(data);
-}

mercurial