[evolution-data-server] ESoupSession: Refresh Bearer auth token during request redirect
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] ESoupSession: Refresh Bearer auth token during request redirect
- Date: Wed, 17 Feb 2021 15:13:36 +0000 (UTC)
commit 416165848c572b8e2156933c6cdc1f6ef7c3d290
Author: Milan Crha <mcrha redhat com>
Date: Wed Feb 17 16:10:54 2021 +0100
ESoupSession: Refresh Bearer auth token during request redirect
The token should be checked for expiry and eventually refreshed before
every soup_request_send(), especially when the given address is redirected
and the token can expire during the redirects processing.
src/libedataserver/e-soup-session.c | 50 ++++++++++++++++++++-----------------
1 file changed, 27 insertions(+), 23 deletions(-)
---
diff --git a/src/libedataserver/e-soup-session.c b/src/libedataserver/e-soup-session.c
index 99ad6fc0a..621a60280 100644
--- a/src/libedataserver/e-soup-session.c
+++ b/src/libedataserver/e-soup-session.c
@@ -1013,7 +1013,6 @@ e_soup_session_send_request_sync (ESoupSession *session,
GCancellable *cancellable,
GError **error)
{
- ESoupAuthBearer *using_bearer_auth = NULL;
GInputStream *input_stream;
SoupMessage *message;
gboolean redirected;
@@ -1030,8 +1029,6 @@ e_soup_session_send_request_sync (ESoupSession *session,
g_clear_pointer (&session->priv->ssl_certificate_pem, g_free);
session->priv->ssl_certificate_errors = 0;
session->priv->ssl_info_set = FALSE;
- if (session->priv->using_bearer_auth)
- using_bearer_auth = g_object_ref (session->priv->using_bearer_auth);
g_mutex_unlock (&session->priv->property_lock);
if (session->priv->source &&
@@ -1043,32 +1040,39 @@ e_soup_session_send_request_sync (ESoupSession *session,
g_clear_object (&message);
}
- if (using_bearer_auth &&
- e_soup_auth_bearer_is_expired (using_bearer_auth)) {
- message = soup_request_http_get_message (request);
+ redirected = TRUE;
+ while (redirected) {
+ ESoupAuthBearer *using_bearer_auth = NULL;
- if (!e_soup_session_setup_bearer_auth (session, message, FALSE, using_bearer_auth,
cancellable, &local_error)) {
- if (local_error) {
- soup_message_set_status_full (message, SOUP_STATUS_BAD_REQUEST,
local_error->message);
- g_propagate_error (error, local_error);
- } else {
- soup_message_set_status (message, SOUP_STATUS_BAD_REQUEST);
- }
+ redirected = FALSE;
- g_object_unref (using_bearer_auth);
- g_clear_object (&message);
+ g_mutex_lock (&session->priv->property_lock);
+ if (session->priv->using_bearer_auth)
+ using_bearer_auth = g_object_ref (session->priv->using_bearer_auth);
+ g_mutex_unlock (&session->priv->property_lock);
- return NULL;
- }
+ if (using_bearer_auth &&
+ e_soup_auth_bearer_is_expired (using_bearer_auth)) {
+ message = soup_request_http_get_message (request);
- g_clear_object (&message);
- }
+ if (!e_soup_session_setup_bearer_auth (session, message, FALSE, using_bearer_auth,
cancellable, &local_error)) {
+ if (local_error) {
+ soup_message_set_status_full (message, SOUP_STATUS_BAD_REQUEST,
local_error->message);
+ g_propagate_error (error, local_error);
+ } else {
+ soup_message_set_status (message, SOUP_STATUS_BAD_REQUEST);
+ }
- g_clear_object (&using_bearer_auth);
+ g_object_unref (using_bearer_auth);
+ g_clear_object (&message);
- redirected = TRUE;
- while (redirected) {
- redirected = FALSE;
+ return NULL;
+ }
+
+ g_clear_object (&message);
+ }
+
+ g_clear_object (&using_bearer_auth);
input_stream = soup_request_send (SOUP_REQUEST (request), cancellable, &local_error);
if (input_stream) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]