diff --git a/SOURCES/1164.patch b/SOURCES/1164.patch new file mode 100644 index 0000000..a15f00b --- /dev/null +++ b/SOURCES/1164.patch @@ -0,0 +1,143 @@ +From 8987652fe1f1dca674a0726e6d967c60ed79e8b6 Mon Sep 17 00:00:00 2001 +From: Matthew Almond +Date: Mon, 8 Mar 2021 12:57:53 -0800 +Subject: [PATCH 1/2] Expose librepo's checksum functions via SWIG + +DNF has been carrying around yum's old checksum function. These +functions duplicate code in librepo. They are slower because librepo can +employ caching of digests. Lastly, these functions in Python do not know +about changes in checksum logic like +https://github.com/rpm-software-management/librepo/pull/222 + +The choices here are: + +1. Replicate `lr_checksum_cow_fd()` and caching logic in Python +2. Just use librepo from dnf. + +This is 2. Note there was bug in librepo that forces no caching +for `checksum_value()` +(https://github.com/rpm-software-management/librepo/issues/233). This is +now fixed, so we depend on librepo-1.13.1 to ensure this fix is present. + +This change goes hand in hand with a change to `dnf` itself to make use +of the new functions and eliminate the old ones. This is +https://github.com/rpm-software-management/dnf/pull/1743. We bump the +version of this library in the next commit to ensure this dependency is +expressed properly. + +On errors, these functions raise libdnf.error.Error which can be easily +mapped into MiscError in dnf +--- + bindings/swig/utils.i | 3 +++ + libdnf/utils/utils.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++ + libdnf/utils/utils.hpp | 16 ++++++++++++++ + 3 files changed, 69 insertions(+) + +diff --git a/bindings/swig/utils.i b/bindings/swig/utils.i +index 60fabb02d..df323e375 100644 +--- a/bindings/swig/utils.i ++++ b/bindings/swig/utils.i +@@ -44,4 +44,7 @@ namespace libdnf { namespace filesystem { + + void decompress(const char * inPath, const char * outPath, mode_t outMode, const char * compressType = nullptr); + ++bool checksum_check(const char * type, const char * inPath, const char * checksum_valid); ++std::string checksum_value(const char * type, const char * inPath); ++ + }} +diff --git a/libdnf/utils/utils.cpp b/libdnf/utils/utils.cpp +index 1a83bfbd2..450718d37 100644 +--- a/libdnf/utils/utils.cpp ++++ b/libdnf/utils/utils.cpp +@@ -1,6 +1,7 @@ + #include "utils.hpp" + #include "libdnf/dnf-sack-private.hpp" + #include "libdnf/sack/advisorymodule.hpp" ++#include + + #include + +@@ -300,6 +301,55 @@ void decompress(const char * inPath, const char * outPath, mode_t outMode, const + fclose(inFile); + } + ++void checksum(const char * type, const char * inPath, const char * checksum_valid, bool * valid_out, gchar ** calculated_out) ++{ ++ GError * errP{nullptr}; ++ gboolean valid; ++ LrChecksumType lr_type = lr_checksum_type(type); ++ ++ if (lr_type == LR_CHECKSUM_UNKNOWN) ++ throw libdnf::Error(tfm::format("Unknown checksum type %s", type)); ++ ++ auto inFd = open(inPath, O_RDONLY); ++ ++ if (inFd == -1) ++ throw libdnf::Error(tfm::format("Error opening %s: %s", inPath, strerror(errno))); ++ ++ auto ret = lr_checksum_fd_compare(lr_type, ++ inFd, ++ /** ++ * If checksum_valid references a string, pass it in, else use ++ * an empty string ++ */ ++ checksum_valid ? checksum_valid : "", ++ TRUE, ++ &valid, ++ calculated_out, ++ &errP); ++ ++ close(inFd); ++ if (!ret) ++ throw libdnf::Error(tfm::format("Error calculating checksum %s: (%d, %s)", inPath, errP->code, errP->message)); ++ if (valid_out) ++ *valid_out = valid == TRUE; /* gboolean -> bool */ ++} ++ ++ ++bool checksum_check(const char * type, const char * inPath, const char * checksum_valid) ++{ ++ bool valid; ++ checksum(type, inPath, checksum_valid, &valid, NULL); ++ return valid; ++} ++ ++std::string checksum_value(const char * type, const char * inPath) ++{ ++ g_autofree gchar *calculated = NULL; ++ checksum(type, inPath, NULL, NULL, &calculated); ++ std::string out(calculated); ++ return out; ++} ++ + } + + namespace numeric { +diff --git a/libdnf/utils/utils.hpp b/libdnf/utils/utils.hpp +index 5d755e017..43ca9ff34 100644 +--- a/libdnf/utils/utils.hpp ++++ b/libdnf/utils/utils.hpp +@@ -68,6 +68,22 @@ std::vector getDirContent(const std::string &dirPath); + * @param compressType Type of compression (".bz2", ".gz", ...), nullptr - detect from inPath filename. Defaults to nullptr. + */ + void decompress(const char * inPath, const char * outPath, mode_t outMode, const char * compressType = nullptr); ++ ++/** ++* @brief checksum file and return if matching. ++* ++* @param type Checksum type ("sha", "sha1", "sha256" etc). Raises libdnf::Error if invalid. ++* @param inPath Path to input file ++* @param valid_checksum hexadecimal encoded checksum string. ++*/ ++bool checksum_check(const char * type, const char * inPath, const char * valid_checksum); ++/** ++* @brief checksum file and return checksum. ++* ++* @param type Checksum type ("sha", "sha1", "sha256" etc). Raises libdnf::Error if invalid. ++* @param inPath Path to input file ++*/ ++std::string checksum_value(const char * type, const char * inPath); + } + + namespace numeric { + diff --git a/SPECS/libdnf.spec b/SPECS/libdnf.spec index 0bf373a..9ef7e63 100644 --- a/SPECS/libdnf.spec +++ b/SPECS/libdnf.spec @@ -56,7 +56,7 @@ Name: libdnf Version: %{libdnf_major_version}.%{libdnf_minor_version}.%{libdnf_micro_version} -Release: 7%{?dist} +Release: 7.1%{?dist} Summary: Library providing simplified C and Python API to libsolv License: LGPLv2+ URL: https://github.com/rpm-software-management/libdnf @@ -69,6 +69,7 @@ Patch4: 0005-Allow-loading-incomplete-cache-and-loading-ext-solv-files-w Patch5: 0006-Add-new-option-module-stream-switch.patch Patch6: 0007-Fix-removal-step-during-modular-enable-in-context-part.patch Patch7: 0008-Update-translations.patch +Patch9999: https://github.com/rpm-software-management/libdnf/pull/1164.patch BuildRequires: cmake @@ -317,6 +318,9 @@ popd %endif %changelog +* Wed Mar 17 2021 Matthew Almond - 0.55.0-7.1 +- Add PR1164 (first commit to avoid rebase errors) + * Mon Mar 8 2021 Marek Blaha - 0.55.0-7 - Update translations (RhBug:1820548)