From 1b1d9e234abb9cbba7f722d32e7a0eb9dfe267d1 Mon Sep 17 00:00:00 2001 From: Zdenek Prikryl Date: Wed, 18 Feb 2009 17:23:26 +0100 Subject: new logic of getting package name --- lib/MiddleWare/CrashCatcher.conf | 2 + lib/MiddleWare/Makefile.am | 3 +- lib/MiddleWare/MiddleWare.cpp | 20 ++++++-- lib/MiddleWare/MiddleWare.h | 4 ++ lib/Utils/DebugDump.cpp | 25 +++------ lib/Utils/DebugDump.h | 1 - lib/Utils/Packages.cpp | 107 --------------------------------------- lib/Utils/Packages.h | 13 +---- src/Hooks/CCpp.cpp | 1 - 9 files changed, 33 insertions(+), 143 deletions(-) diff --git a/lib/MiddleWare/CrashCatcher.conf b/lib/MiddleWare/CrashCatcher.conf index e865ebec..6684d37a 100644 --- a/lib/MiddleWare/CrashCatcher.conf +++ b/lib/MiddleWare/CrashCatcher.conf @@ -1,4 +1,6 @@ # test conf file. it will be generated in the future +# GPG keys +OpenGPGPublicKeys = /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora # blacklisted packages BlackList = bash, bind, apache2 # enabled plugins diff --git a/lib/MiddleWare/Makefile.am b/lib/MiddleWare/Makefile.am index 2b63f856..cb4de945 100644 --- a/lib/MiddleWare/Makefile.am +++ b/lib/MiddleWare/Makefile.am @@ -2,7 +2,8 @@ lib_LTLIBRARIES = libMiddleWare.la libMiddleWare_la_SOURCES = MiddleWare.cpp MiddleWare.h PluginManager.cpp \ PluginManager.h CrashCatcherPlugin.cpp \ CrashCatcherPlugin.h DynamicLibrary.cpp \ - DynamicLibrary.h Settings.h Settings.cpp + DynamicLibrary.h Settings.h Settings.cpp \ + RPMInfo.cpp RPMInfo.h libMiddleWare_la_LIBADD = $(DL_LIBS) ../Utils/libUtils.la libMiddleWare_la_LDFLAGS = -version-info 0:1:0 libMiddleWare_la_CPPFLAGS = -I$(srcdir)/../Utils diff --git a/lib/MiddleWare/MiddleWare.cpp b/lib/MiddleWare/MiddleWare.cpp index 2f86c006..9bb2f9dd 100644 --- a/lib/MiddleWare/MiddleWare.cpp +++ b/lib/MiddleWare/MiddleWare.cpp @@ -61,6 +61,15 @@ void CMiddleWare::LoadSettings(const std::string& pPath) { parse_settings(settings["EnabledPlugins"], m_setEnabledPlugins); } + if (settings.find("OpenGPGPublicKeys") != settings.end()) + { + parse_settings(settings["OpenGPGPublicKeys"], m_setOpenGPGKeys); + set_opengpg_keys_t::iterator it_k; + for (it_k = m_setOpenGPGKeys.begin(); it_k != m_setOpenGPGKeys.end(); it_k++) + { + m_RPMInfo.LoadOpenGPGPublicKey(*it_k); + } + } if (settings.find("Database") != settings.end()) { m_sDatabase = settings["Database"]; @@ -225,15 +234,17 @@ int CMiddleWare::SaveDebugDump(const std::string& pDebugDumpDir, crash_info_t& p CDebugDump dd; dd.Open(pDebugDumpDir); - dd.LoadText(FILENAME_PACKAGE, package); - dd.LoadText(FILENAME_TIME, time); + dd.LoadText(FILENAME_EXECUTABLE, executable); + package = m_RPMInfo.GetPackage(executable); if (package == "" || - m_setBlackList.find(package.substr(0, package.find("-"))) != m_setBlackList.end()) + !m_RPMInfo.CheckFingerprint(package) || !m_RPMInfo.CheckHash(package, executable) || + (m_setBlackList.find(package.substr(0, package.find("-"))) != m_setBlackList.end())) { dd.Delete(pDebugDumpDir); return 0; } + dd.SaveText(FILENAME_PACKAGE, package); if (dd.Exist(FILENAME_APPLICATION)) { @@ -252,8 +263,8 @@ int CMiddleWare::SaveDebugDump(const std::string& pDebugDumpDir, crash_info_t& p throw std::string("CMiddleWare::SaveDebugDumpToDataBase(): Wrong UUID."); } + dd.LoadText(FILENAME_TIME, time); dd.LoadText(FILENAME_UID, UID); - dd.LoadText(FILENAME_EXECUTABLE, executable); database_row_t row; database->Connect(); @@ -300,6 +311,7 @@ vector_crash_infos_t CMiddleWare::GetCrashInfos(const std::string& pUID) info.m_sUUID = rows[ii].m_sUUID; info.m_sUID = rows[ii].m_sUID; info.m_sCount = rows[ii].m_sCount; + info.m_sTime = rows[ii].m_sTime; dd.Open(rows[ii].m_sDebugDumpDir); dd.LoadText(FILENAME_EXECUTABLE, data); diff --git a/lib/MiddleWare/MiddleWare.h b/lib/MiddleWare/MiddleWare.h index ed94f8ba..61f46aa3 100644 --- a/lib/MiddleWare/MiddleWare.h +++ b/lib/MiddleWare/MiddleWare.h @@ -27,6 +27,7 @@ #include "PluginManager.h" #include "CrashTypes.h" #include "MiddleWareTypes.h" +#include "RPMInfo.h" class CMiddleWare { @@ -34,11 +35,14 @@ class CMiddleWare typedef set_strings_t set_blacklist_t; typedef set_strings_t set_enabled_plugins_t; typedef set_strings_t set_reporters_t; + typedef set_strings_t set_opengpg_keys_t; typedef std::map map_plugin2reporters_t; CPluginManager* m_pPluginManager; + CRPMInfo m_RPMInfo; set_blacklist_t m_setBlackList; set_enabled_plugins_t m_setEnabledPlugins; + set_opengpg_keys_t m_setOpenGPGKeys; std::string m_sDatabase; map_plugin2reporters_t m_mapPlugin2Reporters; diff --git a/lib/Utils/DebugDump.cpp b/lib/Utils/DebugDump.cpp index f09de9ea..53861622 100644 --- a/lib/Utils/DebugDump.cpp +++ b/lib/Utils/DebugDump.cpp @@ -93,11 +93,12 @@ void CDebugDump::Lock() m_bUnlock = false; return; } - while (ExistFileDir(lockPath)) - { - std::cerr << "CDebugDump::Lock(): waiting..." << std::endl; - usleep(10); - } + } + + while (ExistFileDir(lockPath)) + { + std::cerr << "CDebugDump::Lock(): waiting..." << std::endl; + usleep(10); } if ((m_nFD = open(lockPath.c_str(), O_RDWR | O_CREAT, 0640)) < 0) @@ -106,6 +107,7 @@ void CDebugDump::Lock() } if (lockf(m_nFD,F_LOCK, 0) < 0) { + remove(lockPath.c_str()); throw std::string("CDebugDump::Lock(): cannot lock DebugDump"); } } @@ -334,16 +336,3 @@ void CDebugDump::SaveProc(const std::string& pPID) LoadTextFile(path, data); SaveText(FILENAME_CMDLINE, data); } - -void CDebugDump::SavePackage() -{ - std::string executable; - std::string package = ""; - if (Exist(FILENAME_EXECUTABLE)) - { - CPackages packages; - LoadText(FILENAME_EXECUTABLE, executable); - package = packages.SearchFile(executable); - } - SaveText(FILENAME_PACKAGE, package); -} diff --git a/lib/Utils/DebugDump.h b/lib/Utils/DebugDump.h index b32dfeba..08e26434 100644 --- a/lib/Utils/DebugDump.h +++ b/lib/Utils/DebugDump.h @@ -68,7 +68,6 @@ class CDebugDump void Close(); void SaveProc(const std::string& pPID); - void SavePackage(); bool Exist(const std::string& pFileName); diff --git a/lib/Utils/Packages.cpp b/lib/Utils/Packages.cpp index e93c2929..418331ba 100644 --- a/lib/Utils/Packages.cpp +++ b/lib/Utils/Packages.cpp @@ -20,7 +20,6 @@ */ #include "Packages.h" -#include #include @@ -30,29 +29,6 @@ CPackages::CPackages() : { g_type_init(); m_pPkClient = pk_client_new(); - - uint8_t* pkt = NULL; - size_t pklen; - pgpKeyID_t keyID; - char *argv[] = {(char*)""}; - poptContext context = rpmcliInit(0, argv, NULL); - - // TODO: make this configurable - - pgpReadPkts("/etc/pki/rpm-gpg/RPM-GPG-KEY-fedora", &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); - } - rpmcliFini(context); } CPackages::~CPackages() @@ -60,89 +36,6 @@ CPackages::~CPackages() g_object_unref(m_pPkClient); } -bool CPackages::CheckFingerprint(const Header& pHeader) -{ - if (!headerIsEntry(pHeader, RPMTAG_SIGGPG)) - { - return false; - } - std::cout << "aaa" << std::endl; - char* headerFingerprint; - rpmtd td = rpmtdNew(); - headerGet(pHeader, 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); - return false; - } - free(headerFingerprint); - return true; - } - return false; -} - -bool CPackages::CheckHash(const Header& pHeader, const rpmts& pTs, const std::string&pPath) -{ - rpmfi fi = rpmfiNew(pTs, pHeader, 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 == "" || std::string(computedHash) == "") - { - return false; - } - else if (headerHash == computedHash) - { - return true; - } - return false; -} - -std::string CPackages::SearchFile(const std::string& pPath) -{ - std::string ret = ""; - char *argv[] = {(char*)""}; - poptContext context = rpmcliInit(0, argv, NULL); - rpmts ts = rpmtsCreate(); - rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_BASENAMES, pPath.c_str(), 0); - Header header; - if ((header = rpmdbNextIterator(iter)) != NULL) - { - if (CheckFingerprint(header)) - { - char* nerv = headerGetNEVR(header, NULL); - if (nerv != NULL) - { - if (CheckHash(header, ts, pPath)) - { - ret = nerv; - free(nerv); - } - } - } - } - - rpmdbFreeIterator(iter); - rpmtsFree(ts); - rpmcliFini(context); - return ret; -} bool CPackages::Install(const std::string& pPackage) { diff --git a/lib/Utils/Packages.h b/lib/Utils/Packages.h index 67e5f247..4213de4a 100644 --- a/lib/Utils/Packages.h +++ b/lib/Utils/Packages.h @@ -25,28 +25,19 @@ #include #include #include -#include -#include -#include + class CPackages { private: - typedef std::set set_fingerprints_t; + PkClient *m_pPkClient; bool m_bBusy; - set_fingerprints_t m_setFingerprints; - - - bool CheckFingerprint(const Header& pHeader); - bool CheckHash(const Header& pHeader, const rpmts& pTs, const std::string&pPath); - public: CPackages(); ~CPackages(); - std::string SearchFile(const std::string& pPath); bool Install(const std::string& pPackage); bool GetInstallationStatus(); diff --git a/src/Hooks/CCpp.cpp b/src/Hooks/CCpp.cpp index 082c9d64..4d9124f8 100644 --- a/src/Hooks/CCpp.cpp +++ b/src/Hooks/CCpp.cpp @@ -62,7 +62,6 @@ int main(int argc, char** argv) dd.Create(path); dd.SaveProc(pid); dd.SaveText(FILENAME_LANGUAGE, "CCpp"); - dd.SavePackage(); int size = CORESTEP*sizeof(char); int ii = 0; -- cgit