File: validate-uri.patch

package info (click to toggle)
gnome-calendar 43.1-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 4,736 kB
  • sloc: ansic: 28,782; xml: 109; makefile: 6
file content (121 lines) | stat: -rw-r--r-- 4,037 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
From: Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
Subject: Test URI before discovery
Bug: https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/794
Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1033239
Origin: https://gitlab.gnome.org/GNOME/gnome-calendar/-/commit/0322bcf54cf1fc37ff74b87fd36e282dc1cf7863
Index: gnome-calendar-43.1/src/utils/gcal-source-discoverer.c
===================================================================
--- gnome-calendar-43.1.orig/src/utils/gcal-source-discoverer.c
+++ gnome-calendar-43.1/src/utils/gcal-source-discoverer.c
@@ -183,6 +183,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
@@ -221,7 +241,7 @@ discover_file_in_thread (DiscovererData
 
   GCAL_ENTRY;
 
-  guri = g_uri_parse (data->uri, SOUP_HTTP_URI_FLAGS | G_URI_FLAGS_PARSE_RELAXED, NULL);
+  guri = create_and_validate_uri (data->uri, error);
 
   if (!guri)
     GCAL_RETURN (NULL);
@@ -277,6 +297,7 @@ discover_webdav_in_thread (DiscovererDat
   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;
@@ -284,6 +305,11 @@ discover_webdav_in_thread (DiscovererDat
 
   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);
Index: gnome-calendar-43.1/tests/test-discoverer.c
===================================================================
--- gnome-calendar-43.1.orig/tests/test-discoverer.c
+++ gnome-calendar-43.1/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
@@ -183,6 +220,7 @@ main (gint   argc,
   g_test_init (&argc, &argv, NULL);
 
   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 ();