summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garcia Campos <cgarcia@igalia.com>2020-10-27 12:20:42 +0100
committerCarlos Garcia Campos <cgarcia@igalia.com>2020-10-28 09:46:21 +0100
commitca5c1c949236fda07aec953a4a9cac61b2e94efe (patch)
treeb432b770f59e8eb2ec9588e6ccc4ec54c8cae14a
parent8a918ee3cd75def6f9c1a6bdcb1008e99684ec6b (diff)
downloadlibsoup-ca5c1c949236fda07aec953a4a9cac61b2e94efe.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.c18
-rw-r--r--libsoup/auth/soup-auth.c8
-rw-r--r--libsoup/soup-message-private.h1
-rw-r--r--libsoup/soup-message.c13
-rw-r--r--libsoup/soup-session-private.h2
-rw-r--r--libsoup/soup-session.c18
6 files changed, 30 insertions, 30 deletions
diff --git a/libsoup/auth/soup-auth-manager.c b/libsoup/auth/soup-auth-manager.c
index 2af4a0b5..afe6be48 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 62d0a677..9295400c 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
@@ -262,14 +263,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,
"is-for-proxy", (msg->status_code == SOUP_STATUS_PROXY_UNAUTHORIZED),
- "host", soup_message_get_uri (msg)->host,
+ "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 6eae152d..e57dec01 100644
--- a/libsoup/soup-message.c
+++ b/libsoup/soup-message.c
@@ -1086,6 +1086,19 @@ 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) {
+ /* When loaded from the disk cache, the connection is 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 b2a94bb2..3eb8b0be 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -4166,24 +4166,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)