#include <rpc-port-parcel-internal.h>
#include <rpc-port-parcel.h>
#include <rpc-port.h>
+#include <rpc-port-internal.h>
+
#include <unistd.h>
#include <map>
namespace {
+constexpr const uid_t kRegularUidMin = 5000;
+constexpr const char kUserEventNamePrefix[] = "event.";
+
rpc_port_parcel_h Clone(rpc_port_parcel_h parcel) {
void* raw = nullptr;
unsigned int size = 0;
}
/* LCOV_EXCL_STOP */
+bool CheckUserEventSenderValid(std::string_view event_name,
+ std::string_view app_id) {
+ auto it = event_name.rfind('.');
+ if (it == std::string::npos) {
+ _E("invalid event name");
+ return false;
+ }
+
+ event_name = event_name.substr(0, it);
+ auto len = event_name.length();
+ if (len <= 1 || len > 128) {
+ _E("invalid length(%zu) of user-defined name", len);
+ return false;
+ }
+
+ std::string valid_name = kUserEventNamePrefix + std::string(app_id);
+ _D("valid_name(%s), event_name(%s) ", valid_name.c_str(), event_name.data());
+
+ if (valid_name != event_name) {
+ _E("appid misamatch (%s) - (%s)", valid_name.c_str(), event_name.data());
+ return false;
+ }
+
+ return true;
+}
+
std::shared_ptr<rpc_port::es_stub::LocalExecution> EventSystem_context_;
} // namespace
case static_cast<int>(MethodId::SendUserEvent): {
char* param1_raw = nullptr;
rpc_port_parcel_read_string(parcel, ¶m1_raw);
- std::string param1(param1_raw);
+ std::string event_name(param1_raw);
free(param1_raw);
bundle* param2_raw = nullptr;
rpc_port_parcel_read_bundle(parcel, ¶m2_raw);
Bundle param2(param2_raw, false, true);
bool param3;
rpc_port_parcel_read_bool(parcel, ¶m3);
- auto retVal =
- service->SendUserEvent(std::move(param1), std::move(param2), param3);
+ bool retVal = false;
+
+ if (CheckUserEventSenderValid(event_name, sender_))
+ retVal = service->SendUserEvent(std::move(event_name), std::move(param2), param3);
rpc_port_parcel_write_int32(result, static_cast<int>(MethodId::__Result));
rpc_port_parcel_write_bool(result, retVal);
if (GetContext() != nullptr) {
bundle* param2_raw = nullptr;
rpc_port_parcel_read_bundle(parcel, ¶m2_raw);
Bundle param2(param2_raw, false, true);
- auto retVal =
- service->SendSystemEvent(std::move(param1), std::move(param2));
+
+ bool retVal = false;
+ uid_t uid;
+ int ret = rpc_port_get_peer_info(port, nullptr, &uid);
+ if (ret != 0) {
+ _E("Failed to rpc_port_get_peer_info. (%d)", ret);
+ } else if (uid >= kRegularUidMin) {
+ _E("Failed to send system event. uid(%u)", uid);
+ } else {
+ retVal = service->SendSystemEvent(std::move(param1), std::move(param2));
+ }
+
rpc_port_parcel_write_int32(result, static_cast<int>(MethodId::__Result));
rpc_port_parcel_write_bool(result, retVal);
if (GetContext() != nullptr) {
EXPECT_EQ(ret, ES_R_OK);
}
-TEST_F(EventSystemTest, eventsystem_send_user_event) {
- tizen_base::Bundle data;
- int ret = eventsystem_send_user_event("event.test", data.GetHandle(), false);
- EXPECT_EQ(ret, ES_R_OK);
-}
-
TEST_F(EventSystemTest, eventsystem_send_system_event) {
tizen_base::Bundle data;
int ret = eventsystem_send_system_event("tizen.system.event.test",
TEST_F(EventSystemTest, eventsystem_send_user_event) {
tizen_base::Bundle data;
+ EXPECT_CALL(GetMock<RpcPortMock>(), rpc_port_get_peer_info(_, _, _))
+ .WillRepeatedly(Invoke([](rpc_port_h, pid_t* pid, uid_t* uid) {
+ if (pid) *pid = getpid();
+ if (uid) *uid = 5001;
+ return 0;
+ }));
+
RunModule();
- int ret = eventsystem_send_user_event("event.test", data.GetHandle(), false);
+ int ret = eventsystem_send_user_event(
+ "event.d::org.tizen.appfw.service.esd.test", data.GetHandle(), false);
EXPECT_EQ(ret, ES_R_OK);
}
pkgmgrinfo_appinfo_foreach_appcontrol(_, _, _))
.WillOnce(Invoke([](auto handle, pkgmgrinfo_app_control_list_cb callback,
void* user_data) {
- std::string uri = "event.test";
+ std::string uri = "event.d::org.tizen.appfw.service.esd.test";
callback(AUL_SVC_OPERATION_LAUNCH_ON_EVENT, uri.c_str(), "test_mime",
user_data);
return 0;
EXPECT_CALL(GetMock<AulMock>(),
aul_svc_run_service_async_for_uid(_, _, _, _, _))
.Times(1);
+ EXPECT_CALL(GetMock<RpcPortMock>(), rpc_port_get_peer_info(_, _, _))
+ .WillRepeatedly(Invoke([](rpc_port_h, pid_t* pid, uid_t* uid) {
+ if (pid) *pid = getpid();
+ if (uid) *uid = 5001;
+ return 0;
+ }));
RunModule();
g_event_name = "";
loop = g_main_loop_new(nullptr, FALSE);
int ret = eventsystem_register_application_event(
- "event.test", &id, &type,
+ "event.d::org.tizen.appfw.service.esd.test", &id, &type,
[](const char* event_name, bundle_raw* event_data, int len,
void* user_data) {
g_event_name = event_name;
nullptr);
EXPECT_EQ(ret, ES_R_OK);
tizen_base::Bundle data;
- eventsystem_send_user_event("event.test", data.GetHandle(), false);
+ eventsystem_send_user_event("event.d::org.tizen.appfw.service.esd.test",
+ data.GetHandle(), false);
g_main_loop_run(loop);
- EXPECT_EQ(g_event_name, "event.test");
+ EXPECT_EQ(g_event_name, "event.d::org.tizen.appfw.service.esd.test");
g_main_loop_unref(loop);
}
pkgmgrinfo_appinfo_foreach_appcontrol(_, _, _))
.WillOnce(Invoke([](auto handle, pkgmgrinfo_app_control_list_cb callback,
void* user_data) {
- std::string uri = "event.test";
+ std::string uri = "event.d::org.tizen.appfw.service.esd.test";
callback(AUL_SVC_OPERATION_LAUNCH_ON_EVENT, uri.c_str(), "test_mime",
user_data);
return 0;
EXPECT_CALL(GetMock<AulMock>(),
aul_svc_run_service_async_for_uid(_, _, _, _, _))
.Times(1);
+ EXPECT_CALL(GetMock<RpcPortMock>(), rpc_port_get_peer_info(_, _, _))
+ .WillRepeatedly(Invoke([](rpc_port_h, pid_t* pid, uid_t* uid) {
+ if (pid) *pid = getpid();
+ if (uid) *uid = 5001;
+ return 0;
+ }));
RunModule();
g_event_name = "";
loop = g_main_loop_new(nullptr, FALSE);
int ret = eventsystem_register_application_event(
- "event.test", &id, &type,
+ "event.d::org.tizen.appfw.service.esd.test", &id, &type,
[](const char* event_name, bundle_raw* event_data, int len,
void* user_data) {
g_event_name = event_name;
nullptr);
EXPECT_EQ(ret, ES_R_OK);
tizen_base::Bundle data;
- eventsystem_send_user_event("event.test", data.GetHandle(), true);
+ eventsystem_send_user_event("event.d::org.tizen.appfw.service.esd.test",
+ data.GetHandle(), true);
g_main_loop_run(loop);
- EXPECT_EQ(g_event_name, "event.test");
+ EXPECT_EQ(g_event_name, "event.d::org.tizen.appfw.service.esd.test");
g_main_loop_unref(loop);
}
extern "C" int rpc_port_stub_listen(rpc_port_stub_h h) {
return MOCK_HOOK_P1(RpcPortMock, rpc_port_stub_listen, h);
+}
+
+extern "C" int rpc_port_get_peer_info(rpc_port_h h, pid_t* pid, uid_t* uid) {
+ return MOCK_HOOK_P3(RpcPortMock, rpc_port_get_peer_info, h, pid, uid);
}
\ No newline at end of file
class RpcPortMock : public virtual ModuleMock {
public:
+ RpcPortMock() {
+ using ::testing::_;
+ using ::testing::Invoke;
+
+ ON_CALL(*this, rpc_port_get_peer_info(_, _, _))
+ .WillByDefault(Invoke([](rpc_port_h, pid_t* pid, uid_t* uid) {
+ if (pid) *pid = getpid();
+ if (uid) *uid = getuid();
+ return 0;
+ }));
+ }
+
virtual ~RpcPortMock() {}
MOCK_METHOD2(rpc_port_register_proc_info, int(const char*, bundle*));
MOCK_METHOD1(rpc_port_stub_listen, int(rpc_port_stub_h));
+ MOCK_METHOD3(rpc_port_get_peer_info, int(rpc_port_h, pid_t*, uid_t*));
};
#endif // MOCK_RPC_PORT_MOCK_H_