diff options
| author | Jiri Moskovcak <jmoskovc@redhat.com> | 2009-02-19 15:23:00 +0100 |
|---|---|---|
| committer | Jiri Moskovcak <jmoskovc@redhat.com> | 2009-02-19 15:23:00 +0100 |
| commit | 2f907417d37d83cefad7950397bd141c0586b1d5 (patch) | |
| tree | 12d58967607cac7f300e7dcaee456fdfe9bd95a1 /lib/MiddleWare/RPMInfo.cpp | |
| parent | b472b75f70c7e9144fb29f9d142e9f52f4caab39 (diff) | |
| parent | 0c899d52e5e42caf8c5c394ef6c142c08ac38858 (diff) | |
| download | abrt-2f907417d37d83cefad7950397bd141c0586b1d5.tar.gz abrt-2f907417d37d83cefad7950397bd141c0586b1d5.tar.xz abrt-2f907417d37d83cefad7950397bd141c0586b1d5.zip | |
Merge branch 'master' of git://git.fedorahosted.org/git/crash-catcher
Conflicts:
lib/DBus/Makefile.am
lib/DBus/dbus-crash-catcher.conf
lib/DBus/dbus-crashcatcher.conf
src/Daemon/Makefile.am
src/Daemon/dbus-crashcatcher.conf
Diffstat (limited to 'lib/MiddleWare/RPMInfo.cpp')
| -rw-r--r-- | lib/MiddleWare/RPMInfo.cpp | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/lib/MiddleWare/RPMInfo.cpp b/lib/MiddleWare/RPMInfo.cpp new file mode 100644 index 0000000..55dccd2 --- /dev/null +++ b/lib/MiddleWare/RPMInfo.cpp @@ -0,0 +1,119 @@ +#include "RPMInfo.h" +#include <iostream> + +CRPMInfo::CRPMInfo() +{ + char *argv[] = {(char*)""}; + m_poptContext = rpmcliInit(0, argv, NULL); +} + +CRPMInfo::~CRPMInfo() +{ + rpmcliFini(m_poptContext); +} + +void CRPMInfo::LoadOpenGPGPublicKey(const std::string& pFileName) +{ + uint8_t* pkt = NULL; + size_t pklen; + pgpKeyID_t keyID; + pgpReadPkts(pFileName.c_str(), &pkt, &pklen); + if (pgpPubkeyFingerprint(pkt, pklen, keyID) == 0) + { + char* fedoraFingerprint = pgpHexStr(keyID, sizeof(keyID)); + if (fedoraFingerprint != NULL) + { + m_setFingerprints.insert(fedoraFingerprint); + } + } + if (pkt) + { + free(pkt); + } +} + +bool CRPMInfo::CheckFingerprint(const std::string& pPackage) +{ + bool ret = false; + rpmts ts = rpmtsCreate(); + rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage.c_str(), 0); + Header header; + if ((header = rpmdbNextIterator(iter)) != NULL) + { + if (headerIsEntry(header, RPMTAG_SIGGPG)) + { + char* headerFingerprint; + rpmtd td = rpmtdNew(); + headerGet(header, RPMTAG_SIGGPG, td, HEADERGET_DEFAULT); + headerFingerprint = pgpHexStr((const uint8_t*)td->data + 9, sizeof(pgpKeyID_t)); + rpmtdFree(td); + if (headerFingerprint != NULL) + { + if (m_setFingerprints.find(headerFingerprint) != m_setFingerprints.end()) + { + free(headerFingerprint); + ret = true; + } + } + } + } + rpmdbFreeIterator(iter); + rpmtsFree(ts); + return ret; +} + +bool CRPMInfo::CheckHash(const std::string& pPackage, const std::string& pPath) +{ + bool ret = false; + rpmts ts = rpmtsCreate(); + rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage.c_str(), 0); + Header header; + if ((header = rpmdbNextIterator(iter)) != NULL) + { + rpmfi fi = rpmfiNew(ts, header, RPMTAG_BASENAMES, 0); + pgpHashAlgo hashAlgo; + std::string headerHash; + char computedHash[1024] = ""; + + while(rpmfiNext(fi) != -1) + { + if (pPath == rpmfiFN(fi)) + { + headerHash = rpmfiFDigestHex(fi, &hashAlgo); + } + } + rpmfiFree(fi); + + rpmDoDigest(hashAlgo, pPath.c_str(), 1, (unsigned char*) computedHash, NULL); + + if (headerHash != "" && headerHash == computedHash) + { + ret = true; + } + } + rpmdbFreeIterator(iter); + rpmtsFree(ts); + return ret; +} + +std::string CRPMInfo::GetPackage(const std::string& pFileName) +{ + std::string ret = ""; + rpmts ts = rpmtsCreate(); + rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_BASENAMES, pFileName.c_str(), 0); + Header header; + if ((header = rpmdbNextIterator(iter)) != NULL) + { + char* nerv = headerGetNEVR(header, NULL); + if (nerv != NULL) + { + ret = nerv; + free(nerv); + } + } + + rpmdbFreeIterator(iter); + rpmtsFree(ts); + return ret; +} + |
