fix: parse pkgfile properly (fixes #132)
accept also pkgfile in addition to pkgname. make also the signature verification stuff work properly again with non-repository files.cute-signatures
parent
279513bfbe
commit
6b94ed8a7a
41
src/fix.c
41
src/fix.c
|
@ -41,38 +41,49 @@ static int fix_main(void *pctx, struct apk_database *db, int argc, char **argv)
|
|||
struct fix_ctx *ctx = (struct fix_ctx *) pctx;
|
||||
struct apk_state *state = NULL;
|
||||
struct apk_name *name;
|
||||
struct apk_package *pkg;
|
||||
struct apk_package **pkgs;
|
||||
int r = 0, i, j;
|
||||
|
||||
state = apk_state_new(db);
|
||||
if (state == NULL)
|
||||
return -1;
|
||||
|
||||
pkgs = alloca(sizeof(struct apk_package *) * argc);
|
||||
for (i = 0; i < argc; i++) {
|
||||
name = apk_db_get_name(db, APK_BLOB_STR(argv[i]));
|
||||
if (name == NULL)
|
||||
goto err;
|
||||
pkg = NULL;
|
||||
if (strstr(argv[i], ".apk") != NULL) {
|
||||
struct apk_sign_ctx sctx;
|
||||
|
||||
for (j = 0; j < name->pkgs->num; j++) {
|
||||
if (name->pkgs->item[j]->ipkg != NULL)
|
||||
apk_sign_ctx_init(&sctx, APK_SIGN_VERIFY_AND_GENERATE,
|
||||
NULL, db->keys_fd);
|
||||
r = apk_pkg_read(db, argv[i], &sctx, &pkg);
|
||||
apk_sign_ctx_free(&sctx);
|
||||
if (r != 0) {
|
||||
apk_error("%s: %s", argv[i], apk_error_str(r));
|
||||
goto err;
|
||||
}
|
||||
name = pkg->name;
|
||||
} else {
|
||||
name = apk_db_get_name(db, APK_BLOB_STR(argv[i]));
|
||||
for (j = 0; name && name->pkgs && j < name->pkgs->num; j++) {
|
||||
if (name->pkgs->item[j]->ipkg != NULL) {
|
||||
pkg = name->pkgs->item[j];
|
||||
break;
|
||||
}
|
||||
if (j >= name->pkgs->num) {
|
||||
apk_error("Package '%s' is not installed", name->name);
|
||||
}
|
||||
}
|
||||
if (pkg == NULL || pkg->ipkg == NULL) {
|
||||
apk_error("%s is not installed", name->name);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (ctx->reinstall)
|
||||
name->flags |= APK_NAME_REINSTALL;
|
||||
pkgs[i] = pkg;
|
||||
}
|
||||
|
||||
for (i = 0; i < argc; i++) {
|
||||
struct apk_dependency dep;
|
||||
|
||||
r = apk_dep_from_blob(&dep, db, APK_BLOB_STR(argv[i]));
|
||||
if (r != 0)
|
||||
goto err;
|
||||
|
||||
r = apk_state_lock_dependency(state, &dep);
|
||||
r = apk_state_lock_name(state, pkg->name, pkg);
|
||||
if (r != 0) {
|
||||
if (!(apk_flags & APK_FORCE))
|
||||
goto err;
|
||||
|
|
|
@ -352,11 +352,6 @@ void apk_sign_ctx_init(struct apk_sign_ctx *ctx, int action,
|
|||
ctx->keys_fd = keys_fd;
|
||||
ctx->action = action;
|
||||
switch (action) {
|
||||
case APK_SIGN_NONE:
|
||||
ctx->md = EVP_md_null();
|
||||
ctx->control_started = 1;
|
||||
ctx->data_started = 1;
|
||||
break;
|
||||
case APK_SIGN_VERIFY:
|
||||
ctx->md = EVP_md_null();
|
||||
break;
|
||||
|
@ -377,10 +372,14 @@ void apk_sign_ctx_init(struct apk_sign_ctx *ctx, int action,
|
|||
break;
|
||||
case APK_SIGN_GENERATE:
|
||||
case APK_SIGN_VERIFY_AND_GENERATE:
|
||||
default:
|
||||
action = APK_SIGN_GENERATE;
|
||||
ctx->md = EVP_sha1();
|
||||
break;
|
||||
default:
|
||||
action = APK_SIGN_NONE;
|
||||
ctx->md = EVP_md_null();
|
||||
ctx->control_started = 1;
|
||||
ctx->data_started = 1;
|
||||
break;
|
||||
}
|
||||
EVP_MD_CTX_init(&ctx->mdctx);
|
||||
EVP_DigestInit_ex(&ctx->mdctx, ctx->md, NULL);
|
||||
|
@ -421,7 +420,8 @@ int apk_sign_ctx_process_file(struct apk_sign_ctx *ctx,
|
|||
ctx->num_signatures++;
|
||||
|
||||
/* Found already a trusted key */
|
||||
if (ctx->action != APK_SIGN_VERIFY ||
|
||||
if ((ctx->action != APK_SIGN_VERIFY &&
|
||||
ctx->action != APK_SIGN_VERIFY_AND_GENERATE) ||
|
||||
ctx->signature.pkey != NULL)
|
||||
return 0;
|
||||
|
||||
|
|
Loading…
Reference in New Issue