]> git.ipfire.org Git - pakfire.git/commitdiff
archive: Add scaffolding to return keys on verify
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 22 Jul 2021 12:35:18 +0000 (12:35 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 22 Jul 2021 12:35:18 +0000 (12:35 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/archive.c
src/libpakfire/archive.c
src/libpakfire/include/pakfire/archive.h
src/libpakfire/transaction.c

index 979b5226c58073b21aea332a97cbe67e508c08f7..50d2872b9c83db1e03fe34fb50cf6a0709f2af9b 100644 (file)
@@ -104,7 +104,7 @@ static PyObject* Archive_verify(ArchiveObject* self) {
        pakfire_archive_verify_status_t status;
 
        // Verify this archive
-       int r = pakfire_archive_verify(self->archive, &status);
+       int r = pakfire_archive_verify(self->archive, &status, NULL);
        if (r) {
                PyErr_SetFromErrno(PyExc_OSError);
                return NULL;
index a95bb0c05e704a9c4dea7ba4bc43676abc010309..afa7a5c2b006e65a99c6563f1f0b1528bd799663 100644 (file)
@@ -1534,7 +1534,8 @@ ERROR:
 /*
        This function walks through the archive looking for signatures and verifies them
 */
-static int pakfire_archive_verify_signatures(struct pakfire_archive* archive) {
+static int pakfire_archive_verify_signatures(struct pakfire_archive* archive,
+               struct pakfire_key*** keys) {
        char* buffer = NULL;
        size_t size = 0;
 
@@ -1575,26 +1576,37 @@ ERROR:
 }
 
 PAKFIRE_EXPORT int pakfire_archive_verify(struct pakfire_archive* archive,
-               pakfire_archive_verify_status_t* status) {
+               pakfire_archive_verify_status_t* status, struct pakfire_key*** keys) {
+       int r;
+
        DEBUG(archive->pakfire, "Verifying archive %p\n", archive);
 
        // Return previous result if this has already been called
        if (archive->verify == PAKFIRE_ARCHIVE_VERIFY_UNKNOWN) {
                // Verify all signatures
-               int r = pakfire_archive_verify_signatures(archive);
+               int r = pakfire_archive_verify_signatures(archive, keys);
                if (r)
-                       return r;
+                       goto ERROR;
 
                // Verify checksums
                r = pakfire_archive_verify_checksums(archive, PAKFIRE_ARCHIVE_VERIFY_BEST);
                if (r)
-                       return r;
+                       goto ERROR;
        }
 
        // Store result
        *status = archive->verify;
 
        return 0;
+
+ERROR:
+       if (keys && *keys) {
+               for (struct pakfire_key** key = *keys; *key; key++)
+                       pakfire_key_unref(*key);
+               free(*keys);
+       }
+
+       return r;
 }
 
 PAKFIRE_EXPORT const char* pakfire_archive_verify_strerror(pakfire_archive_verify_status_t status) {
index 63fd3b0a197f1f9478b768fba17764b0d72189c2..21ee3e6c6a336ebfe181f9b15bf76d9ac9bce60d 100644 (file)
@@ -26,6 +26,7 @@
 struct pakfire_archive;
 
 #include <pakfire/filelist.h>
+#include <pakfire/key.h>
 #include <pakfire/package.h>
 #include <pakfire/repo.h>
 #include <pakfire/scriptlet.h>
@@ -59,7 +60,7 @@ unsigned int pakfire_archive_get_format(struct pakfire_archive* archive);
 struct pakfire_filelist* pakfire_archive_get_filelist(struct pakfire_archive* archive);
 
 int pakfire_archive_verify(struct pakfire_archive* archive,
-       pakfire_archive_verify_status_t* status);
+       pakfire_archive_verify_status_t* status, struct pakfire_key*** keys);
 const char* pakfire_archive_verify_strerror(pakfire_archive_verify_status_t status);
 int pakfire_archive_sign(struct pakfire_archive* archive, struct pakfire_key* key);
 
index 7dce2034d4b545222e92783b648344fcb2b366f7..923541662ff32850b3b374281d77f6ac4f20873e 100644 (file)
@@ -581,7 +581,7 @@ static int pakfire_transaction_verify(struct pakfire_transaction* transaction,
        pakfire_archive_verify_status_t status;
 
        // Verify the archive
-       int r = pakfire_archive_verify(archive, &status);
+       int r = pakfire_archive_verify(archive, &status, NULL);
        if (r)
                return r;