diff options
| author | Carlos Garcia Campos <cgarcia@igalia.com> | 2020-10-27 12:20:42 +0100 |
|---|---|---|
| committer | Carlos Garcia Campos <cgarcia@igalia.com> | 2020-10-27 12:41:08 +0100 |
| commit | cb5a05d635a6fa6336eaf5e944b6b6ef7c8b3e11 (patch) | |
| tree | fa329fd151b32874b399495d1e06b0b1355d5614 | |
| parent | fe65b44a6a860de05d29eb71ba826cb7134e57e2 (diff) | |
| download | libsoup-cb5a05d635a6fa6336eaf5e944b6b6ef7c8b3e11.tar.gz | |
auth: set the proxy host on SoupAuth instead of the requested one
In case of proxy auth, the host being authenticated is the proxy one.
Fixes #105
| -rw-r--r-- | libsoup/auth/soup-auth-manager.c | 18 | ||||
| -rw-r--r-- | libsoup/auth/soup-auth.c | 8 | ||||
| -rw-r--r-- | libsoup/soup-message-private.h | 1 | ||||
| -rw-r--r-- | libsoup/soup-message.c | 15 | ||||
| -rw-r--r-- | libsoup/soup-session-private.h | 2 | ||||
| -rw-r--r-- | libsoup/soup-session.c | 18 |
6 files changed, 32 insertions, 30 deletions
diff --git a/libsoup/auth/soup-auth-manager.c b/libsoup/auth/soup-auth-manager.c index 60494909..5b451ce4 100644 --- a/libsoup/auth/soup-auth-manager.c +++ b/libsoup/auth/soup-auth-manager.c @@ -460,6 +460,7 @@ lookup_auth (SoupAuthManagerPrivate *priv, SoupMessage *msg) SoupAuthHost *host; const char *path, *realm; SoupAuth *auth; + SoupURI *uri; /* If the message already has a ready auth, use that instead */ auth = soup_message_get_auth (msg); @@ -469,7 +470,11 @@ lookup_auth (SoupAuthManagerPrivate *priv, SoupMessage *msg) if (soup_message_get_flags (msg) & SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE) return NULL; - host = get_auth_host_for_uri (priv, soup_message_get_uri (msg)); + uri = soup_message_get_uri_for_auth (msg); + if (!uri) + return NULL; + + host = get_auth_host_for_uri (priv, uri); if (!host->auth_realms && !make_auto_ntlm_auth (priv, host)) return NULL; @@ -481,7 +486,7 @@ lookup_auth (SoupAuthManagerPrivate *priv, SoupMessage *msg) if (!host->auth_realms) return NULL; - path = soup_message_get_uri (msg)->path; + path = uri->path; if (!path) path = "/"; realm = soup_path_map_lookup (host->auth_realms, path); @@ -533,12 +538,7 @@ authenticate_auth (SoupAuthManager *manager, SoupAuth *auth, if (!soup_auth_can_authenticate (auth)) return; - if (proxy) { - uri = soup_session_get_message_proxy_uri (priv->session, msg); - if (!uri) - return; - } else - uri = soup_message_get_uri (msg); + uri = soup_message_get_uri_for_auth (msg); /* If a password is specified explicitly in the URI, use it * even if the auth had previously already been authenticated. @@ -645,7 +645,7 @@ auth_got_headers (SoupMessage *msg, gpointer manager) if (!(soup_message_get_flags (msg) & SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE)) { SoupAuth *new_auth; - new_auth = record_auth_for_uri (priv, soup_message_get_uri (msg), + new_auth = record_auth_for_uri (priv, soup_message_get_uri_for_auth (msg), auth, prior_auth_failed); g_object_unref (auth); auth = g_object_ref (new_auth); diff --git a/libsoup/auth/soup-auth.c b/libsoup/auth/soup-auth.c index 56612c52..5fabd0a7 100644 --- a/libsoup/auth/soup-auth.c +++ b/libsoup/auth/soup-auth.c @@ -14,6 +14,7 @@ #include "soup-auth.h" #include "soup.h" #include "soup-connection-auth.h" +#include "soup-message-private.h" /** * SECTION:soup-auth @@ -267,14 +268,19 @@ soup_auth_new (GType type, SoupMessage *msg, const char *auth_header) SoupAuth *auth; GHashTable *params; const char *scheme; + SoupURI *uri; g_return_val_if_fail (g_type_is_a (type, SOUP_TYPE_AUTH), NULL); g_return_val_if_fail (SOUP_IS_MESSAGE (msg), NULL); g_return_val_if_fail (auth_header != NULL, NULL); + uri = soup_message_get_uri_for_auth (msg); + if (!uri) + return NULL; + auth = g_object_new (type, SOUP_AUTH_IS_FOR_PROXY, (msg->status_code == SOUP_STATUS_PROXY_UNAUTHORIZED), - SOUP_AUTH_HOST, soup_message_get_uri (msg)->host, + SOUP_AUTH_HOST, uri->host, NULL); SoupAuthPrivate *priv = soup_auth_get_instance_private (auth); diff --git a/libsoup/soup-message-private.h b/libsoup/soup-message-private.h index 47068bac..771049db 100644 --- a/libsoup/soup-message-private.h +++ b/libsoup/soup-message-private.h @@ -72,6 +72,7 @@ SoupAuth *soup_message_get_auth (SoupMessage *msg); void soup_message_set_proxy_auth (SoupMessage *msg, SoupAuth *auth); SoupAuth *soup_message_get_proxy_auth (SoupMessage *msg); +SoupURI *soup_message_get_uri_for_auth (SoupMessage *msg); /* I/O */ void soup_message_io_run (SoupMessage *msg, diff --git a/libsoup/soup-message.c b/libsoup/soup-message.c index 7897ac38..a9805aa6 100644 --- a/libsoup/soup-message.c +++ b/libsoup/soup-message.c @@ -1159,6 +1159,21 @@ soup_message_get_proxy_auth (SoupMessage *msg) return priv->proxy_auth; } +SoupURI * +soup_message_get_uri_for_auth (SoupMessage *msg) +{ + SoupMessagePrivate *priv = soup_message_get_instance_private (msg); + + if (msg->status_code == SOUP_STATUS_PROXY_UNAUTHORIZED) { + if (!priv->connection) + return NULL; + + return priv->connection ? soup_connection_get_proxy_uri (priv->connection) : NULL; + } + + return priv->uri; +} + SoupConnection * soup_message_get_connection (SoupMessage *msg) { diff --git a/libsoup/soup-session-private.h b/libsoup/soup-session-private.h index d641c69b..f85c9022 100644 --- a/libsoup/soup-session-private.h +++ b/libsoup/soup-session-private.h @@ -11,8 +11,6 @@ G_BEGIN_DECLS -SoupURI *soup_session_get_message_proxy_uri (SoupSession *session, - SoupMessage *msg); void soup_session_requeue_message (SoupSession *session, SoupMessage *msg); SoupMessage *soup_session_get_original_message_for_authentication (SoupSession *session, diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c index 5722a8e1..4b506af2 100644 --- a/libsoup/soup-session.c +++ b/libsoup/soup-session.c @@ -4290,24 +4290,6 @@ soup_session_websocket_connect_finish (SoupSession *session, return g_task_propagate_pointer (G_TASK (result), error); } -SoupURI * -soup_session_get_message_proxy_uri (SoupSession *session, - SoupMessage *msg) -{ - SoupSessionPrivate *priv = soup_session_get_instance_private (session); - SoupMessageQueueItem *item; - SoupURI *uri; - - item = soup_message_queue_lookup (priv->queue, msg); - if (!item) - return NULL; - - /* When loaded from the disk cache, the connection is NULL. */ - uri = item->conn ? soup_connection_get_proxy_uri (item->conn) : NULL; - soup_message_queue_item_unref (item); - return uri; -} - SoupMessage * soup_session_get_original_message_for_authentication (SoupSession *session, SoupMessage *msg) |
