diff options
author | Georges Basile Stavracas Neto <georges.stavracas@gmail.com> | 2023-03-05 11:19:32 -0300 |
---|---|---|
committer | Georges Basile Stavracas Neto <georges.stavracas@gmail.com> | 2023-03-05 11:24:49 -0300 |
commit | 0322bcf54cf1fc37ff74b87fd36e282dc1cf7863 (patch) | |
tree | ea19b6e8397094e1ef665e629d7e4e6c5bd9f6b6 | |
parent | 075b91d2790907188e728344c6336443ee2a897e (diff) | |
download | gnome-calendar-0322bcf54cf1fc37ff74b87fd36e282dc1cf7863.tar.gz |
utils/source-discoverer: Test URI before discovery
This makes sure that we have a valid host set. This check is
copies from Soup's private SOUP_URI_IS_VALID() macro.
Add a test for this behavior.
Closes https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/794
-rw-r--r-- | src/utils/gcal-source-discoverer.c | 28 | ||||
-rw-r--r-- | tests/test-discoverer.c | 38 |
2 files changed, 65 insertions, 1 deletions
diff --git a/src/utils/gcal-source-discoverer.c b/src/utils/gcal-source-discoverer.c index 4b32e11a..53cb0b94 100644 --- a/src/utils/gcal-source-discoverer.c +++ b/src/utils/gcal-source-discoverer.c @@ -208,6 +208,26 @@ is_authentication_error (gint code) return FALSE; } +static GUri * +create_and_validate_uri (const gchar *uri, + GError **error) +{ + g_autoptr (GUri) guri = NULL; + + guri = g_uri_parse (uri, SOUP_HTTP_URI_FLAGS | G_URI_FLAGS_PARSE_RELAXED, error); + + if (!guri) + GCAL_RETURN (NULL); + + if (!g_uri_get_host (guri) || g_uri_get_host (guri)[0] == '\0') + { + g_set_error (error, G_URI_ERROR, G_URI_ERROR_FAILED, "Invalid URI"); + return NULL; + } + + return g_steal_pointer (&guri); +} + /* * Callbacks @@ -250,7 +270,7 @@ discover_file_in_thread (DiscovererData *data, GCAL_ENTRY; - guri = g_uri_parse (data->uri, SOUP_HTTP_URI_FLAGS | G_URI_FLAGS_PARSE_RELAXED, error); + guri = create_and_validate_uri (data->uri, error); if (!guri) GCAL_RETURN (NULL); @@ -319,6 +339,7 @@ discover_webdav_in_thread (DiscovererData *data, g_autoptr (ESource) source = NULL; g_autoptr (GError) local_error = NULL; g_autofree gchar *certificate_pem = NULL; + g_autoptr (GUri) guri = NULL; GTlsCertificateFlags flags; GSList *discovered_sources = NULL; GSList *user_addresses = NULL; @@ -326,6 +347,11 @@ discover_webdav_in_thread (DiscovererData *data, GCAL_ENTRY; + guri = create_and_validate_uri (data->uri, error); + + if (!guri) + GCAL_RETURN (NULL); + credentials = e_named_parameters_new (); e_named_parameters_set (credentials, E_SOURCE_CREDENTIAL_USERNAME, data->username); e_named_parameters_set (credentials, E_SOURCE_CREDENTIAL_PASSWORD, data->password); diff --git a/tests/test-discoverer.c b/tests/test-discoverer.c index 42432b75..307d5c3e 100644 --- a/tests/test-discoverer.c +++ b/tests/test-discoverer.c @@ -82,6 +82,43 @@ discoverer_file (void) /*********************************************************************************************************************/ +static void +discoverer_invalid_https_only_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr (GPtrArray) sources = NULL; + g_autoptr (GError) error = NULL; + GMainLoop *mainloop = user_data; + + sources = gcal_discover_sources_from_uri_finish (result, &error); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_FAILED); + g_assert_null (sources); + + g_main_loop_quit (mainloop); +} + +static void +discoverer_invalid_https_only (void) +{ + g_autoptr (GMainLoop) mainloop = NULL; + + g_test_bug ("794"); + + mainloop = g_main_loop_new (NULL, FALSE); + + gcal_discover_sources_from_uri ("https://", + NULL, + NULL, + NULL, + discoverer_invalid_https_only_cb, + mainloop); + + g_main_loop_run (mainloop); +} + +/*********************************************************************************************************************/ + #if 0 static void @@ -184,6 +221,7 @@ main (gint argc, g_test_bug_base ("https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/"); g_test_add_func ("/discoverer/file", discoverer_file); + g_test_add_func ("/discoverer/invalid-https-only", discoverer_invalid_https_only); //g_test_add_func ("/discoverer/webdav/unauthorized", discoverer_webdav_unauthorized); return g_test_run (); |