diff --git a/src/Daemon/Makefile.am b/src/Daemon/Makefile.am index ef67726..9316aeb 100644 --- a/src/Daemon/Makefile.am +++ b/src/Daemon/Makefile.am @@ -24,6 +24,7 @@ abrtd_CPPFLAGS = \ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ $(GLIB_CFLAGS) \ $(DBUS_CFLAGS) \ + $(RPM_CFLAGS) \ $(XMLRPC_CFLAGS) $(XMLRPC_CLIENT_CFLAGS) \ $(ENABLE_SOCKET_OR_DBUS) \ -D_GNU_SOURCE \ diff --git a/src/Daemon/RPM.cpp b/src/Daemon/RPM.cpp index e4208a2..0b45877 100644 --- a/src/Daemon/RPM.cpp +++ b/src/Daemon/RPM.cpp @@ -28,7 +28,6 @@ CRPM::CRPM() CRPM::~CRPM() { - rpmFreeCrypto(); rpmFreeRpmrc(); rpmcliFini(m_poptContext); } @@ -50,7 +49,6 @@ void CRPM::LoadOpenGPGPublicKey(const char* pFileName) if (fedoraFingerprint != NULL) { m_setFingerprints.insert(fedoraFingerprint); - free(fedoraFingerprint); } } free(pkt); @@ -60,45 +58,38 @@ bool CRPM::CheckFingerprint(const char* pPackage) { bool ret = false; rpmts ts = rpmtsCreate(); - rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage, 0); - Header header = rpmdbNextIterator(iter); + rpmmi iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage, 0); + Header header = rpmmiNext(iter); if (header != NULL) { - rpmTag rpmTags[] = { RPMTAG_DSAHEADER, RPMTAG_RSAHEADER, RPMTAG_SHA1HEADER }; - int ii; - for (ii = 0; ii < 3; ii++) - { - 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; - } - } - } - } - } - } + char *pgpsig = headerSprintf( + header, + "%|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:" + "{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}|", + NULL, + NULL, + NULL); + 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; + } + } + } + } } - rpmdbFreeIterator(iter); + rpmmiFree(iter); rpmtsFree(ts); return ret; } @@ -107,28 +98,49 @@ bool CheckHash(const char* pPackage, const char* pPath) { bool ret = false; rpmts ts = rpmtsCreate(); - rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage, 0); - Header header = rpmdbNextIterator(iter); + rpmmi iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage, 0); + Header header = rpmmiNext(iter); if (header != NULL) { rpmfi fi = rpmfiNew(ts, header, RPMTAG_BASENAMES, 0); pgpHashAlgo hashAlgo; std::string headerHash; char computedHash[1024] = ""; + const unsigned char *digest = NULL; + char * pgpHex = NULL; + size_t lenp; + struct stat sb; + size_t digestlen = 0; + char buf[8*BUFSIZ]; + size_t nb; + int xx; while (rpmfiNext(fi) != -1) { if (strcmp(pPath, rpmfiFN(fi)) == 0) { - headerHash = rpmfiFDigestHex(fi, &hashAlgo); - rpmDoDigest(hashAlgo, pPath, 1, (unsigned char*) computedHash, NULL); + digest = rpmfiDigest(fi, reinterpret_cast(&hashAlgo), &lenp); + pgpHex = pgpHexStr(digest, lenp); + headerHash = std::string((const char*)digest, lenp*2); + + if(Stat(pPath, &sb) >= 0) { + DIGEST_CTX ctx = rpmDigestInit(hashAlgo, RPMDIGEST_NONE); + FD_t fd = Fopen(pPath, "r"); + + while ((nb = Fread(buf, sizeof(buf[0]), sizeof(buf), fd)) > 0) + xx = rpmDigestUpdate(ctx, buf, nb); + xx = Fclose(fd); fd = NULL; + xx = rpmDigestFinal(ctx, &digest, &digestlen, 0); + pgpHex = pgpHexStr(digest, digestlen); + snprintf(computedHash, digestlen*2, "%s", pgpHex); + } ret = (headerHash != "" && headerHash == computedHash); break; } } rpmfiFree(fi); } - rpmdbFreeIterator(iter); + rpmmiFree(iter); rpmtsFree(ts); return ret; } @@ -137,20 +149,26 @@ std::string GetDescription(const char* pPackage) { std::string pDescription; rpmts ts = rpmtsCreate(); - rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage, 0); - Header header = rpmdbNextIterator(iter); + rpmmi iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage, 0); + Header header = rpmmiNext(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); + HE_t he = (HE_t)memset(alloca(sizeof(*he)), 0, sizeof(*he)); + he->tag = RPMTAG_SUMMARY; + if(headerGet(header, he, 0)) + { + pDescription += he->p.str; + _free(he->p.ptr); + } + pDescription += "\n\n"; + he->tag = RPMTAG_DESCRIPTION; + if(headerGet(header, he, 0)) + { + pDescription += he->p.str; + _free(he->p.ptr); + } } - rpmdbFreeIterator(iter); - rpmtsFree(ts); + rpmmiFree(iter); return pDescription; } @@ -159,23 +177,21 @@ std::string GetComponent(const char* pFileName) std::string ret; char *package_name; rpmts ts = rpmtsCreate(); - rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_BASENAMES, pFileName, 0); - Header header = rpmdbNextIterator(iter); + rpmmi iter = rpmtsInitIterator(ts, RPMTAG_BASENAMES, pFileName, 0); + Header header = rpmmiNext(iter); if (header != NULL) { - rpmtd td = rpmtdNew(); - headerGet(header, RPMTAG_SOURCERPM, td, HEADERGET_DEFAULT); - const char * srpm = rpmtdGetString(td); - if (srpm != NULL) + HE_t he = (HE_t)memset(alloca(sizeof(*he)), 0, sizeof(*he)); + he->tag = RPMTAG_SOURCERPM; + if(headerGet(header, he, 0)) { - package_name = get_package_name_from_NVR_or_NULL(srpm); + package_name = get_package_name_from_NVR_or_NULL(he->p.str); ret = std::string(package_name); - free(package_name); + _free(he->p.ptr); } - rpmtdFree(td); } - rpmdbFreeIterator(iter); + rpmmiFree(iter); rpmtsFree(ts); return ret; } @@ -184,14 +200,14 @@ char* GetPackage(const char* pFileName) { char* ret = NULL; rpmts ts = rpmtsCreate(); - rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_BASENAMES, pFileName, 0); - Header header = rpmdbNextIterator(iter); + rpmmi iter = rpmtsInitIterator(ts, RPMTAG_BASENAMES, pFileName, 0); + Header header = rpmmiNext(iter); if (header != NULL) { - ret = headerGetNEVR(header, NULL); + ret = headerSprintf(header, "%{name}-%{version}-%{release}", NULL, NULL, NULL); } - rpmdbFreeIterator(iter); + rpmmiFree(iter); rpmtsFree(ts); return ret; } diff --git a/src/Daemon/RPM.h b/src/Daemon/RPM.h index 4df868d..db77137 100644 --- a/src/Daemon/RPM.h +++ b/src/Daemon/RPM.h @@ -22,9 +22,10 @@ #ifndef RPM_H_ #define RPM_H_ -#include -#include -#include +#include +#include +#include +#include #include "abrt_types.h" /**