From 008b914f9e73e5fadfbd8e4aeacf970cb4bb038e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Fortin=20Tam?= Date: Sat, 24 Feb 2024 23:15:13 -0500 Subject: [PATCH] utils/source-discoverer: Set the User-Agent This avoids some web servers or WAFs doing weird stuff with our requests which would lead to situations where our web calendar source discovery would face server errors, redirects, incorrect contents, etc. Fixes #651 Fixes https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/290 --- src/utils/gcal-source-discoverer.c | 2 +- src/utils/gcal-utils.c | 27 +++++++++++++++++++++++++++ src/utils/gcal-utils.h | 2 ++ tests/test-server.c | 14 +++++++------- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/utils/gcal-source-discoverer.c b/src/utils/gcal-source-discoverer.c index 53cb0b94..b5bda6a7 100644 --- a/src/utils/gcal-source-discoverer.c +++ b/src/utils/gcal-source-discoverer.c @@ -281,7 +281,7 @@ discover_file_in_thread (DiscovererData *data, uri_str = g_uri_to_string_partial (guri, G_URI_HIDE_PASSWORD); GCAL_TRACE_MSG ("Creating request for %s", uri_str); - session = soup_session_new_with_options ("timeout", 10, NULL); + session = gcal_create_soup_session (); message = soup_message_new_from_uri ("GET", guri); g_signal_connect (message, "authenticate", G_CALLBACK (on_soup_message_authenticate_cb), data); diff --git a/src/utils/gcal-utils.c b/src/utils/gcal-utils.c index 89b06392..d2721b51 100644 --- a/src/utils/gcal-utils.c +++ b/src/utils/gcal-utils.c @@ -32,6 +32,7 @@ #include #include +#include #include @@ -1329,3 +1330,29 @@ gcal_get_service_name_from_url (const gchar *url) return NULL; } + +/** + * gcal_create_soup_session: + * +* Creates a new #SoupSession with correct default settings. + * + * Returns: (transfer full): a new #SoupSession + */ +SoupSession * +gcal_create_soup_session (void) +{ + g_autoptr (SoupSession) session = NULL; + + session = soup_session_new (); + + /* Set up a 10 seconds default timeout, as 60 is too long for fail-fast performance in general. + * Individual parts of the code can always override this if needed. */ + soup_session_set_timeout (session, 10); + + /* RFC2616 states HTTP requests "should" contain the User-Agent header. In practice though, in our situation + * User-Agent is mandatory, or restrictive "web application firewalls" can do unexpected things with our request. + * The trailing " - " lets libsoup append its name and version for us. */ + soup_session_set_user_agent (session, "GNOME Calendar/" PACKAGE_VERSION " - "); + + return g_steal_pointer (&session); +} diff --git a/src/utils/gcal-utils.h b/src/utils/gcal-utils.h index 8572efc6..721847a2 100644 --- a/src/utils/gcal-utils.h +++ b/src/utils/gcal-utils.h @@ -139,4 +139,6 @@ gboolean gcal_is_valid_event_name (const gchar const gchar* gcal_get_service_name_from_url (const gchar *url); +SoupSession * gcal_create_soup_session (void); + #endif /* __GCAL_UTILS_H__ */ diff --git a/tests/test-server.c b/tests/test-server.c index ad8382ce..833c7310 100644 --- a/tests/test-server.c +++ b/tests/test-server.c @@ -104,7 +104,7 @@ server_request_no_auth_empty (void) server = init_server (); uri = gcal_simple_server_get_uri (server); - session = soup_session_new (); + session = gcal_create_soup_session (); message = soup_message_new_from_uri ("GET", uri); g_signal_connect (message, "authenticate", G_CALLBACK (fail_authenticate_cb), server); @@ -129,7 +129,7 @@ server_request_no_auth_ics (void) uri = gcal_simple_server_get_uri (server); e_util_change_uri_component (&uri, SOUP_URI_PATH, "/public/calendar.ics"); - session = soup_session_new (); + session = gcal_create_soup_session (); message = soup_message_new_from_uri ("GET", uri); g_signal_connect (message, "authenticate", G_CALLBACK (fail_authenticate_cb), server); @@ -154,7 +154,7 @@ server_request_no_auth_calendar (void) uri = gcal_simple_server_get_uri (server); e_util_change_uri_component (&uri, SOUP_URI_PATH, "/public/calendar"); - session = soup_session_new (); + session = gcal_create_soup_session (); message = soup_message_new_from_uri ("GET", uri); g_signal_connect (message, "authenticate", G_CALLBACK (fail_authenticate_cb), server); @@ -179,7 +179,7 @@ server_request_auth_empty (void) uri = gcal_simple_server_get_uri (server); e_util_change_uri_component (&uri, SOUP_URI_PATH, "/secret-area"); - session = soup_session_new (); + session = gcal_create_soup_session (); message = soup_message_new_from_uri ("GET", uri); g_signal_connect (message, "authenticate", G_CALLBACK (authenticate_cb), server); @@ -204,7 +204,7 @@ server_request_auth_calendar (void) uri = gcal_simple_server_get_uri (server); e_util_change_uri_component (&uri, SOUP_URI_PATH, "/secret-area/calendar"); - session = soup_session_new (); + session = gcal_create_soup_session (); message = soup_message_new_from_uri ("GET", uri); g_signal_connect (message, "authenticate", G_CALLBACK (authenticate_cb), server); @@ -229,7 +229,7 @@ server_request_auth_ics (void) uri = gcal_simple_server_get_uri (server); e_util_change_uri_component (&uri, SOUP_URI_PATH, "/secret-area/calendar.ics"); - session = soup_session_new (); + session = gcal_create_soup_session (); message = soup_message_new_from_uri ("GET", uri); g_signal_connect (message, "authenticate", G_CALLBACK (authenticate_cb), server); @@ -254,7 +254,7 @@ server_request_auth_wrong (void) uri = gcal_simple_server_get_uri (server); e_util_change_uri_component (&uri, SOUP_URI_PATH, "/secret-area"); - session = soup_session_new (); + session = gcal_create_soup_session (); message = soup_message_new_from_uri ("GET", uri); g_signal_connect (message, "authenticate", G_CALLBACK (wrong_authenticate_cb), server);