summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2023-03-05 11:19:32 -0300
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2023-03-05 11:24:49 -0300
commit0322bcf54cf1fc37ff74b87fd36e282dc1cf7863 (patch)
treeea19b6e8397094e1ef665e629d7e4e6c5bd9f6b6
parent075b91d2790907188e728344c6336443ee2a897e (diff)
downloadgnome-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.c28
-rw-r--r--tests/test-discoverer.c38
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 ();