summaryrefslogtreecommitdiffstats
path: root/src/Daemon/RPM.cpp
diff options
context:
space:
mode:
authorNikola Pajkovsky <npajkovs@redhat.com>2010-08-05 10:29:29 +0200
committerNikola Pajkovsky <npajkovs@redhat.com>2010-08-10 09:56:19 +0200
commit952420f6b5843e7f16474e3fd288bd8585c05373 (patch)
tree97edda09a9f54fd344ec2f32644383856b169524 /src/Daemon/RPM.cpp
parent7037aa0c7ad092d2228cf82b0ef5096cdabe9019 (diff)
downloadabrt-952420f6b5843e7f16474e3fd288bd8585c05373.tar.gz
abrt-952420f6b5843e7f16474e3fd288bd8585c05373.tar.xz
abrt-952420f6b5843e7f16474e3fd288bd8585c05373.zip
rewrite rpm to pure C
Signed-off-by: Nikola Pajkovsky <npajkovs@redhat.com>
Diffstat (limited to 'src/Daemon/RPM.cpp')
-rw-r--r--src/Daemon/RPM.cpp232
1 files changed, 129 insertions, 103 deletions
diff --git a/src/Daemon/RPM.cpp b/src/Daemon/RPM.cpp
index fd25b499..60f896a6 100644
--- a/src/Daemon/RPM.cpp
+++ b/src/Daemon/RPM.cpp
@@ -18,180 +18,206 @@
*/
#include "abrtlib.h"
#include "RPM.h"
+#include <rpm/header.h>
+#include <rpm/rpmts.h>
#include "comm_layer_inner.h"
+#include <glib.h>
-CRPM::CRPM()
+/**
+* A set, which contains finger prints.
+*/
+
+static GList *list_fingerprints = NULL;
+
+void rpm_init()
{
- static const char *const argv[] = { "", NULL };
- m_poptContext = rpmcliInit(1, (char**)argv, NULL);
+ int status = rpmReadConfigFiles((const char*)NULL, (const char*)NULL);
+ if (status != 0)
+ error_msg("error reading rc files");
+
+ list_fingerprints = g_list_alloc();
}
-CRPM::~CRPM()
+static void list_free(gpointer data, gpointer user_data)
+{
+ free(data);
+}
+
+void rpm_destroy()
{
- rpmFreeCrypto();
rpmFreeRpmrc();
- rpmcliFini(m_poptContext);
+ rpmFreeCrypto();
+
+ g_list_foreach(list_fingerprints, list_free, NULL);
+ g_list_free(list_fingerprints);
}
-void CRPM::LoadOpenGPGPublicKey(const char* pFileName)
+void rpm_load_gpgkey(const char* filename)
{
- uint8_t* pkt = NULL;
+ uint8_t *pkt = NULL;
size_t pklen;
- pgpKeyID_t keyID;
- if (pgpReadPkts(pFileName, &pkt, &pklen) != PGPARMOR_PUBKEY)
+ if (pgpReadPkts(filename, &pkt, &pklen) != PGPARMOR_PUBKEY)
{
free(pkt);
- error_msg("Can't load public GPG key %s", pFileName);
+ error_msg("Can't load public GPG key %s", filename);
return;
}
+
+ uint8_t keyID[8];
if (pgpPubkeyFingerprint(pkt, pklen, keyID) == 0)
{
- char* fedoraFingerprint = pgpHexStr(keyID, sizeof(keyID));
- if (fedoraFingerprint != NULL)
- {
- m_setFingerprints.insert(fedoraFingerprint);
- free(fedoraFingerprint);
- }
+ char *fingerprint = pgpHexStr(keyID, sizeof(keyID));
+ if (fingerprint != NULL)
+ g_list_append(list_fingerprints, fingerprint);
}
free(pkt);
}
-bool CRPM::CheckFingerprint(const char* pPackage)
+bool rpm_chk_fingerprint(const char* pkg)
{
bool ret = false;
+ char *pgpsig = NULL;
+ const char *errmsg = NULL;
+
rpmts ts = rpmtsCreate();
- rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage, 0);
+ rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pkg, 0);
Header header = rpmdbNextIterator(iter);
- if (header != NULL)
+ if (!header)
+ goto error;
+
+ pgpsig = headerFormat(header, "%{SIGGPG:pgpsig}", &errmsg);
+ if (!pgpsig && errmsg)
{
- rpmTag rpmTags[] = { RPMTAG_DSAHEADER, RPMTAG_RSAHEADER, RPMTAG_SHA1HEADER };
- int ii;
- for (ii = 0; ii < 3; ii++)
+ VERB1 log("cannot get siggpg:pgpsig. reason: %s", errmsg);
+ goto error;
+ }
+
+ {
+ char *pgpsig_tmp = strstr(pgpsig, " Key ID ");
+ if (pgpsig_tmp)
{
- if (headerIsEntry(header, rpmTags[ii]))
- {
- rpmtd td = rpmtdNew();
- headerGet(header, rpmTags[ii] , td, HEADERGET_DEFAULT);
- char* pgpsig = rpmtdFormat(td, RPMTD_FORMAT_PGPSIG , NULL);
- rpmtdFree(td);
- if (pgpsig)
- {
- std::string PGPSignatureText = pgpsig;
- free(pgpsig);
-
- size_t Key_ID_pos = PGPSignatureText.find(" Key ID ");
- if (Key_ID_pos != std::string::npos)
- {
- std::string headerFingerprint = PGPSignatureText.substr(Key_ID_pos + sizeof (" Key ID ") - 1);
-
- if (headerFingerprint != "")
- {
- if (m_setFingerprints.find(headerFingerprint) != m_setFingerprints.end())
- {
- ret = true;
- break;
- }
- }
- }
- }
- }
+ pgpsig_tmp += sizeof(" Key ID ") - 1;
+ ret = g_list_find(list_fingerprints, pgpsig_tmp) != NULL;
}
}
+
+error:
+ free(pgpsig);
rpmdbFreeIterator(iter);
rpmtsFree(ts);
return ret;
}
+/*
+ Checking the MD5 sum requires to run prelink to "un-prelink" the
+ binaries - this is considered potential security risk so we don't
+ use it, until we find some non-intrusive way
+*/
+
+/*
+ * Not woking, need to be rewriten
+ *
bool CheckHash(const char* pPackage, const char* pPath)
{
- bool ret = false;
+ bool ret = true;
rpmts ts = rpmtsCreate();
rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage, 0);
Header header = rpmdbNextIterator(iter);
- if (header != NULL)
- {
- rpmfi fi = rpmfiNew(ts, header, RPMTAG_BASENAMES, RPMFI_NOHEADER);
- pgpHashAlgo hashAlgo;
- std::string headerHash;
- char computedHash[1024] = "";
+ if (header == NULL)
+ goto error;
- while (rpmfiNext(fi) != -1)
+ rpmfi fi = rpmfiNew(ts, header, RPMTAG_BASENAMES, RPMFI_NOHEADER);
+ pgpHashAlgo hashAlgo;
+ std::string headerHash;
+ char computedHash[1024] = "";
+
+ while (rpmfiNext(fi) != -1)
+ {
+ if (strcmp(pPath, rpmfiFN(fi)) == 0)
{
- if (strcmp(pPath, rpmfiFN(fi)) == 0)
- {
- headerHash = rpmfiFDigestHex(fi, &hashAlgo);
- rpmDoDigest(hashAlgo, pPath, 1, (unsigned char*) computedHash, NULL);
- ret = (headerHash != "" && headerHash == computedHash);
- break;
- }
+ headerHash = rpmfiFDigestHex(fi, &hashAlgo);
+ rpmDoDigest(hashAlgo, pPath, 1, (unsigned char*) computedHash, NULL);
+ ret = (headerHash != "" && headerHash == computedHash);
+ break;
}
- rpmfiFree(fi);
}
+ rpmfiFree(fi);
+error:
rpmdbFreeIterator(iter);
rpmtsFree(ts);
return ret;
}
+*/
-std::string GetDescription(const char* pPackage)
+char* rpm_get_description(const char* pkg)
{
- std::string pDescription;
+ char *dsc = NULL;
+ const char *errmsg = NULL;
rpmts ts = rpmtsCreate();
- rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage, 0);
+
+ rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pkg, 0);
Header header = rpmdbNextIterator(iter);
- if (header != NULL)
- {
- rpmtd td = rpmtdNew();
- headerGet(header, RPMTAG_SUMMARY, td, HEADERGET_DEFAULT);
- const char* summary = rpmtdGetString(td);
- headerGet(header, RPMTAG_DESCRIPTION, td, HEADERGET_DEFAULT);
- const char* description = rpmtdGetString(td);
- pDescription = summary + std::string("\n\n") + description;
- rpmtdFree(td);
- }
+ if (!header)
+ goto error;
+
+ dsc = headerFormat(header, "%{SUMMARY}\n\n%{DESCRIPTION}", &errmsg);
+ if (!dsc && errmsg)
+ error_msg("cannot get summary and description. reason: %s", errmsg);
+
+error:
rpmdbFreeIterator(iter);
rpmtsFree(ts);
- return pDescription;
+ return dsc;
}
-std::string GetComponent(const char* pFileName)
+char* rpm_get_component(const char* filename)
{
- std::string ret;
- char *package_name;
+ char *ret = NULL;
+ char *srpm = NULL;
+ const char *errmsg = NULL;
+
rpmts ts = rpmtsCreate();
- rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_BASENAMES, pFileName, 0);
+ rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_BASENAMES, filename, 0);
Header header = rpmdbNextIterator(iter);
- if (header != NULL)
+ if (!header)
+ goto error;
+
+ srpm = headerFormat(header, "%{SOURCERPM}", &errmsg);
+ if (!srpm && errmsg)
{
- rpmtd td = rpmtdNew();
- headerGet(header, RPMTAG_SOURCERPM, td, HEADERGET_DEFAULT);
- const char * srpm = rpmtdGetString(td);
- if (srpm != NULL)
- {
- package_name = get_package_name_from_NVR_or_NULL(srpm);
- ret = std::string(package_name);
- free(package_name);
- }
- rpmtdFree(td);
+ error_msg("cannot get srpm. reason: %s", errmsg);
+ goto error;
}
+ ret = get_package_name_from_NVR_or_NULL(srpm);
+ free(srpm);
+
+error:
rpmdbFreeIterator(iter);
rpmtsFree(ts);
return ret;
}
-char* GetPackage(const char* pFileName)
+// caller is responsible to free returned value
+char* rpm_get_package_nvr(const char* filename)
{
- char* ret = NULL;
+ char* nvr = NULL;
+ const char *errmsg = NULL;
+
rpmts ts = rpmtsCreate();
- rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_BASENAMES, pFileName, 0);
+ rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_BASENAMES, filename, 0);
Header header = rpmdbNextIterator(iter);
- if (header != NULL)
- {
- ret = headerGetNEVR(header, NULL);
- }
+ if (!header)
+ goto error;
+
+ nvr = headerFormat(header, "%{NAME}-%{VERSION}-%{RELEASE}", &errmsg);
+ if (!nvr && errmsg)
+ error_msg("cannot get nvr. reason: %s", errmsg);
+
+error:
rpmdbFreeIterator(iter);
rpmtsFree(ts);
- return ret;
+ return nvr;
}