Andrew Geissler | eff2747 | 2021-10-29 15:35:00 -0500 | [diff] [blame] | 1 | From d39fd6d5f4c0a63cc048b84b0f989cb83f31e5fe Mon Sep 17 00:00:00 2001 |
| 2 | From: Carlos Garcia Campos <cgarcia@igalia.com> |
| 3 | Date: Tue, 8 Jun 2021 10:57:06 +0200 |
| 4 | Subject: [PATCH 1/2] Use GUri instead of SoupURI |
| 5 | |
| 6 | Upstream-Status: Submitted [https://gitlab.gnome.org/GNOME/librest/-/merge_requests/6] |
| 7 | --- |
| 8 | configure.ac | 2 +- |
| 9 | rest-extras/flickr-proxy.c | 19 ++++++++++++++----- |
| 10 | rest/oauth-proxy-call.c | 19 ++++++++++++++----- |
| 11 | rest/oauth2-proxy.c | 22 +++++++++++----------- |
| 12 | 4 files changed, 40 insertions(+), 22 deletions(-) |
| 13 | |
| 14 | diff --git a/configure.ac b/configure.ac |
| 15 | index d15e592..d586e69 100644 |
| 16 | --- a/configure.ac |
| 17 | +++ b/configure.ac |
| 18 | @@ -40,7 +40,7 @@ AM_PROG_CC_C_O |
| 19 | LT_PREREQ([2.2.6]) |
| 20 | LT_INIT([disable-static]) |
| 21 | |
| 22 | -PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.44) |
| 23 | +PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.67.4) |
| 24 | PKG_CHECK_MODULES(SOUP, libsoup-2.4 >= 2.42) |
| 25 | PKG_CHECK_MODULES(XML, libxml-2.0) |
| 26 | PKG_CHECK_MODULES(GTHREAD, gthread-2.0) |
| 27 | diff --git a/rest-extras/flickr-proxy.c b/rest-extras/flickr-proxy.c |
| 28 | index 3342a4d..7726359 100644 |
| 29 | --- a/rest-extras/flickr-proxy.c |
| 30 | +++ b/rest-extras/flickr-proxy.c |
| 31 | @@ -304,13 +304,13 @@ flickr_proxy_build_login_url (FlickrProxy *proxy, |
| 32 | const char *frob, |
| 33 | const char *perms) |
| 34 | { |
| 35 | - SoupURI *uri; |
| 36 | + GUri *uri; |
| 37 | GHashTable *params; |
| 38 | char *sig, *s; |
| 39 | + char *query; |
| 40 | |
| 41 | g_return_val_if_fail (FLICKR_IS_PROXY (proxy), NULL); |
| 42 | |
| 43 | - uri = soup_uri_new ("http://flickr.com/services/auth/"); |
| 44 | params = g_hash_table_new (g_str_hash, g_str_equal); |
| 45 | |
| 46 | g_hash_table_insert (params, "api_key", proxy->priv->api_key); |
| 47 | @@ -321,14 +321,23 @@ flickr_proxy_build_login_url (FlickrProxy *proxy, |
| 48 | |
| 49 | sig = flickr_proxy_sign (proxy, params); |
| 50 | g_hash_table_insert (params, "api_sig", sig); |
| 51 | + query = soup_form_encode_hash (params); |
| 52 | |
| 53 | - soup_uri_set_query_from_form (uri, params); |
| 54 | + uri = g_uri_build (G_URI_FLAGS_ENCODED, |
| 55 | + "http", |
| 56 | + NULL, |
| 57 | + "flickr.com", |
| 58 | + -1, |
| 59 | + "services/auth/", |
| 60 | + query, |
| 61 | + NULL); |
| 62 | |
| 63 | - s = soup_uri_to_string (uri, FALSE); |
| 64 | + s = g_uri_to_string (uri); |
| 65 | |
| 66 | + g_free (query); |
| 67 | g_free (sig); |
| 68 | g_hash_table_destroy (params); |
| 69 | - soup_uri_free (uri); |
| 70 | + g_uri_unref (uri); |
| 71 | |
| 72 | return s; |
| 73 | } |
| 74 | diff --git a/rest/oauth-proxy-call.c b/rest/oauth-proxy-call.c |
| 75 | index c90c69d..e238c3c 100644 |
| 76 | --- a/rest/oauth-proxy-call.c |
| 77 | +++ b/rest/oauth-proxy-call.c |
| 78 | @@ -30,7 +30,7 @@ |
| 79 | |
| 80 | G_DEFINE_TYPE (OAuthProxyCall, oauth_proxy_call, REST_TYPE_PROXY_CALL) |
| 81 | |
| 82 | -#define OAUTH_ENCODE_STRING(x_) (x_ ? soup_uri_encode( (x_), "!$&'()*+,;=@") : g_strdup ("")) |
| 83 | +#define OAUTH_ENCODE_STRING(x_) (x_ ? g_uri_escape_string( (x_), NULL, TRUE) : g_strdup ("")) |
| 84 | |
| 85 | static char * |
| 86 | sign_plaintext (OAuthProxyPrivate *priv) |
| 87 | @@ -136,15 +136,24 @@ sign_hmac (OAuthProxy *proxy, RestProxyCall *call, GHashTable *oauth_params) |
| 88 | if (priv->oauth_echo) { |
| 89 | g_string_append_uri_escaped (text, priv->service_url, NULL, FALSE); |
| 90 | } else if (priv->signature_host != NULL) { |
| 91 | - SoupURI *url = soup_uri_new (url_str); |
| 92 | + GUri *url = g_uri_parse (url_str, G_URI_FLAGS_ENCODED, NULL); |
| 93 | + GUri *new_url; |
| 94 | gchar *signing_url; |
| 95 | |
| 96 | - soup_uri_set_host (url, priv->signature_host); |
| 97 | - signing_url = soup_uri_to_string (url, FALSE); |
| 98 | + new_url = g_uri_build (g_uri_get_flags (url), |
| 99 | + g_uri_get_scheme (url), |
| 100 | + g_uri_get_userinfo (url), |
| 101 | + priv->signature_host, |
| 102 | + g_uri_get_port (url), |
| 103 | + g_uri_get_path (url), |
| 104 | + g_uri_get_query (url), |
| 105 | + g_uri_get_fragment (url)); |
| 106 | + signing_url = g_uri_to_string (new_url); |
| 107 | |
| 108 | g_string_append_uri_escaped (text, signing_url, NULL, FALSE); |
| 109 | |
| 110 | - soup_uri_free (url); |
| 111 | + g_uri_unref (new_url); |
| 112 | + g_uri_unref (url); |
| 113 | g_free (signing_url); |
| 114 | } else { |
| 115 | g_string_append_uri_escaped (text, url_str, NULL, FALSE); |
| 116 | diff --git a/rest/oauth2-proxy.c b/rest/oauth2-proxy.c |
| 117 | index 24e5da0..3382f8b 100644 |
| 118 | --- a/rest/oauth2-proxy.c |
| 119 | +++ b/rest/oauth2-proxy.c |
| 120 | @@ -37,8 +37,6 @@ oauth2_proxy_error_quark (void) |
| 121 | return g_quark_from_static_string ("rest-oauth2-proxy"); |
| 122 | } |
| 123 | |
| 124 | -#define EXTRA_CHARS_ENCODE "!$&'()*+,;=@" |
| 125 | - |
| 126 | enum { |
| 127 | PROP_0, |
| 128 | PROP_CLIENT_ID, |
| 129 | @@ -242,8 +240,8 @@ append_query_param (gpointer key, gpointer value, gpointer user_data) |
| 130 | char *encoded_val, *encoded_key; |
| 131 | char *param; |
| 132 | |
| 133 | - encoded_val = soup_uri_encode (value, EXTRA_CHARS_ENCODE); |
| 134 | - encoded_key = soup_uri_encode (key, EXTRA_CHARS_ENCODE); |
| 135 | + encoded_val = g_uri_escape_string (value, NULL, TRUE); |
| 136 | + encoded_key = g_uri_escape_string (key, NULL, TRUE); |
| 137 | |
| 138 | param = g_strdup_printf ("%s=%s", encoded_key, encoded_val); |
| 139 | g_free (encoded_key); |
| 140 | @@ -295,8 +293,8 @@ oauth2_proxy_build_login_url_full (OAuth2Proxy *proxy, |
| 141 | g_hash_table_foreach (extra_params, append_query_param, params); |
| 142 | } |
| 143 | |
| 144 | - encoded_uri = soup_uri_encode (redirect_uri, EXTRA_CHARS_ENCODE); |
| 145 | - encoded_id = soup_uri_encode (proxy->priv->client_id, EXTRA_CHARS_ENCODE); |
| 146 | + encoded_uri = g_uri_escape_string (redirect_uri, NULL, TRUE); |
| 147 | + encoded_id = g_uri_escape_string (proxy->priv->client_id, NULL, TRUE); |
| 148 | |
| 149 | url = g_strdup_printf ("%s?client_id=%s&redirect_uri=%s&type=user_agent", |
| 150 | proxy->priv->auth_endpoint, encoded_id, |
| 151 | @@ -378,20 +376,22 @@ oauth2_proxy_extract_access_token (const char *url) |
| 152 | { |
| 153 | GHashTable *params; |
| 154 | char *token = NULL; |
| 155 | - SoupURI *soupuri = soup_uri_new (url); |
| 156 | + const char *fragment; |
| 157 | + GUri *uri = g_uri_parse (url, G_URI_FLAGS_ENCODED, NULL); |
| 158 | |
| 159 | - if (soupuri->fragment != NULL) { |
| 160 | - params = soup_form_decode (soupuri->fragment); |
| 161 | + fragment = g_uri_get_fragment (uri); |
| 162 | + if (fragment != NULL) { |
| 163 | + params = soup_form_decode (fragment); |
| 164 | |
| 165 | if (params) { |
| 166 | char *encoded = g_hash_table_lookup (params, "access_token"); |
| 167 | if (encoded) |
| 168 | - token = soup_uri_decode (encoded); |
| 169 | + token = g_uri_unescape_string (encoded, NULL); |
| 170 | |
| 171 | g_hash_table_destroy (params); |
| 172 | } |
| 173 | } |
| 174 | - soup_uri_free (soupuri); |
| 175 | + g_uri_unref (uri); |
| 176 | |
| 177 | return token; |
| 178 | } |
| 179 | -- |
| 180 | 2.33.1 |
| 181 | |