about summary refs log tree commit diff
path: root/shared/systemd/nm-sd-utils-shared.c
diff options
context:
space:
mode:
authorSebastien Bacher <seb128@ubuntu.com>2020-07-02 11:35:14 +0200
committerSebastien Bacher <seb128@ubuntu.com>2020-07-02 11:52:25 +0200
commitc6c4e39b012d544c1f1ed816686c8ae1599da793 (patch)
tree094d5e07c1d135d0ee67d99e051fd6a9a367a6a4 /shared/systemd/nm-sd-utils-shared.c
parent7368e45ff5b3b8b328d55408bcd403e4d6c564d0 (diff)
parentacd7b014c72673f5b0c0b91309e27028886da167 (diff)
Merge remote-tracking branch 'salsa/debian/master' into ubuntu/master
Diffstat (limited to 'shared/systemd/nm-sd-utils-shared.c')
-rw-r--r--shared/systemd/nm-sd-utils-shared.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/shared/systemd/nm-sd-utils-shared.c b/shared/systemd/nm-sd-utils-shared.c
index 85fd6a35..4fe82ca0 100644
--- a/shared/systemd/nm-sd-utils-shared.c
+++ b/shared/systemd/nm-sd-utils-shared.c
@@ -13,6 +13,7 @@
 #include "hexdecoct.h"
 #include "hostname-util.h"
 #include "path-util.h"
+#include "web-util.h"
 
 /*****************************************************************************/
 
@@ -94,3 +95,85 @@ gboolean nm_sd_hostname_is_valid (const char *s, bool allow_trailing_dot)
 {
 	return hostname_is_valid (s, allow_trailing_dot);
 }
+
+/*****************************************************************************/
+
+static gboolean
+_http_url_is_valid (const char *url, gboolean only_https)
+{
+	if (   !url
+	    || !url[0])
+		return FALSE;
+
+	if (   !only_https
+	    && NM_STR_HAS_PREFIX (url, "http://"))
+		url += NM_STRLEN ("http://");
+	else if (NM_STR_HAS_PREFIX (url, "https://"))
+		url += NM_STRLEN ("https://");
+	else
+		return FALSE;
+
+	if (!url[0])
+		return FALSE;
+
+	return !NM_STRCHAR_ANY (url, ch, (guchar) ch >= 128u);
+}
+
+gboolean
+nm_sd_http_url_is_valid_https (const char *url)
+{
+	/* We use this function to verify connection:mud-url property, it must thus
+	 * not change behavior.
+	 *
+	 * Note that sd_dhcp_client_set_mud_url() and sd_dhcp6_client_set_request_mud_url()
+	 * assert with http_url_is_valid() that the argument is valid. We thus must make
+	 * sure to only pass URLs that are valid according to http_url_is_valid().
+	 *
+	 * This is given, because our nm_sd_http_url_is_valid_https() is more strict
+	 * than http_url_is_valid().
+	 *
+	 * We only must make sure that this is also correct in the future, when we
+	 * re-import systemd code. */
+	nm_assert (_http_url_is_valid (url, FALSE) == http_url_is_valid (url));
+	return _http_url_is_valid (url, TRUE);
+}
+
+/*****************************************************************************/
+
+int
+nmtst_systemd_extract_first_word_all (const char *str, char ***out_strv)
+{
+	gs_unref_ptrarray GPtrArray *arr = NULL;
+
+	/* we implement a str split function to parse `/proc/cmdline`. This
+	 * code should behave like systemd, which uses extract_first_word()
+	 * for that.
+	 *
+	 * As we want to unit-test our implementation to match systemd,
+	 * expose this function for testing. */
+
+	g_assert (out_strv);
+	g_assert (!*out_strv);
+
+	if (!str)
+		return 0;
+
+	arr = g_ptr_array_new_with_free_func (g_free);
+
+	for (;;) {
+		gs_free char *word = NULL;
+		int r;
+
+		r = extract_first_word (&str, &word, NULL, EXTRACT_UNQUOTE | EXTRACT_RELAX);
+		if (r < 0)
+			return r;
+		if (r == 0)
+			break;
+		g_ptr_array_add (arr, g_steal_pointer (&word));
+	}
+
+	g_ptr_array_add (arr, NULL);
+
+	*out_strv = (char **) g_ptr_array_free (g_steal_pointer (&arr), FALSE);
+	return 1;
+}