[libsoup/carlosgc/authenticate: 3/6] auth: set the proxy host on SoupAuth instead of the requested one




commit cb5a05d635a6fa6336eaf5e944b6b6ef7c8b3e11
Author: Carlos Garcia Campos <cgarcia igalia com>
Date:   Tue Oct 27 12:20:42 2020 +0100

    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

 libsoup/auth/soup-auth-manager.c | 18 +++++++++---------
 libsoup/auth/soup-auth.c         |  8 +++++++-
 libsoup/soup-message-private.h   |  1 +
 libsoup/soup-message.c           | 15 +++++++++++++++
 libsoup/soup-session-private.h   |  2 --
 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)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]