|
|
88f094 |
From 125e957092083ea37cf8ac712fa62587e3817242 Mon Sep 17 00:00:00 2001
|
|
|
88f094 |
From: Jens Georg <mail@jensge.org>
|
|
|
88f094 |
Date: Mon, 10 May 2021 11:45:57 +0200
|
|
|
88f094 |
Subject: [PATCH] Tests: Add test for host header validation
|
|
|
88f094 |
|
|
|
88f094 |
---
|
|
|
88f094 |
libgupnp/gupnp-context-private.h | 5 ++
|
|
|
88f094 |
libgupnp/gupnp-context.c | 25 ++++++++--
|
|
|
88f094 |
tests/gtest/test-bugs.c | 78 ++++++++++++++++++++++++++++++--
|
|
|
88f094 |
3 files changed, 99 insertions(+), 9 deletions(-)
|
|
|
88f094 |
|
|
|
88f094 |
diff --git a/libgupnp/gupnp-context-private.h b/libgupnp/gupnp-context-private.h
|
|
|
88f094 |
index 5848d02..a8b4a75 100644
|
|
|
88f094 |
--- a/libgupnp/gupnp-context-private.h
|
|
|
88f094 |
+++ b/libgupnp/gupnp-context-private.h
|
|
|
88f094 |
@@ -42,6 +42,11 @@ gupnp_context_ip_is_ours (GUPnPContext *context, const char *address);
|
|
|
88f094 |
G_GNUC_INTERNAL gboolean
|
|
|
88f094 |
gupnp_context_validate_host_header (GUPnPContext *context, const char *host);
|
|
|
88f094 |
|
|
|
88f094 |
+gboolean
|
|
|
88f094 |
+validate_host_header (const char *host_header,
|
|
|
88f094 |
+ const char *host_ip,
|
|
|
88f094 |
+ guint context_port);
|
|
|
88f094 |
+
|
|
|
88f094 |
G_END_DECLS
|
|
|
88f094 |
|
|
|
88f094 |
#endif /* __GUPNP_CONTEXT_PRIVATE_H__ */
|
|
|
88f094 |
diff --git a/libgupnp/gupnp-context.c b/libgupnp/gupnp-context.c
|
|
|
88f094 |
index 0381474..ec88b93 100644
|
|
|
88f094 |
--- a/libgupnp/gupnp-context.c
|
|
|
88f094 |
+++ b/libgupnp/gupnp-context.c
|
|
|
88f094 |
@@ -1585,9 +1585,11 @@ out:
|
|
|
88f094 |
}
|
|
|
88f094 |
|
|
|
88f094 |
gboolean
|
|
|
88f094 |
-gupnp_context_validate_host_header (GUPnPContext *context,
|
|
|
88f094 |
- const char *host_header)
|
|
|
88f094 |
+validate_host_header (const char *host_header,
|
|
|
88f094 |
+ const char *host_ip,
|
|
|
88f094 |
+ guint context_port)
|
|
|
88f094 |
{
|
|
|
88f094 |
+
|
|
|
88f094 |
gboolean retval = FALSE;
|
|
|
88f094 |
// Be lazy and let GUri do the heavy lifting here, such as stripping the
|
|
|
88f094 |
// [] from v6 addresses, splitting of the port etc.
|
|
|
88f094 |
@@ -1610,8 +1612,11 @@ gupnp_context_validate_host_header (GUPnPContext *context,
|
|
|
88f094 |
goto out;
|
|
|
88f094 |
}
|
|
|
88f094 |
|
|
|
88f094 |
- const char *host_ip = gssdp_client_get_host_ip (GSSDP_CLIENT (context));
|
|
|
88f094 |
- gint context_port = gupnp_context_get_port (context);
|
|
|
88f094 |
+ // -1 means there was no :port; according to UDA this is allowed and
|
|
|
88f094 |
+ // defaults to 80, the HTTP port then
|
|
|
88f094 |
+ if (port == -1) {
|
|
|
88f094 |
+ port = 80;
|
|
|
88f094 |
+ }
|
|
|
88f094 |
|
|
|
88f094 |
if (!g_str_equal (host, host_ip)) {
|
|
|
88f094 |
g_debug ("Mismatch between host header and host IP (%s, "
|
|
|
88f094 |
@@ -1631,6 +1636,18 @@ gupnp_context_validate_host_header (GUPnPContext *context,
|
|
|
88f094 |
|
|
|
88f094 |
out:
|
|
|
88f094 |
g_clear_error (&error);
|
|
|
88f094 |
+ g_free (host);
|
|
|
88f094 |
g_free (uri_from_host);
|
|
|
88f094 |
+
|
|
|
88f094 |
return retval;
|
|
|
88f094 |
}
|
|
|
88f094 |
+
|
|
|
88f094 |
+gboolean
|
|
|
88f094 |
+gupnp_context_validate_host_header (GUPnPContext *context,
|
|
|
88f094 |
+ const char *host_header)
|
|
|
88f094 |
+{
|
|
|
88f094 |
+ return validate_host_header (
|
|
|
88f094 |
+ host_header,
|
|
|
88f094 |
+ gssdp_client_get_host_ip (GSSDP_CLIENT (context)),
|
|
|
88f094 |
+ gupnp_context_get_port (context));
|
|
|
88f094 |
+}
|
|
|
88f094 |
diff --git a/tests/gtest/test-bugs.c b/tests/gtest/test-bugs.c
|
|
|
88f094 |
index 0ffac76..24ec4ba 100644
|
|
|
88f094 |
--- a/tests/gtest/test-bugs.c
|
|
|
88f094 |
+++ b/tests/gtest/test-bugs.c
|
|
|
88f094 |
@@ -24,6 +24,7 @@
|
|
|
88f094 |
#endif
|
|
|
88f094 |
|
|
|
88f094 |
#include <libgupnp/gupnp.h>
|
|
|
88f094 |
+#include <libgupnp/gupnp-context-private.h>
|
|
|
88f094 |
|
|
|
88f094 |
|
|
|
88f094 |
struct _GUPnPServiceAction {
|
|
|
88f094 |
@@ -468,14 +469,81 @@ test_bgo_743233 (void)
|
|
|
88f094 |
g_object_unref (context);
|
|
|
88f094 |
}
|
|
|
88f094 |
|
|
|
88f094 |
+static void
|
|
|
88f094 |
+test_ggo_24 (void)
|
|
|
88f094 |
+{
|
|
|
88f094 |
+ // IPv4
|
|
|
88f094 |
+ g_assert (
|
|
|
88f094 |
+ validate_host_header ("127.0.0.1:4711", "127.0.0.1", 4711));
|
|
|
88f094 |
+
|
|
|
88f094 |
+ g_assert (
|
|
|
88f094 |
+ validate_host_header ("127.0.0.1", "127.0.0.1", 80));
|
|
|
88f094 |
+
|
|
|
88f094 |
+ g_assert_false (
|
|
|
88f094 |
+ validate_host_header ("example.com", "127.0.0.1", 4711));
|
|
|
88f094 |
+
|
|
|
88f094 |
+ g_assert_false (
|
|
|
88f094 |
+ validate_host_header ("example.com:80", "127.0.0.1", 4711));
|
|
|
88f094 |
+
|
|
|
88f094 |
+ g_assert_false (
|
|
|
88f094 |
+ validate_host_header ("example.com:4711", "127.0.0.1", 4711));
|
|
|
88f094 |
+
|
|
|
88f094 |
+ g_assert_false (
|
|
|
88f094 |
+ validate_host_header ("192.168.1.2:4711", "127.0.0.1", 4711));
|
|
|
88f094 |
+
|
|
|
88f094 |
+ g_assert_false (
|
|
|
88f094 |
+ validate_host_header ("[fe80::01]", "127.0.0.1", 4711));
|
|
|
88f094 |
+
|
|
|
88f094 |
+ // Link ids should not be parsed
|
|
|
88f094 |
+ g_assert_false (
|
|
|
88f094 |
+ validate_host_header ("[fe80::01%1]", "127.0.0.1", 4711));
|
|
|
88f094 |
+
|
|
|
88f094 |
+ g_assert_false (
|
|
|
88f094 |
+ validate_host_header ("[fe80::01%eth0]", "127.0.0.1", 4711));
|
|
|
88f094 |
+
|
|
|
88f094 |
+ // IPv6
|
|
|
88f094 |
+ g_assert (
|
|
|
88f094 |
+ validate_host_header ("[::1]:4711", "::1", 4711));
|
|
|
88f094 |
+
|
|
|
88f094 |
+ g_assert (
|
|
|
88f094 |
+ validate_host_header ("[::1]", "::1", 80));
|
|
|
88f094 |
+
|
|
|
88f094 |
+ // Host header needs to be enclosed in [] even without port
|
|
|
88f094 |
+ g_assert_false (
|
|
|
88f094 |
+ validate_host_header ("::1", "::1", 80));
|
|
|
88f094 |
+
|
|
|
88f094 |
+ g_assert_false (
|
|
|
88f094 |
+ validate_host_header ("example.com", "::1", 4711));
|
|
|
88f094 |
+
|
|
|
88f094 |
+ g_assert_false (
|
|
|
88f094 |
+ validate_host_header ("example.com:80", "::1", 4711));
|
|
|
88f094 |
+
|
|
|
88f094 |
+ g_assert_false (
|
|
|
88f094 |
+ validate_host_header ("example.com:4711", "::1", 4711));
|
|
|
88f094 |
+
|
|
|
88f094 |
+ g_assert_false (
|
|
|
88f094 |
+ validate_host_header ("192.168.1.2:4711", "::1", 4711));
|
|
|
88f094 |
+
|
|
|
88f094 |
+ g_assert_false (
|
|
|
88f094 |
+ validate_host_header ("[fe80::01]", "::1", 4711));
|
|
|
88f094 |
+
|
|
|
88f094 |
+ // Link ids should not be parsed
|
|
|
88f094 |
+ g_assert_false (
|
|
|
88f094 |
+ validate_host_header ("[fe80::01%1]", "fe80::acab", 4711));
|
|
|
88f094 |
+
|
|
|
88f094 |
+ g_assert_false (
|
|
|
88f094 |
+ validate_host_header ("[fe80::01%eth0]", "fe80::acab", 4711));
|
|
|
88f094 |
+}
|
|
|
88f094 |
+
|
|
|
88f094 |
int
|
|
|
88f094 |
main (int argc, char *argv[]) {
|
|
|
88f094 |
g_test_init (&argc, &argv, NULL);
|
|
|
88f094 |
- g_test_add_func ("/bugs/696762", test_bgo_696762);
|
|
|
88f094 |
- g_test_add_func ("/bugs/678701", test_bgo_678701);
|
|
|
88f094 |
- g_test_add_func ("/bugs/690400", test_bgo_690400);
|
|
|
88f094 |
- g_test_add_func ("/bugs/722696", test_bgo_722696);
|
|
|
88f094 |
- g_test_add_func ("/bugs/743233", test_bgo_743233);
|
|
|
88f094 |
+ g_test_add_func ("/bugs/bgo/696762", test_bgo_696762);
|
|
|
88f094 |
+ g_test_add_func ("/bugs/bgo/678701", test_bgo_678701);
|
|
|
88f094 |
+ g_test_add_func ("/bugs/bgo/690400", test_bgo_690400);
|
|
|
88f094 |
+ g_test_add_func ("/bugs/bgo/722696", test_bgo_722696);
|
|
|
88f094 |
+ g_test_add_func ("/bugs/bgo/743233", test_bgo_743233);
|
|
|
88f094 |
+ g_test_add_func ("/bugs/ggo/24", test_ggo_24);
|
|
|
88f094 |
|
|
|
88f094 |
return g_test_run ();
|
|
|
88f094 |
}
|
|
|
88f094 |
--
|
|
|
88f094 |
2.31.1
|
|
|
88f094 |
|