pidgin/pidgin

Merged in default (pull request #600)

2019-10-13, Gary Kramlich
75d0b54c40f2
Merged in default (pull request #600)

Convert upnp to libsoup and fix a bug

Approved-by: Gary Kramlich
--- a/libpurple/network.c Sun Oct 13 00:16:37 2019 +0000
+++ b/libpurple/network.c Sun Oct 13 00:54:24 2019 +0000
@@ -779,4 +779,6 @@
/* TODO: clean up remaining port mappings, note calling
purple_upnp_remove_port_mapping from here doesn't quite work... */
+
+ purple_upnp_uninit();
}
--- a/libpurple/upnp.c Sun Oct 13 00:16:37 2019 +0000
+++ b/libpurple/upnp.c Sun Oct 13 00:54:24 2019 +0000
@@ -19,6 +19,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*/
#include <gio/gio.h>
+#include <libsoup/soup.h>
#include "internal.h"
@@ -135,13 +136,14 @@
gpointer cb_data;
gboolean success;
guint tima; /* g_timeout_add handle */
- PurpleHttpConnection *hc;
+ SoupMessage *msg;
};
static PurpleUPnPControlInfo control_info = {
PURPLE_UPNP_STATUS_UNDISCOVERED,
NULL, "\0", "\0", "\0", 0};
+static SoupSession *session = NULL;
static GSList *discovery_callbacks = NULL;
static void purple_upnp_discover_send_broadcast(UPnPDiscoveryData *dd);
@@ -364,19 +366,16 @@
}
static void
-upnp_parse_description_cb(PurpleHttpConnection *http_conn,
- PurpleHttpResponse *response, gpointer _dd)
+upnp_parse_description_cb(G_GNUC_UNUSED SoupSession *session, SoupMessage *msg,
+ gpointer _dd)
{
UPnPDiscoveryData *dd = _dd;
gchar *control_url = NULL;
- if (response && purple_http_response_is_successful(response)) {
- const gchar *got_data;
- size_t got_len;
-
- got_data = purple_http_response_get_data(response, &got_len);
+ if (msg && SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) {
control_url = purple_upnp_parse_description_response(
- got_data, got_len, dd->full_url, dd->service_type);
+ msg->response_body->data, msg->response_body->length,
+ dd->full_url, dd->service_type);
}
g_free(dd->full_url);
@@ -412,8 +411,8 @@
static void
purple_upnp_parse_description(const gchar* descriptionURL, UPnPDiscoveryData *dd)
{
- PurpleHttpRequest *req;
- PurpleHttpURL *url;
+ SoupMessage *msg;
+ SoupURI *uri;
/* Remove the timeout because everything it is waiting for has
* successfully completed */
@@ -423,20 +422,17 @@
/* Extract base url out of the descriptionURL.
* Example description URL: http://192.168.1.1:5678/rootDesc.xml
*/
- url = purple_http_url_parse(descriptionURL);
- if (!url) {
+ uri = soup_uri_new(descriptionURL);
+ if (!uri) {
upnp_parse_description_cb(NULL, NULL, dd);
return;
}
- dd->full_url = g_strdup_printf("http://%s:%d",
- purple_http_url_get_host(url),
- purple_http_url_get_port(url));
- purple_http_url_free(url);
+ dd->full_url = g_strdup_printf("http://%s:%d", uri->host, uri->port);
+ soup_uri_free(uri);
- req = purple_http_request_new(descriptionURL);
- purple_http_request_set_max_len(req, MAX_UPNP_DOWNLOAD);
- purple_http_request(NULL, req, upnp_parse_description_cb, dd);
- purple_http_request_unref(req);
+ msg = soup_message_new("GET", descriptionURL);
+ // purple_http_request_set_max_len(msg, MAX_UPNP_DOWNLOAD);
+ soup_session_queue_message(session, msg, upnp_parse_description_cb, dd);
}
static void
@@ -660,34 +656,31 @@
purple_upnp_discover_send_broadcast(dd);
}
-static PurpleHttpConnection*
-purple_upnp_generate_action_message_and_send(const gchar* actionName,
- const gchar* actionParams, PurpleHttpCallback cb,
- gpointer cb_data)
+static SoupMessage *
+purple_upnp_generate_action_message_and_send(const gchar *actionName,
+ const gchar *actionParams,
+ SoupSessionCallback cb,
+ gpointer cb_data)
{
- PurpleHttpConnection *hc;
- PurpleHttpRequest *req;
+ SoupMessage *msg;
+ gchar *action;
gchar* soapMessage;
/* set the soap message */
soapMessage = g_strdup_printf(SOAP_ACTION, actionName,
control_info.service_type, actionParams, actionName);
- req = purple_http_request_new(control_info.control_url);
- purple_http_request_set_max_len(req, MAX_UPNP_DOWNLOAD);
- purple_http_request_set_method(req, "POST");
- purple_http_request_header_set_printf(req, "SOAPAction",
- "\"urn:schemas-upnp-org:service:%s#%s\"",
- control_info.service_type, actionName);
- purple_http_request_header_set(req, "Content-Type",
- "text/xml; charset=utf-8");
- purple_http_request_set_contents(req, soapMessage, -1);
- hc = purple_http_request(NULL, req, cb, cb_data);
- purple_http_request_unref(req);
+ msg = soup_message_new("POST", control_info.control_url);
+ // purple_http_request_set_max_len(msg, MAX_UPNP_DOWNLOAD);
+ action = g_strdup_printf("\"urn:schemas-upnp-org:service:%s#%s\"",
+ control_info.service_type, actionName);
+ soup_message_headers_replace(msg->request_headers, "SOAPAction", action);
+ g_free(action);
+ soup_message_set_request(msg, "text/xml; charset=utf-8", SOUP_MEMORY_TAKE,
+ soapMessage, strlen(soapMessage));
+ soup_session_queue_message(session, msg, cb, cb_data);
- g_free(soapMessage);
-
- return hc;
+ return msg;
}
const gchar *
@@ -707,18 +700,20 @@
}
static void
-looked_up_public_ip_cb(PurpleHttpConnection *http_conn,
- PurpleHttpResponse *response, gpointer user_data)
+looked_up_public_ip_cb(G_GNUC_UNUSED SoupSession *session, SoupMessage *msg,
+ gpointer user_data)
{
gchar* temp, *temp2;
const gchar *got_data;
size_t got_len;
- if (!purple_http_response_is_successful(response))
+ if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) {
return;
+ }
/* extract the ip, or see if there is an error */
- got_data = purple_http_response_get_data(response, &got_len);
+ got_data = msg->response_body->data;
+ got_len = msg->response_body->length;
if((temp = g_strstr_len(got_data, got_len,
"<NewExternalIPAddress")) == NULL) {
purple_debug_error("upnp",
@@ -785,45 +780,43 @@
static void
lookup_internal_ip()
{
- PurpleHttpURL *url;
+ SoupURI *uri;
- url = purple_http_url_parse(control_info.control_url);
- if (!url) {
+ uri = soup_uri_new(control_info.control_url);
+ if (!uri) {
purple_debug_error("upnp",
"lookup_internal_ip(): Failed In Parse URL\n");
return;
}
- if(purple_proxy_connect(NULL, NULL, purple_http_url_get_host(url),
- purple_http_url_get_port(url), looked_up_internal_ip_cb,
- NULL) == NULL)
- {
- purple_debug_error("upnp", "Get Local IP Connect Failed: "
- "Address: %s @@@ Port %d\n",
- purple_http_url_get_host(url),
- purple_http_url_get_port(url));
+ if (purple_proxy_connect(NULL, NULL, uri->host, uri->port,
+ looked_up_internal_ip_cb, NULL) == NULL) {
+ purple_debug_error(
+ "upnp", "Get Local IP Connect Failed: Address: %s @@@ Port %d",
+ uri->host, uri->port);
}
- purple_http_url_free(url);
+ soup_uri_free(uri);
}
static void
-done_port_mapping_cb(PurpleHttpConnection *http_conn,
- PurpleHttpResponse *response, gpointer user_data)
+done_port_mapping_cb(G_GNUC_UNUSED SoupSession *session, SoupMessage *msg,
+ gpointer user_data)
{
PurpleUPnPMappingAddRemove *ar = user_data;
gboolean success = TRUE;
/* determine if port mapping was a success */
- if (!purple_http_response_is_successful(response))
- {
+ if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) {
purple_debug_error("upnp",
- "purple_upnp_set_port_mapping(): Failed HTTP_OK\n%s\n",
- purple_http_response_get_error(response));
+ "purple_upnp_set_port_mapping(): Failed HTTP_OK: %s",
+ msg->reason_phrase);
success = FALSE;
- } else
- purple_debug_info("upnp", "Successfully completed port mapping operation\n");
+ } else {
+ purple_debug_info("upnp",
+ "Successfully completed port mapping operation");
+ }
ar->success = success;
ar->tima = g_timeout_add(0, fire_ar_cb_async_and_free, ar);
@@ -860,8 +853,8 @@
ar->portmap, ar->protocol);
}
- ar->hc = purple_upnp_generate_action_message_and_send(
- action_name, action_params, done_port_mapping_cb, ar);
+ ar->msg = purple_upnp_generate_action_message_and_send(
+ action_name, action_params, done_port_mapping_cb, ar);
g_free(action_params);
return;
@@ -905,7 +898,7 @@
if (ar->tima > 0)
g_source_remove(ar->tima);
- purple_http_conn_cancel(ar->hc);
+ soup_session_cancel_message(session, ar->msg, SOUP_STATUS_CANCELLED);
g_free(ar);
}
@@ -1018,8 +1011,17 @@
void
purple_upnp_init()
{
+ session = soup_session_new();
+
g_signal_connect(g_network_monitor_get_default(),
"network-changed",
G_CALLBACK(purple_upnp_network_config_changed_cb),
NULL);
}
+
+void
+purple_upnp_uninit(void)
+{
+ soup_session_abort(session);
+ g_clear_object(&session);
+}
--- a/libpurple/upnp.h Sun Oct 13 00:16:37 2019 +0000
+++ b/libpurple/upnp.h Sun Oct 13 00:54:24 2019 +0000
@@ -48,6 +48,12 @@
*/
void purple_upnp_init(void);
+/**
+ * purple_upnp_uninit:
+ *
+ * Shuts down UPnP
+ */
+void purple_upnp_uninit(void);
/**
* purple_upnp_discover:
--- a/pidgin/plugins/imgupload.c Sun Oct 13 00:16:37 2019 +0000
+++ b/pidgin/plugins/imgupload.c Sun Oct 13 00:54:24 2019 +0000
@@ -126,7 +126,7 @@
g_free(img_data_e);
soup_message_set_request(msg, "application/x-www-form-urlencoded",
- SOUP_MESSAGE_TAKE, req_data, -1);
+ SOUP_MESSAGE_TAKE, req_data, strlen(req_data));
g_object_set_data_full(G_OBJECT(msg), "imgupload-imgur-name",
g_strdup(purple_image_get_friendly_filename(image)),