diff --git a/src/as-system-info.c b/src/as-system-info.c index 306c1093..2c64bb1c 100644 --- a/src/as-system-info.c +++ b/src/as-system-info.c @@ -324,6 +324,8 @@ const gchar * as_system_info_get_os_cid (AsSystemInfo *sysinfo) { AsSystemInfoPrivate *priv = GET_PRIVATE (sysinfo); + g_autofree gchar *homepage_cid = NULL; + g_auto(GStrv) os_id_parts = NULL; as_system_info_load_os_release (sysinfo, NULL); if (priv->os_cid != NULL) @@ -333,6 +335,25 @@ as_system_info_get_os_cid (AsSystemInfo *sysinfo) return priv->os_cid; } + homepage_cid = as_utils_dns_to_rdns (priv->os_homepage, NULL); + if (priv->os_id != NULL) { + if (homepage_cid != NULL) { + gsize homepage_cid_len = strlen (homepage_cid); + + if (g_str_has_prefix (priv->os_id, homepage_cid) && + priv->os_id[homepage_cid_len] == '.') { + priv->os_cid = g_strdup (priv->os_id); + return priv->os_cid; + } + } + + os_id_parts = g_strsplit (priv->os_id, ".", -1); + if (g_strv_length (os_id_parts) >= 3 && as_utils_is_tld (os_id_parts[0])) { + priv->os_cid = g_strdup (priv->os_id); + return priv->os_cid; + } + } + priv->os_cid = as_utils_dns_to_rdns (priv->os_homepage, priv->os_id); if (priv->os_cid == NULL) return priv->os_id; diff --git a/tests/samples/os-release-rdns-home-match b/tests/samples/os-release-rdns-home-match new file mode 100644 index 00000000..6fdc302f --- /dev/null +++ b/tests/samples/os-release-rdns-home-match @@ -0,0 +1,3 @@ +NAME="Freedesktop SDK" +ID=org.freedesktop.platform +HOME_URL="https://freedesktop.org" diff --git a/tests/samples/os-release-rdns-home-match-unknown-tld b/tests/samples/os-release-rdns-home-match-unknown-tld new file mode 100644 index 00000000..909fc8b6 --- /dev/null +++ b/tests/samples/os-release-rdns-home-match-unknown-tld @@ -0,0 +1,3 @@ +NAME="Freedesktop Test SDK" +ID=invalid.freedesktop.platform +HOME_URL="https://freedesktop.invalid" diff --git a/tests/samples/os-release-rdns-home-mismatch b/tests/samples/os-release-rdns-home-mismatch new file mode 100644 index 00000000..b0c1a5d6 --- /dev/null +++ b/tests/samples/os-release-rdns-home-mismatch @@ -0,0 +1,3 @@ +NAME="Example OS" +ID=org.example.platform +HOME_URL="https://project.example.com" diff --git a/tests/samples/os-release-rdns-home-prefix-collision b/tests/samples/os-release-rdns-home-prefix-collision new file mode 100644 index 00000000..ffd93cae --- /dev/null +++ b/tests/samples/os-release-rdns-home-prefix-collision @@ -0,0 +1,3 @@ +NAME="Freedesktop Prefix Collision Test SDK" +ID=invalid.freedesktopx.platform +HOME_URL="https://freedesktop.invalid" diff --git a/tests/test-basics.c b/tests/test-basics.c index 2feabb45..13ab373e 100644 --- a/tests/test-basics.c +++ b/tests/test-basics.c @@ -1216,7 +1216,15 @@ test_system_info (void) { g_autoptr(AsSystemInfo) sysinfo_tmpl = NULL; g_autoptr(AsSystemInfo) sysinfo = as_system_info_new (); + g_autoptr(AsSystemInfo) sysinfo_rdns_home_match = as_system_info_new (); + g_autoptr(AsSystemInfo) sysinfo_rdns_home_match_unknown_tld = as_system_info_new (); + g_autoptr(AsSystemInfo) sysinfo_rdns_home_prefix_collision = as_system_info_new (); + g_autoptr(AsSystemInfo) sysinfo_rdns_home_mismatch = as_system_info_new (); g_autofree gchar *osrelease_fname = NULL; + g_autofree gchar *osrelease_rdns_home_match_fname = NULL; + g_autofree gchar *osrelease_rdns_home_match_unknown_tld_fname = NULL; + g_autofree gchar *osrelease_rdns_home_prefix_collision_fname = NULL; + g_autofree gchar *osrelease_rdns_home_mismatch_fname = NULL; g_autofree gchar *dev_name = NULL; g_autoptr(GError) error = NULL; @@ -1231,6 +1239,38 @@ test_system_info (void) g_assert_cmpstr (as_system_info_get_os_id (sysinfo), ==, "debian"); g_assert_cmpstr (as_system_info_get_os_cid (sysinfo), ==, "org.debian.debian"); + osrelease_rdns_home_match_fname = + g_build_filename (datadir, "os-release-rdns-home-match", NULL); + as_system_info_load_os_release (sysinfo_rdns_home_match, + osrelease_rdns_home_match_fname); + g_assert_cmpstr (as_system_info_get_os_cid (sysinfo_rdns_home_match), + ==, + "org.freedesktop.platform"); + + osrelease_rdns_home_match_unknown_tld_fname = + g_build_filename (datadir, "os-release-rdns-home-match-unknown-tld", NULL); + as_system_info_load_os_release (sysinfo_rdns_home_match_unknown_tld, + osrelease_rdns_home_match_unknown_tld_fname); + g_assert_cmpstr (as_system_info_get_os_cid (sysinfo_rdns_home_match_unknown_tld), + ==, + "invalid.freedesktop.platform"); + + osrelease_rdns_home_prefix_collision_fname = + g_build_filename (datadir, "os-release-rdns-home-prefix-collision", NULL); + as_system_info_load_os_release (sysinfo_rdns_home_prefix_collision, + osrelease_rdns_home_prefix_collision_fname); + g_assert_cmpstr (as_system_info_get_os_cid (sysinfo_rdns_home_prefix_collision), + ==, + "invalid.freedesktop.invalid.freedesktopx.platform"); + + osrelease_rdns_home_mismatch_fname = + g_build_filename (datadir, "os-release-rdns-home-mismatch", NULL); + as_system_info_load_os_release (sysinfo_rdns_home_mismatch, + osrelease_rdns_home_mismatch_fname); + g_assert_cmpstr (as_system_info_get_os_cid (sysinfo_rdns_home_mismatch), + ==, + "org.example.platform"); + #ifndef G_OS_WIN32 g_assert_nonnull (as_system_info_get_kernel_name (sysinfo)); g_assert_nonnull (as_system_info_get_kernel_version (sysinfo));