]> git.ipfire.org Git - pakfire.git/commitdiff
downloader: Implement passing expected digest to transfer
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 8 Sep 2021 12:41:33 +0000 (12:41 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 8 Sep 2021 12:41:33 +0000 (12:41 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/dist.c
src/libpakfire/downloader.c
src/libpakfire/include/pakfire/downloader.h
src/libpakfire/repo.c
src/libpakfire/request.c
src/libpakfire/transaction.c

index e094416dea938d2ff0fa77dd48f50308e133ec6a..622c8cca445708686eba61bc2f637e13dea50102 100644 (file)
@@ -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;
        }
index f95cb8bb3d5226a03dc49ba6deee17e14194c26e..911c17f32754a32e20267dc23cba29042cf75a3c 100644 (file)
@@ -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;
 
index 4e71f4b76dc7a78e6a78a6abe2cbd49d0518f23b..19537269668f980b0e678d20ebbfbbffc66ffa02 100644 (file)
@@ -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);
index bc3217ba65581c3715e4680fcb56fcecb32883ce..b16c1a76ff2f7b95d03c677616064a0b14ed9d30 100644 (file)
@@ -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;
 
index c4568cf9b1b22d5dd802ec2cb3feefbd8ce0982b..0a46de3a4cb83380ac590bc39ef00b8905e2eac6 100644 (file)
@@ -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;
 
index 493e30b34784a6fcf5d5efe0eb82518e9a7df7f3..04e9628ec46a448e33aa6bed22d8c6e87f3a6b7a 100644 (file)
@@ -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)