diff --git a/SOURCES/5.patch b/SOURCES/5.patch new file mode 100644 index 0000000..6b55e0e --- /dev/null +++ b/SOURCES/5.patch @@ -0,0 +1,130 @@ +From c3a333256261545ffe1bd7088c6c54dcb9fb759b Mon Sep 17 00:00:00 2001 +From: Jaroslav Rohel +Date: Tue, 21 Apr 2020 08:56:01 +0200 +Subject: [PATCH] Append ctx_baseurl prefix to gpg_url (RhBug:1708628) + +Sometime the gpg_url contains relative path to context baseurl. +In that case the code appends baseurl prefix to gpg_url. The resulting +URI is normalized (solved "//", ".", and "..") + +The new function rhsm_url_base_join() introduce similar results +as utils.url_base_join() in subscription manager. +--- + rhsm/rhsm-utils.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 93 insertions(+), 1 deletion(-) + +diff --git a/rhsm/rhsm-utils.c b/rhsm/rhsm-utils.c +index 6708a43..ee3f296 100644 +--- a/rhsm/rhsm-utils.c ++++ b/rhsm/rhsm-utils.c +@@ -181,6 +181,97 @@ rhsm_json_array_is_subset_of_hash_table (JsonArray *array, + return TRUE; + } + ++/* ++ * Join a baseurl (hostname) and url (full or relpath). ++ * ++ * If url is a full url, just return it. Otherwise combine ++ * it with base, skipping redundant seperators if needed. ++ * ++ * Simulate the behavior of subscription manager. ++ */ ++static gchar * ++rhsm_url_base_join (const gchar *base, ++ const gchar *url) ++{ ++ /* handle special cases similar to subscription manager */ ++ if (!url || *url == '\0') ++ return g_strdup (""); ++ if (strstr (url, "://")) ++ return g_strdup (url); ++ if (!base || *base == '\0') ++ return g_strdup (url); ++ ++ /* parse URI, split to schema, host, and path */ ++ g_autofree gchar *schema = NULL; ++ g_autofree gchar *host = NULL; ++ g_autofree gchar *path = NULL; ++ gchar *tmp = strstr (base, ":"); ++ if (tmp) ++ schema = g_strndup (base, tmp - base); ++ if (schema) ++ { ++ if (tmp[1] == '/' && tmp[2] == '/') ++ { ++ gchar *tmp2 = strstr (tmp + 3, "/"); ++ if (tmp2) ++ { ++ host = g_strndup (tmp + 3, tmp2 - tmp - 3); ++ path = g_strdup (tmp2); ++ } ++ else ++ host = g_strdup (tmp + 3); ++ } ++ else ++ path = g_strdup (tmp + 1); ++ } ++ else ++ path = g_strdup (base); ++ ++ /* full_path is path from base + url */ ++ g_autofree gchar *full_path = NULL; ++ if (path) ++ full_path = g_strconcat (path, "/", url, NULL); ++ else ++ full_path = g_strconcat ("/", url, NULL); ++ ++ /* normalize full_path ++ * split to vector, copy vector but skip empty and "." items, ++ * for each ".." source item remove last item from destination ++ */ ++ g_auto(GStrv) src_split_path = g_strsplit (full_path, "/", -1); ++ guint src_len = g_strv_length (src_split_path); ++ g_autofree gchar **dest_split_path = g_new0 (gchar *, src_len + 1); ++ guint dest_len = 0; ++ for (guint src_idx = 0; src_idx < src_len; ++src_idx) ++ { ++ gchar *src = src_split_path[src_idx]; ++ if (*src == '\0' || strcmp (src, ".") == 0) ++ continue; ++ if (strcmp (src, "..") == 0) ++ { ++ if (dest_len > 0) ++ --dest_len; ++ continue; ++ } ++ dest_split_path[dest_len++] = src; ++ } ++ dest_split_path[dest_len] = NULL; ++ ++ /* construct destination path */ ++ g_autofree gchar *tmp_path = g_strjoinv ("/", dest_split_path); ++ g_autofree gchar *dest_path = NULL; ++ if (g_str_has_suffix (url, "/") || g_str_has_suffix (url, "/.") || g_str_has_suffix (url, "/..")) ++ dest_path = g_strconcat (tmp_path, "/", NULL); ++ else ++ dest_path = g_strdup (tmp_path); ++ ++ /* construct and return final URI */ ++ if (schema) ++ return g_strconcat (schema, "://", host ? host : "", "/", dest_path, NULL); ++ else ++ return g_strconcat ("/", dest_path, NULL); ++} ++ + /** + * rhsm_utils_yum_repo_from_context: + * @ctx: an #RHSMContext. +@@ -275,7 +366,8 @@ rhsm_utils_yum_repo_from_context (RHSMContext *ctx) + if (json_object_has_member (repo, "gpg_url")) + { + const gchar *gpg_url = json_object_get_string_member (repo, "gpg_url"); +- g_key_file_set_string (repofile, id, "gpgkey", gpg_url); ++ g_autofree gchar *gpgkey = rhsm_url_base_join (ctx_baseurl, gpg_url); ++ g_key_file_set_string (repofile, id, "gpgkey", gpgkey); + g_key_file_set_boolean (repofile, id, "gpgcheck", TRUE); + } + else +-- +libgit2 0.28.5 + diff --git a/SPECS/librhsm.spec b/SPECS/librhsm.spec index 3b0de7c..8f30722 100644 --- a/SPECS/librhsm.spec +++ b/SPECS/librhsm.spec @@ -2,7 +2,7 @@ Name: lib%{libname} Version: 0.0.3 -Release: 4%{?dist} +Release: 5%{?dist} Summary: Red Hat Subscription Manager library License: LGPLv2+ @@ -10,6 +10,7 @@ URL: https://github.com/rpm-software-management/librhsm Source: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz Patch0: 2.patch Patch1: 4.patch +Patch2: 5.patch BuildRequires: meson >= 0.37.0 BuildRequires: gcc @@ -50,6 +51,9 @@ Requires: %{name}%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release} %{_libdir}/pkgconfig/%{name}.pc %changelog +* Thu Jan 5 2023 Nicola Sella - 0.0.3-5 +- Append ctx_baseurl prefix to gpg_url + * Wed Jan 6 2021 Marek Blaha - 0.0.3-4 - Rebuild to ship also librhsm-devel subpackage