diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2022-04-11 13:09:37 +0200 |
---|---|---|
committer | Carlos Garcia Campos <cgarcia@igalia.com> | 2022-06-08 12:36:17 +0200 |
commit | 02ffd064b87184a0dbe03210c270baa60c6139b8 (patch) | |
tree | ee4039b97f44d488b53693784f027ecf7064fabe | |
parent | f3cdcf8dfb58864b1e8d040f52fa67410dfdfc93 (diff) | |
download | libsoup-02ffd064b87184a0dbe03210c270baa60c6139b8.tar.gz |
auth-manager: Add a mutex to protect accessing the auth hosts
-rw-r--r-- | libsoup/auth/soup-auth-manager.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/libsoup/auth/soup-auth-manager.c b/libsoup/auth/soup-auth-manager.c index 7e263a69..402967d0 100644 --- a/libsoup/auth/soup-auth-manager.c +++ b/libsoup/auth/soup-auth-manager.c @@ -54,6 +54,7 @@ typedef struct { gboolean auto_ntlm; SoupAuth *proxy_auth; + GMutex mutex; GHashTable *auth_hosts; } SoupAuthManagerPrivate; @@ -83,6 +84,7 @@ soup_auth_manager_init (SoupAuthManager *manager) soup_uri_host_equal, NULL, (GDestroyNotify)soup_auth_host_free); + g_mutex_init (&priv->mutex); } static void @@ -96,6 +98,8 @@ soup_auth_manager_finalize (GObject *object) g_clear_object (&priv->proxy_auth); + g_mutex_clear (&priv->mutex); + G_OBJECT_CLASS (soup_auth_manager_parent_class)->finalize (object); } @@ -616,6 +620,8 @@ auth_got_headers (SoupMessage *msg, gpointer manager) SoupAuth *auth, *prior_auth; gboolean prior_auth_failed = FALSE; + g_mutex_lock (&priv->mutex); + /* See if we used auth last time */ prior_auth = soup_message_get_auth (msg); if (prior_auth && check_auth (msg, prior_auth)) { @@ -624,8 +630,10 @@ auth_got_headers (SoupMessage *msg, gpointer manager) prior_auth_failed = TRUE; } else { auth = create_auth (priv, msg); - if (!auth) + if (!auth) { + g_mutex_unlock (&priv->mutex); return; + } } if (!soup_message_query_flags (msg, SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE)) { @@ -637,6 +645,8 @@ auth_got_headers (SoupMessage *msg, gpointer manager) auth = g_object_ref (new_auth); } + g_mutex_unlock (&priv->mutex); + /* If we need to authenticate, try to do it. */ authenticate_auth (manager, auth, msg, prior_auth_failed, FALSE, TRUE); @@ -650,6 +660,8 @@ auth_got_body (SoupMessage *msg, gpointer manager) SoupAuthManagerPrivate *priv = soup_auth_manager_get_instance_private (manager); SoupAuth *auth; + g_mutex_lock (&priv->mutex); + auth = lookup_auth (priv, msg); if (auth && soup_auth_is_ready (auth, msg)) { if (SOUP_IS_CONNECTION_AUTH (auth)) @@ -663,6 +675,8 @@ auth_got_body (SoupMessage *msg, gpointer manager) soup_session_requeue_message (priv->session, msg); } + + g_mutex_unlock (&priv->mutex); } static void @@ -672,6 +686,8 @@ proxy_auth_got_headers (SoupMessage *msg, gpointer manager) SoupAuth *auth = NULL, *prior_auth; gboolean prior_auth_failed = FALSE; + g_mutex_lock (&priv->mutex); + /* See if we used auth last time */ prior_auth = soup_message_get_proxy_auth (msg); if (prior_auth && check_auth (msg, prior_auth)) { @@ -684,13 +700,17 @@ proxy_auth_got_headers (SoupMessage *msg, gpointer manager) if (!auth) { auth = create_auth (priv, msg); - if (!auth) + if (!auth) { + g_mutex_unlock (&priv->mutex); return; + } if (!soup_message_query_flags (msg, SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE)) priv->proxy_auth = g_object_ref (auth); } + g_mutex_unlock (&priv->mutex); + /* If we need to authenticate, try to do it. */ authenticate_auth (manager, auth, msg, prior_auth_failed, TRUE, TRUE); @@ -704,6 +724,8 @@ proxy_auth_got_body (SoupMessage *msg, gpointer manager) SoupAuthManagerPrivate *priv = soup_auth_manager_get_instance_private (manager); SoupAuth *auth; + g_mutex_lock (&priv->mutex); + auth = lookup_proxy_auth (priv, msg); if (auth && soup_auth_is_ready (auth, msg)) { /* When not using cached credentials, update the Authorization header @@ -713,6 +735,8 @@ proxy_auth_got_body (SoupMessage *msg, gpointer manager) update_authorization_header (msg, auth, TRUE); soup_session_requeue_message (priv->session, msg); } + + g_mutex_unlock (&priv->mutex); } static void @@ -724,6 +748,8 @@ auth_msg_starting (SoupMessage *msg, gpointer manager) if (soup_message_query_flags (msg, SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE)) return; + g_mutex_lock (&priv->mutex); + if (soup_message_get_method (msg) != SOUP_METHOD_CONNECT) { auth = lookup_auth (priv, msg); if (auth) { @@ -743,6 +769,8 @@ auth_msg_starting (SoupMessage *msg, gpointer manager) } soup_message_set_proxy_auth (msg, auth); update_authorization_header (msg, auth, TRUE); + + g_mutex_unlock (&priv->mutex); } static void @@ -800,7 +828,9 @@ soup_auth_manager_use_auth (SoupAuthManager *manager, { SoupAuthManagerPrivate *priv = soup_auth_manager_get_instance_private (manager); + g_mutex_lock (&priv->mutex); record_auth_for_uri (priv, uri, auth, FALSE); + g_mutex_unlock (&priv->mutex); } /** @@ -817,7 +847,9 @@ soup_auth_manager_clear_cached_credentials (SoupAuthManager *manager) g_return_if_fail (SOUP_IS_AUTH_MANAGER (manager)); + g_mutex_lock (&priv->mutex); g_hash_table_remove_all (priv->auth_hosts); + g_mutex_unlock (&priv->mutex); } static void |