From: Michael Tremer Date: Wed, 8 Sep 2021 12:41:33 +0000 (+0000) Subject: downloader: Implement passing expected digest to transfer X-Git-Tag: 0.9.28~970 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2a140a7f94816758eb78ece29b71b0690d8c8fd5;p=pakfire.git downloader: Implement passing expected digest to transfer Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/dist.c b/src/libpakfire/dist.c index e094416de..622c8cca4 100644 --- a/src/libpakfire/dist.c +++ b/src/libpakfire/dist.c @@ -251,7 +251,7 @@ static int pakfire_dist_add_source(struct pakfire* pakfire, struct pakfire_packa // Download the file if it does not exist in the cache if (access(cache_path, R_OK) != 0) { r = pakfire_downloader_retrieve(downloader, BASEURL, mirrorlist, - NULL, filename, cache_path, PAKFIRE_DOWNLOADER_MD_NONE, 0); + NULL, filename, cache_path, PAKFIRE_DOWNLOADER_MD_NONE, NULL, 0, 0); if (r) return r; } diff --git a/src/libpakfire/downloader.c b/src/libpakfire/downloader.c index f95cb8bb3..911c17f32 100644 --- a/src/libpakfire/downloader.c +++ b/src/libpakfire/downloader.c @@ -72,6 +72,8 @@ struct pakfire_transfer { const EVP_MD* md; unsigned char computed_digest[EVP_MAX_MD_SIZE]; unsigned int computed_digest_length; + unsigned char expected_digest[EVP_MAX_MD_SIZE]; + unsigned int expected_digest_length; // Mirrors char baseurl[PATH_MAX]; @@ -258,7 +260,8 @@ static int debug_callback(CURL *handle, curl_infotype type, static struct pakfire_transfer* pakfire_downloader_create_transfer( struct pakfire_downloader* downloader, const char* baseurl, struct pakfire_mirrorlist* mirrors, const char* title, const char* url, const char* path, - enum pakfire_downloader_message_digest md, enum pakfire_transfer_flags flags) { + enum pakfire_downloader_message_digest md, const char* expected_digest, const size_t expected_digest_length, + enum pakfire_transfer_flags flags) { struct pakfire_config* config = NULL; DEBUG(downloader->pakfire, "Adding download of %s\n", url); @@ -274,6 +277,27 @@ static struct pakfire_transfer* pakfire_downloader_create_transfer( return NULL; } + // Check if expected digest is set + switch (md) { + case PAKFIRE_DOWNLOADER_MD_NONE: + break; + + default: + if (!expected_digest || !expected_digest_length) { + ERROR(downloader->pakfire, "Expected message digest or size is not set\n"); + errno = EINVAL; + return NULL; + } + break; + } + + // Expected digest length cannot be too long + if (expected_digest_length > EVP_MAX_MD_SIZE) { + ERROR(downloader->pakfire, "Digest length is too long\n"); + errno = EMSGSIZE; + return NULL; + } + struct pakfire_transfer* transfer = calloc(1, sizeof(*transfer)); if (!transfer) return NULL; @@ -337,6 +361,10 @@ static struct pakfire_transfer* pakfire_downloader_create_transfer( break; } + // Copy the expected digest + if (transfer->md && expected_digest) + memcpy(transfer->expected_digest, expected_digest, expected_digest_length); + // Allocate handle transfer->handle = curl_easy_init(); if (!transfer->handle) @@ -385,9 +413,10 @@ ERROR: int pakfire_downloader_add_transfer(struct pakfire_downloader* downloader, const char* baseurl, struct pakfire_mirrorlist* mirrors, const char* title, const char* url, const char* path, enum pakfire_downloader_message_digest md, + const char* expected_digest, const size_t expected_digest_length, enum pakfire_transfer_flags flags) { struct pakfire_transfer* transfer = pakfire_downloader_create_transfer( - downloader, baseurl, mirrors, title, url, path, md, flags); + downloader, baseurl, mirrors, title, url, path, md, expected_digest, expected_digest_length, flags); if (!transfer) return 1; @@ -837,9 +866,10 @@ AGAIN: int pakfire_downloader_retrieve(struct pakfire_downloader* downloader, const char* baseurl, struct pakfire_mirrorlist* mirrors, const char* title, const char* url, const char* path, enum pakfire_downloader_message_digest md, + const char* expected_digest, const size_t expected_digest_length, enum pakfire_transfer_flags flags) { struct pakfire_transfer* transfer = pakfire_downloader_create_transfer( - downloader, baseurl, mirrors, title, url, path, md, flags); + downloader, baseurl, mirrors, title, url, path, md, expected_digest, expected_digest_length, flags); if (!transfer) return 1; diff --git a/src/libpakfire/include/pakfire/downloader.h b/src/libpakfire/include/pakfire/downloader.h index 4e71f4b76..195372696 100644 --- a/src/libpakfire/include/pakfire/downloader.h +++ b/src/libpakfire/include/pakfire/downloader.h @@ -49,10 +49,12 @@ struct pakfire_downloader* pakfire_downloader_unref(struct pakfire_downloader* d int pakfire_downloader_retrieve(struct pakfire_downloader* downloader, const char* baseurl, struct pakfire_mirrorlist* mirrors, const char* title, const char* url, const char* path, enum pakfire_downloader_message_digest md, + const char* expected_digest, const size_t expected_digest_length, enum pakfire_transfer_flags flags); int pakfire_downloader_add_transfer(struct pakfire_downloader* downloader, const char* baseurl, struct pakfire_mirrorlist* mirrors, const char* title, const char* url, const char* path, enum pakfire_downloader_message_digest md, + const char* expected_digest, const size_t expected_digest_length, enum pakfire_transfer_flags flags); int pakfire_downloader_run(struct pakfire_downloader* downloader); diff --git a/src/libpakfire/repo.c b/src/libpakfire/repo.c index bc3217ba6..b16c1a76f 100644 --- a/src/libpakfire/repo.c +++ b/src/libpakfire/repo.c @@ -87,6 +87,7 @@ static int pakfire_repo_is_internal(struct pakfire_repo* repo) { static int pakfire_repo_retrieve(struct pakfire_repo* repo, const char* title, const char* url, const char* path, enum pakfire_downloader_message_digest md, + const char* expected_digest, const size_t expected_digest_length, enum pakfire_transfer_flags flags) { struct pakfire_downloader* downloader; int r = pakfire_downloader_create(&downloader, repo->pakfire); @@ -98,7 +99,7 @@ static int pakfire_repo_retrieve(struct pakfire_repo* repo, const char* title, // Retrieve the database file r = pakfire_downloader_retrieve(downloader, repo->appdata->baseurl, mirrorlist, - title, url, path, md, flags); + title, url, path, md, expected_digest, expected_digest_length, flags); if (mirrorlist) pakfire_mirrorlist_unref(mirrorlist); @@ -121,7 +122,7 @@ static int pakfire_repo_import_key(struct pakfire_repo* repo, const char* url) { // Try to download the key int r = pakfire_repo_retrieve(repo, NULL, url, path, - PAKFIRE_DOWNLOADER_MD_NONE, PAKFIRE_TRANSFER_NOTEMP|PAKFIRE_TRANSFER_NOPROGRESS); + PAKFIRE_DOWNLOADER_MD_NONE, NULL, 0, PAKFIRE_TRANSFER_NOTEMP|PAKFIRE_TRANSFER_NOPROGRESS); if (r) goto ERROR; @@ -279,7 +280,7 @@ static int pakfire_repo_download_database(struct pakfire_repo* repo, const char* pakfire_string_format(database_url, "repodata/%s", database); return pakfire_repo_retrieve(repo, title, database_url, cache_path, - PAKFIRE_DOWNLOADER_MD_NONE, 0); + PAKFIRE_DOWNLOADER_MD_NONE, NULL, 0, 0); } static int pakfire_repo_read_metadata(struct pakfire_repo* repo, const char* path, int refresh) { @@ -370,7 +371,7 @@ static int pakfire_repo_refresh_mirrorlist(struct pakfire_repo* repo, const int return pakfire_repo_retrieve(repo, NULL, repo->appdata->mirrorlist_url, repo->appdata->mirrorlist, - PAKFIRE_DOWNLOADER_MD_NONE, PAKFIRE_TRANSFER_NOPROGRESS); + PAKFIRE_DOWNLOADER_MD_NONE, NULL, 0, PAKFIRE_TRANSFER_NOPROGRESS); } static int pakfire_repo_refresh_metadata(struct pakfire_repo* repo, const int force) { @@ -386,7 +387,7 @@ static int pakfire_repo_refresh_metadata(struct pakfire_repo* repo, const int fo int r = pakfire_repo_retrieve(repo, NULL, "repodata/repomd.json", repo->appdata->metadata, PAKFIRE_DOWNLOADER_MD_NONE, - PAKFIRE_TRANSFER_NOPROGRESS); + NULL, 0, PAKFIRE_TRANSFER_NOPROGRESS); if (r) return r; diff --git a/src/libpakfire/request.c b/src/libpakfire/request.c index c4568cf9b..0a46de3a4 100644 --- a/src/libpakfire/request.c +++ b/src/libpakfire/request.c @@ -457,7 +457,7 @@ static int pakfire_request_add_url(struct pakfire_request* request, int action, // Download the file r = pakfire_downloader_retrieve(downloader, NULL, NULL, NULL, - url, path, PAKFIRE_DOWNLOADER_MD_NONE, PAKFIRE_TRANSFER_NOTEMP); + url, path, PAKFIRE_DOWNLOADER_MD_NONE, NULL, 0, PAKFIRE_TRANSFER_NOTEMP); if (r) goto ERROR; diff --git a/src/libpakfire/transaction.c b/src/libpakfire/transaction.c index 493e30b34..04e9628ec 100644 --- a/src/libpakfire/transaction.c +++ b/src/libpakfire/transaction.c @@ -1019,7 +1019,7 @@ static int pakfire_transaction_download_package(struct pakfire_transaction* tran // Add transfer to downloader r = pakfire_downloader_add_transfer(downloader, baseurl, mirrorlist, - nevra, filename, path, PAKFIRE_DOWNLOADER_MD_NONE, 0); + nevra, filename, path, PAKFIRE_DOWNLOADER_MD_NONE, NULL, 0, 0); ERROR: if (mirrorlist)