diff options
-rw-r--r-- | src/Daemon/CommLayerServerDBus.cpp | 355 | ||||
-rw-r--r-- | src/Gui/CCReporterDialog.py | 2 |
2 files changed, 232 insertions, 125 deletions
diff --git a/src/Daemon/CommLayerServerDBus.cpp b/src/Daemon/CommLayerServerDBus.cpp index 0994a1ce..9d00e419 100644 --- a/src/Daemon/CommLayerServerDBus.cpp +++ b/src/Daemon/CommLayerServerDBus.cpp @@ -139,30 +139,35 @@ static inline void store_val(DBusMessageIter* iter, const std::map<K,V>& val) { * Helpers for parsing DBus messages */ +enum { + ERROR = -1, + LAST_FIELD = 0, + MORE_FIELDS = 1, +}; /* Checks type, loads data, advances to the next arg. * Returns TRUE if next arg exists. */ -//static bool load_bool(DBusMessageIter* iter, bool& val); -static bool load_int32(DBusMessageIter* iter, int32_t &val); -static bool load_uint32(DBusMessageIter* iter, uint32_t &val); -static bool load_int64(DBusMessageIter* iter, int64_t &val); -static bool load_uint64(DBusMessageIter* iter, uint64_t &val); -static bool load_charp(DBusMessageIter* iter, const char*& val); -//static inline bool load_val(DBusMessageIter* iter, bool &val) { return load_bool(iter, val); } -static inline bool load_val(DBusMessageIter* iter, int32_t &val) { return load_int32(iter, val); } -static inline bool load_val(DBusMessageIter* iter, uint32_t &val) { return load_uint32(iter, val); } -static inline bool load_val(DBusMessageIter* iter, int64_t &val) { return load_int64(iter, val); } -static inline bool load_val(DBusMessageIter* iter, uint64_t &val) { return load_uint64(iter, val); } -static inline bool load_val(DBusMessageIter* iter, const char*& val) { return load_charp(iter, val); } -static inline bool load_val(DBusMessageIter* iter, std::string& val) +//static int load_bool(DBusMessageIter* iter, bool& val); +static int load_int32(DBusMessageIter* iter, int32_t &val); +static int load_uint32(DBusMessageIter* iter, uint32_t &val); +static int load_int64(DBusMessageIter* iter, int64_t &val); +static int load_uint64(DBusMessageIter* iter, uint64_t &val); +static int load_charp(DBusMessageIter* iter, const char*& val); +//static inline int load_val(DBusMessageIter* iter, bool &val) { return load_bool(iter, val); } +static inline int load_val(DBusMessageIter* iter, int32_t &val) { return load_int32(iter, val); } +static inline int load_val(DBusMessageIter* iter, uint32_t &val) { return load_uint32(iter, val); } +static inline int load_val(DBusMessageIter* iter, int64_t &val) { return load_int64(iter, val); } +static inline int load_val(DBusMessageIter* iter, uint64_t &val) { return load_uint64(iter, val); } +static inline int load_val(DBusMessageIter* iter, const char*& val) { return load_charp(iter, val); } +static inline int load_val(DBusMessageIter* iter, std::string& val) { const char* str; - bool r = load_charp(iter, str); + int r = load_charp(iter, str); val = str; return r; } -//static bool load_bool(DBusMessageIter* iter, bool& val) +//static int load_bool(DBusMessageIter* iter, bool& val) //{ // int type = dbus_message_iter_get_arg_type(iter); // if (type != DBUS_TYPE_BOOLEAN) @@ -172,43 +177,58 @@ static inline bool load_val(DBusMessageIter* iter, std::string& val) // val = db; // return dbus_message_iter_next(iter); //} -static bool load_int32(DBusMessageIter* iter, int32_t& val) +static int load_int32(DBusMessageIter* iter, int32_t& val) { int type = dbus_message_iter_get_arg_type(iter); if (type != DBUS_TYPE_INT32) - error_msg_and_die("%s expected in dbus message, but not found ('%c')", "int32", type); + { + error_msg("%s expected in dbus message, but not found ('%c')", "int32", type); + return -1; + } dbus_message_iter_get_basic(iter, &val); return dbus_message_iter_next(iter); } -static bool load_uint32(DBusMessageIter* iter, uint32_t& val) +static int load_uint32(DBusMessageIter* iter, uint32_t& val) { int type = dbus_message_iter_get_arg_type(iter); if (type != DBUS_TYPE_UINT32) - error_msg_and_die("%s expected in dbus message, but not found ('%c')", "uint32", type); + { + error_msg("%s expected in dbus message, but not found ('%c')", "uint32", type); + return -1; + } dbus_message_iter_get_basic(iter, &val); return dbus_message_iter_next(iter); } -static bool load_int64(DBusMessageIter* iter, int64_t& val) +static int load_int64(DBusMessageIter* iter, int64_t& val) { int type = dbus_message_iter_get_arg_type(iter); if (type != DBUS_TYPE_INT64) - error_msg_and_die("%s expected in dbus message, but not found ('%c')", "int64", type); + { + error_msg("%s expected in dbus message, but not found ('%c')", "int64", type); + return -1; + } dbus_message_iter_get_basic(iter, &val); return dbus_message_iter_next(iter); } -static bool load_uint64(DBusMessageIter* iter, uint64_t& val) +static int load_uint64(DBusMessageIter* iter, uint64_t& val) { int type = dbus_message_iter_get_arg_type(iter); if (type != DBUS_TYPE_UINT64) - error_msg_and_die("%s expected in dbus message, but not found ('%c')", "uint64", type); + { + error_msg("%s expected in dbus message, but not found ('%c')", "uint64", type); + return -1; + } dbus_message_iter_get_basic(iter, &val); return dbus_message_iter_next(iter); } -static bool load_charp(DBusMessageIter* iter, const char*& val) +static int load_charp(DBusMessageIter* iter, const char*& val) { int type = dbus_message_iter_get_arg_type(iter); if (type != DBUS_TYPE_STRING) - error_msg_and_die("%s expected in dbus message, but not found ('%c')", "string", type); + { + error_msg("%s expected in dbus message, but not found ('%c')", "string", type); + return -1; + } dbus_message_iter_get_basic(iter, &val); //log("load_charp:'%s'", val); return dbus_message_iter_next(iter); @@ -216,16 +236,19 @@ static bool load_charp(DBusMessageIter* iter, const char*& val) /* Templates for vector and map */ template<typename E> -static bool load_vector(DBusMessageIter* iter, std::vector<E>& val) +static int load_vector(DBusMessageIter* iter, std::vector<E>& val) { int type = dbus_message_iter_get_arg_type(iter); if (type != DBUS_TYPE_ARRAY) - error_msg_and_die("array expected in dbus message, but not found ('%c')", type); + { + error_msg("array expected in dbus message, but not found ('%c')", type); + return -1; + } DBusMessageIter sub_iter; dbus_message_iter_recurse(iter, &sub_iter); - bool next_exists; + int r; //int cnt = 0; //type = dbus_message_iter_get_arg_type(&sub_iter); /* here "type" is the element's type, and it will be checked by load_val */ @@ -233,51 +256,67 @@ static bool load_vector(DBusMessageIter* iter, std::vector<E>& val) do { E elem; //cnt++; - next_exists = load_val(&sub_iter, elem); + r = load_val(&sub_iter, elem); + if (r < 0) + return r; val.push_back(elem); - } while (next_exists); + } while (r == MORE_FIELDS); //log("%s: %d elems", __func__, cnt); return dbus_message_iter_next(iter); } /* template<> -static bool load_vector(DBusMessageIter* iter, std::vector<uint8_t>& val) +static int load_vector(DBusMessageIter* iter, std::vector<uint8_t>& val) { if we use such vector, MUST add specialized code here (see in dbus-c++ source) } */ template<typename K, typename V> -static bool load_map(DBusMessageIter* iter, std::map<K,V>& val) +static int load_map(DBusMessageIter* iter, std::map<K,V>& val) { int type = dbus_message_iter_get_arg_type(iter); if (type != DBUS_TYPE_ARRAY) - error_msg_and_die("map expected in dbus message, but not found ('%c')", type); + { + error_msg("array expected in dbus message, but not found ('%c')", type); + return -1; + } DBusMessageIter sub_iter; dbus_message_iter_recurse(iter, &sub_iter); bool next_exists; + int r; //int cnt = 0; do { type = dbus_message_iter_get_arg_type(&sub_iter); if (type != DBUS_TYPE_DICT_ENTRY) - error_msg_and_die("sub_iter type is not DBUS_TYPE_DICT_ENTRY (%c)!", type); + { + error_msg("sub_iter type is not DBUS_TYPE_DICT_ENTRY (%c)!", type); + return -1; + } DBusMessageIter sub_sub_iter; dbus_message_iter_recurse(&sub_iter, &sub_sub_iter); K key; - next_exists = load_val(&sub_sub_iter, key); - if (!next_exists) - error_msg_and_die("malformed map element in dbus message"); + r = load_val(&sub_sub_iter, key); + if (r != MORE_FIELDS) + { + if (r == LAST_FIELD) + error_msg("malformed map element in dbus message"); + return -1; + } V value; - next_exists = load_val(&sub_sub_iter, value); - if (next_exists) - error_msg_and_die("malformed map element in dbus message"); + r = load_val(&sub_sub_iter, value); + if (r != LAST_FIELD) + { + if (r == MORE_FIELDS) + error_msg("malformed map element in dbus message"); + return -1; + } val[key] = value; //cnt++; - next_exists = dbus_message_iter_next(&sub_iter); } while (next_exists); //log("%s: %d elems", __func__, cnt); @@ -286,9 +325,9 @@ static bool load_map(DBusMessageIter* iter, std::map<K,V>& val) } template<typename E> -static inline bool load_val(DBusMessageIter* iter, std::vector<E>& val) { return load_vector(iter, val); } +static inline int load_val(DBusMessageIter* iter, std::vector<E>& val) { return load_vector(iter, val); } template<typename K, typename V> -static inline bool load_val(DBusMessageIter* iter, std::map<K,V>& val) { return load_map(iter, val); } +static inline int load_val(DBusMessageIter* iter, std::map<K,V>& val) { return load_map(iter, val); } /* @@ -412,25 +451,15 @@ static long get_remote_uid(DBusMessage* call) const char* sender = dbus_message_get_sender(call); long uid = dbus_bus_get_unix_user(s_pConn, sender, &err); if (dbus_error_is_set(&err)) - return -1; + { + dbus_error_free(&err); + error_msg("can't determine remore uid, assuming 0"); + return 0; + } return uid; } -//static const char* get_string_param(DBusMessage* call) -//{ -// const char* str = NULL; -// DBusError err; -// dbus_error_init(&err); -// if (!dbus_message_get_args(call, -// &err, -// DBUS_TYPE_STRING, &str -// ) -// ) { -// error_msg_and_die("dbus call parameter mismatch"); -// } -// return str; -//} -static void handle_GetCrashInfos(DBusMessage* call, DBusMessage* reply) +static int handle_GetCrashInfos(DBusMessage* call, DBusMessage* reply) { long unix_uid = get_remote_uid(call); VERB1 log("got %s() call from uid %ld", "GetCrashInfos", unix_uid); @@ -441,36 +470,55 @@ static void handle_GetCrashInfos(DBusMessage* call, DBusMessage* reply) store_val(&iter, argout1); send_flush_and_unref(reply); + return 0; } -static void handle_CreateReport(DBusMessage* call, DBusMessage* reply) +static int handle_CreateReport(DBusMessage* call, DBusMessage* reply) { - const char* argin1;//DOESNT WORK!?? = get_string_param(call); + const char* argin1; DBusMessageIter in_iter; if (!dbus_message_iter_init(call, &in_iter)) - error_msg_and_die("dbus call error: no parameters"); - load_val(&in_iter, argin1); - - if (argin1) // superfluous now { - long unix_uid = get_remote_uid(call); - VERB1 log("got %s('%s') call from uid %ld", "CreateReport", argin1, unix_uid); + error_msg("dbus call %s: no parameters", "CreateReport"); + return -1; + } + int r = load_val(&in_iter, argin1); + if (r != LAST_FIELD) + { + if (r == MORE_FIELDS) + error_msg("dbus call %s: extra parameters", "CreateReport"); + return -1; + } + + long unix_uid = get_remote_uid(call); + VERB1 log("got %s('%s') call from uid %ld", "CreateReport", argin1, unix_uid); //FIXME: duplicate dbus_message_get_sender in get_remote_uid - uint64_t argout1 = CreateReport_t(argin1, to_string(unix_uid), dbus_message_get_sender(call)); - dbus_message_append_args(reply, + uint64_t argout1 = CreateReport_t(argin1, to_string(unix_uid), dbus_message_get_sender(call)); + + dbus_message_append_args(reply, DBUS_TYPE_UINT64, &argout1, DBUS_TYPE_INVALID); - } + send_flush_and_unref(reply); + return 0; } -static void handle_Report(DBusMessage* call, DBusMessage* reply) +static int handle_Report(DBusMessage* call, DBusMessage* reply) { map_crash_report_t argin1; DBusMessageIter in_iter; if (!dbus_message_iter_init(call, &in_iter)) - error_msg_and_die("dbus call error: no parameters"); - load_val(&in_iter, argin1); + { + error_msg("dbus call %s: no parameters", "Report"); + return -1; + } + int r = load_val(&in_iter, argin1); + if (r != LAST_FIELD) + { + if (r == MORE_FIELDS) + error_msg("dbus call %s: extra parameters", "Report"); + return -1; + } long unix_uid = get_remote_uid(call); VERB1 log("got %s(...) call from uid %ld", "Report", unix_uid); @@ -479,14 +527,14 @@ static void handle_Report(DBusMessage* call, DBusMessage* reply) { argout1 = Report(argin1, to_string(unix_uid)); } - catch(CABRTException &e) + catch (CABRTException &e) { dbus_message_unref(reply); reply = dbus_message_new_error(call, DBUS_ERROR_FAILED, e.what().c_str()); if (!reply) die_out_of_memory(); send_flush_and_unref(reply); - return; + return 0; } DBusMessageIter out_iter; @@ -494,35 +542,54 @@ static void handle_Report(DBusMessage* call, DBusMessage* reply) store_val(&out_iter, argout1); send_flush_and_unref(reply); + return 0; } -static void handle_DeleteDebugDump(DBusMessage* call, DBusMessage* reply) +static int handle_DeleteDebugDump(DBusMessage* call, DBusMessage* reply) { - const char* argin1; // = get_string_param(call); + const char* argin1; DBusMessageIter in_iter; if (!dbus_message_iter_init(call, &in_iter)) - error_msg_and_die("dbus call error: no parameters"); - load_val(&in_iter, argin1); - - if (argin1) // superfluous now { - long unix_uid = get_remote_uid(call); - VERB1 log("got %s('%s') call from uid %ld", "DeleteDebugDump", argin1, unix_uid); - bool argout1 = DeleteDebugDump(argin1, to_string(unix_uid)); - dbus_message_append_args(reply, + error_msg("dbus call %s: no parameters", "DeleteDebugDump"); + return -1; + } + int r = load_val(&in_iter, argin1); + if (r != LAST_FIELD) + { + if (r == MORE_FIELDS) + error_msg("dbus call %s: extra parameters", "DeleteDebugDump"); + return -1; + } + + long unix_uid = get_remote_uid(call); + VERB1 log("got %s('%s') call from uid %ld", "DeleteDebugDump", argin1, unix_uid); + bool argout1 = DeleteDebugDump(argin1, to_string(unix_uid)); + + dbus_message_append_args(reply, DBUS_TYPE_BOOLEAN, &argout1, DBUS_TYPE_INVALID); - } + send_flush_and_unref(reply); + return 0; } -static void handle_GetJobResult(DBusMessage* call, DBusMessage* reply) +static int handle_GetJobResult(DBusMessage* call, DBusMessage* reply) { uint64_t job_id; DBusMessageIter in_iter; if (!dbus_message_iter_init(call, &in_iter)) - error_msg_and_die("dbus call error: no parameters"); - load_val(&in_iter, job_id); + { + error_msg("dbus call %s: no parameters", "GetJobResult"); + return -1; + } + int r = load_val(&in_iter, job_id); + if (r != LAST_FIELD) + { + if (r == MORE_FIELDS) + error_msg("dbus call %s: extra parameters", "GetJobResult"); + return -1; + } long unix_uid = get_remote_uid(call); VERB1 log("got %s(%llx) call from uid %ld", "GetJobResult", (long long)job_id, unix_uid); @@ -533,9 +600,10 @@ static void handle_GetJobResult(DBusMessage* call, DBusMessage* reply) store_val(&out_iter, report); send_flush_and_unref(reply); + return 0; } -static void handle_GetPluginsInfo(DBusMessage* call, DBusMessage* reply) +static int handle_GetPluginsInfo(DBusMessage* call, DBusMessage* reply) { vector_map_string_t plugins_info = g_pPluginManager->GetPluginsInfo(); @@ -544,75 +612,114 @@ static void handle_GetPluginsInfo(DBusMessage* call, DBusMessage* reply) store_val(&iter, plugins_info); send_flush_and_unref(reply); + return 0; } -static void handle_GetPluginSettings(DBusMessage* call, DBusMessage* reply) +static int handle_GetPluginSettings(DBusMessage* call, DBusMessage* reply) { const char* PluginName; // = get_string_param(call); DBusMessageIter in_iter; if (!dbus_message_iter_init(call, &in_iter)) - error_msg_and_die("dbus call error: no parameters"); - load_val(&in_iter, PluginName); - - if (PluginName) // superfluous now { - long unix_uid = get_remote_uid(call); - VERB1 log("got %s('%s') call from uid %ld", "GetPluginSettings", PluginName, unix_uid); - map_plugin_settings_t plugin_settings = g_pPluginManager->GetPluginSettings(PluginName, to_string(unix_uid)); - - DBusMessageIter iter; - dbus_message_iter_init_append(reply, &iter); - store_val(&iter, plugin_settings); + error_msg("dbus call %s: no parameters", "GetPluginSettings"); + return -1; + } + int r = load_val(&in_iter, PluginName); + if (r != LAST_FIELD) + { + if (r == MORE_FIELDS) + error_msg("dbus call %s: extra parameters", "GetPluginSettings"); + return -1; } + + long unix_uid = get_remote_uid(call); + VERB1 log("got %s('%s') call from uid %ld", "GetPluginSettings", PluginName, unix_uid); + map_plugin_settings_t plugin_settings = g_pPluginManager->GetPluginSettings(PluginName, to_string(unix_uid)); + + DBusMessageIter iter; + dbus_message_iter_init_append(reply, &iter); + store_val(&iter, plugin_settings); send_flush_and_unref(reply); + return 0; } -static void handle_SetPluginSettings(DBusMessage* call, DBusMessage* reply) +static int handle_SetPluginSettings(DBusMessage* call, DBusMessage* reply) { - std::string PluginName; - map_plugin_settings_t plugin_settings; DBusMessageIter in_iter; if (!dbus_message_iter_init(call, &in_iter)) - error_msg_and_die("dbus call error: no parameters"); - bool next_exists = load_val(&in_iter, PluginName); - if (!next_exists) - error_msg_and_die("dbus call format error"); - load_val(&in_iter, plugin_settings); + { + error_msg("dbus call %s: no parameters", "SetPluginSettings"); + return -1; + } + std::string PluginName; + int r = load_val(&in_iter, PluginName); + if (r != MORE_FIELDS) + { + if (r == LAST_FIELD) + error_msg("dbus call %s: too few parameters", "SetPluginSettings"); + return -1; + } + map_plugin_settings_t plugin_settings; + r = load_val(&in_iter, plugin_settings); + if (r != LAST_FIELD) + { + if (r == MORE_FIELDS) + error_msg("dbus call %s: extra parameters", "SetPluginSettings"); + return -1; + } 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); + send_flush_and_unref(reply); + return 0; } -static void handle_RegisterPlugin(DBusMessage* call, DBusMessage* reply) +static int handle_RegisterPlugin(DBusMessage* call, DBusMessage* reply) { - const char* PluginName; // = get_string_param(call); DBusMessageIter in_iter; if (!dbus_message_iter_init(call, &in_iter)) - error_msg_and_die("dbus call error: no parameters"); - load_val(&in_iter, PluginName); - - if (PluginName) // superfluous now { - g_pPluginManager->RegisterPlugin(PluginName); + error_msg("dbus call %s: no parameters", "RegisterPlugin"); + return -1; + } + const char* PluginName; + int r = load_val(&in_iter, PluginName); + if (r != LAST_FIELD) + { + if (r == MORE_FIELDS) + error_msg("dbus call %s: extra parameters", "RegisterPlugin"); + return -1; } + + g_pPluginManager->RegisterPlugin(PluginName); + send_flush_and_unref(reply); + return 0; } -static void handle_UnRegisterPlugin(DBusMessage* call, DBusMessage* reply) +static int handle_UnRegisterPlugin(DBusMessage* call, DBusMessage* reply) { - const char* PluginName; // = get_string_param(call); DBusMessageIter in_iter; if (!dbus_message_iter_init(call, &in_iter)) - error_msg_and_die("dbus call error: no parameters"); - load_val(&in_iter, PluginName); - - if (PluginName) // superfluous now { - g_pPluginManager->UnRegisterPlugin(PluginName); + error_msg("dbus call %s: no parameters", "UnRegisterPlugin"); + return -1; } + const char* PluginName; + int r = load_val(&in_iter, PluginName); + if (r != LAST_FIELD) + { + if (r == MORE_FIELDS) + error_msg("dbus call %s: extra parameters", "UnRegisterPlugin"); + return -1; + } + + g_pPluginManager->UnRegisterPlugin(PluginName); + send_flush_and_unref(reply); + return 0; } diff --git a/src/Gui/CCReporterDialog.py b/src/Gui/CCReporterDialog.py index e9de8ca0..5d0a0e29 100644 --- a/src/Gui/CCReporterDialog.py +++ b/src/Gui/CCReporterDialog.py @@ -95,7 +95,7 @@ class ReporterDialog(): for row in self.reportListStore: rowe = dict(zip(attributes, row)) if (rowe["attachment"] or (rowe["editable"] and rowe["attachment"])) and rowe["send"]: - result = gui_question_dialog(_("<b>WARNING</b>, you're about to send data that might contain some sensitive informations!\n" + result = gui_question_dialog(_("<b>WARNING</b>, you're about to send data which might contain sensitive information.\n" "Do you really want to send <b>%s</b>?\n" % rowe["item"]), self.window) if result == gtk.RESPONSE_NO: row[attributes.index("send")] = False |