manifest: add file support as well as apkdb support

cute-signatures
William Pitcock 2017-05-27 21:19:41 +00:00
parent 46c2693468
commit 18f7aa9e44
1 changed files with 55 additions and 0 deletions

View File

@ -11,6 +11,8 @@
*/ */
#include <stdio.h> #include <stdio.h>
#include <sys/stat.h>
#include "apk_defines.h" #include "apk_defines.h"
#include "apk_applet.h" #include "apk_applet.h"
#include "apk_database.h" #include "apk_database.h"
@ -23,6 +25,11 @@ static char *csum_types[APK_CHECKSUM_SHA1 + 1] = {
[APK_CHECKSUM_SHA1] = "sha1", [APK_CHECKSUM_SHA1] = "sha1",
}; };
struct manifest_file_ctx {
const char *file;
struct apk_sign_ctx *sctx;
};
static void process_package(struct apk_database *db, struct apk_package *pkg) static void process_package(struct apk_database *db, struct apk_package *pkg)
{ {
struct apk_installed_package *ipkg = pkg->ipkg; struct apk_installed_package *ipkg = pkg->ipkg;
@ -51,12 +58,60 @@ static void process_package(struct apk_database *db, struct apk_package *pkg)
} }
} }
static int read_file_entry(void *ctx, const struct apk_file_info *ae,
struct apk_istream *is)
{
struct manifest_file_ctx *mctx = ctx;
char csum_buf[(APK_CHECKSUM_SHA1 * 2) + 1];
apk_blob_t csum_blob = APK_BLOB_BUF(csum_buf);
if (ae->name[0] == '.') {
if (!strncmp(ae->name, ".PKGINFO", 8) || !strncmp(ae->name, ".SIGN.", 6))
return 0;
}
if ((ae->mode & S_IFMT) != S_IFREG)
return 0;
memset(csum_buf, '\0', sizeof(csum_buf));
apk_blob_push_hexdump(&csum_blob, APK_BLOB_CSUM(ae->csum));
if (apk_verbosity > 1)
printf("%s: ", mctx->file);
printf("%s:%s %s\n", csum_types[ae->csum.type], csum_buf, ae->name);
return 0;
}
static void process_file(struct apk_database *db, const char *match)
{
struct apk_sign_ctx sctx;
struct apk_istream *is;
struct manifest_file_ctx ctx = {match, &sctx};
apk_sign_ctx_init(&sctx, APK_SIGN_VERIFY, NULL, db->keys_fd);
is = apk_bstream_gunzip_mpart(apk_bstream_from_file(AT_FDCWD, match),
apk_sign_ctx_mpart_cb, &sctx);
if (IS_ERR_OR_NULL(is)) {
apk_error("%s: %s", match, strerror(errno));
return;
}
(void) apk_tar_parse(is, read_file_entry, &ctx, FALSE, &db->id_cache);
is->close(is);
}
static void process_match(struct apk_database *db, const char *match, struct apk_name *name, void *ctx) static void process_match(struct apk_database *db, const char *match, struct apk_name *name, void *ctx)
{ {
struct apk_provider *p; struct apk_provider *p;
if (name == NULL) if (name == NULL)
{
process_file(db, match);
return; return;
}
foreach_array_item(p, name->providers) foreach_array_item(p, name->providers)
process_package(db, p->pkg); process_package(db, p->pkg);