From 9d8a7ce14916854334d09e4850902aa572091b6a Mon Sep 17 00:00:00 2001 From: Florian Festi Date: Mon, 14 Oct 2024 12:25:24 +0200 Subject: [PATCH] Pass rpmPubkey instance to rpmtxnDeletePubkey Use the matchingKeys() in rpmkeys to acquire thos instances. Use EXIT_FAILURE as exit code for rpmkeys --delete instead of the count of errors. --- include/rpm/rpmts.h | 3 ++- lib/rpmts.cc | 16 +++++----------- tests/rpmsigdig.at | 4 ++-- tools/rpmkeys.cc | 22 ++++++++-------------- 4 files changed, 17 insertions(+), 28 deletions(-) diff --git a/include/rpm/rpmts.h b/include/rpm/rpmts.h index 7c92a605b3..21083da726 100644 --- a/include/rpm/rpmts.h +++ b/include/rpm/rpmts.h @@ -14,6 +14,7 @@ #include #include #include +#include #ifdef __cplusplus extern "C" { @@ -359,7 +360,7 @@ rpmRC rpmtxnImportPubkey(rpmtxn txn, const unsigned char * pkt, size_t pktlen); * RPMRC_NOKEY on invalid keyid * RPMRC_FAIL on other failure */ -rpmRC rpmtxnDeletePubkey(rpmtxn txn, const char *keyid); +rpmRC rpmtxnDeletePubkey(rpmtxn txn, rpmPubkey key); /** \ingroup rpmts * Retrieve handle for keyring used for this transaction set diff --git a/lib/rpmts.cc b/lib/rpmts.cc index 6ba46a7c1b..80492e031c 100644 --- a/lib/rpmts.cc +++ b/lib/rpmts.cc @@ -781,17 +781,10 @@ rpmRC rpmtxnImportPubkey(rpmtxn txn, const unsigned char * pkt, size_t pktlen) return rc; } -rpmRC rpmtxnDeletePubkey(rpmtxn txn, const char *keyid) +rpmRC rpmtxnDeletePubkey(rpmtxn txn, rpmPubkey key) { rpmRC rc = RPMRC_FAIL; - size_t klen = strlen(keyid); - - /* Allow short keyid while we're transitioning */ - if (klen != 40 && klen != 16 && klen != 8) - return RPMRC_NOKEY; - - if (!rpmIsValidHex(keyid, klen)) - return RPMRC_NOKEY; + char * keyid = rpmPubkeyKeyIDAsHex(key); if (txn) { /* force keyring load */ @@ -804,12 +797,13 @@ rpmRC rpmtxnDeletePubkey(rpmtxn txn, const char *keyid) rc = RPMRC_OK; if (!(rpmtsFlags(txn->ts) & RPMTRANS_FLAG_TEST)) { if (txn->ts->keyringtype == KEYRING_FS) - rc = rpmtsDeleteFSKey(txn, keyid); + rc = rpmtsDeleteFSKey(txn, keyid+8); else - rc = rpmtsDeleteDBKey(txn, keyid); + rc = rpmtsDeleteDBKey(txn, keyid+8); } rpmKeyringFree(keyring); } + free(keyid); return rc; } diff --git a/tests/rpmsigdig.at b/tests/rpmsigdig.at index e3209a36d0..2d75b83959 100644 --- a/tests/rpmsigdig.at +++ b/tests/rpmsigdig.at @@ -78,7 +78,7 @@ runroot rpmkeys -Kv /data/RPMS/hello-2.0-1.x86_64-signed-with-new-subkey.rpm RPMTEST_CHECK([ runroot rpmkeys --delete abcd gimmekey 1111aaaa2222bbbb ], -[3], +[1], [], [error: invalid key id: abcd error: invalid key id: gimmekey @@ -147,7 +147,7 @@ runroot rpmkeys -Kv /data/RPMS/hello-2.0-1.x86_64-signed-with-new-subkey.rpm RPMTEST_CHECK([ runroot rpmkeys --delete abcd gimmekey 1111aaaa2222bbbb ], -[3], +[1], [], [error: invalid key id: abcd error: invalid key id: gimmekey diff --git a/tools/rpmkeys.cc b/tools/rpmkeys.cc index 731d086d83..488f5ca545 100644 --- a/tools/rpmkeys.cc +++ b/tools/rpmkeys.cc @@ -107,6 +107,13 @@ static int printKey(rpmPubkey key, void * data) return 0; } +static int deleteKey(rpmPubkey key, void * data) +{ + rpmtxn txn = (rpmtxn) data; + rpmtxnDeletePubkey(txn, key); + return 0; +} + int main(int argc, char *argv[]) { int ec = EXIT_FAILURE; @@ -144,20 +151,7 @@ int main(int argc, char *argv[]) { rpmtxn txn = rpmtxnBegin(ts, RPMTXN_WRITE); if (txn) { - int nfail = 0; - for (char const * const *arg = args; *arg && **arg; arg++) { - rpmRC delrc = rpmtxnDeletePubkey(txn, *arg); - if (delrc) { - if (delrc == RPMRC_NOTFOUND) - rpmlog(RPMLOG_ERR, ("key not found: %s\n"), *arg); - else if (delrc == RPMRC_NOKEY) - rpmlog(RPMLOG_ERR, ("invalid key id: %s\n"), *arg); - else if (delrc == RPMRC_FAIL) - rpmlog(RPMLOG_ERR, ("failed to delete key: %s\n"), *arg); - nfail++; - } - } - ec = nfail; + ec = matchingKeys(keyring, args, txn, deleteKey); rpmtxnEnd(txn); } break;