diff options
author | Jiri Moskovcak <Mozkum@dhcp-lab-216.englab.brq.redhat.com> | 2009-11-01 23:25:19 +0100 |
---|---|---|
committer | Jiri Moskovcak <Mozkum@dhcp-lab-216.englab.brq.redhat.com> | 2009-11-01 23:25:19 +0100 |
commit | 0586639caf9fd8218257a16006bb9783ee490102 (patch) | |
tree | a4b8bc367598338161cf0ad85dcd21d8ecd91b52 | |
parent | 675f8db1c51c474db89e988c06ace1b13f99857d (diff) | |
download | abrt-0586639caf9fd8218257a16006bb9783ee490102.tar.gz abrt-0586639caf9fd8218257a16006bb9783ee490102.tar.xz abrt-0586639caf9fd8218257a16006bb9783ee490102.zip |
Hack to fix the problem with daemon remembering the last used settings
-rw-r--r-- | lib/Plugins/Bugzilla.cpp | 107 | ||||
-rw-r--r-- | lib/Plugins/Bugzilla.h | 3 | ||||
-rw-r--r-- | lib/Plugins/Catcut.cpp | 3 | ||||
-rw-r--r-- | lib/Plugins/Catcut.h | 1 | ||||
-rw-r--r-- | lib/Plugins/KerneloopsReporter.cpp | 4 | ||||
-rw-r--r-- | lib/Plugins/KerneloopsReporter.h | 1 | ||||
-rw-r--r-- | lib/Plugins/Logger.cpp | 3 | ||||
-rw-r--r-- | lib/Plugins/Logger.h | 1 | ||||
-rw-r--r-- | lib/Plugins/Mailx.cpp | 3 | ||||
-rw-r--r-- | lib/Plugins/Mailx.h | 1 | ||||
-rw-r--r-- | lib/Plugins/TicketUploader.cpp | 3 | ||||
-rw-r--r-- | lib/Plugins/TicketUploader.h | 1 | ||||
-rw-r--r-- | lib/Utils/Reporter.h | 1 | ||||
-rw-r--r-- | src/Daemon/CommLayerServerDBus.cpp | 15 | ||||
-rw-r--r-- | src/Daemon/CommLayerServerSocket.cpp | 11 | ||||
-rw-r--r-- | src/Daemon/MiddleWare.cpp | 9 | ||||
-rw-r--r-- | src/Daemon/MiddleWare.h | 1 |
17 files changed, 142 insertions, 26 deletions
diff --git a/lib/Plugins/Bugzilla.cpp b/lib/Plugins/Bugzilla.cpp index 84c79347..6a547cf1 100644 --- a/lib/Plugins/Bugzilla.cpp +++ b/lib/Plugins/Bugzilla.cpp @@ -39,6 +39,68 @@ static void get_product_and_version(const std::string& pRelease, std::string& pProduct, std::string& pVersion); +map_plugin_settings_t CReporterBugzilla::parse_settings(const map_plugin_settings_t& pSettings) +{ + map_plugin_settings_t plugin_settings; + map_plugin_settings_t::const_iterator it; + map_plugin_settings_t::const_iterator end = pSettings.end(); + + std::string BugzillaURL; + std::string BugzillaXMLRPC; + + it = pSettings.find("BugzillaURL"); + if (it != end) + { + BugzillaURL = it->second; + //remove the /xmlrpc.cgi part from old settings + //FIXME: can be removed after users are informed about new config format + std::string::size_type pos = BugzillaURL.find(XML_RPC_SUFFIX); + if (pos != std::string::npos) + { + BugzillaURL.erase(pos); + } + //remove the trailing '/' + while (BugzillaURL[BugzillaURL.length() - 1] == '/') + { + BugzillaURL.erase(BugzillaURL.length() - 1); + } + plugin_settings["BugzillaXMLRPC"] = BugzillaURL + XML_RPC_SUFFIX; + plugin_settings["BugzillaURL"] = BugzillaURL; + } + it = pSettings.find("Login"); + if (it != end) + { + plugin_settings["Login"] = it->second; + } + else + { + /* if any of the option is not set we use the defaults for everything */ + plugin_settings.clear(); + return plugin_settings; + } + it = pSettings.find("Password"); + if (it != end) + { + plugin_settings["Password"] = it->second; + } + else + { + plugin_settings.clear(); + return plugin_settings; + } + it = pSettings.find("NoSSLVerify"); + if (it != end) + { + plugin_settings["NoSSLVerify"] = (it->second == "yes"); + } + else + { + plugin_settings.clear(); + return plugin_settings; + } + VERB1 log("User settings ok, using it instead of defaults"); + return plugin_settings; +} // FIXME: we still leak memmory if this function detects a fault: // many instances when we leave non-freed or non-xmlrpc_DECREF'ed data behind. @@ -384,36 +446,61 @@ static void add_attachments(const std::string& pBugId, const map_crash_report_t& } } -std::string CReporterBugzilla::Report(const map_crash_report_t& pCrashReport, const std::string& pArgs) +std::string CReporterBugzilla::Report(const map_crash_report_t& pCrashReport, + const map_plugin_settings_t& pSettings, + const std::string& pArgs) { int32_t bug_id = -1; - + std::string Login; + std::string Password; + std::string BugzillaXMLRPC; + std::string BugzillaURL; + bool NoSSLVerify; + map_plugin_settings_t settings = parse_settings(pSettings); + /* if parse_settings fails it returns an empty map so we need to use defaults*/ + if(!settings.empty()) + { + Login = settings["Login"]; + Password = settings["Password"]; + BugzillaXMLRPC = settings["BugzillaXMLRPC"]; + BugzillaURL = settings["BugzillaURL"]; + NoSSLVerify = settings["NoSSLVerify"] == "yes"; + } + else + { + Login = m_sLogin; + Password = m_sPassword; + BugzillaXMLRPC = m_sBugzillaXMLRPC; + BugzillaURL = m_sBugzillaURL; + NoSSLVerify = m_bNoSSLVerify; + } + std::string component = pCrashReport.find(FILENAME_COMPONENT)->second[CD_CONTENT]; std::string uuid = pCrashReport.find(CD_UUID)->second[CD_CONTENT]; try { - new_xmlrpc_client(m_sBugzillaXMLRPC.c_str(), m_bNoSSLVerify); + new_xmlrpc_client(BugzillaXMLRPC.c_str(), NoSSLVerify); update_client(_("Checking for duplicates...")); bug_id = check_uuid_in_bugzilla(component.c_str(), uuid.c_str()); update_client(_("Logging into bugzilla...")); - if ((m_sLogin == "") && (m_sPassword == "")) + if ((Login == "") && (Password == "")) { VERB3 log("Empty login and password"); throw CABRTException(EXCEP_PLUGIN, std::string(_("Empty login and password. Please check Bugzilla.conf"))); } - login(m_sLogin.c_str(), m_sPassword.c_str()); + login(Login.c_str(), Password.c_str()); if (bug_id > 0) { update_client(_("Checking CC...")); - if (!check_cc_and_reporter(bug_id, m_sLogin.c_str())) + if (!check_cc_and_reporter(bug_id, Login.c_str())) { - add_plus_one_cc(bug_id, m_sLogin.c_str()); + add_plus_one_cc(bug_id, Login.c_str()); } destroy_xmlrpc_client(); - return m_sBugzillaURL + "/show_bug.cgi?id="+to_string(bug_id); + return BugzillaURL + "/show_bug.cgi?id="+to_string(bug_id); } update_client(_("Creating new bug...")); @@ -433,10 +520,10 @@ std::string CReporterBugzilla::Report(const map_crash_report_t& pCrashReport, co if (bug_id > 0) { - return m_sBugzillaURL + "/show_bug.cgi?id="+to_string(bug_id); + return BugzillaURL + "/show_bug.cgi?id="+to_string(bug_id); } - return m_sBugzillaURL + "/show_bug.cgi?id="; + return BugzillaURL + "/show_bug.cgi?id="; } void CReporterBugzilla::SetSettings(const map_plugin_settings_t& pSettings) diff --git a/lib/Plugins/Bugzilla.h b/lib/Plugins/Bugzilla.h index 17864650..702eead2 100644 --- a/lib/Plugins/Bugzilla.h +++ b/lib/Plugins/Bugzilla.h @@ -14,6 +14,8 @@ class CReporterBugzilla : public CReporter std::string m_sLogin; std::string m_sPassword; std::string m_sAttchmentInBase64; + + map_plugin_settings_t parse_settings(const map_plugin_settings_t& pSettings); public: CReporterBugzilla(); @@ -21,6 +23,7 @@ class CReporterBugzilla : public CReporter virtual void SetSettings(const map_plugin_settings_t& pSettings); virtual map_plugin_settings_t GetSettings(); virtual std::string Report(const map_crash_report_t& pCrashReport, + const map_plugin_settings_t& pSettings, const std::string& pArgs); }; diff --git a/lib/Plugins/Catcut.cpp b/lib/Plugins/Catcut.cpp index c833a577..5f0583f4 100644 --- a/lib/Plugins/Catcut.cpp +++ b/lib/Plugins/Catcut.cpp @@ -298,7 +298,8 @@ CReporterCatcut::CReporterCatcut() : CReporterCatcut::~CReporterCatcut() {} -string CReporterCatcut::Report(const map_crash_report_t& pCrashReport, const string& pArgs) +string CReporterCatcut::Report(const map_crash_report_t& pCrashReport, + const map_plugin_settings_t& pSettings, const string& pArgs) { update_client(_("Creating new bug...")); try diff --git a/lib/Plugins/Catcut.h b/lib/Plugins/Catcut.h index 69380387..40ef399d 100644 --- a/lib/Plugins/Catcut.h +++ b/lib/Plugins/Catcut.h @@ -20,6 +20,7 @@ class CReporterCatcut : public CReporter virtual map_plugin_settings_t GetSettings(); virtual std::string Report(const map_crash_report_t& pCrashReport, + const map_plugin_settings_t& pSettings, const std::string& pArgs); }; diff --git a/lib/Plugins/KerneloopsReporter.cpp b/lib/Plugins/KerneloopsReporter.cpp index 8344b810..c57a1ef8 100644 --- a/lib/Plugins/KerneloopsReporter.cpp +++ b/lib/Plugins/KerneloopsReporter.cpp @@ -93,7 +93,9 @@ CKerneloopsReporter::CKerneloopsReporter() : m_sSubmitURL("http://submit.kerneloops.org/submitoops.php") {} -std::string CKerneloopsReporter::Report(const map_crash_report_t& pCrashReport, const std::string& pArgs) +std::string CKerneloopsReporter::Report(const map_crash_report_t& pCrashReport, + const map_plugin_settings_t& pSettings, + const std::string& pArgs) { int ret = -1; map_crash_report_t::const_iterator it; diff --git a/lib/Plugins/KerneloopsReporter.h b/lib/Plugins/KerneloopsReporter.h index f1b427f8..3c165920 100644 --- a/lib/Plugins/KerneloopsReporter.h +++ b/lib/Plugins/KerneloopsReporter.h @@ -43,6 +43,7 @@ class CKerneloopsReporter : public CReporter virtual void SetSettings(const map_plugin_settings_t& pSettings); virtual map_plugin_settings_t GetSettings(); virtual std::string Report(const map_crash_report_t& pCrashReport, + const map_plugin_settings_t& pSettings, const std::string& pArgs); }; diff --git a/lib/Plugins/Logger.cpp b/lib/Plugins/Logger.cpp index eb9c2404..81787940 100644 --- a/lib/Plugins/Logger.cpp +++ b/lib/Plugins/Logger.cpp @@ -53,7 +53,8 @@ map_plugin_settings_t CLogger::GetSettings() return ret; } -std::string CLogger::Report(const map_crash_report_t& pCrashReport, const std::string& pArgs) +std::string CLogger::Report(const map_crash_report_t& pCrashReport, + const map_plugin_settings_t& pSettings, const std::string& pArgs) { update_client(_("Creating a report...")); diff --git a/lib/Plugins/Logger.h b/lib/Plugins/Logger.h index 60c76e4a..33f957db 100644 --- a/lib/Plugins/Logger.h +++ b/lib/Plugins/Logger.h @@ -37,6 +37,7 @@ class CLogger : public CReporter virtual void SetSettings(const map_plugin_settings_t& pSettings); virtual map_plugin_settings_t GetSettings(); virtual std::string Report(const map_crash_report_t& pCrashReport, + const map_plugin_settings_t& pSettings, const std::string& pArgs); }; diff --git a/lib/Plugins/Mailx.cpp b/lib/Plugins/Mailx.cpp index f7a86fd0..ef3a8d2a 100644 --- a/lib/Plugins/Mailx.cpp +++ b/lib/Plugins/Mailx.cpp @@ -118,7 +118,8 @@ void CMailx::SendEmail(const std::string& pSubject, const std::string& pText, co ExecMailx(atoi(pUID.c_str()), pText); } -std::string CMailx::Report(const map_crash_report_t& pCrashReport, const std::string& pArgs) +std::string CMailx::Report(const map_crash_report_t& pCrashReport, + const map_plugin_settings_t& pSettings, const std::string& pArgs) { update_client(_("Creating a report...")); diff --git a/lib/Plugins/Mailx.h b/lib/Plugins/Mailx.h index fd00bb8b..e3c86e73 100644 --- a/lib/Plugins/Mailx.h +++ b/lib/Plugins/Mailx.h @@ -49,6 +49,7 @@ class CMailx : public CReporter virtual void SetSettings(const map_plugin_settings_t& pSettings); virtual map_plugin_settings_t GetSettings(); virtual std::string Report(const map_crash_report_t& pCrashReport, + const map_plugin_settings_t& pSettings, const std::string& pArgs); }; diff --git a/lib/Plugins/TicketUploader.cpp b/lib/Plugins/TicketUploader.cpp index 69243cd9..179ccc07 100644 --- a/lib/Plugins/TicketUploader.cpp +++ b/lib/Plugins/TicketUploader.cpp @@ -218,7 +218,8 @@ void CTicketUploader::SendFile(const std::string& pURL, } -string CTicketUploader::Report(const map_crash_report_t& pCrashReport, const std::string& pArgs) +string CTicketUploader::Report(const map_crash_report_t& pCrashReport, + const map_plugin_settings_t& pSettings, const std::string& pArgs) { string ret; update_client(_("Creating an TicketUploader report...")); diff --git a/lib/Plugins/TicketUploader.h b/lib/Plugins/TicketUploader.h index 68a29638..92e33872 100644 --- a/lib/Plugins/TicketUploader.h +++ b/lib/Plugins/TicketUploader.h @@ -65,6 +65,7 @@ class CTicketUploader : public CReporter virtual void SetSettings(const map_plugin_settings_t& pSettings); virtual string Report(const map_crash_report_t& pCrashReport, + const map_plugin_settings_t& pSettings, const std::string& pArgs); diff --git a/lib/Utils/Reporter.h b/lib/Utils/Reporter.h index c74a10c3..f2788993 100644 --- a/lib/Utils/Reporter.h +++ b/lib/Utils/Reporter.h @@ -41,6 +41,7 @@ class CReporter : public CPlugin * @retun A message which can be displayed after a report is created. */ virtual std::string Report(const map_crash_report_t& pCrashReport, + const map_plugin_settings_t& pSettings, const std::string& pArgs) = 0; }; diff --git a/src/Daemon/CommLayerServerDBus.cpp b/src/Daemon/CommLayerServerDBus.cpp index cc98fc2c..dd904e4f 100644 --- a/src/Daemon/CommLayerServerDBus.cpp +++ b/src/Daemon/CommLayerServerDBus.cpp @@ -250,12 +250,10 @@ static int handle_Report(DBusMessage* call, DBusMessage* reply) if (!user_conf_data.empty()) { std::string PluginName; - map_plugin_settings_t plugin_settings; map_map_string_t::const_iterator it_user_conf_data = user_conf_data.begin(); for (; it_user_conf_data != user_conf_data.end(); it_user_conf_data++) { PluginName = it_user_conf_data->first; - plugin_settings = it_user_conf_data->second; #if DEBUG std::cout << "plugin name: " << it_user_conf_data->first; map_string_t::const_iterator it_plugin_config; @@ -266,16 +264,16 @@ static int handle_Report(DBusMessage* call, DBusMessage* reply) std::cout << " key: " << it_plugin_config->first << " value: " << it_plugin_config->second << std::endl; } #endif - g_pPluginManager->SetPluginSettings(PluginName, sender, plugin_settings); + // this would overwrite the default settings + //g_pPluginManager->SetPluginSettings(PluginName, sender, plugin_settings); } } -//so far, user_conf_data is unused long unix_uid = get_remote_uid(call); report_status_t argout1; try { - argout1 = Report(argin1, to_string(unix_uid)); + argout1 = Report(argin1, user_conf_data, to_string(unix_uid)); } catch (CABRTException &e) { @@ -377,7 +375,12 @@ static int handle_SetPluginSettings(DBusMessage* call, DBusMessage* reply) long unix_uid = get_remote_uid(call); VERB1 log("got %s('%s',...) call from uid %ld", "SetPluginSettings", PluginName.c_str(), unix_uid); - g_pPluginManager->SetPluginSettings(PluginName, to_string(unix_uid), plugin_settings); + /* Disabled, as we don't use it, we use only temporary user settings while reporting + this method should be used to change the default setting and thus should + be protected by polkit + */ + //FIXME: protect with polkit +// g_pPluginManager->SetPluginSettings(PluginName, to_string(unix_uid), plugin_settings); send_flush_and_unref(reply); return 0; diff --git a/src/Daemon/CommLayerServerSocket.cpp b/src/Daemon/CommLayerServerSocket.cpp index 6b62928b..7afe4b6e 100644 --- a/src/Daemon/CommLayerServerSocket.cpp +++ b/src/Daemon/CommLayerServerSocket.cpp @@ -138,7 +138,9 @@ void CCommLayerServerSocket::ProcessMessage(const std::string& pMessage, GIOChan { std::string message = pMessage.substr(sizeof(MESSAGE_REPORT) - 1); map_crash_report_t report = string_to_crash_report(message); - Report(report, UID); + map_plugin_settings_t plugin_settings; + //FIXME: another hack to make this compile +// Report(report, plugin_settings, UID); } else if (!strncmp(pMessage.c_str(), MESSAGE_CREATE_REPORT, sizeof(MESSAGE_CREATE_REPORT) - 1)) { @@ -227,7 +229,12 @@ vector_crash_infos_t CCommLayerServerSocket::GetCrashInfos(const std::string &pS report_status_t CCommLayerServerSocket::Report(const map_crash_report_t& pReport, const std::string& pSender) { report_status_t rs; - rs = ::Report(pReport, pSender); + //FIXME: a hack to make this compile, but we don't use sockets anyway + /* we could probably remove the sockets and rely only on dbus, + as it will become mandatory even on servers, but this needs some investigation + and more opinions + */ + //rs = ::Report(pReport, pSettings, pSender); return rs; } diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp index 2fd4f259..932db53d 100644 --- a/src/Daemon/MiddleWare.cpp +++ b/src/Daemon/MiddleWare.cpp @@ -273,6 +273,7 @@ void RunAction(const std::string& pActionDir, void RunActionsAndReporters(const std::string& pDebugDumpDir) { vector_pair_string_string_t::iterator it_ar = s_vectorActionsAndReporters.begin(); + map_plugin_settings_t plugin_settings; for (; it_ar != s_vectorActionsAndReporters.end(); it_ar++) { try @@ -283,7 +284,7 @@ void RunActionsAndReporters(const std::string& pDebugDumpDir) map_crash_report_t crashReport; DebugDumpToCrashReport(pDebugDumpDir, crashReport); - reporter->Report(crashReport, (*it_ar).second); + reporter->Report(crashReport, plugin_settings, (*it_ar).second); } else if (g_pPluginManager->GetPluginType((*it_ar).first) == ACTION) { @@ -336,7 +337,8 @@ static bool CheckReport(const map_crash_report_t& pCrashReport) } report_status_t Report(const map_crash_report_t& pCrashReport, - const std::string& pUID) + map_map_string_t& pSettings, + const std::string& pUID) { report_status_t ret; @@ -409,7 +411,8 @@ report_status_t Report(const map_crash_report_t& pCrashReport, } } #endif - std::string res = reporter->Report(pCrashReport, it_r->second); + map_plugin_settings_t plugin_settings = pSettings[pluginName]; + std::string res = reporter->Report(pCrashReport, plugin_settings, it_r->second); #if 0 /* Using ~user/.abrt/ is bad wrt security */ if (home != "") diff --git a/src/Daemon/MiddleWare.h b/src/Daemon/MiddleWare.h index fab822fe..c78d4d95 100644 --- a/src/Daemon/MiddleWare.h +++ b/src/Daemon/MiddleWare.h @@ -93,6 +93,7 @@ void RunActionsAndReporters(const std::string& pDebugDumpDir); * @return A report status, which reporters ends successfuly with messages. */ report_status_t Report(const map_crash_report_t& pCrashReport, + map_map_string_t& pSettings, const std::string& pUID); /** * Get debugdump direcotory. If debugdump is not found |