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 | |
| 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')
| -rw-r--r-- | lib/MiddleWare/Makefile.am | 13 | ||||
| -rw-r--r-- | lib/MiddleWare/MiddleWare.cpp | 47 | ||||
| -rw-r--r-- | lib/MiddleWare/MiddleWare.h | 5 | ||||
| -rw-r--r-- | lib/MiddleWare/RPMInfo.cpp | 119 | ||||
| -rw-r--r-- | lib/MiddleWare/RPMInfo.h | 52 | ||||
| -rw-r--r-- | lib/MiddleWare/crash-catcher.conf (renamed from lib/MiddleWare/CrashCatcher.conf) | 4 | ||||
| -rw-r--r-- | lib/MiddleWare/test.cpp | 3 |
7 files changed, 225 insertions, 18 deletions
diff --git a/lib/MiddleWare/Makefile.am b/lib/MiddleWare/Makefile.am index 2b63f85..f95253f 100644 --- a/lib/MiddleWare/Makefile.am +++ b/lib/MiddleWare/Makefile.am @@ -2,17 +2,20 @@ 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 -libMiddleWare_la_LIBADD = $(DL_LIBS) ../Utils/libUtils.la + DynamicLibrary.h Settings.h Settings.cpp \ + RPMInfo.cpp RPMInfo.h Plugin.h CrashTypes.h \ + MiddleWareTypes.h Application.h Database.h \ + Reporter.h Language.h +libMiddleWare_la_LIBADD = $(DL_LIBS) ../Utils/libUtils.la $(RPM_LIBS) libMiddleWare_la_LDFLAGS = -version-info 0:1:0 -libMiddleWare_la_CPPFLAGS = -I$(srcdir)/../Utils +libMiddleWare_la_CPPFLAGS = -I$(srcdir)/../Utils $(RPM_CFLAGS) middlewareconfdir = $(CONF_DIR) -middlewareconf_DATA = CrashCatcher.conf +dist_middlewareconf_DATA = crash-catcher.conf check_PROGRAMS = test test_SOURCES = test.cpp -test_LDADD = ../Utils/libUtils.la libMiddleWare.la $(DL_LIBS) +test_LDADD = ../Utils/libUtils.la libMiddleWare.la $(DL_LIBS) $(RPM_LIBS) test_CPPFLAGS = -I$(srcdir)/../Utils \ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ diff --git a/lib/MiddleWare/MiddleWare.cpp b/lib/MiddleWare/MiddleWare.cpp index 2f86c00..f4f50df 100644 --- a/lib/MiddleWare/MiddleWare.cpp +++ b/lib/MiddleWare/MiddleWare.cpp @@ -26,7 +26,8 @@ CMiddleWare::CMiddleWare(const std::string& pPlugisConfDir, const std::string& pPlugisLibDir, const std::string& pMiddleWareConfFile) : - m_pPluginManager(NULL) + m_pPluginManager(NULL), + m_bOpenGPGCheck(true) { m_pPluginManager = new CPluginManager(pPlugisConfDir, pPlugisLibDir); if (m_pPluginManager == NULL) @@ -61,6 +62,19 @@ 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("EnableOpenGPG") != settings.end()) + { + m_bOpenGPGCheck = settings["EnableOpenGPG"] == "yes"; + } if (settings.find("Database") != settings.end()) { m_sDatabase = settings["Database"]; @@ -211,7 +225,7 @@ void CMiddleWare::Report(const crash_context_t& pCrashContext, database->SetReported(pCrashContext.m_sUUID, pCrashContext.m_sUID); database->DisConnect(); } - +#include <iostream> int CMiddleWare::SaveDebugDump(const std::string& pDebugDumpDir, crash_info_t& pCrashInfo) { CDatabase* database = m_pPluginManager->GetDatabase(m_sDatabase); @@ -225,15 +239,25 @@ 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); - - if (package == "" || - m_setBlackList.find(package.substr(0, package.find("-"))) != m_setBlackList.end()) + dd.LoadText(FILENAME_EXECUTABLE, executable); + package = m_RPMInfo.GetPackage(executable); + std::string packageName = package.substr(0, package.rfind("-", package.rfind("-") - 1)); + if (packageName == "" || + (m_setBlackList.find(packageName) != m_setBlackList.end())) { - dd.Delete(pDebugDumpDir); + dd.Delete(); return 0; } + if (m_bOpenGPGCheck) + { + if (!m_RPMInfo.CheckFingerprint(packageName) || + !m_RPMInfo.CheckHash(packageName, executable)) + { + dd.Delete(); + return 0; + } + } + dd.SaveText(FILENAME_PACKAGE, package); if (dd.Exist(FILENAME_APPLICATION)) { @@ -252,8 +276,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(); @@ -263,12 +287,12 @@ int CMiddleWare::SaveDebugDump(const std::string& pDebugDumpDir, crash_info_t& p if (row.m_sReported == "1") { - dd.Delete(pDebugDumpDir); + dd.Delete(); return 0; } if (row.m_sCount != "1") { - dd.Delete(pDebugDumpDir); + dd.Delete(); } dd.Close(); @@ -300,6 +324,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 ed94f8b..d2cd8a2 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,14 +35,18 @@ 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<std::string, set_reporters_t> 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; + bool m_bOpenGPGCheck; std::string GetLocalUUIDLanguage(const std::string& pLanguage, const std::string& pDebugDumpDir); 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; +} + diff --git a/lib/MiddleWare/RPMInfo.h b/lib/MiddleWare/RPMInfo.h new file mode 100644 index 0000000..2850fd6 --- /dev/null +++ b/lib/MiddleWare/RPMInfo.h @@ -0,0 +1,52 @@ +/* + RPMInfo.h - header file for rpm database + - it implements query for local rpm database + + Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com) + Copyright (C) 2009 RedHat inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef RPMINFO_H_ +#define RPMINFO_H_ + +#include "MiddleWareTypes.h" + +#include <rpm/rpmcli.h> +#include <rpm/rpmts.h> +#include <rpm/rpmdb.h> + +class CRPMInfo +{ + private: + + typedef set_strings_t set_fingerprints_t; + + poptContext m_poptContext; + set_fingerprints_t m_setFingerprints; + + public: + CRPMInfo(); + ~CRPMInfo(); + + void LoadOpenGPGPublicKey(const std::string& pFileName); + + bool CheckFingerprint(const std::string& pPackage); + bool CheckHash(const std::string& pPackage, const std::string&pPath); + std::string GetPackage(const std::string& pFileName); +}; + +#endif /* RPMINFO_H_ */ diff --git a/lib/MiddleWare/CrashCatcher.conf b/lib/MiddleWare/crash-catcher.conf index e865ebe..d8adce7 100644 --- a/lib/MiddleWare/CrashCatcher.conf +++ b/lib/MiddleWare/crash-catcher.conf @@ -1,4 +1,8 @@ # test conf file. it will be generated in the future +# Enable GPG check +EnableOpenGPG = yes +# GPG keys +OpenGPGPublicKeys = /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora # blacklisted packages BlackList = bash, bind, apache2 # enabled plugins diff --git a/lib/MiddleWare/test.cpp b/lib/MiddleWare/test.cpp index c9e849a..3c2a055 100644 --- a/lib/MiddleWare/test.cpp +++ b/lib/MiddleWare/test.cpp @@ -35,14 +35,13 @@ int main(int argc, char** argv) { CMiddleWare middleWare(PLUGINS_CONF_DIR, PLUGINS_LIB_DIR, - std::string(CONF_DIR) + "/CrashCatcher.conf"); + std::string(CONF_DIR) + "/crash-catcher.conf"); /* Create DebugDump */ CDebugDump dd; char pid[100]; sprintf(pid, "%d", getpid()); dd.Create(std::string(DEBUG_DUMPS_DIR)+"/"+pid); dd.SaveProc(pid); - dd.SavePackage(); dd.SaveText(FILENAME_LANGUAGE, "CCpp"); dd.SaveBinary(FILENAME_BINARYDATA1, "ass0-9as", sizeof("ass0-9as")); |
