-Jongmyeong Ko <jongmyeong.ko@samsung.com>
+Junghoon Park <jh9216.park@samsung.com>
Jusung Son <jusung07.son@samsung.com>
-CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
+PROJECT(esd)
-PROJECT(esd C CXX)
-AUX_SOURCE_DIRECTORY(src/ SRCS)
-AUX_SOURCE_DIRECTORY(src/esd_cion/ CION_SRCS)
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,-zdefs")
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
+SET(CMAKE_C_FLAGS_DEBUG "-O0 -g")
+SET(CMAKE_C_FLAGS_RELEASE "-O2")
-SET(VERSION 0.0.1)
-SET(VERSION_MAJOR 0)
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_C_FLAGS} -std=c++17")
+SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
+SET(CMAKE_CXX_FLAGS_RELEASE "-O2")
-SET(PREFIX ${CMAKE_INSTALL_PREFIX})
-SET(EXEC_PREFIX "\${prefix}")
-SET(LIBDIR "\${prefix}/lib")
-SET(INCLUDEDIR "\${prefix}/include")
-
-set(CMAKE_SKIP_BUILD_RPATH true)
-
-### Local include directories
-INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/src)
-
-### Required packages
-INCLUDE(FindPkgConfig)
-
-pkg_check_modules(pkgs REQUIRED
- dlog
- bundle
- parcel
- pkgmgr-info
- glib-2.0
- gio-2.0
- appsvc
- aul
- vconf
- libtzplatform-config
- cert-svc-vcore
- cynara-client
- cynara-creds-gdbus
- cynara-session
- security-manager
- sqlite3
- uuid
- cion
- capi-system-info
-)
-
-FOREACH(flag ${pkgs_CFLAGS})
- SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
-ENDFOREACH(flag)
+SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed")
-#FIND_LIBRARY(LIB_DL dl)
+## Target esd
+SET(TARGET_ESD "esd")
+SET(TARGET_LIB_ESD "libesd")
-## Additional flag
-SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden")
-SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g -Wall -Werror")
-SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} -std=c++14 -Werror")
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
+## Target modules
+SET(TARGET_ESD_MOD_CION "esd-mod-cion")
+SET(TARGET_ESD_MOD_DBUS_EVENT "esd-mod-dbus-event")
-## Linker flags
-SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed")
+#ENABLE_TESTING()
+#SET(TARGET_ESD_UNIT_TESTS "esd-unit-tests")
-##build eventsystem daemon
-add_executable(esd ${SRCS} ${CION_SRCS})
-TARGET_LINK_LIBRARIES(esd eventsystem pkgmgr-client ${pkgs_LDFLAGS})
-SET_TARGET_PROPERTIES(esd PROPERTIES COMPILE_FLAGS ${CFLAGS} ${CXXFLAGS} "-fPIE")
-SET_TARGET_PROPERTIES(esd PROPERTIES LINK_FLAGS "-pie -Wl,-z,relro")
+SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
+ "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/")
-# pkgconfig file
-configure_file(esd.manifest.in esd.manifest @ONLY)
-configure_file(tizen.system.event.app2esd.service.in tizen.system.event.app2esd.service @ONLY)
-
-INSTALL(TARGETS esd DESTINATION bin)
-INSTALL(FILES ${CMAKE_SOURCE_DIR}/eventsystem.conf DESTINATION /etc/dbus-1/system.d)
-INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/tizen.system.event.app2esd.service DESTINATION ${SHARE_INSTALL_PREFIX}/dbus-1/system-services/)
+INCLUDE(FindPkgConfig)
+INCLUDE(ApplyPkgConfig)
+
+PKG_CHECK_MODULES(AUL_DEPS REQUIRED aul)
+PKG_CHECK_MODULES(BUNDLE_DEPS REQUIRED bundle)
+PKG_CHECK_MODULES(CAPI_SYSTEM_INFO_DEPS REQUIRED capi-system-info)
+PKG_CHECK_MODULES(CERT_SVC_VCORE_DEPS REQUIRED cert-svc-vcore)
+PKG_CHECK_MODULES(CYNARA_CLIENT_DEPS REQUIRED cynara-client)
+PKG_CHECK_MODULES(CYNARA_CREDS_DBUS_DEPS REQUIRED cynara-creds-gdbus)
+PKG_CHECK_MODULES(CYNARA_SESSION_DEPS REQUIRED cynara-session)
+PKG_CHECK_MODULES(DLOG_DEPS REQUIRED dlog)
+PKG_CHECK_MODULES(GIO_DEPS REQUIRED gio-2.0)
+PKG_CHECK_MODULES(GLIB_DEPS REQUIRED glib-2.0)
+PKG_CHECK_MODULES(LIBTZPLATFORM_CONFIG_DEPS REQUIRED libtzplatform-config)
+PKG_CHECK_MODULES(PARCEL_DEPS REQUIRED parcel)
+PKG_CHECK_MODULES(PKGMGR_INFO_DEPS REQUIRED pkgmgr-info)
+PKG_CHECK_MODULES(SECURITY_MANAGER_DEPS REQUIRED security-manager)
+PKG_CHECK_MODULES(SQLITE3_DEPS REQUIRED sqlite3)
+PKG_CHECK_MODULES(CION_DEPS REQUIRED cion)
+PKG_CHECK_MODULES(UUID_DEPS REQUIRED uuid)
+PKG_CHECK_MODULES(VCONF_DEPS REQUIRED vconf)
+PKG_CHECK_MODULES(PKGMGR_DEPS REQUIRED pkgmgr)
+PKG_CHECK_MODULES(EVENTSYSTEM_DEPS REQUIRED eventsystem)
+
+ADD_SUBDIRECTORY(src)
--- /dev/null
+# Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+#
+# This function applies external (out of source tree) dependencies
+# to given target. Arguments are:
+# TARGET - valid cmake target
+# PRIVACY - dependency can be inherited by dependent targets or not:
+# PUBLIC - this should be used by default, cause compile/link flags passing
+# PRIVATE - do not passes any settings to dependent targets,
+# may be usefull for static libraries from the inside of the project
+# Argument ARGV2 and following are supposed to be names of checked pkg config
+# packages. This function will use variables created by check_pkg_modules().
+# - ${DEP_NAME}_LIBRARIES
+# - ${DEP_NAME}_INCLUDE_DIRS
+# - ${DEP_NAME}_CFLAGS
+#
+FUNCTION(APPLY_PKG_CONFIG TARGET PRIVACY)
+ MATH(EXPR DEST_INDEX "${ARGC}-1")
+ FOREACH(I RANGE 2 ${DEST_INDEX})
+ IF(NOT ${ARGV${I}}_FOUND)
+ MESSAGE(FATAL_ERROR "Not found dependency - ${ARGV${I}}_FOUND")
+ ENDIF(NOT ${ARGV${I}}_FOUND)
+ TARGET_LINK_LIBRARIES(${TARGET} ${PRIVACY} "${${ARGV${I}}_LIBRARIES}")
+ TARGET_INCLUDE_DIRECTORIES(${TARGET} ${PRIVACY} SYSTEM "${${ARGV${I}}_INCLUDE_DIRS}")
+ STRING(REPLACE ";" " " CFLAGS_STR "${${ARGV${I}}_CFLAGS}")
+ SET(CFLAGS_LIST ${CFLAGS_STR})
+ SEPARATE_ARGUMENTS(CFLAGS_LIST)
+ FOREACH(OPTION ${CFLAGS_LIST})
+ TARGET_COMPILE_OPTIONS(${TARGET} ${PRIVACY} ${OPTION})
+ ENDFOREACH(OPTION)
+ SET_TARGET_PROPERTIES(${TARGET} PROPERTIES SKIP_BUILD_RPATH true)
+ ENDFOREACH(I RANGE 2 ${DEST_INDEX})
+ENDFUNCTION(APPLY_PKG_CONFIG TARGET PRIVACY)
+++ /dev/null
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EVENTSYSTEM_DAEMON_H__
-#define __EVENTSYSTEM_DAEMON_H__
-
-/**
- * header file for eventsystem_daemon
- */
-
-#include <stdbool.h>
-#include <glib.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#undef LOG_TAG
-#define LOG_TAG "ESD"
-
-#define _E(fmt, arg...) LOGE(fmt, ##arg)
-#define _D(fmt, arg...) LOGD(fmt, ##arg)
-#define _W(fmt, arg...) LOGW(fmt, ##arg)
-#define _I(fmt, arg...) LOGI(fmt, ##arg)
-
-#define FREE_AND_NULL(ptr) do { \
- if (ptr) { \
- free((void *)ptr); \
- ptr = NULL; \
- } \
-} while (0)
-
-#define ESD_BOOT_COMPLETED "/tmp/esd_ready"
-
-#define SYSTEMD_DBUS_DEST "org.freedesktop.systemd1"
-#define SYSTEMD_DBUS_IFACE_MANAGER SYSTEMD_DBUS_DEST ".Manager"
-#define SYSTEMD_DBUS_PATH "/org/freedesktop/systemd1"
-#define SYSTEMD_DBUS_SIGNAL_STARTUP_FINISHED "StartupFinished"
-#define SYSTEMD_DBUS_SIGNAL_USER_STARTUP_FINISHED "UserSessionStartupFinished"
-
-typedef struct cion_service_info {
- char *service_name;
- char *appid;
- char *display_name;
-} cion_service_info_s;
-
-int __esd_register_vconf_callbacks(void);
-
-int _esd_cion_init(void);
-void _esd_cion_adds_enabled_app(const char *service_name, const char *app_id,
- const char *display_name);
-void _esd_cion_removes_enabled_app(const char *service_name, const char *app_id);
-
-int esd_cion_db_init(void);
-int esd_cion_get_uuid_with_generate(const char* appid, char** uuid);
-int esd_cion_set_display_name(const char *appid, const char *service_name,
- char *display_name);
-int esd_cion_get_display_name(const char *appid, const char *service_name,
- char **display_name);
-int esd_cion_set_enabled(const char *appid, const char *service_name,
- bool enabled);
-int esd_cion_get_enabled(const char *appid, const char *service_name,
- int *enabled);
-int esd_cion_get_enabled_service_list(GList **list);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EVENTSYSTEM_DAEMONE_H__ */
Name: esd
Summary: Event system daemon
-Version: 0.2.5
+Version: 1.0.0
Release: 1
Group: Application Framework/Service
License: Apache-2.0
Source0: %{name}-%{version}.tar.gz
Source1: esd.service
+Source1001: %{name}.manifest
BuildRequires: cmake
BuildRequires: pkgconfig(aul)
BuildRequires: pkgconfig(bundle)
%description devel
Event system Daemon (devel)
+%package -n esd-mod-cion
+Summary: ESD module for cion
+Group: Application Framework/Service
+
+%description -n esd-mod-cion
+This module is for cion
+
+%package -n esd-mod-dbus-event
+Summary: ESD module for dbus-event
+Group: Application Framework/Service
+
+%description -n esd-mod-dbus-event
+This module is for event system using dbus
+
+%define _moddir %{_datadir}/esd
+
%prep
%setup -q
+cp %{SOURCE1001} .
%build
export CFLAGS="$CFLAGS -DTIZEN_DEBUG_ENABLE"
export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE"
export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE"
+MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'`
+%cmake \
+ -DFULLVER=%{version} \
+ -DMAJORVER=${MAJORVER} \
+ -DESD_MODULES_DIR=%{_moddir} \
+ .
-%cmake .
make %{?jobs:-j%jobs}
%install
%postun -p /sbin/ldconfig
%files
-%manifest esd.manifest
+%manifest %{name}.manifest
%config %{_sysconfdir}/dbus-1/system.d/eventsystem.conf
%defattr(-,root,root,-)
%{_bindir}/esd
+%{_libdir}/libesd.so.*
%{_unitdir}/esd.service
%{_unitdir}/multi-user.target.wants/esd.service
%attr(0644,root,root) %{_datadir}/dbus-1/system-services/tizen.system.event.app2esd.service
%license LICENSE
%files devel
-%defattr(-,root,root,-)
+%{_includedir}/esd/*.hh
+%{_libdir}/libesd.so
+%{_libdir}/pkgconfig/*pc
+
+%files -n esd-mod-cion
+%manifest %{name}.manifest
+%license LICENSE
+%{_moddir}/mod/libesd-mod-cion.so
+
+%files -n esd-mod-dbus-event
+%manifest %{name}.manifest
+%license LICENSE
+%{_moddir}/mod/libesd-mod-dbus-event.so
--- /dev/null
+ADD_SUBDIRECTORY(esd)
+ADD_SUBDIRECTORY(lib)
+ADD_SUBDIRECTORY(modules)
--- /dev/null
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} ESD_SRCS)
+
+ADD_EXECUTABLE(${TARGET_ESD} ${ESD_SRCS})
+
+SET_TARGET_PROPERTIES(${TARGET_ESD} PROPERTIES COMPILE_FLAGS "-fPIE")
+SET_TARGET_PROPERTIES(${TARGET_ESD} PROPERTIES LINK_FLAGS
+ "-pie -Wl,-z,relro")
+
+TARGET_LINK_LIBRARIES(${TARGET_ESD} PRIVATE ${TARGET_LIB_ESD} "-ldl")
+TARGET_INCLUDE_DIRECTORIES(${TARGET_ESD} PUBLIC
+ ${CMAKE_CURRENT_SOURCE_DIR}/../lib)
+
+APPLY_PKG_CONFIG(${TARGET_ESD} PUBLIC
+ DLOG_DEPS
+ GLIB_DEPS
+)
+
+INSTALL(TARGETS ${TARGET_ESD} DESTINATION bin)
+CONFIGURE_FILE(tizen.system.event.app2esd.service.in tizen.system.event.app2esd.service @ONLY)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/tizen.system.event.app2esd.service DESTINATION ${SHARE_INSTALL_PREFIX}/dbus-1/system-services/)
--- /dev/null
+/*
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "module_runner.hh"
+
+constexpr const char MODULE_PATH[] = "/usr/share/esd/mod/";
+
+int main(int argc, char* argv[]) {
+ esd::ModuleRunner runner;
+
+ if (runner.Run(MODULE_PATH))
+ return 0;
+
+ return -1;
+}
--- /dev/null
+/*
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "module_runner.hh"
+
+#include <dirent.h>
+#include <fcntl.h>
+#include <glib.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <log.hh>
+
+namespace esd {
+
+ModuleRunner::ModuleRunner() = default;
+
+bool ModuleRunner::Run(const std::string& module_path) {
+ GMainLoop* loop = g_main_loop_new(nullptr, FALSE);
+ if (loop == nullptr) {
+ _E("out of memory");
+ return false;
+ }
+
+ _I("ESD : Init modules");
+ if (!InitModules(module_path)) {
+ g_main_loop_unref(loop);
+ return false;
+ }
+
+ g_main_loop_run(loop);
+ _E("ESD : Shutdown");
+ FiniModules();
+ g_main_loop_unref(loop);
+
+ return true;
+}
+
+bool ModuleRunner::InitModules(const std::string& module_path) {
+ DIR* dp = opendir(module_path.c_str());
+ if (dp == nullptr)
+ return false;
+
+ dirent* dentry;
+ while ((dentry = readdir(dp)) != nullptr) {
+ if (dentry->d_name[0] == '.')
+ continue;
+
+ char* extension = strrchr(dentry->d_name, '.');
+ if (extension == nullptr || strcmp(extension, ".so") != 0)
+ continue;
+
+ std::string path = module_path + "/" +
+ std::string(dentry->d_name);
+
+ if (!InitModule(path)) {
+ closedir(dp);
+ return false;
+ }
+ }
+
+ closedir(dp);
+
+ return true;
+}
+
+bool ModuleRunner::InitModule(const std::string& module_path) {
+ std::unique_ptr<void, DlCloser> handle(
+ dlopen(module_path.c_str(), RTLD_LAZY | RTLD_GLOBAL));
+ if (!handle) {
+ _E("dlopen() is failed. path(%s), error(%s)", module_path.c_str(),
+ dlerror());
+ return false;
+ }
+
+ using esd_mod_func = esd::api::IModule* (*)();
+ auto* get_mod = reinterpret_cast<esd_mod_func>(
+ dlsym(handle.get(), "ESD_GET_MODULE"));
+ if (get_mod == nullptr) {
+ _E("dlsym() is failed");
+ return false;
+ }
+
+ auto* mod = get_mod();
+ modules_.push_back(std::unique_ptr<api::IModule>(mod));
+ libs_.push_back(std::move(handle));
+ return mod->Startup(&tools_);
+}
+
+void ModuleRunner::FiniModules() {
+ for (auto& mod : modules_)
+ mod->Shutdown();
+}
+
+} // namespace esd
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef EVENTSYSTEM_ESD_HH_
+#define EVENTSYSTEM_ESD_HH_
+
+#include <dlfcn.h>
+#include <list>
+#include <memory>
+#include <string>
+
+#include <imodule.hh>
+#include <tool_box.hh>
+
+namespace esd {
+
+class ModuleRunner {
+ public:
+ ModuleRunner();
+ bool Run(const std::string& module_path);
+
+ private:
+ bool InitModules(const std::string& module_path);
+ bool InitModule(const std::string& module_path);
+ void FiniModules();
+
+ private:
+ struct DlCloser {
+ void operator()(void* handle) const {
+ dlclose(handle);
+ }
+ };
+
+ api::ToolBox tools_;
+ std::list<std::unique_ptr<void, DlCloser>> libs_;
+ std::list<std::unique_ptr<api::IModule>> modules_;
+};
+
+} // namespace esd
+
+#endif // EVENTSYSTEM_ESD_HH_
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <dlog.h>
-
-#include "eventsystem_daemon.h"
-#include "cion_ondemand_server.h"
-
-namespace {
- std::shared_ptr<CionOndemandServer> esd_cion_server;
- bool is_listening = false;
-} // namespace
-
-static void __change_listen_status_cion_server() {
- try {
- GList *list = nullptr;
- int ret = esd_cion_get_enabled_service_list(&list);
- if (ret != 0) {
- _D("Get list error");
- } else if (list == nullptr && is_listening) {
- esd_cion_server->Stop();
- is_listening = false;
- _D("esd_cion_server stop listen");
- } else if (list != nullptr && !is_listening) {
- esd_cion_server->Listen();
- is_listening = true;
- _D("esd_cion_server start listen");
- }
- } catch (const cion::Exception& e) {
- _E("cion_init failed : %s", e.what());
- }
-
- return;
-}
-
-int _esd_cion_init() {
- try {
- esd_cion_server =
- std::make_shared<CionOndemandServer>("__CION_INTERNAL_DAEMON__", "");
- } catch (const cion::Exception& e) {
- _D("cion_init failed : %s", e.what());
- return -1;
- }
-
- _D("cion_init done");
-
- __change_listen_status_cion_server();
-
- return 0;
-}
-
-void _esd_cion_adds_enabled_app(const char *service_name, const char *app_id,
- const char *display_name) {
- if (esd_cion_server == nullptr) {
- _E("Call init function at first");
- return;
- }
-
- esd_cion_server->AddOndemandServiceList(std::string(service_name),
- std::string(app_id), std::string(display_name));
-
- if (!is_listening)
- __change_listen_status_cion_server();
-}
-
-void _esd_cion_removes_enabled_app(const char *service_name, const char *app_id) {
- if (esd_cion_server == nullptr) {
- _E("Call init function at first");
- return;
- }
-
- esd_cion_server->RemoveOndemandServiceList(std::string(service_name),
- std::string(app_id));
-
- if (is_listening)
- __change_listen_status_cion_server();
-}
\ No newline at end of file
+++ /dev/null
-#include <stdlib.h>
-#include <uuid/uuid.h>
-#include <sqlite3.h>
-#include <string.h>
-#include <dlog.h>
-#include <unistd.h>
-#include <tzplatform_config.h>
-#include <stdbool.h>
-#include <glib.h>
-
-#include "eventsystem_daemon.h"
-
-#define DBPATH tzplatform_mkpath(TZ_SYS_DB, ".cion.db")
-
-#define CREATE_CION_TABLE " \
-PRAGMA user_version = 50; \
-PRAGMA journal_mode = PERSIST; \
-PRAGMA foreign_keys = ON; \
-BEGIN EXCLUSIVE TRANSACTION; \
-CREATE TABLE IF NOT EXISTS cion_uuid ( \
- appid TEXT NOT NULL, \
- uuid TEXT NOT NULL, \
- PRIMARY KEY(appid) \
-); \
-CREATE TABLE IF NOT EXISTS cion_display_name ( \
- service_name TEXT NOT NULL, \
- appid TEXT NOT NULL, \
- display_name TEXT NULL, \
- enabled INTEGER DEFAULT 0, \
- PRIMARY KEY(service_name, appid) , \
- FOREIGN KEY(appid) REFERENCES cion_uuid (appid) ON DELETE CASCADE \
-); \
-COMMIT TRANSACTION; "
-
-static int __check_table_exist(sqlite3 *db) {
- int ret;
- const char *val;
- sqlite3_stmt *stmt = NULL;
- const char query[] =
- "SELECT name FROM sqlite_master WHERE type='table'"
- " ORDER BY name ASC";
-
- ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
- if (ret != SQLITE_OK) {
- _E("prepare error: %s", sqlite3_errmsg(db));
- ret = -1;
- goto out;
- }
-
- ret = sqlite3_step(stmt);
- if (ret != SQLITE_ROW) {
- _E("fail to get row");
- ret = -1;
- goto out;
- }
-
- val = (const char*)sqlite3_column_text(stmt, 0);
- if (val == NULL) {
- _E("name is NULL");
- ret = -1;
- goto out;
- }
-
- if (strcmp("cion", val) != 0) {
- ret = -1;
- goto out;
- }
-
- ret = 0;
-
-out:
- sqlite3_finalize(stmt);
-
- return ret;
-}
-
-static int __create_table(sqlite3 *db) {
- int ret;
- char *errmsg = NULL;
-
- ret = sqlite3_exec(db, CREATE_CION_TABLE,
- NULL, NULL, &errmsg);
- if (ret != SQLITE_OK) {
- _E("create table fail : %s", errmsg);
- sqlite3_free(errmsg);
- return -1;
- }
-
- return 0;
-}
-
-int esd_cion_db_init(void) {
- sqlite3 *db = NULL;
-
- if (sqlite3_open_v2(DBPATH, &db, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) {
- sqlite3_close_v2(db);
- unlink(DBPATH);
-
- if (sqlite3_open_v2(DBPATH, &db,
- SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE,
- NULL) != SQLITE_OK) {
- _E("Fail to create db");
- unlink(DBPATH);
- return -1;
- }
- }
-
- if (__check_table_exist(db) < 0) {
- if (__create_table(db) < 0) {
- sqlite3_close_v2(db);
- _E("Fail to create table");
- return -1;
- }
- }
-
- sqlite3_close_v2(db);
-
- return 0;
-}
-
-sqlite3 *esd_cion_db_open() {
- sqlite3 *db;
-
- if (access(DBPATH, R_OK | W_OK) != 0)
- return NULL;
-
- if (sqlite3_open_v2(DBPATH, &db, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK)
- return NULL;
-
- return db;
-}
-
-int esd_cion_db_close(sqlite3 **db) {
- if (db == NULL || *db == NULL)
- return 0;
-
- if (sqlite3_close(*db) != SQLITE_OK) {
- _E("Failed to close db");
- return 0;
- }
-
- *db = NULL;
-
- return 0;
-}
-
-static const char *__esd_cion_generate_uuid() {
- uuid_t uu;
- char _uuid[37];
- char *uuid;
-
- uuid_generate_random(uu);
- uuid_unparse(uu, _uuid);
-
- uuid = strdup(_uuid);
-
- return uuid;
-}
-
-static int __esd_cion_get_uuid(sqlite3 *db, const char *appid, char **uuid) {
- int ret = -1;
- char *query;
- sqlite3_stmt *stmt = NULL;
-
- query = sqlite3_mprintf("SELECT uuid FROM cion_uuid "
- "WHERE appid = %Q", appid);
- if (query == NULL)
- goto out;
-
- ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
- if (ret != SQLITE_OK)
- goto out;
-
- ret = sqlite3_step(stmt);
- if (ret == SQLITE_ROW) {
- ret = 0;
- *uuid = strdup((char*)sqlite3_column_text(stmt, 0));
- }
-
-out:
- sqlite3_free(query);
- sqlite3_finalize(stmt);
-
- return ret;
-}
-
-static int __esd_cion_set_uuid(sqlite3 *db, const char *appid, const char *uuid) {
- int ret = -1;
- char *query;
- sqlite3_stmt *stmt = NULL;
-
- query = sqlite3_mprintf("INSERT INTO cion_uuid (appid, uuid) "
- "VALUES (%Q, %Q) ", appid, uuid);
- if (query == NULL)
- goto out;
-
- ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
- if (ret != SQLITE_OK)
- goto out;
-
- ret = sqlite3_step(stmt);
- if (ret == SQLITE_OK || ret == SQLITE_DONE)
- ret = 0;
-
-out:
- sqlite3_free(query);
- sqlite3_finalize(stmt);
-
- return ret;
-}
-
-int esd_cion_get_uuid_with_generate(const char *appid, char **uuid) {
- int ret = 0;
- sqlite3 *db;
- const char *_uuid;
-
- db = esd_cion_db_open();
- if (!db) {
- _E("db open fail");
- return -1;
- }
-
- if (__esd_cion_get_uuid(db, appid, uuid) != 0) {
- _uuid = __esd_cion_generate_uuid();
- ret = __esd_cion_set_uuid(db, appid, _uuid);
- if (ret == 0)
- *uuid = (char*)_uuid;
- else
- free((char*)_uuid);
-
- _E("get uuid generate");
- }
-
- esd_cion_db_close(&db);
-
- return ret;
-}
-
-int esd_cion_set_display_name(const char *appid, const char *service_name,
- char *display_name) {
- int ret = -1;
- sqlite3 *db;
- char *query = NULL;
- sqlite3_stmt *stmt = NULL;
- char *_uuid = NULL;
-
- db = esd_cion_db_open();
- if (!db) {
- _E("db open fail");
- return -1;
- }
-
- if (__esd_cion_get_uuid(db, appid, &_uuid) != 0) {
- _uuid = (char*)__esd_cion_generate_uuid();
- ret = __esd_cion_set_uuid(db, appid, _uuid);
- if (ret != 0)
- goto out;
- }
-
- query = sqlite3_mprintf("INSERT INTO cion_display_name "
- "(service_name, appid, display_name) "
- "VALUES (%Q, %Q, %Q) ON CONFLICT(service_name, appid)"
- "DO UPDATE SET display_name = %Q "
- "WHERE service_name = %Q AND appid = %Q ", service_name, appid, display_name,
- display_name, service_name, appid);
- if (query == NULL)
- goto out;
-
- ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
- if (ret != SQLITE_OK)
- goto out;
-
- ret = sqlite3_step(stmt);
- _E("set name step: %d", ret);
-
- if (ret == SQLITE_OK || ret == SQLITE_DONE)
- ret = 0;
-
-out:
- free(_uuid);
- sqlite3_free(query);
- sqlite3_finalize(stmt);
- esd_cion_db_close(&db);
-
- return ret;
-}
-
-int esd_cion_get_display_name(const char *appid, const char *service_name,
- char **display_name) {
- int ret = -1;
- sqlite3 *db;
- char *query = NULL;
- sqlite3_stmt *stmt = NULL;
- char *_name = NULL;
-
- db = esd_cion_db_open();
- if (!db) {
- _E("db open fail");
- return -1;
- }
-
- query = sqlite3_mprintf("SELECT display_name FROM cion_display_name "
- "WHERE appid = %Q AND service_name = %Q", appid, service_name);
- if (query == NULL)
- goto out;
-
- ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
- if (ret != SQLITE_OK)
- goto out;
-
- ret = sqlite3_step(stmt);
- if (ret == SQLITE_ROW) {
- ret = 0;
-
- _name = (char*)sqlite3_column_text(stmt, 0);
-
- if (_name != NULL)
- *display_name = strdup(_name);
- else
- _E("get display name null");
-
- } else if (ret == SQLITE_DONE){
- _E("get display name not exist");
- ret = 0;
- }
-
-out:
- sqlite3_free(query);
- sqlite3_finalize(stmt);
- esd_cion_db_close(&db);
-
- return ret;
-}
-
-int esd_cion_set_enabled(const char *appid, const char *service_name,
- bool enabled) {
- int ret = -1;
- sqlite3 *db;
- char *query = NULL;
- const char *display_name = "";
- sqlite3_stmt *stmt = NULL;
- sqlite3_stmt *select_stmt = NULL;
-
- db = esd_cion_db_open();
- if (!db) {
- _E("db open fail");
- return -1;
- }
-
- query = sqlite3_mprintf("UPDATE cion_display_name SET enabled = %i "
- "WHERE appid = %Q AND service_name = %Q", enabled? 1 : 0 ,
- appid, service_name);
- if (query == NULL)
- goto out;
-
- ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
- if (ret != SQLITE_OK)
- goto out;
-
- ret = sqlite3_step(stmt);
- if (ret != SQLITE_OK && ret != SQLITE_DONE)
- goto out;
-
- sqlite3_free(query);
- query = sqlite3_mprintf("SELECT display_name FROM cion_display_name "
- "WHERE appid = %Q AND service_name = %Q", appid, service_name);
- if (query == NULL)
- goto out;
-
- ret = sqlite3_prepare_v2(db, query, strlen(query), &select_stmt, NULL);
- if (ret != SQLITE_OK)
- goto out;
-
- ret = sqlite3_step(select_stmt);
- if (ret == SQLITE_ROW) {
- ret = 0;
- display_name = (const char*)sqlite3_column_text(select_stmt, 0);
- }
-
- if (enabled)
- _esd_cion_adds_enabled_app(service_name, appid, display_name);
- else
- _esd_cion_removes_enabled_app(service_name, appid);
-
-out:
- sqlite3_free(query);
- sqlite3_finalize(stmt);
- sqlite3_finalize(select_stmt);
- esd_cion_db_close(&db);
-
- return ret;
-}
-
-int esd_cion_get_enabled(const char *appid, const char *service_name,
- int *enabled) {
- int ret = -1;
- sqlite3 *db;
- char *query = NULL;
- sqlite3_stmt *stmt = NULL;
-
- db = esd_cion_db_open();
- if (!db) {
- _E("db open fail");
- return -1;
- }
-
- query = sqlite3_mprintf("SELECT enabled FROM cion_display_name "
- "WHERE appid = %Q AND service_name = %Q", appid, service_name);
- if (query == NULL)
- goto out;
-
- ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
- if (ret != SQLITE_OK)
- goto out;
-
- ret = sqlite3_step(stmt);
- if (ret == SQLITE_ROW) {
- ret = 0;
-
- *enabled = sqlite3_column_int(stmt, 0);
- } else if (ret == SQLITE_DONE){
- _E("get enabled not exist");
- ret = 0;
- }
-
-out:
- sqlite3_free(query);
- sqlite3_finalize(stmt);
- esd_cion_db_close(&db);
-
- return ret;
-}
-
-static void __cion_service_info_destroy(cion_service_info_s *info)
-{
- if (info == NULL)
- return;
-
- free(info->service_name);
- free(info->appid);
- free(info->display_name);
- free(info);
-}
-
-static cion_service_info_s *__cion_service_info_create(sqlite3_stmt *stmt)
-{
- cion_service_info_s *info;
- const char* value;
- int index = 0;
-
- info = calloc(1, sizeof(cion_service_info_s));
- if (info == NULL) {
- _E("malloc() is failed");
- return NULL;
- }
-
- value = (const char *)sqlite3_column_text(stmt, index++);
- if (value == NULL) {
- _E("sqlite3_column_text() is failed. index: %d", index - 1);
- __cion_service_info_destroy(info);
- return NULL;
- }
-
- info->service_name = strdup(value);
- if (info->service_name == NULL) {
- _E("strdup() is failed");
- __cion_service_info_destroy(info);
- return NULL;
- }
-
- value = (const char *)sqlite3_column_text(stmt, index++);
- if (value == NULL) {
- _E("sqlite3_column_text() is failed. index: %d", index - 1);
- __cion_service_info_destroy(info);
- return NULL;
- }
-
- info->appid = strdup(value);
- if (info->appid == NULL) {
- _E("strdup() is failed");
- __cion_service_info_destroy(info);
- return NULL;
- }
-
- value = (const char *)sqlite3_column_text(stmt, index++);
- if (value != NULL)
- info->display_name = strdup(value);
- else
- info->display_name = strdup("");
-
- if (info->display_name == NULL) {
- _E("strdup() is failed");
- __cion_service_info_destroy(info);
- return NULL;
- }
-
- return info;
-}
-
-int esd_cion_get_enabled_service_list(GList **list)
-{
- int ret = -1;
- sqlite3 *db;
- char *query = NULL;
- sqlite3_stmt *stmt = NULL;
- cion_service_info_s *cion_info;
-
- db = esd_cion_db_open();
- if (!db) {
- _E("db open fail");
- return -1;
- }
-
- query = sqlite3_mprintf("SELECT service_name, appid, display_name "
- "FROM cion_display_name WHERE enabled = 1");
- if (query == NULL)
- goto out;
-
- ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
- if (ret != SQLITE_OK)
- goto out;
-
- while (sqlite3_step(stmt) == SQLITE_ROW) {
- cion_info = __cion_service_info_create(stmt);
- if (cion_info == NULL) {
- ret = -1;
- goto out;
- }
-
- _D("get list : [%s:%s:%s]",
- cion_info->service_name, cion_info->appid,
- cion_info->display_name);
- *list = g_list_append(*list, cion_info);
- }
-
-out:
- sqlite3_free(query);
- sqlite3_finalize(stmt);
- esd_cion_db_close(&db);
-
- return ret;
-}
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <glib.h>
-#include <aul.h>
-#include <aul_svc.h>
-#include <unistd.h>
-#include <ctype.h>
-#include <dlog.h>
-#include <gio/gio.h>
-#include <package-manager.h>
-#include <pkgmgr-info.h>
-#include <appsvc/appsvc.h>
-#include <eventsystem.h>
-#include <bundle_internal.h>
-#include <fcntl.h>
-#include <vconf.h>
-#include <tzplatform_config.h>
-#include <cert-svc/ccert.h>
-#include <cert-svc/cinstance.h>
-#include <cynara-client.h>
-#include <cynara-creds-gdbus.h>
-#include <cynara-session.h>
-#include <security-manager.h>
-#include "eventsystem_daemon.h"
-
-#define DEFAULT_USER tzplatform_getuid(TZ_SYS_DEFAULT_USER)
-#define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
-#define ROOT_USER 0
-
-#define SYS_EVENT_NAME_PREFIX "tizen.system.event"
-#define SYS_EVENT_OBJ_PATH "/tizen/system/event"
-#define REQUEST_LAST_DATA "request_last_data"
-
-static GHashTable *event_launch_table; /* table of events for launch_on_event*/
-
-static const char *event_launch_support_list[] = {
- SYS_EVENT_BATTERY_CHARGER_STATUS,
- SYS_EVENT_USB_STATUS,
- SYS_EVENT_EARJACK_STATUS,
- SYS_EVENT_INCOMMING_MSG,
- SYS_EVENT_OUTGOING_MSG,
- SYS_EVENT_WIFI_STATE
-};
-
-struct privilege_info {
- const char *event_name;
- const char *privilege_name;
-};
-
-static const struct privilege_info privilege_check_list[] = {
- {SYS_EVENT_DISPLAY_STATE, "http://tizen.org/privilege/display"},
- {SYS_EVENT_WIFI_STATE, "http://tizen.org/privilege/network.get"},
- {SYS_EVENT_INCOMMING_MSG, "http://tizen.org/privilege/message.read"},
- {SYS_EVENT_OUTGOING_MSG, "http://tizen.org/privilege/message.read"}
-};
-
-static int privilege_check_size = sizeof(privilege_check_list)/sizeof(struct privilege_info);
-
-#ifdef APPFW_EVENT_SYSTEM_EARLIER_FEATURE
-static const char *earlier_event_list[] = {
- SYS_EVENT_ESD_STATUS,
- SYS_EVENT_LOW_MEMORY,
- SYS_EVENT_BOOT_COMPLETED,
- SYS_EVENT_SYSTEM_SHUTDOWN,
- SYS_EVENT_BATTERY_CHARGER_STATUS
-};
-
-static GHashTable *earlier_event_table; /* table of events for earlier_data */
-
-typedef struct __earlier_table_item {
- char *event_name;
- guint reg_id;
- bundle *earlier_data; /* event-data from earlier occurrence */
-} earlier_item;
-
-#endif
-
-static GHashTable *user_last_event_table; /* table of user events for last data */
-
-struct __last_event_item {
- char *key;
- char *app_id;
- char *event_name;
- char *own_name;
- uid_t uid;
-};
-
-static GHashTable *trusted_busname_table; /* table of dbus bus-names for trusted user-event */
-
-typedef struct __trusted_busname_item {
- char *app_id;
- char *bus_name;
- int pid;
- uid_t uid;
-} trusted_item;
-
-typedef struct __eventlaunch_item_param {
- char *app_id;
-} eventlaunch_item_param_s;
-
-enum trusted_result {
- TRUSTED_UNKNOWN,
- TRUSTED_ALLOWED,
- TRUSTED_DENIED,
-};
-
-typedef struct esd_list_item {
- char *pkg_id;
- char *app_id;
- int trusted_info;
- uid_t uid;
-} esd_list_item_s;
-
-typedef struct __event_launch_table_item {
- char *event_name;
- char *package_name; /* just for passing pointer to app-list removal func */
- GList *app_list_evtlaunch; /* app-list for on-event-launch */
- guint reg_id;
- uid_t uid;
-} event_launch_item;
-
-enum __pkg_event_type {
- UNKNOWN = 0,
- INSTALL,
- UNINSTALL,
- UPDATE,
-};
-
-typedef struct __pkgmgr_event {
- int type;
- char *pkgid;
-} esd_pkgmgr_event;
-
-typedef struct __esd_event_param {
- char *event_name;
- bundle *event_data;
- uid_t sender_uid;
- char *sender_appid;
- bool is_user_event;
- bool trusted;
- void *user_data;
-} esd_event_param;
-
-typedef struct esd_info {
- pkgmgr_client *client;
-} esd_info_s;
-static esd_info_s s_info;
-
-typedef struct __esd_appctrl_cb_data {
- char *appid;
- char *pkgid;
- uid_t uid;
-} esd_appctrl_cb_data;
-
-static void __esd_event_handler(char *event_name, bundle *data, void *user_data);
-static int __esd_add_appinfo_handler(const pkgmgrinfo_appinfo_h handle, void *data);
-
-static cynara *r_cynara;
-
-static int __esd_init_cynara(void)
-{
- int ret;
-
- ret = cynara_initialize(&r_cynara, NULL);
- if (ret != CYNARA_API_SUCCESS) {
- _E("cynara initialize failed.");
- return ret;
- }
-
- return 0;
-}
-
-static void __esd_finish_cynara(void)
-{
- if (r_cynara)
- cynara_finish(r_cynara);
- r_cynara = NULL;
-}
-
-static void free_saved_event(struct __last_event_item *item)
-{
- if (!item)
- return;
-
- free(item->event_name);
- free(item->own_name);
- free(item->app_id);
- free(item);
-}
-
-#ifdef APPFW_EVENT_SYSTEM_EARLIER_FEATURE
-static int __esd_check_earlier_support(const char *event_name)
-{
- int i = 0;
- int size = sizeof(earlier_event_list)/sizeof(*earlier_event_list);
-
- for (i = 0; i < size; i++) {
- if (strcmp(earlier_event_list[i], event_name) == 0)
- return true;
- }
-
- return false;
-}
-#endif
-
-static bool __esd_check_platform_cert(const char *pkgid, uid_t uid)
-{
- _D("Checking if %s has a platform certification", pkgid);
-
- int r;
- const char *cert_value;
- pkgmgrinfo_certinfo_h certinfo;
- CertSvcInstance instance;
- CertSvcCertificate certificate;
- CertSvcVisibility visibility = CERTSVC_VISIBILITY_PUBLIC;
-
- r = pkgmgrinfo_pkginfo_create_certinfo(&certinfo);
- if (r != PMINFO_R_OK) {
- _E("Failed to create certinfo");
- return false;
- }
-
- r = pkgmgrinfo_pkginfo_load_certinfo(pkgid, certinfo, uid);
- if (r != PMINFO_R_OK) {
- _E("Failed to load certinfo");
- pkgmgrinfo_pkginfo_destroy_certinfo(certinfo);
- return false;
- }
-
- r = pkgmgrinfo_pkginfo_get_cert_value(certinfo,
- PMINFO_DISTRIBUTOR_ROOT_CERT, &cert_value);
- if (r != PMINFO_R_OK || cert_value == NULL) {
- _E("Failed to get cert value");
- pkgmgrinfo_pkginfo_destroy_certinfo(certinfo);
- return false;
- }
-
- r = certsvc_instance_new(&instance);
- if (r != CERTSVC_SUCCESS) {
- _E("certsvc_instance_new() is failed.");
- pkgmgrinfo_pkginfo_destroy_certinfo(certinfo);
- return false;
- }
-
- r = certsvc_certificate_new_from_memory(instance,
- (const unsigned char *)cert_value,
- strlen(cert_value),
- CERTSVC_FORM_DER_BASE64,
- &certificate);
- if (r != CERTSVC_SUCCESS) {
- _E("certsvc_certificate_new_from_memory() is failed.");
- pkgmgrinfo_pkginfo_destroy_certinfo(certinfo);
- certsvc_instance_free(instance);
- return false;
- }
-
- r = certsvc_certificate_get_visibility(certificate, &visibility);
- if (r != CERTSVC_SUCCESS)
- _E("certsvc_certificate_get_visibility() is failed.");
-
- pkgmgrinfo_pkginfo_destroy_certinfo(certinfo);
- certsvc_certificate_free(certificate);
- certsvc_instance_free(instance);
-
- _D("visibility is %d", visibility);
- if (visibility & CERTSVC_VISIBILITY_PLATFORM) {
- _D("%s has a platform certification", pkgid);
- return true;
- }
-
- return false;
-}
-
-static int __esd_check_event_launch_support(const char *event_name)
-{
- int i = 0;
- int size = sizeof(event_launch_support_list)/sizeof(*event_launch_support_list);
-
- for (i = 0; i < size; i++) {
- if (strcmp(event_launch_support_list[i], event_name) == 0)
- return true;
- }
-
- return false;
-}
-
-static int __get_sender_unixinfo(GDBusConnection *conn, const char *sender_name, const char *type)
-{
- GDBusMessage *msg = NULL;
- GDBusMessage *reply = NULL;
- GError *err = NULL;
- GVariant *body;
- int ret = -1;
- unsigned int value;
-
- msg = g_dbus_message_new_method_call("org.freedesktop.DBus", "/org/freedesktop/DBus",
- "org.freedesktop.DBus", type);
- if (!msg) {
- _E("Can't allocate new method call");
- goto out;
- }
-
- g_dbus_message_set_body(msg, g_variant_new("(s)", sender_name));
- reply = g_dbus_connection_send_message_with_reply_sync(conn, msg,
- G_DBUS_SEND_MESSAGE_FLAGS_NONE, -1, NULL, NULL, &err);
-
- if (!reply) {
- if (err != NULL) {
- _E("Failed to get info [%s]", err->message);
- g_error_free(err);
- }
- goto out;
- }
-
- body = g_dbus_message_get_body(reply);
- g_variant_get(body, "(u)", &value);
- ret = (int)value;
-
-out:
- if (msg)
- g_object_unref(msg);
- if (reply)
- g_object_unref(reply);
-
- return ret;
-}
-
-static int __get_sender_pid(GDBusConnection *conn, const char *sender_name)
-{
- int pid = 0;
-
- pid = __get_sender_unixinfo(conn, sender_name, "GetConnectionUnixProcessID");
- if (pid < 0) {
- _E("failed to get pid");
- pid = 0;
- }
-
- _D("sender_name(%s), pid(%d)", sender_name, pid);
-
- return pid;
-}
-
-static int __get_sender_uid(GDBusConnection *conn, const char *sender_name)
-{
- int uid = -1;
-
- uid = __get_sender_unixinfo(conn, sender_name, "GetConnectionUnixUser");
- if (uid < 0)
- _E("failed to get uid");
-
- _D("sender_name(%s), uid(%d)", sender_name, uid);
-
- return uid;
-}
-
-static int __esd_check_certificate_match(uid_t uid, const char *app_id, uid_t from_uid, const char *from_appid)
-{
- pkgmgrinfo_cert_compare_result_type_e res;
- int ret = 0;
-
- _D("uid(%d), app_id(%s), from_uid(%d), from_appid(%s)", uid, app_id, from_uid, from_appid);
-
- ret = pkgmgrinfo_pkginfo_compare_usr_app_cert_info(app_id, from_appid, from_uid, &res);
- if (ret < 0) {
- _E("failed to check certificate");
- return ES_R_ERROR;
- }
-
- if (res != PMINFO_CERT_COMPARE_MATCH) {
- _D("certificat not match (%s)", app_id);
- return ES_R_EINVAL;
- }
-
- return ES_R_OK;
-}
-
-static bool __esd_check_application_validation(uid_t uid, const char *appid)
-{
- int ret = 0;
- pkgmgrinfo_appinfo_h handle;
-
- ret = pkgmgrinfo_appinfo_get_usr_appinfo(appid, uid, &handle);
- if (ret != PMINFO_R_OK)
- return false;
-
- pkgmgrinfo_appinfo_destroy_appinfo(handle);
-
- if (!aul_app_is_running_for_uid(appid, uid))
- return false;
-
- return true;
-}
-
-static void __esd_trusted_busname_print_items(void)
-{
- GHashTableIter iter;
- gpointer key;
- gpointer value;
-
- g_hash_table_iter_init(&iter, trusted_busname_table);
-
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- trusted_item *item = (trusted_item *)value;
- if (item)
- _D("uid(%d), appid(%s), pid(%d), busname(%s)", item->uid, item->app_id, item->pid, item->bus_name);
- }
-}
-
-static int __esd_trusted_busname_add_item(uid_t uid, const char *appid, const char *busname, int pid)
-{
- char *app_id = NULL;
- char *bus_name = NULL;
- trusted_item *item = NULL;
- trusted_item *new_item;
-
- app_id = strdup(appid);
- if (app_id == NULL) {
- _E("out of memory");
- return ES_R_ENOMEM;
- }
-
- bus_name = strdup(busname);
- if (bus_name == NULL) {
- _E("out of memory");
- FREE_AND_NULL(app_id);
- return ES_R_ENOMEM;
- }
-
- item = (trusted_item *)g_hash_table_lookup(trusted_busname_table, app_id);
-
- if (item && item->bus_name && strcmp(item->bus_name, bus_name) == 0 &&
- (item->uid == uid)) {
- _D("already exist (%s, %s)", app_id, bus_name);
- FREE_AND_NULL(app_id);
- FREE_AND_NULL(bus_name);
- } else {
- new_item = calloc(1, sizeof(trusted_item));
- if (new_item == NULL) {
- _E("memory alloc failed");
- FREE_AND_NULL(app_id);
- FREE_AND_NULL(bus_name);
- return ES_R_ENOMEM;
- }
- new_item->uid = uid;
- new_item->app_id = app_id;
- new_item->bus_name = bus_name;
- new_item->pid = pid;
- g_hash_table_insert(trusted_busname_table, new_item->app_id, new_item);
- _D("added busname(%s)", new_item->bus_name);
- }
-
- return ES_R_OK;
-}
-
-static int __esd_check_trusted_events(GDBusConnection *conn, const char *list_name)
-{
- GVariant *result;
- GError *error = NULL;
- GVariantIter *iter;
- gchar *str;
- char tmp_appid[128] = {0, };
- int pid = 0;
- int uid = 0;
- int ret = 0;
-
- result = g_dbus_connection_call_sync(conn,
- "org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus",
- list_name, NULL, G_VARIANT_TYPE("(as)"), G_DBUS_CALL_FLAGS_NONE,
- -1, NULL, &error);
-
- if (result == NULL) {
- _E("get (%s) error(%s)", list_name, error->message);
- g_error_free(error);
- return ES_R_ERROR;
- }
-
- g_variant_get(result, "(as)", &iter);
- while (g_variant_iter_loop(iter, "s", &str)) {
- if (!strstr((const char *)str, "event.busname.session"))
- continue;
-
- _D("list(%s), name(%s)", list_name, str);
- pid = __get_sender_pid(conn, (const char *)str);
- if (pid <= 0) {
- _E("failed to get pid(%d)", pid);
- continue;
- }
-
- uid = __get_sender_uid(conn, (const char *)str);
- if (uid < 0) {
- _E("failed to get uid(%d)", uid);
- continue;
- }
- _D("uid(%d)", uid);
-
- memset(tmp_appid, 0, sizeof(tmp_appid));
- ret = aul_app_get_appid_bypid_for_uid(pid, tmp_appid, sizeof(tmp_appid), (uid_t)uid);
- if (ret != AUL_R_OK) {
- _E("failed to get appid by pid(%d)", pid);
- continue;
- }
-
- _D("appid(%s)", tmp_appid);
- if (__esd_check_application_validation((uid_t)uid, tmp_appid)) {
- _D("add to table");
- ret = __esd_trusted_busname_add_item((uid_t)uid, tmp_appid, (const char *)str, pid);
- if (ret < 0)
- _E("failed to add item");
- }
- }
- g_variant_iter_free(iter);
- g_variant_unref(result);
-
- return ES_R_OK;
-}
-
-static int __esd_check_privilege_name(const char *event_name, char **privilege_name)
-{
- int i = 0;
-
- *privilege_name = NULL;
-
- for (i = 0; i < privilege_check_size; i++) {
- if (strcmp(event_name, privilege_check_list[i].event_name) == 0) {
- *privilege_name = (char *)privilege_check_list[i].privilege_name;
- _D("[%d] privilege_name(%s)", i, *privilege_name);
- break;
- }
- }
-
- return ES_R_OK;
-}
-
-static bool __esd_check_valid_privilege_by_cynara(const char *appid, const char *client,
- const char *session, const char *user, const char *privilege_name)
-{
- int ret = 0;
- bool has_privilege = false;
-
- _D("check privilege, (%s, %s, %s, %s, %s)", appid, client, session, user, privilege_name);
-
- ret = cynara_check(r_cynara, client, session, user, privilege_name);
- if (ret == CYNARA_API_ACCESS_ALLOWED) {
- _D("valid privilege");
- has_privilege = true;
- } else if (ret == CYNARA_API_ACCESS_DENIED) {
- _E("invalid privilege");
- } else {
- _E("failed to check privilege, error(%d)", ret);
- }
-
- return has_privilege;
-}
-
-static int __esd_check_app_privileged_event(uid_t uid, const char *appid, const char *pkgid, const char *event_name)
-{
- char *privilege_name = NULL;
- int ret = 0;
- int result = 0;
-
- _D("event_name(%s), uid(%d), appid(%s), pkgid(%s)", event_name, uid, appid, pkgid);
-
- __esd_check_privilege_name(event_name, &privilege_name);
-
- if (privilege_name) {
- ret = security_manager_app_has_privilege(appid, privilege_name, uid, &result);
- if (ret != SECURITY_MANAGER_SUCCESS)
- _E("failed to check privilege(%d)", ret);
- _D("result(%d)", result);
- } else {
- result = 1;
- }
-
- return result;
-}
-
-static void __esd_print_appid_with_eventid(gpointer data, gpointer user_data)
-{
- esd_list_item_s *item = (esd_list_item_s *)data;
- char *event_name = (char *)user_data;
-
- _D("event_name(%s)-uid(%d)-app_id(%s)-pkg_id(%s)", event_name, item->uid, item->app_id, item->pkg_id);
-}
-
-static void __esd_print_interested_event(gpointer data, gpointer user_data)
-{
- event_launch_item *el_item = (event_launch_item *)data;
- char *event_name = (char *)el_item->event_name;
- _D("event_name = (%s)", event_name);
- g_list_foreach(el_item->app_list_evtlaunch, __esd_print_appid_with_eventid, event_name);
-}
-
-static void __esd_launch_table_print_items(void)
-{
- GHashTableIter iter;
- gpointer key;
- gpointer value;
-
- g_hash_table_iter_init(&iter, event_launch_table);
-
- while (g_hash_table_iter_next(&iter, &key, &value))
- __esd_print_interested_event(value, NULL);
-}
-
-static int __esd_find_compare_by_list_item(gconstpointer data, gconstpointer user_data)
-{
- esd_list_item_s *item_1 = (esd_list_item_s *)user_data;
- esd_list_item_s *item_2 = (esd_list_item_s *)data;
-
- return (item_1->uid != item_2->uid) |
- strcmp(item_1->app_id, item_2->app_id) |
- strcmp(item_1->pkg_id, item_2->pkg_id);
-}
-
-static int __esd_add_list_item(uid_t uid, event_launch_item *el_item,
- const char *app_id, const char *pkg_id)
-{
- esd_list_item_s *item_of_list = NULL;
-
- item_of_list = calloc(1, sizeof(esd_list_item_s));
- if (item_of_list == NULL) {
- _E("out_of_memory");
- return ES_R_ENOMEM;
- }
- item_of_list->uid = uid;
- item_of_list->app_id = (char *)app_id;
- item_of_list->pkg_id = (char *)pkg_id;
- item_of_list->trusted_info = TRUSTED_UNKNOWN;
- el_item->app_list_evtlaunch =
- g_list_append(el_item->app_list_evtlaunch, item_of_list);
-
- return ES_R_OK;
-}
-
-static int __esd_add_launch_item(uid_t uid, const char *event_name,
- const char *appid, const char *pkgid)
-{
- GList *app_list = NULL;
- guint subscription_id = 0;
- char *app_id = NULL;
- char *pkg_id = NULL;
- esd_list_item_s *item_of_list = NULL;
- event_launch_item *eli;
- event_launch_item *el_item =
- (event_launch_item *)g_hash_table_lookup(event_launch_table, event_name);
-
- if (el_item) {
- item_of_list = calloc(1, sizeof(esd_list_item_s));
- if (item_of_list == NULL) {
- _E("memory alloc failed");
- return ES_R_ENOMEM;
- }
- item_of_list->uid = uid;
- item_of_list->app_id = (char *)appid;
- item_of_list->pkg_id = (char *)pkgid;
-
- app_list = g_list_find_custom(el_item->app_list_evtlaunch,
- item_of_list, (GCompareFunc)__esd_find_compare_by_list_item);
- free(item_of_list);
- if (app_list == NULL) {
- _D("add new item (list item only)");
- app_id = strdup((char *)appid);
- if (!app_id) {
- _E("out_of_memory");
- return ES_R_ENOMEM;
- }
- pkg_id = strdup((char *)pkgid);
- if (!pkg_id) {
- _E("out_of_memory");
- FREE_AND_NULL(app_id);
- return ES_R_ENOMEM;
- }
- if (__esd_add_list_item(uid, el_item, app_id, pkg_id) < 0) {
- _E("failed to add list item");
- FREE_AND_NULL(app_id);
- FREE_AND_NULL(pkg_id);
- return ES_R_ERROR;
- }
- }
- } else {
- _D("add new item (all)");
- eli = calloc(1, sizeof(event_launch_item));
- if (!eli) {
- _E("memory alloc failed");
- return ES_R_ENOMEM;
- }
-
- eli->event_name = strdup(event_name);
- if (!eli->event_name) {
- _E("out_of_memory");
- FREE_AND_NULL(eli);
- return ES_R_ENOMEM;
- }
-
- app_id = strdup((char *)appid);
- if (!app_id) {
- _E("out_of_memory");
- FREE_AND_NULL(eli->event_name);
- FREE_AND_NULL(eli);
- return ES_R_ENOMEM;
- }
-
- pkg_id = strdup((char *)pkgid);
- if (!pkg_id) {
- _E("out_of_memory");
- FREE_AND_NULL(app_id);
- FREE_AND_NULL(eli->event_name);
- FREE_AND_NULL(eli);
- return ES_R_ENOMEM;
- }
-
- if (__esd_add_list_item(uid, eli, app_id, pkg_id) < 0) {
- _E("failed to add list item");
- FREE_AND_NULL(app_id);
- FREE_AND_NULL(pkg_id);
- FREE_AND_NULL(eli->event_name);
- FREE_AND_NULL(eli);
- return ES_R_ERROR;
- }
-
- g_hash_table_insert(event_launch_table, eli->event_name, eli);
-
- eventsystem_register_event(eli->event_name, &subscription_id,
- (eventsystem_handler)__esd_event_handler, NULL);
- if (subscription_id == 0) {
- _E("signal subscription error, event_name(%s), app_id(%s)",
- eli->event_name, app_id);
- return ES_R_ERROR;
- } else {
- eli->reg_id = subscription_id;
- }
- }
-
- return ES_R_OK;
-}
-
-static void __esd_remove_all_private_usr_app_list(gpointer data, gpointer user_data)
-{
- esd_list_item_s *item = (esd_list_item_s *)data;
- event_launch_item *eli = (event_launch_item *)user_data;
-
- if (item->uid != GLOBAL_USER && !strcmp(eli->package_name, item->pkg_id)) {
- _D("uid(%d), app_id(%s), pkg_id(%s)", item->uid, item->app_id, eli->package_name);
- eli->app_list_evtlaunch = g_list_remove_all(eli->app_list_evtlaunch, data);
- }
-}
-
-static int __esd_launch_table_remove_private_usr_items(void)
-{
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- event_launch_item *eli = NULL;
- GList *first_list = NULL;
-
- g_hash_table_iter_init(&iter, event_launch_table);
-
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- eli = (event_launch_item *)value;
- g_list_foreach(eli->app_list_evtlaunch, __esd_remove_all_private_usr_app_list, eli);
-
- first_list = g_list_first(eli->app_list_evtlaunch);
- if (first_list == NULL) {
- if (eli->reg_id)
- eventsystem_unregister_event(eli->reg_id);
-
- g_hash_table_iter_remove(&iter);
- }
- }
-
- return ES_R_OK;
-}
-
-static void __esd_remove_app_list(gpointer data, gpointer user_data)
-{
- bool skip = false;
- esd_list_item_s *item = (esd_list_item_s *)data;
- event_launch_item *eli = (event_launch_item *)user_data;
-
- if (eli->uid != GLOBAL_USER && eli->uid != item->uid)
- skip = true;
-
- if (!skip && !strcmp(eli->package_name, item->pkg_id)) {
- _D("pkg_id(%s), app_id(%s)", eli->package_name, item->app_id);
- eli->app_list_evtlaunch =
- g_list_remove_all(eli->app_list_evtlaunch, data);
- }
-}
-
-static int __esd_remove_launch_item(uid_t uid, gpointer data, const char *pkg_id)
-{
- event_launch_item *eli = (event_launch_item *)data;
- GList *first_list = NULL;
-
- eli->uid = uid;
- eli->package_name = (char *)pkg_id;
- g_list_foreach(eli->app_list_evtlaunch, __esd_remove_app_list, eli);
-
- first_list = g_list_first(eli->app_list_evtlaunch);
- if (first_list == NULL) {
- if (eli->reg_id)
- eventsystem_unregister_event(eli->reg_id);
-
- return ES_R_REMOVE;
- }
-
- return ES_R_OK;
-}
-
-static int __esd_launch_table_remove_items(uid_t uid, const char *pkg_id)
-{
- GHashTableIter iter;
- gpointer key;
- gpointer value;
-
- g_hash_table_iter_init(&iter, event_launch_table);
-
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- if (__esd_remove_launch_item(uid, value, pkg_id) == ES_R_REMOVE) {
- _D("remove item itself");
- g_hash_table_iter_remove(&iter);
- }
- }
-
- return ES_R_OK;
-}
-
-static void __esd_event_launch_with_appid(gpointer data, gpointer user_data)
-{
- esd_list_item_s *item = (esd_list_item_s *)data;
- uid_t uid = item->uid;
- char *app_id = item->app_id;
- esd_event_param *eep = (esd_event_param *)user_data;
- static unsigned int req_id;
- int pid;
- char event_uri[1024];
- bundle *b;
- int ret;
-
- _D("launch_on_event: app_id(%s), event_name(%s), uid(%d), is_user(%d), trusted(%d)",
- app_id, eep->event_name, uid, eep->is_user_event, eep->trusted);
-
- if (eep->is_user_event && eep->trusted) {
- if (item->trusted_info == TRUSTED_UNKNOWN) {
- ret = __esd_check_certificate_match(uid, app_id, eep->sender_uid, eep->sender_appid);
- if (ret == ES_R_EINVAL) {
- item->trusted_info = TRUSTED_DENIED;
- return;
- } else if (ret == ES_R_ERROR) {
- return;
- } else {
- item->trusted_info = TRUSTED_ALLOWED;
- }
- } else if (item->trusted_info == TRUSTED_DENIED) {
- return;
- }
- }
-
- if (!aul_app_is_running_for_uid(app_id, uid)) {
- b = bundle_dup(eep->event_data);
- if (eep->is_user_event)
- snprintf(event_uri, sizeof(event_uri), "%s%s", USER_EVENT_NAME_PREFIX, eep->event_name);
- else
- snprintf(event_uri, sizeof(event_uri), "%s%s", SYSTEM_EVENT_NAME_PREFIX, eep->event_name);
-
- appsvc_set_operation(b, APPSVC_OPERATION_LAUNCH_ON_EVENT);
- appsvc_set_uri(b, event_uri);
- appsvc_set_appid(b, app_id);
-
- pid = aul_svc_run_service_async_for_uid(b, req_id++, NULL, eep->user_data, uid);
- _D("uid(%d), pid(%d)", uid, pid);
-
- bundle_free(b);
- } else {
- _D("already is running or launch failed");
- }
-}
-
-static void __esd_check_event_launch_with_eventid(gpointer data, gpointer user_data)
-{
- event_launch_item *el_item = (event_launch_item *)data;
- esd_event_param *eep = (esd_event_param *)user_data;
-
- if (strcmp(eep->event_name, (char *)el_item->event_name) == 0) {
- g_list_foreach(el_item->app_list_evtlaunch,
- __esd_event_launch_with_appid, user_data);
- }
-}
-
-static void __esd_launch_event_handler(char *event_name, bundle *data,
- const bool is_user_event, gboolean trusted,
- const uid_t sender_uid, char *sender_appid, void *user_data)
-{
- const char *val;
- const char *msg_type;
- const char *msg_id;
- esd_event_param *eep;
- event_launch_item *el_item;
-
- _D("event_name(%s)", event_name);
-
- el_item = (event_launch_item *)g_hash_table_lookup(event_launch_table, event_name);
- if (el_item == NULL)
- return;
-
- if (el_item->app_list_evtlaunch != NULL) {
- if (is_user_event == false) {
- if (strcmp(SYS_EVENT_BATTERY_CHARGER_STATUS, event_name) == 0) {
- val = bundle_get_val(data, EVT_KEY_BATTERY_CHARGER_STATUS);
- _D("charger val(%s)", val);
- if (val && (strcmp(EVT_VAL_BATTERY_CHARGER_CONNECTED, val) != 0))
- return;
- } else if (strcmp(SYS_EVENT_USB_STATUS, event_name) == 0) {
- val = bundle_get_val(data, EVT_KEY_USB_STATUS);
- _D("usb val(%s)", val);
- if (val && (strcmp(EVT_VAL_USB_CONNECTED, val) != 0))
- return;
- } else if (strcmp(SYS_EVENT_EARJACK_STATUS, event_name) == 0) {
- val = bundle_get_val(data, EVT_KEY_EARJACK_STATUS);
- _D("earjack val(%s)", val);
- if (val && (strcmp(EVT_VAL_EARJACK_CONNECTED, val) != 0))
- return;
- } else if (strcmp(SYS_EVENT_INCOMMING_MSG, event_name) == 0) {
- msg_type = bundle_get_val(data, EVT_KEY_MSG_TYPE);
- _D("msg_type(%s)", msg_type);
- if (msg_type == NULL)
- return;
-
- msg_id = bundle_get_val(data, EVT_KEY_MSG_ID);
- _D("msg_id(%s)", msg_id);
- if (msg_id == NULL)
- return;
- } else if (strcmp(SYS_EVENT_WIFI_STATE, event_name) == 0) {
- val = bundle_get_val(data, EVT_KEY_WIFI_STATE);
- if (val == NULL)
- return;
- _D("wifi_state(%s)", val);
- if (strcmp(EVT_VAL_WIFI_CONNECTED, val) != 0)
- return;
- }
- }
-
- eep = calloc(1, sizeof(esd_event_param));
- if (!eep) {
- _E("memory alloc failed");
- return;
- }
- eep->event_name = event_name;
- eep->event_data = data;
- eep->sender_uid = sender_uid;
- eep->sender_appid = sender_appid;
- eep->is_user_event = is_user_event;
- eep->trusted = (bool)trusted;
- eep->user_data = (void *)user_data;
- __esd_check_event_launch_with_eventid(el_item, eep);
- free(eep);
- }
-}
-
-#ifdef APPFW_EVENT_SYSTEM_EARLIER_FEATURE
-static void __esd_print_earlier_event(gpointer data, gpointer user_data)
-{
- earlier_item *item = (earlier_item *)data;
- char *event_name = (char *)item->event_name;
- const char *val;
-
- _D("event_name = (%s)", event_name);
-
- if (strcmp(event_name, SYS_EVENT_BOOT_COMPLETED) == 0) {
- if (item->earlier_data) {
- val = bundle_get_val(item->earlier_data, EVT_KEY_BOOT_COMPLETED);
- _D("boot_completed(%s)", val);
- }
- } else if (strcmp(event_name, SYS_EVENT_SYSTEM_SHUTDOWN) == 0) {
- if (item->earlier_data) {
- val = bundle_get_val(item->earlier_data, EVT_KEY_SYSTEM_SHUTDOWN);
- _D("shutdown(%s)", val);
- }
- } else if (strcmp(event_name, SYS_EVENT_LOW_MEMORY) == 0) {
- if (item->earlier_data) {
- val = bundle_get_val(item->earlier_data, EVT_KEY_LOW_MEMORY);
- _D("low_memory(%s)", val);
- }
- } else if (strcmp(event_name, SYS_EVENT_BATTERY_CHARGER_STATUS) == 0) {
- if (item->earlier_data) {
- val = bundle_get_val(item->earlier_data, EVT_KEY_BATTERY_CHARGER_STATUS);
- _D("charger_status(%s)", val);
- }
- }
-}
-
-static void __esd_earlier_table_print_items(void)
-{
- GHashTableIter iter;
- gpointer key;
- gpointer value;
-
- g_hash_table_iter_init(&iter, earlier_event_table);
-
- while (g_hash_table_iter_next(&iter, &key, &value))
- __esd_print_earlier_event(value, NULL);
-}
-
-static void __esd_earlier_event_handler(char *event_name, bundle *data, void *user_data)
-{
- earlier_item *item;
- _D("event_name(%s)", event_name);
-
- item = (earlier_item *)g_hash_table_lookup(earlier_event_table, event_name);
- if (item) {
- /* update earlier value */
- if (item->earlier_data != NULL)
- bundle_free(item->earlier_data);
-
- item->earlier_data = bundle_dup(data);
- }
-}
-#endif
-
-static void __esd_event_handler(char *event_name, bundle *data, void *user_data)
-{
- _D("event_name(%s)", event_name);
-
-#ifdef APPFW_EVENT_SYSTEM_EARLIER_FEATURE
- if (__esd_check_earlier_support(event_name))
- __esd_earlier_event_handler(event_name, data, user_data);
-#endif
-
- if (__esd_check_event_launch_support(event_name))
- __esd_launch_event_handler(event_name, data,
- false, TRUE, ROOT_USER, NULL, user_data);
-}
-
-static void __esd_trusted_busname_remove_item(char *bus_name)
-{
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- trusted_item *item;
-
- g_hash_table_iter_init(&iter, trusted_busname_table);
-
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- item = (trusted_item *)value;
- if (item) {
- if (strcmp(bus_name, item->bus_name) == 0) {
- _D("remove trusted busname item(%s, %s)", item->app_id, item->bus_name);
- FREE_AND_NULL(item->app_id);
- FREE_AND_NULL(item->bus_name);
- FREE_AND_NULL(item);
- g_hash_table_iter_remove(&iter);
-
- __esd_trusted_busname_print_items();
- }
- }
- }
-}
-
-static void __esd_filter_name_owner_changed(GDBusConnection *connection,
- const gchar *sender_name, const gchar *object_path,
- const gchar *interface_name, const gchar *signal_name,
- GVariant *parameters, gpointer user_data)
-{
- char *name = NULL;
- char *old_owner = NULL;
- char *new_owner = NULL;
- int old_len = 0;
- int new_len = 0;
-
- g_variant_get(parameters, "(&s&s&s)", &name, &old_owner, &new_owner);
-
- if (strstr(name, "event.busname.session")) {
- old_len = strlen(old_owner);
- new_len = strlen(new_owner);
-
- _D("changed name(%s), old_onwer(%s)(%d) -> new_onwer(%s)(%d)",
- name, old_owner, old_len, new_owner, new_len);
-
- if (old_len > 0 && new_len == 0)
- __esd_trusted_busname_remove_item(name);
- else if (old_len == 0 && new_len > 0)
- _D("new name owned");
- else
- _E("not-expected name change");
- }
-}
-
-static int __esd_dbus_name_monitor(GDBusConnection *connection)
-{
- guint name_owner_changed_id = 0;
-
- name_owner_changed_id = g_dbus_connection_signal_subscribe(connection,
- "org.freedesktop.DBus", "org.freedesktop.DBus",
- "NameOwnerChanged", "/org/freedesktop/DBus", NULL, G_DBUS_SIGNAL_FLAGS_NONE,
- __esd_filter_name_owner_changed, NULL, NULL);
-
- _I("name_owner_changed_id(%d)", name_owner_changed_id);
-
- return ES_R_OK;
-}
-
-static int __esd_get_user_items(uid_t uid)
-{
- int ret = 0;
- pkgmgrinfo_appinfo_filter_h handle = NULL;
-
- _I("get user items for uid(%d)", uid);
- /* reset user's item */
- __esd_launch_table_remove_private_usr_items();
-
- ret = pkgmgrinfo_appinfo_filter_create(&handle);
- if (ret < 0) {
- _E("failed to create appinfo filter");
- return ES_R_ERROR;
- }
- ret = pkgmgrinfo_appinfo_filter_add_string(handle,
- PMINFO_APPINFO_PROP_APP_COMPONENT, "svcapp");
- if (ret < 0) {
- _E("failed to add appinfo filter string");
- pkgmgrinfo_appinfo_filter_destroy(handle);
- return ES_R_ERROR;
- }
- ret = pkgmgrinfo_appinfo_filter_add_string(handle,
- PMINFO_APPINFO_PROP_APP_OPERATION, APPSVC_OPERATION_LAUNCH_ON_EVENT);
- if (ret < 0) {
- _E("failed to add appinfo filter string");
- pkgmgrinfo_appinfo_filter_destroy(handle);
- return ES_R_ERROR;
- }
- ret = pkgmgrinfo_appinfo_usr_filter_foreach_appinfo(handle,
- __esd_add_appinfo_handler, &uid, uid);
- if (ret < 0) {
- _E("appinfo filter foreach error");
- pkgmgrinfo_appinfo_filter_destroy(handle);
- return ES_R_ERROR;
- }
- pkgmgrinfo_appinfo_filter_destroy(handle);
-
- __esd_launch_table_print_items();
-
- return ES_R_OK;
-}
-
-static void __esd_signal_handler(GDBusConnection *connection,
- const gchar *sender_name,
- const gchar *object_path,
- const gchar *interface_name,
- const gchar *signal_name,
- GVariant *parameters,
- gpointer user_data)
-{
- int handle;
- bundle *b;
- guint64 uid = 0;
-
- if (!g_strcmp0(signal_name,
- SYSTEMD_DBUS_SIGNAL_STARTUP_FINISHED)) {
- _I("System session finished");
-
- b = bundle_create();
- bundle_add_str(b, EVT_KEY_BOOT_COMPLETED,
- EVT_VAL_BOOT_COMPLETED_TRUE);
- eventsystem_send_system_event(SYS_EVENT_BOOT_COMPLETED, b);
- bundle_free(b);
-
- handle = creat(ESD_BOOT_COMPLETED, 0640);
- if (handle != -1)
- close(handle);
- } else if (!g_strcmp0(signal_name,
- SYSTEMD_DBUS_SIGNAL_USER_STARTUP_FINISHED)) {
- g_variant_get(parameters, "(t)", &uid);
- _I("User session finished uid : %d", (int)uid);
- if ((uid_t)uid != DEFAULT_USER)
- __esd_get_user_items((uid_t)uid);
- }
-}
-
-static GDBusNodeInfo *introspection_data;
-static const gchar introspection_xml[] =
-"<node>"
-" <interface name='tizen.system.event.app2esd'>"
-" <method name='CheckSenderValidation'>"
-" <arg type='i' name='senderpid' direction='in'/>"
-" <arg type='s' name='eventname' direction='in'/>"
-" <arg type='i' name='ret' direction='out'/>"
-" <arg type='s' name='senderid' direction='out'/>"
-" </method>"
-" <method name='GetTrustedPeerList'>"
-" <arg type='s' name='eventname' direction='in'/>"
-" <arg type='i' name='ret' direction='out'/>"
-" <arg type='as' name='dest_list' direction='out'/>"
-" </method>"
-" <method name='SetupTrustedPeer'>"
-" <arg type='s' name='eventname' direction='in'/>"
-" <arg type='s' name='destination' direction='in'/>"
-" <arg type='i' name='ret' direction='out'/>"
-" </method>"
-" <method name='CheckPrivilegeValidation'>"
-" <arg type='s' name='eventname' direction='in'/>"
-" <arg type='i' name='ret' direction='out'/>"
-" </method>"
-" <method name='CheckUserSendValidation'>"
-" <arg type='s' name='eventname' direction='in'/>"
-" <arg type='i' name='ret' direction='out'/>"
-" </method>"
-" <method name='RequestTrustedEventLaunch'>"
-" <arg type='s' name='eventname' direction='in'/>"
-" <arg type='s' name='eventdata' direction='in'/>"
-" <arg type='i' name='datalen' direction='in'/>"
-" <arg type='i' name='ret' direction='out'/>"
-" </method>"
-" <method name='RequestEventLaunch'>"
-" <arg type='s' name='eventname' direction='in'/>"
-" <arg type='s' name='eventdata' direction='in'/>"
-" <arg type='i' name='datalen' direction='in'/>"
-" <arg type='i' name='ret' direction='out'/>"
-" </method>"
-" <method name='RequestSendingEvent'>"
-" <arg type='s' name='eventname' direction='in'/>"
-" <arg type='s' name='eventdata' direction='in'/>"
-" <arg type='i' name='datalen' direction='in'/>"
-" <arg type='i' name='ret' direction='out'/>"
-" </method>"
-#ifdef APPFW_EVENT_SYSTEM_EARLIER_FEATURE
-" <method name='GetEarlierData'>"
-" <arg type='s' name='appid' direction='in'/>"
-" <arg type='i' name='ret' direction='out'/>"
-" <arg type='i' name='len' direction='out'/>"
-" <arg type='s' name='earlier_data' direction='out'/>"
-" </method>"
-#endif
-" <method name='KeepLastData'>"
-" <arg type='s' name='eventname' direction='in'/>"
-" <arg type='s' name='own_name' direction='in'/>"
-" <arg type='i' name='ret' direction='out'/>"
-" </method>"
-" <method name='CheckLastData'>"
-" <arg type='s' name='eventname' direction='in'/>"
-" <arg type='s' name='own_name' direction='in'/>"
-" <arg type='i' name='ret' direction='out'/>"
-" </method>"
-" <method name='LaunchOnEventFromUserEvent'>"
-" <arg type='s' name='eventname' direction='in'/>"
-" <arg type='s' name='eventdata' direction='in'/>"
-" <arg type='i' name='datalen' direction='in'/>"
-" <arg type='b' name='trusted' direction='in'/>"
-" <arg type='i' name='ret' direction='out'/>"
-" </method>"
-" <method name='CionGetUuid'>"
-" <arg type='i' name='ret' direction='out'/>"
-" <arg type='s' name='uuid' direction='out'/>"
-" </method>"
-" <method name='CionSetDisplayName'>"
-" <arg type='s' name='service_name' direction='in'/>"
-" <arg type='s' name='display_name' direction='in'/>"
-" <arg type='i' name='ret' direction='out'/>"
-" </method>"
-" <method name='CionGetDisplayName'>"
-" <arg type='s' name='service_name' direction='in'/>"
-" <arg type='i' name='ret' direction='out'/>"
-" <arg type='s' name='display_name' direction='out'/>"
-" </method>"
-" <method name='CionSetEnabled'>"
-" <arg type='s' name='service_name' direction='in'/>"
-" <arg type='b' name='enabled' direction='in'/>"
-" <arg type='i' name='ret' direction='out'/>"
-" </method>"
-" <method name='CionGetEnabled'>"
-" <arg type='s' name='service_name' direction='in'/>"
-" <arg type='i' name='ret' direction='out'/>"
-" <arg type='b' name='enabled' direction='out'/>"
-" </method>"
-" </interface>"
-"</node>";
-
-static int __esd_get_appid_by_pid_for_uid(int pid, uid_t uid, char *app_id, int buf_size)
-{
- int retval = ES_R_OK;
- int ret = 0;
-
- if (pid <= 0) {
- _E("invalid pid(%d)", pid);
- retval = ES_R_ERROR;
- } else if (uid <= 0) {
- _E("invalid uid(%d)", uid);
- retval = ES_R_ERROR;
- } else {
- ret = aul_app_get_appid_bypid_for_uid(pid, app_id, buf_size, (uid_t)uid);
- if (ret != AUL_R_OK) {
- _E("failed to get appid by pid");
- retval = ES_R_ERROR;
- }
- _D("pid(%d)-uid(%d)-appid(%s)", pid, uid, app_id);
- }
-
- return retval;
-}
-
-static int __esd_get_appid_by_pid(int pid, char *app_id, int buf_size)
-{
- int ret;
- int fd;
- char buf[128] = { 0, };
-
- ret = aul_app_get_appid_bypid(pid, app_id, buf_size);
- if (ret != AUL_R_OK) {
- snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid);
-
- fd = open(buf, O_RDONLY);
- if (fd < 0)
- return ES_R_ERROR;
-
- ret = read(fd, app_id, buf_size - 1);
- close(fd);
-
- if (ret <= 0)
- return ES_R_ERROR;
-
- app_id[ret] = '\0';
- ret = ES_R_OK;
- }
-
- return ret;
-}
-
-static int check_user_event_sender_valid(const char *event_name, const char *app_id)
-{
- char *valid_name = NULL;
- char *temp_name = NULL;
- char *tmp = NULL;
- int retval = ES_R_OK;
- int len = 0;
- int valid_name_len = 0;
-
- temp_name = strdup(event_name);
- if (temp_name == NULL) {
- _E("out of memory");
- return ES_R_ENOMEM;
- }
-
- tmp = strrchr(temp_name, '.');
- if (tmp == NULL || strlen(tmp) == 0) {
- _E("invalid event name");
- FREE_AND_NULL(temp_name);
- return ES_R_EINVAL;
- }
- len = strlen(tmp);
- if (len <= 1 || len > 128) {
- _E("invalid length(%d) of user-defined name", len);
- FREE_AND_NULL(temp_name);
- return ES_R_EINVAL;
- }
- *tmp = '\0';
-
- _D("app_id(%s), len(%zu)", app_id, strlen(app_id));
-
- valid_name_len = strlen(USER_EVENT_NAME_PREFIX) + strlen(app_id) + 1;
- valid_name = calloc(1, valid_name_len);
- if (valid_name == NULL) {
- _E("memory alloc failed");
- FREE_AND_NULL(temp_name);
- return ES_R_ENOMEM;
- }
- snprintf(valid_name, valid_name_len, "%s%s", USER_EVENT_NAME_PREFIX, app_id);
- _D("valid_name(%s)", valid_name);
-
- if (strcmp(temp_name, valid_name) != 0) {
- _E("appid misamatch");
- retval = ES_R_EINVAL;
- }
-
- FREE_AND_NULL(temp_name);
- FREE_AND_NULL(valid_name);
-
- return retval;
-}
-
-static void check_sender_valid_method_call(GDBusConnection *connection, const gchar *sender,
- GVariant *parameters, GDBusMethodInvocation *invocation)
-{
- GVariant *param = NULL;
- int result = 0;
- char *event_name = NULL;
- char app_id[128] = {0, };
- int event_sender_pid = 0;
- uid_t sender_uid = 0;
-
- g_variant_get(parameters, "(i&s)", &event_sender_pid, &event_name);
- _D("event_sender_pid(%d), event_name(%s)", event_sender_pid, event_name);
-
- sender_uid = (uid_t)__get_sender_uid(connection, sender);
- if (__esd_get_appid_by_pid_for_uid(event_sender_pid, sender_uid, app_id, sizeof(app_id)) < 0) {
- result = ES_R_ERROR;
- } else {
- if (check_user_event_sender_valid(event_name, app_id) < 0) {
- _E("invalid sender");
- result = ES_R_EINVAL;
- } else {
- result = 1;
- }
- }
-
- param = g_variant_new("(is)", result, app_id);
- _D("event_name(%s), result(%d)", event_name, result);
- g_dbus_method_invocation_return_value(invocation, param);
-}
-
-static void check_send_event_valid_method_call(GDBusConnection *connection, const gchar *sender,
- GVariant *parameters, GDBusMethodInvocation *invocation)
-{
- GVariant *param = NULL;
- int result = 0;
- char *event_name = NULL;
- char app_id[128] = {0, };
- int sender_pid = 0;
- uid_t sender_uid = 0;
-
- g_variant_get(parameters, "(&s)", &event_name);
- _D("event_name(%s)", event_name);
-
- sender_pid = __get_sender_pid(connection, sender);
- sender_uid = (uid_t)__get_sender_uid(connection, sender);
- if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id, sizeof(app_id)) < 0) {
- result = ES_R_ERROR;
- } else {
- if (check_user_event_sender_valid(event_name, app_id) < 0) {
- _E("invalid sender");
- result = ES_R_EINVAL;
- } else {
- result = 1;
- }
- }
-
- param = g_variant_new("(i)", result);
- _D("event_name(%s), result(%d)", event_name, result);
- g_dbus_method_invocation_return_value(invocation, param);
-}
-
-static void get_trusted_peer_method_call(GDBusConnection *connection, const gchar *sender,
- GVariant *parameters, GDBusMethodInvocation *invocation)
-{
- GVariant *param = NULL;
- int result = 0;
- GVariantBuilder *builder = NULL;
- GHashTableIter iter;
- gpointer key, value;
- char *event_name = NULL;
- char app_id[128] = {0, };
- int sender_pid = 0;
- uid_t sender_uid = 0;
- int ret = 0;
- uid_t uid = 0;
- char *_appid = NULL;
- char *_busname = NULL;
- trusted_item *item;
-
- g_variant_get(parameters, "(&s)", &event_name);
- _D("event_name(%s)", event_name);
-
- sender_pid = __get_sender_pid(connection, sender);
- sender_uid = (uid_t)__get_sender_uid(connection, sender);
- if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id, sizeof(app_id)) < 0) {
- result = ES_R_ERROR;
- } else {
- builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
-
- g_hash_table_iter_init(&iter, trusted_busname_table);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- item = (trusted_item *)value;
- uid = item->uid;
- _appid = item->app_id;
- _busname = item->bus_name;
-
- if (uid != GLOBAL_USER && uid != sender_uid)
- continue;
-
- ret = __esd_check_certificate_match(uid, _appid, sender_uid, app_id);
- if (ret == ES_R_OK)
- g_variant_builder_add(builder, "s", _busname);
- }
-
- result = 1;
- }
-
- param = g_variant_new("(ias)", result, builder);
- _D("result(%d)", result);
- g_dbus_method_invocation_return_value(invocation, param);
- if (builder)
- g_variant_builder_unref(builder);
-}
-
-static void setup_trusted_peer_method_call(GDBusConnection *connection, const gchar *sender,
- GVariant *parameters, GDBusMethodInvocation *invocation)
-{
- GVariant *param = NULL;
- int result = 0;
- char *event_name = NULL;
- char *destination_name = NULL;
- char app_id[128] = {0, };
- int sender_pid = 0;
- uid_t sender_uid = 0;
- int ret = 0;
-
- g_variant_get(parameters, "(&s&s)", &event_name, &destination_name);
- _D("event_name(%s), destination_name(%s)", event_name, destination_name);
-
- if (destination_name && destination_name[0] != '\0') {
- sender_pid = __get_sender_pid(connection, sender);
- sender_uid = (uid_t)__get_sender_uid(connection, sender);
- if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id, sizeof(app_id)) < 0) {
- result = ES_R_ERROR;
- } else {
- ret = __esd_trusted_busname_add_item(sender_uid, app_id, destination_name,
- sender_pid);
- if (ret < 0) {
- _E("failed to add trusted busname item");
- result = ES_R_ERROR;
- } else {
- result = 1;
- }
- }
- } else {
- _E("invalid destination name");
- result = ES_R_ERROR;
- }
-
- param = g_variant_new("(i)", result);
- _D("event_name(%s), result(%d)", event_name, result);
- g_dbus_method_invocation_return_value(invocation, param);
-}
-
-static void check_privilege_valid_method_call(GDBusConnection *connection, const gchar *sender,
- GVariant *parameters, GDBusMethodInvocation *invocation)
-{
- GVariant *param = NULL;
- int result = 0;
- char *event_name = NULL;
- char *privilege_name = NULL;
- char app_id[128] = {0, };
- int sender_pid = 0;
- uid_t sender_uid = 0;
- char *client = NULL;
- char *session = NULL;
- char *user = NULL;
- int ret = 0;
-
- g_variant_get(parameters, "(&s)", &event_name);
- __esd_check_privilege_name(event_name, &privilege_name);
- _D("event_name(%s), privilege_name(%s)", event_name, privilege_name);
-
- if (privilege_name) {
- sender_pid = __get_sender_pid(connection, sender);
- sender_uid = (uid_t)__get_sender_uid(connection, sender);
- if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id, sizeof(app_id)) < 0) {
- result = ES_R_ERROR;
- } else {
- ret = cynara_creds_gdbus_get_client(connection, sender, CLIENT_METHOD_DEFAULT, &client);
- if (ret != CYNARA_API_SUCCESS) {
- _E("failed to get client");
- result = ES_R_EINVAL;
- goto out;
- }
-
- ret = cynara_creds_gdbus_get_user(connection, sender, USER_METHOD_DEFAULT, &user);
- if (ret != CYNARA_API_SUCCESS) {
- _E("failed to get user");
- result = ES_R_EINVAL;
- goto out;
- }
-
- session = cynara_session_from_pid(sender_pid);
- if (session == NULL) {
- _E("failed to get session");
- result = ES_R_EINVAL;
- goto out;
- }
-
- _D("app_id(%s), client(%s), session(%s), user(%s)", app_id, client, session, user);
- if (__esd_check_valid_privilege_by_cynara(app_id, client, session, user, privilege_name))
- result = 1;
- else
- result = ES_R_EINVAL;
- }
- } else {
- result = 1;
- }
-
-out:
- g_free(client);
- g_free(user);
- g_free(session);
- param = g_variant_new("(i)", result);
- _D("event_name(%s), result(%d)", event_name, result);
- g_dbus_method_invocation_return_value(invocation, param);
-}
-
-#ifdef APPFW_EVENT_SYSTEM_EARLIER_FEATURE
-static void get_earlier_data_method_call(GVariant *parameters, GDBusMethodInvocation *invocation)
-{
- GVariant *param = NULL;
- int result = ES_R_ERROR;
- char *event_name = NULL;
- bundle *b = NULL;
- bundle_raw *raw = NULL;
- int len = 0;
- earlier_item *item;
-
- g_variant_get(parameters, "(&s)", &event_name);
- _D("event_name(%s)", event_name);
-
- item = (earlier_item *)g_hash_table_lookup(earlier_event_table, event_name);
- if (item != NULL) {
- if (item->earlier_data) {
- b = bundle_dup(item->earlier_data);
- bundle_add_str(b, "is_earlier_data", "true");
- result = ES_R_OK;
- }
- }
-
- if (result == ES_R_ERROR)
- b = bundle_create();
-
- bundle_encode(b, &raw, &len);
- bundle_free(b);
-
- param = g_variant_new("(iis)", result, len, raw);
-
- _D("result(%d), len(%d)", result, len);
- g_dbus_method_invocation_return_value(invocation, param);
-
- bundle_free_encoded_rawdata(&raw);
-}
-#endif
-
-static void keep_last_data_method_call(GDBusConnection *connection,
- const gchar *sender, GVariant *parameters,
- GDBusMethodInvocation *invocation)
-{
- GVariant *param;
- int result = ES_R_OK;
- char *event_name;
- char *own_name;
- char *key;
- char app_id[128];
- int sender_pid;
- uid_t sender_uid;
- struct __last_event_item *item;
-
- g_variant_get(parameters, "(&s&s)", &event_name, &own_name);
-
- if (!event_name || !own_name) {
- result = ES_R_ERROR;
- _E("invalid event_name and own_name");
- goto out;
- }
-
- sender_pid = __get_sender_pid(connection, sender);
- sender_uid = (uid_t)__get_sender_uid(connection, sender);
- if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id,
- sizeof(app_id)) < 0) {
- _E("failed to get appid by pid");
- result = ES_R_ERROR;
- goto out;
- }
-
- key = (char *)malloc(sizeof(event_name) + 10);
- if (!key) {
- result = ES_R_ENOMEM;
- _E("out of memory");
- goto out;
- }
-
- snprintf(key, sizeof(event_name) + 10, "%s_%d", event_name, sender_uid);
- item = (struct __last_event_item *)g_hash_table_lookup(user_last_event_table,
- key);
- if (!item) {
- item = calloc(1, sizeof(*item));
- if (!item) {
- result = ES_R_ERROR;
- goto out;
- }
- item->key = key;
- item->event_name = strdup(event_name);
- item->own_name = strdup(own_name);
- item->uid = sender_uid;
- item->app_id = strdup(app_id);
- g_hash_table_insert(user_last_event_table,
- item->key, item);
- } else {
- free(item->own_name);
- item->own_name = strdup(own_name);
- }
-
-out:
- param = g_variant_new("(i)", result);
-
- g_dbus_method_invocation_return_value(invocation, param);
-}
-
-static void check_last_data_method_call(GDBusConnection *connection,
- const gchar *sender, GVariant *parameters,
- GDBusMethodInvocation *invocation)
-{
- GVariant *param;
- int result = ES_R_OK;
- char *event_name;
- char *own_name;
- char *key;
- char app_id[128];
- int sender_pid;
- uid_t sender_uid;
- struct __last_event_item *item;
-
- g_variant_get(parameters, "(&s&s)", &event_name, &own_name);
-
- if (!event_name || !own_name) {
- result = ES_R_ERROR;
- _E("invalid event_name and own_name");
- goto out;
- }
-
- sender_pid = __get_sender_pid(connection, sender);
- sender_uid = (uid_t)__get_sender_uid(connection, sender);
- if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id,
- sizeof(app_id)) < 0) {
- result = ES_R_ERROR;
- _E("failed to get appid by pid");
- goto out;
- }
-
- key = (char *)malloc(sizeof(event_name) + 10);
- if (!key) {
- result = ES_R_ENOMEM;
- _E("out of memory");
- goto out;
- }
-
- snprintf(key, sizeof(event_name) + 10, "%s_%d", event_name, sender_uid);
- item = (struct __last_event_item *)g_hash_table_lookup(user_last_event_table,
- key);
- free(key);
- if (item) {
- GVariant *gv;
- bundle *b;
- bundle_raw *raw;
- int len;
- int ret;
- GError *error = NULL;
-
- b = bundle_create();
- if (!b) {
- result = ES_R_ERROR;
- goto out;
- }
- bundle_add_str(b, EVT_KEY_KEPT_EVENT_NAME, event_name);
- bundle_add_str(b, EVT_KEY_KEPT_OWN_NAME, own_name);
- if (__esd_check_certificate_match(item->uid, item->app_id,
- sender_uid, app_id) == ES_R_OK)
- bundle_add_str(b, EVT_KEY_KEPT_IS_TRUSTED, "true");
- else
- bundle_add_str(b, EVT_KEY_KEPT_IS_TRUSTED, "false");
-
- bundle_encode(b, &raw, &len);
- gv = g_variant_new("(us)", len, raw);
- ret = g_dbus_connection_emit_signal(connection,
- item->own_name,
- SYS_EVENT_OBJ_PATH,
- SYS_EVENT_NAME_PREFIX,
- REQUEST_LAST_DATA,
- gv,
- &error);
- if (ret == FALSE) {
- _E("Unable to emit signal: %s", error->message);
- g_error_free(error);
- }
- bundle_free_encoded_rawdata(&raw);
- bundle_free(b);
- }
-
-out:
- param = g_variant_new("(i)", result);
-
- g_dbus_method_invocation_return_value(invocation, param);
-}
-
-static void launch_on_event_from_userevent(GDBusConnection *connection,
- const gchar *sender, GVariant *parameters,
- GDBusMethodInvocation *invocation)
-{
- GVariant *param;
- int result = ES_R_OK;
- int len;
- gboolean trusted;
- int sender_pid;
- uid_t sender_uid;
- char *event_name;
- char app_id[128];
- char *buf;
- bundle *b;
-
- g_variant_get(parameters, "(&s&sib)", &event_name, &buf, &len, &trusted);
-
- if (!event_name) {
- result = ES_R_ERROR;
- _E("invalid event_name");
- goto out;
- }
-
- sender_pid = __get_sender_pid(connection, sender);
- sender_uid = (uid_t)__get_sender_uid(connection, sender);
- if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id,
- sizeof(app_id)) < 0) {
- _E("failed to get appid by pid");
- result = ES_R_ERROR;
- goto out;
- }
-
- b = bundle_decode((bundle_raw *)buf, len);
- if (b == NULL) {
- _E("Out of memory");
- result = ES_R_ENOMEM;
- goto out;
- }
-
- __esd_launch_event_handler(event_name, b, true, trusted,
- sender_uid, app_id, NULL);
-
- bundle_free(b);
-
-out:
- param = g_variant_new("(i)", result);
-
- g_dbus_method_invocation_return_value(invocation, param);
-}
-
-static void get_uuid_method_call(GDBusConnection *connection,
- const gchar *sender, GVariant *parameters,
- GDBusMethodInvocation *invocation)
-{
- GVariant *param = NULL;
- int result = ES_R_OK;
- char *uuid;
- char app_id[128] = { 0, };
- int sender_pid;
-
- sender_pid = __get_sender_pid(connection, sender);
- if (__esd_get_appid_by_pid(sender_pid, app_id, sizeof(app_id)) < 0) {
- _E("failed to get appid by pid");
- result = ES_R_ERROR;
- goto out;
- }
-
- if (esd_cion_get_uuid_with_generate(app_id, &uuid) == 0) {
- param = g_variant_new("(is)", result, uuid);
- free(uuid);
- } else {
- result = ES_R_ERROR;
- }
-
-out:
- if (param == NULL)
- param = g_variant_new("(is)", result, "");
-
- g_dbus_method_invocation_return_value(invocation, param);
-}
-
-static void set_display_name_method_call(GDBusConnection *connection,
- const gchar *sender, GVariant *parameters,
- GDBusMethodInvocation *invocation)
-{
- GVariant *param = NULL;
- int result = ES_R_OK;
- char app_id[128] = { 0, };
- int sender_pid;
- char *display_name = NULL;
- char *service_name = NULL;
-
- sender_pid = __get_sender_pid(connection, sender);
- if (__esd_get_appid_by_pid(sender_pid, app_id, sizeof(app_id)) < 0) {
- _E("failed to get appid by pid");
- result = ES_R_ERROR;
- goto out;
- }
-
- g_variant_get(parameters, "(&s&s)", &service_name, &display_name);
-
- if (esd_cion_set_display_name(app_id, service_name, display_name) != 0)
- result = ES_R_ERROR;
-
-out:
- param = g_variant_new("(i)", result);
- g_dbus_method_invocation_return_value(invocation, param);
-}
-
-static void get_display_name_method_call(GDBusConnection *connection,
- const gchar *sender, GVariant *parameters,
- GDBusMethodInvocation *invocation)
-{
- GVariant *param = NULL;
- int result = ES_R_OK;
- char app_id[128] = { 0, };
- int sender_pid;
- char *service_name = NULL;
- char *display_name = NULL;
-
- sender_pid = __get_sender_pid(connection, sender);
- if (__esd_get_appid_by_pid(sender_pid, app_id, sizeof(app_id)) < 0) {
- _E("failed to get appid by pid");
- result = ES_R_ERROR;
- goto out;
- }
-
- g_variant_get(parameters, "(&s)", &service_name);
-
- if (esd_cion_get_display_name(app_id, service_name, &display_name) == 0) {
- if (display_name != NULL) {
- param = g_variant_new("(is)", result, display_name);
- free(display_name);
- } else {
- goto out;
- }
- } else {
- result = ES_R_ERROR;
- }
-
-out:
- if (param == NULL)
- param = g_variant_new("(is)", result, "");
-
- g_dbus_method_invocation_return_value(invocation, param);
-}
-
-static void set_enabled_method_call(GDBusConnection *connection,
- const gchar *sender, GVariant *parameters,
- GDBusMethodInvocation *invocation)
-{
- GVariant *param = NULL;
- int result = ES_R_OK;
- char app_id[128] = { 0, };
- int sender_pid;
- gboolean enabled;
- char *service_name = NULL;
-
- sender_pid = __get_sender_pid(connection, sender);
- if (__esd_get_appid_by_pid(sender_pid, app_id, sizeof(app_id)) < 0) {
- _E("failed to get appid by pid");
- result = ES_R_ERROR;
- goto out;
- }
-
- g_variant_get(parameters, "(&sb)", &service_name, &enabled);
-
- if (esd_cion_set_enabled(app_id, service_name, (bool)enabled) != 0)
- result = ES_R_ERROR;
-
-out:
- param = g_variant_new("(i)", result);
- g_dbus_method_invocation_return_value(invocation, param);
-}
-
-static void get_enabled_method_call(GDBusConnection *connection,
- const gchar *sender, GVariant *parameters,
- GDBusMethodInvocation *invocation)
-{
- GVariant *param = NULL;
- int result = ES_R_OK;
- char app_id[128] = { 0, };
- int sender_pid;
- char *service_name = NULL;
- int enabled;
-
- sender_pid = __get_sender_pid(connection, sender);
- if (__esd_get_appid_by_pid(sender_pid, app_id, sizeof(app_id)) < 0) {
- _E("failed to get appid by pid");
- result = ES_R_ERROR;
- goto out;
- }
-
- g_variant_get(parameters, "(&s)", &service_name);
-
- if (esd_cion_get_enabled(app_id, service_name, &enabled) == 0)
- param = g_variant_new("(ib)", result, (bool)enabled);
- else
- result = ES_R_ERROR;
-
-out:
- if (param == NULL)
- param = g_variant_new("(ib)", result, false);
-
- g_dbus_method_invocation_return_value(invocation, param);
-}
-
-static void handle_method_call(GDBusConnection *connection,
- const gchar *sender, const gchar *object_path,
- const gchar *interface_name, const gchar *method_name,
- GVariant *parameters, GDBusMethodInvocation *invocation,
- gpointer user_data)
-{
- if (g_strcmp0(method_name, "CheckSenderValidation") == 0) {
- check_sender_valid_method_call(connection, sender, parameters, invocation);
- } else if (g_strcmp0(method_name, "GetTrustedPeerList") == 0) {
- get_trusted_peer_method_call(connection, sender, parameters, invocation);
- } else if (g_strcmp0(method_name, "SetupTrustedPeer") == 0) {
- setup_trusted_peer_method_call(connection, sender, parameters, invocation);
- } else if (g_strcmp0(method_name, "CheckPrivilegeValidation") == 0) {
- check_privilege_valid_method_call(connection, sender, parameters, invocation);
- } else if (g_strcmp0(method_name, "CheckUserSendValidation") == 0) {
- check_send_event_valid_method_call(connection, sender, parameters, invocation);
-#ifdef APPFW_EVENT_SYSTEM_EARLIER_FEATURE
- } else if (g_strcmp0(method_name, "GetEarlierData") == 0) {
- get_earlier_data_method_call(parameters, invocation);
-#endif
- } else if (g_strcmp0(method_name, "KeepLastData") == 0) {
- keep_last_data_method_call(connection, sender, parameters, invocation);
- } else if (g_strcmp0(method_name, "CheckLastData") == 0) {
- check_last_data_method_call(connection, sender, parameters, invocation);
- } else if (g_strcmp0(method_name, "LaunchOnEventFromUserEvent") == 0) {
- launch_on_event_from_userevent(connection, sender, parameters, invocation);
- } else if (g_strcmp0(method_name, "CionGetUuid") == 0) {
- get_uuid_method_call(connection, sender, parameters, invocation);
- } else if (g_strcmp0(method_name, "CionSetDisplayName") == 0) {
- set_display_name_method_call(connection, sender, parameters, invocation);
- } else if (g_strcmp0(method_name, "CionGetDisplayName") == 0) {
- get_display_name_method_call(connection, sender, parameters, invocation);
- } else if (g_strcmp0(method_name, "CionSetEnabled") == 0) {
- set_enabled_method_call(connection, sender, parameters, invocation);
- } else if (g_strcmp0(method_name, "CionGetEnabled") == 0) {
- get_enabled_method_call(connection, sender, parameters, invocation);
- }
-}
-
-static const GDBusInterfaceVTable interface_vtable = {
- handle_method_call,
- NULL,
- NULL
-};
-
-static void __esd_on_bus_acquired(GDBusConnection *connection,
- const gchar *name, gpointer user_data)
-{
- _I("bus acquired(%s)", name);
-
- guint reg_id = 0;
- guint boot_id = 0;
- guint user_boot_id = 0;
- GError *error = NULL;
-
- reg_id = g_dbus_connection_register_object(connection,
- ESD_OBJECT_PATH,
- introspection_data->interfaces[0],
- &interface_vtable,
- NULL, NULL, &error);
- if (reg_id == 0) {
- _E("g_dbus_connection_register_object error(%s)", error->message);
- g_error_free(error);
- }
-
- boot_id = g_dbus_connection_signal_subscribe(connection,
- NULL,
- SYSTEMD_DBUS_IFACE_MANAGER,
- SYSTEMD_DBUS_SIGNAL_STARTUP_FINISHED,
- SYSTEMD_DBUS_PATH,
- NULL,
- G_DBUS_SIGNAL_FLAGS_NONE,
- __esd_signal_handler,
- NULL,
- NULL);
-
- if (boot_id == 0)
- _E("g_dbus_connection_signal_subscribe() is failed.");
-
- user_boot_id = g_dbus_connection_signal_subscribe(connection,
- NULL,
- SYSTEMD_DBUS_IFACE_MANAGER,
- SYSTEMD_DBUS_SIGNAL_USER_STARTUP_FINISHED,
- SYSTEMD_DBUS_PATH,
- NULL,
- G_DBUS_SIGNAL_FLAGS_NONE,
- __esd_signal_handler,
- NULL,
- NULL);
-
- if (user_boot_id == 0)
- _E("g_dbus_connection_signal_subscribe() is failed.");
-}
-
-static void __esd_on_name_acquired(GDBusConnection *connection,
- const gchar *name, gpointer user_data)
-{
- bundle *b;
-
- __esd_check_trusted_events(connection, "ListNames");
- __esd_check_trusted_events(connection, "ListActivatableNames");
-
- b = bundle_create();
- bundle_add_str(b, EVT_KEY_ESD_STATUS, EVT_VAL_ESD_STARTED);
- eventsystem_send_system_event(SYS_EVENT_ESD_STATUS, b);
- bundle_free(b);
-
- __esd_register_vconf_callbacks();
-
- __esd_trusted_busname_print_items();
-
- __esd_get_user_items(DEFAULT_USER);
-
- __esd_dbus_name_monitor(connection);
-}
-
-static void __esd_on_name_lost(GDBusConnection *connection,
- const gchar *name, gpointer user_data)
-{
-}
-
-static int __esd_before_loop(void)
-{
- int ret = 0;
- GError *error = NULL;
- guint owner_id = 0;
-
-#ifdef APPFW_EVENT_SYSTEM_EARLIER_FEATURE
- guint subscription_id = 0;
- int i;
- int size;
- char *event_name;
- int fd;
- int val;
- int status;
- int charger_status;
- int charge_now;
- earlier_item *item;
-
- earlier_event_table = g_hash_table_new(g_str_hash, g_str_equal);
- user_last_event_table = g_hash_table_new_full(g_str_hash,
- g_str_equal, NULL, (GDestroyNotify)free_saved_event);
-
- _I("register events for earlier_data");
- size = sizeof(earlier_event_list)/sizeof(*earlier_event_list);
- for (i = 0; i < size; i++) {
- event_name = (char *)earlier_event_list[i];
- _I("event_name(%s)", event_name);
-
- item = calloc(1, sizeof(earlier_item));
- if (item == NULL) {
- _E("memery alloc failed");
- return ES_R_ENOMEM;
- }
- item->event_name = strdup(event_name);
- if (item->event_name == NULL) {
- _E("out of memory");
- free(item);
- return ES_R_ENOMEM;
- }
-
- /* set initial data */
- if (strcmp(event_name, SYS_EVENT_BOOT_COMPLETED) == 0) {
- fd = open(ESD_BOOT_COMPLETED, O_RDONLY);
- if (fd < 0) {
- _D("open file error(%d)", fd);
- } else {
- item->earlier_data = bundle_create();
- bundle_add_str(item->earlier_data, EVT_KEY_BOOT_COMPLETED,
- EVT_VAL_BOOT_COMPLETED_TRUE);
- close(fd);
- }
- } else if (strcmp(event_name, SYS_EVENT_SYSTEM_SHUTDOWN) == 0) {
- ret = vconf_get_int(VCONFKEY_SYSMAN_POWER_OFF_STATUS, &val);
- if (ret != VCONF_OK) {
- _E("failed to get power_off status (%d)", ret);
- } else {
- if (val == VCONFKEY_SYSMAN_POWER_OFF_DIRECT ||
- val == VCONFKEY_SYSMAN_POWER_OFF_RESTART) {
- /* power-off requested */
- item->earlier_data = bundle_create();
- bundle_add_str(item->earlier_data, EVT_KEY_SYSTEM_SHUTDOWN,
- EVT_VAL_SYSTEM_SHUTDOWN_TRUE);
- }
- }
- } else if (strcmp(event_name, SYS_EVENT_LOW_MEMORY) == 0) {
- ret = vconf_get_int(VCONFKEY_SYSMAN_LOW_MEMORY, &status);
- if (ret != VCONF_OK) {
- _E("failed to get low_memory status (%d)", ret);
- } else {
- item->earlier_data = bundle_create();
- if (status == VCONFKEY_SYSMAN_LOW_MEMORY_SOFT_WARNING)
- bundle_add_str(item->earlier_data, EVT_KEY_LOW_MEMORY,
- EVT_VAL_MEMORY_SOFT_WARNING);
- else if (status == VCONFKEY_SYSMAN_LOW_MEMORY_HARD_WARNING)
- bundle_add_str(item->earlier_data, EVT_KEY_LOW_MEMORY,
- EVT_VAL_MEMORY_HARD_WARNING);
- else
- bundle_add_str(item->earlier_data, EVT_KEY_LOW_MEMORY,
- EVT_VAL_MEMORY_NORMAL);
- }
- } else if (strcmp(event_name, SYS_EVENT_BATTERY_CHARGER_STATUS) == 0) {
- ret = vconf_get_int(VCONFKEY_SYSMAN_CHARGER_STATUS, &charger_status);
- if (ret != VCONF_OK) {
- _E("failed to get charger_status (%d)", ret);
- } else {
- ret = vconf_get_int(VCONFKEY_SYSMAN_BATTERY_CHARGE_NOW, &charge_now);
- if (ret != VCONF_OK)
- _E("failed to get charge_now (%d)", ret);
- }
-
- if (ret == VCONF_OK) {
- item->earlier_data = bundle_create();
- if (charger_status == VCONFKEY_SYSMAN_CHARGER_CONNECTED) {
- if (charge_now == 0) {
- bundle_add_str(item->earlier_data,
- EVT_KEY_BATTERY_CHARGER_STATUS,
- EVT_VAL_BATTERY_CHARGER_DISCHARGING);
- } else {
- bundle_add_str(item->earlier_data,
- EVT_KEY_BATTERY_CHARGER_STATUS,
- EVT_VAL_BATTERY_CHARGER_CHARGING);
- }
- } else {
- bundle_add_str(item->earlier_data,
- EVT_KEY_BATTERY_CHARGER_STATUS,
- EVT_VAL_BATTERY_CHARGER_DISCONNECTED);
- }
- }
- }
-
- eventsystem_register_event(event_name, &subscription_id,
- (eventsystem_handler)__esd_event_handler, NULL);
- if (subscription_id == 0) {
- _E("signal subscription error, event_name(%s)", event_name);
- if (item->earlier_data)
- bundle_free(item->earlier_data);
- free(item->event_name);
- free(item);
-
- return ES_R_ERROR;
- } else {
- item->reg_id = subscription_id;
- }
-
- g_hash_table_insert(earlier_event_table, event_name, item);
- }
-
- __esd_earlier_table_print_items();
-#endif
-
- event_launch_table = g_hash_table_new(g_str_hash, g_str_equal);
- trusted_busname_table = g_hash_table_new(g_str_hash, g_str_equal);
-
- /* gdbus setup for method call */
- introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, &error);
- if (!introspection_data) {
- _E("g_dbus_node_info_new_for_xml error(%s)", error->message);
- g_error_free(error);
- return ES_R_ERROR;
- }
-
- owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
- ESD_BUS_NAME,
- G_BUS_NAME_OWNER_FLAGS_NONE,
- __esd_on_bus_acquired,
- __esd_on_name_acquired,
- __esd_on_name_lost,
- NULL, NULL);
- if (!owner_id) {
- _E("g_bus_own_name error");
- g_dbus_node_info_unref(introspection_data);
- return ES_R_ERROR;
- }
-
- _I("esd before_loop done");
-
- return ES_R_OK;
-}
-
-static void __esd_pkgmgr_event_free(esd_pkgmgr_event *pkg_event)
-{
- pkg_event->type = UNKNOWN;
- if (pkg_event->pkgid) {
- free(pkg_event->pkgid);
- pkg_event->pkgid = NULL;
- }
-}
-
-static int __esd_appcontrol_cb(const char *operation,
- const char *uri, const char *mime, void *data)
-{
- esd_appctrl_cb_data *cb_data = (esd_appctrl_cb_data *)data;
- char *appid = NULL;
- char *pkgid = NULL;
- char *event_name = NULL;
- uid_t uid = 0;
-
- if (cb_data == NULL) {
- _E("invalid data");
- return 0;
- }
- appid = cb_data->appid;
- pkgid = cb_data->pkgid;
- uid = cb_data->uid;
-
- _D("uid(%d), appid(%s), pkgid(%s), operation(%s), uri(%s), mime(%s)",
- uid, appid, pkgid, operation, uri, mime);
-
- if (!strcmp(operation, APPSVC_OPERATION_LAUNCH_ON_EVENT)) {
- if (uri && !strncmp(uri, SYSTEM_EVENT_NAME_PREFIX, strlen(SYSTEM_EVENT_NAME_PREFIX))) {
- event_name = strdup(&uri[8]);
- if (event_name) {
- _D("appid(%s), event_name(%s)", appid, event_name);
- if (!__esd_check_event_launch_support(event_name))
- _E("failed to add item (not support event)");
- else if (!__esd_check_app_privileged_event(uid, appid, pkgid, event_name))
- _E("failed to add item (no privilege)");
- else if (__esd_add_launch_item(uid, event_name, appid, pkgid))
- _E("failed to add item");
-
- } else {
- _E("out of memory");
- }
- } else if (uri && !strncmp(uri, USER_EVENT_NAME_PREFIX, strlen(USER_EVENT_NAME_PREFIX))) {
- event_name = strdup(uri);
- if (event_name) {
- _D("appid(%s), event_name(%s)", appid, event_name);
- if (__esd_check_platform_cert(pkgid, uid)) {
- if (__esd_add_launch_item(uid, event_name, appid, pkgid))
- _E("failed to add item");
- }
- } else {
- _E("out of memory");
- }
- }
- FREE_AND_NULL(event_name);
- }
-
- return 0;
-}
-
-static int __esd_add_appinfo_handler(const pkgmgrinfo_appinfo_h handle, void *data)
-{
- char *appid = NULL;
- char *pkgid = NULL;
- int ret = 0;
- uid_t *p_uid = NULL;
-
- if (data == NULL) {
- _E("invalid data");
- return ES_R_ERROR;
- }
-
- p_uid = (uid_t *)data;
-
- ret = pkgmgrinfo_appinfo_get_pkgid(handle, &pkgid);
- if (ret < 0) {
- _E("failed to get appid");
- return ES_R_ERROR;
- }
-
- ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
- if (ret < 0) {
- _E("failed to get appid");
- return ES_R_ERROR;
- }
-
- esd_appctrl_cb_data *cb_data = calloc(1, sizeof(esd_appctrl_cb_data));
-
- if (cb_data == NULL) {
- _E("memory alloc failed");
- return ES_R_ENOMEM;
- }
- cb_data->appid = strdup(appid);
- if (cb_data->appid == NULL) {
- _E("out_of_memory");
- FREE_AND_NULL(cb_data);
- return ES_R_ENOMEM;
- }
- cb_data->pkgid = strdup(pkgid);
- if (cb_data->pkgid == NULL) {
- _E("out_of_memory");
- FREE_AND_NULL(cb_data->appid);
- FREE_AND_NULL(cb_data);
- return ES_R_ENOMEM;
- }
- cb_data->uid = *p_uid;
-
- ret = pkgmgrinfo_appinfo_foreach_appcontrol(handle,
- (pkgmgrinfo_app_control_list_cb)__esd_appcontrol_cb, cb_data);
-
- FREE_AND_NULL(cb_data->pkgid);
- FREE_AND_NULL(cb_data->appid);
- FREE_AND_NULL(cb_data);
-
- if (ret < 0) {
- _E("failed to get appcontrol info");
- return ES_R_ERROR;
- }
-
- return ES_R_OK;
-}
-
-static int __esd_pkgmgr_event_callback(uid_t target_uid, int req_id,
- const char *pkg_type, const char *pkgid, const char *key,
- const char *val, const void *pmsg, void *data)
-{
- esd_pkgmgr_event *pkg_event = (esd_pkgmgr_event *)data;
- pkgmgrinfo_pkginfo_h handle = NULL;
- int ret = 0;
-
- _D("target_uid(%d), req_id(%d), pkg_type(%s), pkgid(%s), key(%s), val(%s)",
- target_uid, req_id, pkg_type, pkgid, key, val);
-
- if (strncmp(key, "start", strlen(key)) == 0) {
- if (strcmp(val, "install") == 0) {
- _D("install start");
- pkg_event->type = INSTALL;
- } else if (strcmp(val, "uninstall") == 0) {
- _D("unistall start");
- pkg_event->type = UNINSTALL;
- } else if (strcmp(val, "update") == 0) {
- _D("update start");
- pkg_event->type = UPDATE;
- } else {
- _D("val(%s) start", val);
- __esd_pkgmgr_event_free(pkg_event);
- }
- } else if (strcmp(key, "end") == 0 && strcmp(val, "ok") == 0) {
- if (pkg_event->type == INSTALL || pkg_event->type == UPDATE) {
- _D("install end (ok)");
- ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, target_uid, &handle);
- if (ret < 0) {
- _E("failed to get pkginfo");
- __esd_pkgmgr_event_free(pkg_event);
- return 0;
- }
- ret = pkgmgrinfo_appinfo_get_usr_list(handle,
- PMINFO_SVC_APP, __esd_add_appinfo_handler, &target_uid, target_uid);
- if (ret < 0) {
- _E("failed to get appinfo");
- pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
- __esd_pkgmgr_event_free(pkg_event);
- return 0;
- }
- ret = pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
- if (ret < 0) {
- _E("failed to destroy pkginfo");
- __esd_pkgmgr_event_free(pkg_event);
- return 0;
- }
- } else if (pkg_event->type == UNINSTALL) {
- _D("uninstall end (ok)");
- __esd_launch_table_remove_items(target_uid, pkgid);
- __esd_launch_table_print_items();
- }
- __esd_pkgmgr_event_free(pkg_event);
- } else if (strcmp(key, "end") == 0 && strcmp(val, "fail") == 0) {
- _E("pkg_event(%d) falied", pkg_event->type);
- __esd_pkgmgr_event_free(pkg_event);
- } else {
- if (strcmp(key, "install_percent") != 0)
- __esd_pkgmgr_event_free(pkg_event);
- }
-
- return 0;
-}
-
-static int __esd_init()
-{
- int req_id = 0;
- int ret = 0;
- pkgmgr_client *client;
- esd_pkgmgr_event *pkg_event;
-
-#if (GLIB_MAJOR_VERSION <= 2 && GLIB_MINOR_VERSION < 36)
- g_type_init();
-#endif
- __esd_init_cynara();
-
- client = pkgmgr_client_new(PC_LISTENING);
- if (client == NULL) {
- _E("set pkgmgr client failed");
- __esd_finish_cynara();
- return ES_R_ERROR;
- }
-
- pkg_event = calloc(1, sizeof(esd_pkgmgr_event));
- if (pkg_event == NULL) {
- _E("memory alloc failed");
- ret = pkgmgr_client_free(client);
- if (ret != PKGMGR_R_OK)
- _E("pkgmgr_client_free failed(%d)", ret);
- __esd_finish_cynara();
- return ES_R_ENOMEM;
- }
-
- req_id = pkgmgr_client_listen_status(client, __esd_pkgmgr_event_callback, pkg_event);
- if (req_id < 0) {
- _E("pkgmgr client listen failed");
- ret = pkgmgr_client_free(client);
- if (ret != PKGMGR_R_OK)
- _E("pkgmgr_client_free failed(%d)", ret);
- free(pkg_event);
- __esd_finish_cynara();
- return ES_R_ERROR;
- }
-
- s_info.client = client;
-
- _I("esd init done");
-
- return 0;
-}
-
-static void __esd_remove_esd_list_item(gpointer data, gpointer user_data)
-{
- esd_list_item_s *item = (esd_list_item_s *)data;
-
- free(item->app_id);
- free(item->pkg_id);
-}
-
-static void __esd_finalize(void)
-{
- gpointer key;
- gpointer value;
- GHashTableIter iter;
- trusted_item *item;
- event_launch_item *el_item;
- int ret = 0;
-#ifdef APPFW_EVENT_SYSTEM_EARLIER_FEATURE
- earlier_item *er_item;
-#endif
-
- _D("esd finalize");
-
- if (trusted_busname_table) {
- g_hash_table_iter_init(&iter, trusted_busname_table);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- item = (trusted_item *)value;
- if (item) {
- free(item->app_id);
- free(item->bus_name);
- free(item);
- } else {
- _E("item is null");
- }
- g_hash_table_iter_remove(&iter);
- }
- g_hash_table_unref(trusted_busname_table);
- }
-
-#ifdef APPFW_EVENT_SYSTEM_EARLIER_FEATURE
- if (earlier_event_table) {
- g_hash_table_iter_init(&iter, earlier_event_table);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- er_item = (earlier_item *)value;
- if (er_item) {
- eventsystem_unregister_event(er_item->reg_id);
- free(er_item->event_name);
- bundle_free(er_item->earlier_data);
- free(er_item);
- } else {
- _E("ealier item is NULL");
- }
- g_hash_table_iter_remove(&iter);
- }
- g_hash_table_unref(earlier_event_table);
- }
-
- g_hash_table_destroy(user_last_event_table);
-#endif
-
- if (event_launch_table) {
- g_hash_table_iter_init(&iter, event_launch_table);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- el_item = (event_launch_item *)value;
- if (el_item) {
- eventsystem_unregister_event(el_item->reg_id);
- free(el_item->event_name);
- g_list_foreach(el_item->app_list_evtlaunch,
- __esd_remove_esd_list_item, NULL);
- g_list_free(el_item->app_list_evtlaunch);
- free(el_item);
- } else {
- _E("item is NULL");
- }
- g_hash_table_iter_remove(&iter);
- }
- g_hash_table_unref(event_launch_table);
- }
-
- if (introspection_data)
- g_dbus_node_info_unref(introspection_data);
-
- if (s_info.client) {
- ret = pkgmgr_client_free(s_info.client);
- if (ret != PKGMGR_R_OK)
- _E("pkgmgr_client_free failed(%d)", ret);
- }
-
- __esd_finish_cynara();
-
- _D("esd finalize end");
-}
-
-int main(int argc, char *argv[])
-{
- GMainLoop *mainloop;
- _I("event system daemon : main()");
-
- mainloop = g_main_loop_new(NULL, FALSE);
- if (mainloop == NULL) {
- _E("out of memory");
- return ES_R_ERROR;
- }
-
- if (__esd_init() != 0) {
- _E("ESD Initialization failed!");
- g_main_loop_unref(mainloop);
- return ES_R_ERROR;
- }
-
- if (_esd_cion_init() != 0)
- _E("ESD Cion Initialization failed!");
-
- if (__esd_before_loop() < 0) {
- _E("ESD failed!");
- __esd_finalize();
- g_main_loop_unref(mainloop);
- return ES_R_ERROR;
- }
-
- if (esd_cion_db_init() < 0)
- _E("db init failed!");
-
- g_main_loop_run(mainloop);
-
- _E("shutdown");
-
- __esd_finalize();
-
- g_main_loop_unref(mainloop);
-
- return 0;
-}
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <glib.h>
-#include <dlog.h>
-#include <vconf.h>
-#include <bundle.h>
-#include <eventsystem.h>
-
-#include "eventsystem_daemon.h"
-
-/* table item : sent system-event by esd */
-static GHashTable *esd_sent_table;
-
-typedef struct __esd_sent_table_item {
- char *event_name;
- bundle *event_data;
-} esd_sent_item;
-
-struct esd_vconf_handler {
- const char *key;
- void (*esd_vconfcb_fn) (keynode_t *node, void *user_data);
-};
-
-static int __esd_event_data_compare(bundle *b1, bundle *b2, const char *key)
-{
- int ret = 0;
- int tmp1 = 0;
- int tmp2 = 0;
- char *str1 = NULL;
- char *str2 = NULL;
-
- if (bundle_get_count(b1) == bundle_get_count(b2)) {
- tmp1 = bundle_get_str(b1, key, &str1);
- tmp2 = bundle_get_str(b2, key, &str2);
- if (tmp1 == BUNDLE_ERROR_NONE && tmp2 == BUNDLE_ERROR_NONE) {
- if (strcmp(str1, str2) != 0) {
- _D("new event_data : value check");
- ret = 1;
- }
- }
- } else {
- _D("new event_data : bundle_count check");
- ret = 1;
- }
-
- if (ret == 0)
- _D("same event_data");
-
- return ret;
-}
-
-static int __esd_send_system_event(const char *event_name, bundle *b, const char *key)
-{
- int ret = ES_R_OK;
- esd_sent_item *item =
- (esd_sent_item *)g_hash_table_lookup(esd_sent_table, event_name);
-
- if (item && __esd_event_data_compare(item->event_data, b, key) == 0) {
- _D("skip send: same with previous data");
- } else {
- ret = eventsystem_send_system_event(event_name, b);
- if (ret != ES_R_OK) {
- _E("failed to send event");
- goto out;
- }
-
- if (item) {
- bundle_free(item->event_data);
- item->event_data = bundle_dup(b);
- } else {
- item = calloc(1, sizeof(esd_sent_item));
- if (item == NULL) {
- _E("memory alloc failed");
- ret = ES_R_ERROR;
- goto out;
- }
- item->event_name = strdup(event_name);
- if (item->event_name == NULL) {
- _E("out of memory");
- FREE_AND_NULL(item);
- ret = ES_R_ERROR;
- goto out;
- }
- item->event_data = bundle_dup(b);
- }
-
- g_hash_table_insert(esd_sent_table, item->event_name, item);
- }
-
-out:
- return ret;
-}
-
-static void __esd_vconfcb_location_use_mylocation(keynode_t *node, void *user_data)
-{
- int ret = 0;
- int enabled = 0;
- bundle *b = NULL;
- const char *key = NULL;
- const char *val = NULL;
-
- _D("vconfcb called");
-
- ret = vconf_get_int(VCONFKEY_LOCATION_USE_MY_LOCATION, &enabled);
- if (ret != VCONF_OK) {
- _E("failed to get vconf (%d)", ret);
- return;
- }
-
- key = EVT_KEY_LOCATION_ENABLE_STATE;
-
- if (enabled)
- val = EVT_VAL_LOCATION_ENABLED;
- else
- val = EVT_VAL_LOCATION_DISABLED;
-
- b = bundle_create();
- bundle_add_str(b, key, val);
-
- if (__esd_send_system_event(SYS_EVENT_LOCATION_ENABLE_STATE, b, key) != ES_R_OK)
- _E("failed to send event");
-
- if (b)
- bundle_free(b);
-}
-
-static void __esd_vconfcb_location_enabled(keynode_t *node, void *user_data)
-{
- int ret = 0;
- int enabled = 0;
- bundle *b = NULL;
- const char *key = NULL;
- const char *val = NULL;
-
- _D("vconfcb called");
-
- ret = vconf_get_int(VCONFKEY_LOCATION_ENABLED, &enabled);
- if (ret != VCONF_OK) {
- _E("failed to get vconf (%d)", ret);
- return;
- }
-
- key = EVT_KEY_GPS_ENABLE_STATE;
-
- if (enabled)
- val = EVT_VAL_GPS_ENABLED;
- else
- val = EVT_VAL_GPS_DISABLED;
-
- b = bundle_create();
- bundle_add_str(b, key, val);
-
- if (__esd_send_system_event(SYS_EVENT_GPS_ENABLE_STATE, b, key) != ES_R_OK)
- _E("failed to send event");
-
- if (b)
- bundle_free(b);
-}
-
-static void __esd_vconfcb_location_network_enabled(keynode_t *node, void *user_data)
-{
- int ret = 0;
- int enabled = 0;
- bundle *b = NULL;
- const char *key = NULL;
- const char *val = NULL;
-
- _D("vconfcb called");
-
- ret = vconf_get_int(VCONFKEY_LOCATION_NETWORK_ENABLED, &enabled);
- if (ret != VCONF_OK) {
- _E("failed to get vconf (%d)", ret);
- return;
- }
-
- key = EVT_KEY_NPS_ENABLE_STATE;
-
- if (enabled)
- val = EVT_VAL_NPS_ENABLED;
- else
- val = EVT_VAL_NPS_DISABLED;
-
- b = bundle_create();
- bundle_add_str(b, key, val);
-
- if (__esd_send_system_event(SYS_EVENT_NPS_ENABLE_STATE, b, key) != ES_R_OK)
- _E("failed to send event");
-
- if (b)
- bundle_free(b);
-}
-
-static void __esd_vconfcb_language_set(keynode_t *node, void *user_data)
-{
- char *str = 0;
- bundle *b = NULL;
- const char *key = NULL;
-
- _D("vconfcb called");
-
- str = vconf_get_str(VCONFKEY_LANGSET);
- if (str == NULL) {
- _E("failed to get vconf str");
- return;
- }
-
- key = EVT_KEY_LANGUAGE_SET;
-
- b = bundle_create();
- bundle_add_str(b, key, str);
-
- if (__esd_send_system_event(SYS_EVENT_LANGUAGE_SET, b, key) != ES_R_OK)
- _E("failed to send event");
-
- if (b)
- bundle_free(b);
- if (str)
- free(str);
-}
-
-static void __esd_vconfcb_hour_format(keynode_t *node, void *user_data)
-{
- int ret = 0;
- int hours = 0;
- bundle *b = NULL;
- const char *key = NULL;
- const char *val = NULL;
-
- _D("vconfcb called");
-
- ret = vconf_get_int(VCONFKEY_REGIONFORMAT_TIME1224, &hours);
- if (ret != VCONF_OK) {
- _E("failed to get vconf (%d)", ret);
- return;
- }
-
- key = EVT_KEY_HOUR_FORMAT;
-
- if (hours == VCONFKEY_TIME_FORMAT_24)
- val = EVT_VAL_HOURFORMAT_24;
- else
- val = EVT_VAL_HOURFORMAT_12;
-
- b = bundle_create();
- bundle_add_str(b, key, val);
-
- if (__esd_send_system_event(SYS_EVENT_HOUR_FORMAT, b, key) != ES_R_OK)
- _E("failed to send event");
-
- if (b)
- bundle_free(b);
-}
-
-static void __esd_vconfcb_region_format(keynode_t *node, void *user_data)
-{
- char *str = 0;
- bundle *b = NULL;
- const char *key = NULL;
-
- _D("vconfcb called");
-
- str = vconf_get_str(VCONFKEY_REGIONFORMAT);
- if (str == NULL) {
- _E("failed to get vconf str");
- return;
- }
-
- key = EVT_KEY_REGION_FORMAT;
-
- b = bundle_create();
- bundle_add_str(b, key, str);
-
- if (__esd_send_system_event(SYS_EVENT_REGION_FORMAT, b, key) != ES_R_OK)
- _E("failed to send event");
-
- if (b)
- bundle_free(b);
- if (str)
- free(str);
-}
-
-static void __esd_vconfcb_vibration_status(keynode_t *node, void *user_data)
-{
- int ret = 0;
- int vibration_on = 0;
- int sound_on = 0;
- bundle *b = NULL;
- char *key = NULL;
- char *val = NULL;
-
- _D("vconfcb called");
-
- ret = vconf_get_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, &vibration_on);
- if (ret != VCONF_OK) {
- _E("failed to get vconf (%d)", ret);
- return;
- }
-
- ret = vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &sound_on);
- if (ret != VCONF_OK) {
- _E("failed to get vconf (%d)", ret);
- return;
- }
-
- if (vibration_on) {
- key = EVT_KEY_VIBRATION_STATE;
- val = EVT_VAL_VIBRATION_ON;
- b = bundle_create();
- bundle_add_str(b, key, val);
- if (__esd_send_system_event(SYS_EVENT_VIBRATION_STATE, b, key) != ES_R_OK)
- _E("failed to send event");
-
- if (b)
- bundle_free(b);
-
- key = EVT_KEY_SILENT_MODE;
- val = EVT_VAL_SILENTMODE_OFF;
- b = bundle_create();
- bundle_add_str(b, key, val);
- if (__esd_send_system_event(SYS_EVENT_SILENT_MODE, b, key) != ES_R_OK)
- _E("failed to send event");
-
- if (b)
- bundle_free(b);
- } else {
- key = EVT_KEY_VIBRATION_STATE;
- val = EVT_VAL_VIBRATION_OFF;
- b = bundle_create();
- bundle_add_str(b, key, val);
- if (__esd_send_system_event(SYS_EVENT_VIBRATION_STATE, b, key) != ES_R_OK)
- _E("failed to send event");
-
- if (b)
- bundle_free(b);
-
- if (!sound_on) {
- key = EVT_KEY_SILENT_MODE;
- val = EVT_VAL_SILENTMODE_ON;
- b = bundle_create();
- bundle_add_str(b, key, val);
- if (__esd_send_system_event(SYS_EVENT_SILENT_MODE, b, key) != ES_R_OK)
- _E("failed to send event");
-
- if (b)
- bundle_free(b);
- }
- }
-}
-
-static void __esd_vconfcb_sound_status(keynode_t *node, void *user_data)
-{
- int ret = 0;
- int vibration_on = 0;
- int sound_on = 0;
- bundle *b = NULL;
- char *key = NULL;
- char *val = NULL;
-
- _D("vconfcb called");
-
- ret = vconf_get_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, &vibration_on);
- if (ret != VCONF_OK) {
- _E("failed to get vconf (%d)", ret);
- return;
- }
-
- ret = vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &sound_on);
- if (ret != VCONF_OK) {
- _E("failed to get vconf (%d)", ret);
- return;
- }
-
- if (sound_on) {
- key = EVT_KEY_VIBRATION_STATE;
- val = EVT_VAL_VIBRATION_OFF;
- b = bundle_create();
- bundle_add_str(b, key, val);
- if (__esd_send_system_event(SYS_EVENT_VIBRATION_STATE, b, key) != ES_R_OK)
- _E("failed to send event");
-
- if (b)
- bundle_free(b);
-
- key = EVT_KEY_SILENT_MODE;
- val = EVT_VAL_SILENTMODE_OFF;
- b = bundle_create();
- bundle_add_str(b, key, val);
- if (__esd_send_system_event(SYS_EVENT_SILENT_MODE, b, key) != ES_R_OK)
- _E("failed to send event");
-
- if (b)
- bundle_free(b);
- } else {
- if (!vibration_on) {
- key = EVT_KEY_SILENT_MODE;
- val = EVT_VAL_SILENTMODE_ON;
- b = bundle_create();
- bundle_add_str(b, key, val);
- if (__esd_send_system_event(SYS_EVENT_SILENT_MODE, b, key) != ES_R_OK)
- _E("failed to send event");
-
- if (b)
- bundle_free(b);
- }
- }
-}
-
-static void __esd_vconfcb_auto_rotate(keynode_t *node, void *user_data)
-{
- int ret = 0;
- int enabled = 0;
- bundle *b = NULL;
- const char *key = NULL;
- const char *val = NULL;
-
- _D("vconfcb called");
-
- ret = vconf_get_bool(VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, &enabled);
- if (ret != VCONF_OK) {
- _E("failed to get vconf (%d)", ret);
- return;
- }
-
- key = EVT_KEY_SCREEN_AUTOROTATE_STATE;
-
- if (enabled)
- val = EVT_VAL_SCREEN_AUTOROTATE_ON;
- else
- val = EVT_VAL_SCREEN_AUTOROTATE_OFF;
-
- b = bundle_create();
- bundle_add_str(b, key, val);
-
- if (__esd_send_system_event(SYS_EVENT_SCREEN_AUTOROTATE_STATE, b, key) != ES_R_OK)
- _E("failed to send event");
-
- if (b)
- bundle_free(b);
-}
-
-static void __esd_vconfcb_mobiledata_state(keynode_t *node, void *user_data)
-{
- int ret = 0;
- int enabled = 0;
- bundle *b = NULL;
- const char *key = NULL;
- const char *val = NULL;
-
- _D("vconfcb called");
-
- ret = vconf_get_bool(VCONFKEY_3G_ENABLE, &enabled);
- if (ret != VCONF_OK) {
- _E("failed to get vconf (%d)", ret);
- return;
- }
-
- key = EVT_KEY_MOBILE_DATA_STATE;
-
- if (enabled)
- val = EVT_VAL_MOBILE_DATA_ON;
- else
- val = EVT_VAL_MOBILE_DATA_OFF;
-
- b = bundle_create();
- bundle_add_str(b, key, val);
-
- if (__esd_send_system_event(SYS_EVENT_MOBILE_DATA_STATE, b, key) != ES_R_OK)
- _E("failed to send event");
-
- if (b)
- bundle_free(b);
-}
-
-static void __esd_vconfcb_roaming_state(keynode_t *node, void *user_data)
-{
- int ret = 0;
- int enabled = 0;
- bundle *b = NULL;
- const char *key = NULL;
- const char *val = NULL;
-
- _D("vconfcb called");
-
- ret = vconf_get_bool(VCONFKEY_SETAPPL_STATE_DATA_ROAMING_BOOL, &enabled);
- if (ret != VCONF_OK) {
- _E("failed to get vconf (%d)", ret);
- return;
- }
-
- key = EVT_KEY_DATA_ROAMING_STATE;
-
- if (enabled)
- val = EVT_VAL_DATA_ROAMING_ON;
- else
- val = EVT_VAL_DATA_ROAMING_OFF;
-
- b = bundle_create();
- bundle_add_str(b, key, val);
-
- if (__esd_send_system_event(SYS_EVENT_DATA_ROAMING_STATE, b, key) != ES_R_OK)
- _E("failed to send event");
-
- if (b)
- bundle_free(b);
-}
-
-static void __esd_vconfcb_font_set(keynode_t *node, void *user_data)
-{
- char *str = 0;
- bundle *b = NULL;
- const char *key = NULL;
-
- _D("vconfcb called");
-
- str = vconf_get_str(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_NAME);
- if (str == NULL) {
- _E("failed to get vconf str");
- return;
- }
-
- key = EVT_KEY_FONT_SET;
-
- b = bundle_create();
- bundle_add_str(b, key, str);
-
- if (__esd_send_system_event(SYS_EVENT_FONT_SET, b, key) != ES_R_OK)
- _E("failed to send event");
-
- if (b)
- bundle_free(b);
- if (str)
- free(str);
-}
-
-static struct esd_vconf_handler vconf_callbacks[] = {
- {VCONFKEY_LOCATION_USE_MY_LOCATION, __esd_vconfcb_location_use_mylocation},
- {VCONFKEY_LOCATION_ENABLED, __esd_vconfcb_location_enabled},
- {VCONFKEY_LOCATION_NETWORK_ENABLED, __esd_vconfcb_location_network_enabled},
- {VCONFKEY_LANGSET, __esd_vconfcb_language_set},
- {VCONFKEY_REGIONFORMAT_TIME1224, __esd_vconfcb_hour_format},
- {VCONFKEY_REGIONFORMAT, __esd_vconfcb_region_format},
- {VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, __esd_vconfcb_vibration_status},
- {VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, __esd_vconfcb_sound_status},
- {VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, __esd_vconfcb_auto_rotate},
- {VCONFKEY_3G_ENABLE, __esd_vconfcb_mobiledata_state},
- {VCONFKEY_SETAPPL_STATE_DATA_ROAMING_BOOL, __esd_vconfcb_roaming_state},
- {VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_NAME, __esd_vconfcb_font_set},
-};
-
-static int vconfcbs_size = sizeof(vconf_callbacks)/sizeof(struct esd_vconf_handler);
-
-int __esd_register_vconf_callbacks(void)
-{
- int i = 0;
- int ret = 0;
- int result = ES_R_OK;
-
-#if (GLIB_MAJOR_VERSION <= 2 && GLIB_MINOR_VERSION < 36)
- g_type_init();
-#endif
-
- esd_sent_table = g_hash_table_new(g_str_hash, g_str_equal);
-
- _D("vconf callbacks size(%d)", vconfcbs_size);
- for (i = 0; i < vconfcbs_size; i++) {
- ret = vconf_notify_key_changed(vconf_callbacks[i].key,
- vconf_callbacks[i].esd_vconfcb_fn, NULL);
- if (ret != VCONF_OK) {
- _E("failed to register vconf callback (%s)", vconf_callbacks[i].key);
- result = ES_R_ERROR;
- break;
- }
- }
-
- return result;
-}
--- /dev/null
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}
+ LIB_SRCS)
+
+ADD_LIBRARY(${TARGET_LIB_ESD} SHARED
+ ${LIB_SRCS}
+)
+SET_TARGET_PROPERTIES(${TARGET_LIB_ESD} PROPERTIES SOVERSION ${MAJORVER})
+SET_TARGET_PROPERTIES(${TARGET_LIB_ESD} PROPERTIES VERSION ${FULLVER})
+SET_TARGET_PROPERTIES(${TARGET_LIB_ESD} PROPERTIES OUTPUT_NAME esd)
+
+SET_TARGET_PROPERTIES(${TARGET_LIB_ESD} PROPERTIES COMPILE_FLAGS
+ ${CFLAGS} "-fpic")
+SET_TARGET_PROPERTIES(${TARGET_LIB_ESD} PROPERTIES LINK_FLAGS "-ldl -lpthread")
+
+TARGET_INCLUDE_DIRECTORIES(${TARGET_LIB_ESD} PUBLIC
+ ${CMAKE_CURRENT_SOURCE_DIR}/)
+
+APPLY_PKG_CONFIG(${TARGET_LIB_ESD} PUBLIC
+ AUL_DEPS
+ DLOG_DEPS
+ GIO_DEPS
+ GLIB_DEPS
+)
+
+CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/pkgconfig/${TARGET_LIB_ESD}.pc.in
+ ${CMAKE_CURRENT_SOURCE_DIR}/pkgconfig/libesd.pc @ONLY)
+
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/pkgconfig/libesd.pc DESTINATION
+ ${LIB_INSTALL_DIR}/pkgconfig)
+INSTALL(TARGETS ${TARGET_LIB_ESD} DESTINATION ${LIB_INSTALL_DIR} COMPONENT
+ RuntimeLibraries)
+INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ DESTINATION include/esd
+ FILES_MATCHING
+ PATTERN "*.hh")
--- /dev/null
+/*
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef EVENTSYSTEM_LIB_IMODULE_HH_
+#define EVENTSYSTEM_LIB_IMODULE_HH_
+
+#include <tool_box.hh>
+
+namespace esd::api {
+
+class IModule {
+ public:
+ virtual ~IModule() = default;
+ virtual bool Startup(ToolBox* tools) = 0;
+ virtual void Shutdown() = 0;
+};
+
+} // namesapce esd::api
+
+#endif // EVENTSYSTEM_LIB_IMODULE_HH_
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef EVENTSYSTEM_LIB_LOG_HH_
+#define EVENTSYSTEM_LIB_LOG_HH_
+
+#include <dlog.h>
+
+#undef LOG_TAG
+#define LOG_TAG "ESD"
+
+#define _E(fmt, arg...) LOGE(fmt, ##arg)
+#define _D(fmt, arg...) LOGD(fmt, ##arg)
+#define _W(fmt, arg...) LOGW(fmt, ##arg)
+#define _I(fmt, arg...) LOGI(fmt, ##arg)
+
+#endif // EVENTSYSTEM_LIB_LOG_HH_
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef EVENTSYSTEM_LIB_METHOD_BROKER_HH_
+#define EVENTSYSTEM_LIB_METHOD_BROKER_HH_
+
+#include <functional>
+#include <map>
+#include <memory>
+#include <string>
+
+namespace esd::api {
+
+class ParamsBase {
+ public:
+ virtual ~ParamsBase() = default;
+};
+
+template <class... ArgTypes>
+class Params : public ParamsBase {
+ public:
+ using FuncType = std::function<void(ArgTypes...)>;
+
+ Params() {};
+ Params(FuncType f) : func_(f) {}
+
+ void operator()(ArgTypes... args) {
+ if (func_)
+ func_(args...);
+ }
+
+ private:
+ FuncType func_;
+};
+
+class MethodBroker {
+ public:
+ template <class T>
+ void Register(std::string name, const T& cmd) {
+ fmap_.insert(std::pair<std::string,
+ std::shared_ptr<ParamsBase>>(name, std::make_shared<T>(cmd)));
+ }
+
+ template <class... ArgTypes>
+ bool Invoke(std::string name, ArgTypes... args) {
+ using ParamsType = Params<ArgTypes...>;
+
+ auto it = fmap_.find(name);
+ if (it != fmap_.end()) {
+ auto* p = dynamic_cast<ParamsType*>(it->second.get());
+ if (p) {
+ (*p)(args...);
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private:
+ std::map<std::string, std::shared_ptr<ParamsBase>> fmap_;
+};
+
+} // namespace esd::api
+
+#endif // EVENTSYSTEM_LIB_METHOD_BROKER_HH_
\ No newline at end of file
--- /dev/null
+# Package Information for pkg-config
+
+prefix=/usr
+exec_prefix=@EXEC_PREFIX@
+libdir=@LIB_INSTALL_DIR@
+includedir=@INCLUDE_INSTALL_DIR@
+
+Name: libesd
+Description: esd library for making plugins
+Version: @VERSION@
+Requires: bundle
+Libs: -L${libdir} -lesd
+Cflags: -I${includedir} -I${includedir}/esd
--- /dev/null
+/*
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "tool_box.hh"
+
+namespace esd::api {
+
+ToolBox::ToolBox() {
+
+}
+
+} // namespace esd::api
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef EVENTSYSTEM_LIB_TOOL_BOX_HH_
+#define EVENTSYSTEM_LIB_TOOL_BOX_HH_
+
+#include <method_broker.hh>
+
+#undef EXPORT_API
+#define EXPORT_API __attribute__((visibility("default")))
+
+namespace esd::api {
+
+class EXPORT_API ToolBox {
+ public:
+ ToolBox();
+ MethodBroker& GetMethodBroker() {
+ return broker_;
+ }
+
+ private:
+ MethodBroker broker_;
+};
+
+} // namespace esd::api
+
+#endif // EVENTSYSTEM_LIB_TOOL_BOX_HH_
\ No newline at end of file
--- /dev/null
+ADD_SUBDIRECTORY(cion)
+ADD_SUBDIRECTORY(dbus_event)
--- /dev/null
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} ESD_MOD_CION_SRCS)
+
+ADD_LIBRARY(${TARGET_ESD_MOD_CION} ${ESD_MOD_CION_SRCS})
+
+TARGET_INCLUDE_DIRECTORIES(${TARGET_ESD_MOD_CION} PUBLIC
+ ${CMAKE_CURRENT_SOURCE_DIR}/../../lib)
+
+TARGET_LINK_LIBRARIES(${TARGET_ESD_MOD_CION} PRIVATE ${TARGET_LIB_ESD})
+
+APPLY_PKG_CONFIG(${TARGET_ESD_MOD_CION} PUBLIC
+ AUL_DEPS
+ BUNDLE_DEPS
+ PARCEL_DEPS
+ PKGMGR_INFO_DEPS
+ DLOG_DEPS
+ GIO_DEPS
+ GLIB_DEPS
+ CION_DEPS
+ VCONF_DEPS
+ CAPI_SYSTEM_INFO_DEPS
+ LIBTZPLATFORM_CONFIG_DEPS
+ UUID_DEPS
+ SQLITE3_DEPS
+)
+
+INSTALL(TARGETS ${TARGET_ESD_MOD_CION} DESTINATION ${ESD_MODULES_DIR}/mod
+ COMPONENT RuntimeLibraries)
--- /dev/null
+/*
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include "cion_module.hh"
+
+#undef EXPORT_API
+#define EXPORT_API __attribute__((visibility("default")))
+
+extern "C" EXPORT_API esd::api::IModule* ESD_GET_MODULE() {
+ return new esd::module::CionModule();
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include "cion_module.hh"
+
+#include <uuid/uuid.h>
+#include <unistd.h>
+#include <tzplatform_config.h>
+#include <stdbool.h>
+
+#include "log.hh"
+
+#define DBPATH tzplatform_mkpath(TZ_SYS_DB, ".cion.db")
+
+namespace esd::module {
+
+using tizen_base::_;
+using tizen_base::dbtype_cast;
+
+namespace {
+
+constexpr const char CREATE_CION_TABLE[] = R"__cion(
+PRAGMA user_version = 50;
+PRAGMA journal_mode = PERSIST;
+PRAGMA foreign_keys = ON;
+BEGIN EXCLUSIVE TRANSACTION;
+CREATE TABLE IF NOT EXISTS cion_uuid (
+ appid TEXT NOT NULL,
+ uuid TEXT NOT NULL,
+ PRIMARY KEY(appid)
+);
+CREATE TABLE IF NOT EXISTS cion_display_name (
+ service_name TEXT NOT NULL,
+ appid TEXT NOT NULL,
+ display_name TEXT NULL,
+ enabled INTEGER DEFAULT 0,
+ PRIMARY KEY(service_name, appid) ,
+ FOREIGN KEY(appid) REFERENCES cion_uuid (appid) ON DELETE CASCADE
+);
+COMMIT TRANSACTION;
+)__cion";
+
+bool CreateTable(const tizen_base::Database& db) {
+ auto q = tizen_base::Database::Sql(CREATE_CION_TABLE);
+ auto r = db.Exec(q);
+ if (!static_cast<bool>(r))
+ return false;
+
+ return true;
+}
+
+bool IsTableExist(const tizen_base::Database& db) {
+ auto q = tizen_base::Database::Sql(
+ "SELECT name FROM sqlite_master WHERE type='table'"
+ " ORDER BY name ASC");
+ auto r = db.Exec(q);
+ if (!static_cast<bool>(r))
+ return false;
+
+ for (const auto& i : r) {
+ auto [table_name] = i.Get<_>();
+ if (dbtype_cast<std::string>(table_name) == "cion")
+ return true;
+ }
+
+ return false;
+}
+
+} // namespace
+
+bool CionModule::Startup(api::ToolBox* tools) {
+ tools->GetMethodBroker().Register("Cion.GetUuidWithGenerate",
+ api::Params<const std::string&, std::optional<std::string>&>(
+ [this](const std::string& appid, std::optional<std::string>& uuid) {
+ GetUuidWithGenerate(appid, uuid);
+ }));
+ tools->GetMethodBroker().Register("Cion.SetDisplayName",
+ api::Params<const std::string&, const std::string&, const std::string&, int&>(
+ [this](const std::string& appid, const std::string& service_name,
+ const std::string& display_name, int& ret) {
+ SetDisplayName(appid, service_name, display_name, ret);
+ }));
+ tools->GetMethodBroker().Register("Cion.GetDisplayName",
+ api::Params<const std::string&, const std::string&, std::string&, int&>(
+ [this](const std::string& appid, const std::string& service_name,
+ std::string& display_name, int& ret) {
+ GetDisplayName(appid, service_name, display_name, ret);
+ }));
+ tools->GetMethodBroker().Register("Cion.SetEnabled",
+ api::Params<const std::string&, const std::string&, bool, int&>(
+ [this](const std::string& appid, const std::string& service_name,
+ bool enabled, int& ret) {
+ SetEnabled(appid, service_name, enabled, ret);
+ }));
+ tools->GetMethodBroker().Register("Cion.GetEnabled",
+ api::Params<const std::string&, const std::string&, bool&, int&>(
+ [this](const std::string& appid, const std::string& service_name,
+ bool& enabled, int& ret) {
+ GetEnabled(appid, service_name, enabled, ret);
+ }));
+
+ return Init();
+}
+
+void CionModule::Shutdown() {
+
+}
+
+bool CionModule::Init() {
+ try {
+ esd_cion_server_ =
+ std::make_shared<CionOndemandServer>("__CION_INTERNAL_DAEMON__", "", this);
+ } catch (const cion::Exception& e) {
+ _D("cion_init failed : %s", e.what());
+ return false;
+ }
+
+ _D("cion_init done");
+ ChangeListenStatusCionServer();
+
+ return DbInit();
+}
+
+void CionModule::ChangeListenStatusCionServer() {
+ try {
+ auto ret = GetEnabledServiceList();
+ if (!ret) {
+ _D("Get list error");
+ } else if (ret->empty() && is_listening_) {
+ esd_cion_server_->Stop();
+ is_listening_ = false;
+ _D("esd_cion_server stop listen");
+ } else if (!ret->empty() && !is_listening_) {
+ esd_cion_server_->Listen();
+ is_listening_ = true;
+ _D("esd_cion_server start listen");
+ }
+ } catch (const cion::Exception& e) {
+ _E("cion_init failed : %s", e.what());
+ }
+
+ return;
+}
+
+void CionModule::AddEnabledApp(const std::string& service_name,
+ const std::string& app_id, const std::string& display_name) {
+ if (esd_cion_server_ == nullptr) {
+ _E("Call init function at first");
+ return;
+ }
+
+ esd_cion_server_->AddOndemandServiceList(service_name, app_id, display_name);
+ if (!is_listening_)
+ ChangeListenStatusCionServer();
+}
+
+void CionModule::RemoveEnabledApp(const std::string& service_name,
+ const std::string& app_id) {
+ if (esd_cion_server_ == nullptr) {
+ _E("Call init function at first");
+ return;
+ }
+
+ esd_cion_server_->RemoveOndemandServiceList(service_name, app_id);
+
+ if (is_listening_)
+ ChangeListenStatusCionServer();
+}
+
+bool CionModule::DbInit() {
+ try {
+ tizen_base::Database db(DBPATH, SQLITE_OPEN_READWRITE);
+ if (IsTableExist(db)) {
+ if (!CreateTable(db)) {
+ _E("Fail to create table");
+ return false;
+ }
+ }
+ } catch(const std::runtime_error&) {
+ unlink(DBPATH);
+ try {
+ tizen_base::Database db(DBPATH, SQLITE_OPEN_CREATE |
+ SQLITE_OPEN_READWRITE);
+ if (IsTableExist(db)) {
+ if (!CreateTable(db)) {
+ _E("Fail to create table");
+ return false;
+ }
+ }
+ } catch(const std::runtime_error&) {
+ unlink(DBPATH);
+ return false;
+ }
+ }
+
+ return true;
+}
+
+std::string CionModule::GenUuid() {
+ uuid_t uu;
+ char _uuid[37];
+
+ uuid_generate_random(uu);
+ uuid_unparse(uu, _uuid);
+
+ return _uuid;
+}
+
+bool CionModule::GetUuidFromDb(const tizen_base::Database& db,
+ const std::string& appid, std::string& uuid) {
+ auto q = tizen_base::Database::Sql(
+ "SELECT uuid FROM cion_uuid WHERE appid = ?")
+ .Bind(appid);
+ auto r = db.Exec(q);
+ if (!static_cast<bool>(r))
+ return false;
+
+ for (const auto& i : r) {
+ auto [uuid_rec] = i.Get<_>();
+ uuid = dbtype_cast<std::string>(uuid_rec);
+ return true;
+ }
+
+ return false;
+}
+
+bool CionModule::SetUuidToDb(const tizen_base::Database& db,
+ const std::string& appid, const std::string& uuid) {
+ auto q = tizen_base::Database::Sql(
+ "INSERT INTO cion_uuid (appid, uuid) VALUES (?, ?)")
+ .Bind(appid)
+ .Bind(uuid);
+ auto r = db.Exec(q);
+ if (!static_cast<bool>(r))
+ return false;
+ return true;
+}
+
+void CionModule::GetUuidWithGenerate(const std::string& appid,
+ std::optional<std::string>& uuid) {
+ try {
+ tizen_base::Database db(DBPATH, SQLITE_OPEN_READWRITE);
+ std::string uuid_str;
+ int ret = 0;
+
+ if (!GetUuidFromDb(db, appid, uuid_str)) {
+ uuid_str = GenUuid();
+ ret = SetUuidToDb(db, appid, uuid_str);
+ _E("get uuid generate");
+ }
+
+ if (ret == 0)
+ uuid = std::move(uuid_str);
+ } catch(const std::runtime_error&) {
+ uuid = std::nullopt;
+ }
+}
+
+void CionModule::SetDisplayName(const std::string& appid,
+ const std::string& service_name, const std::string& display_name, int& ret) {
+ try {
+ tizen_base::Database db(DBPATH, SQLITE_OPEN_READWRITE);
+ std::string uuid;
+
+ ret = 0;
+ if (!GetUuidFromDb(db, appid, uuid)) {
+ uuid = GenUuid();
+ ret = SetUuidToDb(db, appid, uuid);
+ if (ret != 0)
+ return;
+ }
+
+ auto q = tizen_base::Database::Sql(
+ "INSERT INTO cion_display_name(service_name, appid, display_name) "
+ "VALUES (?, ?, ?) ON CONFLICT(service_name, appid) "
+ "DO UPDATE SET display_name = ? "
+ "WHERE service_name = ? AND appid = ? ")
+ .Bind(service_name)
+ .Bind(appid)
+ .Bind(display_name)
+ .Bind(display_name)
+ .Bind(service_name)
+ .Bind(appid);
+ auto r = db.Exec(q);
+ if (!static_cast<bool>(r))
+ ret = -1;
+ } catch(const std::runtime_error&) {
+ ret = -1;
+ }
+}
+
+void CionModule::GetDisplayName(const std::string& appid,
+ const std::string& service_name, std::string& display_name, int& ret) {
+ try {
+ tizen_base::Database db(DBPATH, SQLITE_OPEN_READWRITE);
+
+ ret = -1;
+ auto q = tizen_base::Database::Sql(
+ "SELECT display_name FROM cion_display_name "
+ "WHERE appid = ? AND service_name = ?")
+ .Bind(appid)
+ .Bind(service_name);
+
+ auto r = db.Exec(q);
+ if (!static_cast<bool>(r))
+ return;
+
+ for (const auto& i : r) {
+ auto [display_name_rec] = i.Get<_>();
+ display_name = dbtype_cast<std::string>(display_name_rec);
+ ret = 0;
+ break;
+ }
+ } catch(const std::runtime_error&) {
+ ret = -1;
+ }
+}
+
+void CionModule::SetEnabled(const std::string& appid, const std::string& service_name,
+ bool enabled, int& ret) {
+ try {
+ tizen_base::Database db(DBPATH, SQLITE_OPEN_READWRITE);
+
+ ret = -1;
+ auto q = tizen_base::Database::Sql(
+ "UPDATE cion_display_name SET enabled = ? "
+ "WHERE appid = ? AND service_name = ?")
+ .Bind(enabled? 1 : 0)
+ .Bind(appid)
+ .Bind(service_name);
+
+ auto r = db.Exec(q);
+ if (!static_cast<bool>(r))
+ return;
+
+ auto q2 = tizen_base::Database::Sql(
+ "SELECT display_name FROM cion_display_name "
+ "WHERE appid = %Q AND service_name = %Q")
+ .Bind(appid)
+ .Bind(service_name);
+
+ auto r2 = db.Exec(q2);
+ if (!static_cast<bool>(r2))
+ return;
+
+ for (const auto& i : r2) {
+ auto [display_name_rec] = i.Get<_>();
+ std::string display_name = dbtype_cast<std::string>(display_name_rec);
+ if (enabled)
+ AddEnabledApp(service_name, appid, display_name);
+ else
+ RemoveEnabledApp(service_name, appid);
+ ret = 0;
+ break;
+ }
+ } catch(const std::runtime_error&) {
+ ret = -1;
+ }
+}
+
+void CionModule::GetEnabled(const std::string& appid, const std::string& service_name,
+ bool& enabled, int& ret) {
+ try {
+ tizen_base::Database db(DBPATH, SQLITE_OPEN_READWRITE);
+
+ ret = -1;
+ auto q = tizen_base::Database::Sql(
+ "SELECT enabled FROM cion_display_name "
+ "WHERE appid = ? AND service_name = ?")
+ .Bind(appid)
+ .Bind(service_name);
+
+ auto r = db.Exec(q);
+ if (!static_cast<bool>(r))
+ return;
+
+ for (const auto& i : r) {
+ auto [enabled_rec] = i.Get<_>();
+ enabled = (bool)dbtype_cast<int>(enabled_rec);
+ ret = 0;
+ break;
+ }
+ } catch(const std::runtime_error&) {
+ ret = -1;
+ }
+}
+
+std::optional<std::list<CionServiceInfo>> CionModule::GetEnabledServiceList() {
+ try {
+ tizen_base::Database db(DBPATH, SQLITE_OPEN_READWRITE);
+ auto q = tizen_base::Database::Sql(
+ "SELECT service_name, appid, display_name "
+ "FROM cion_display_name WHERE enabled = 1");
+
+ auto r = db.Exec(q);
+ if (!static_cast<bool>(r))
+ return std::nullopt;
+
+ std::list<CionServiceInfo> info_list;
+ for (const auto& i : r) {
+ auto [service_name, appid, display_name] = i.Get<_, _, _>();
+ info_list.push_back(
+ CionServiceInfo(dbtype_cast<std::string>(service_name),
+ dbtype_cast<std::string>(appid),
+ dbtype_cast<std::string>(display_name)));
+ }
+
+ return info_list;
+ } catch(const std::runtime_error&) {
+ return std::nullopt;
+ }
+}
+
+} //namespace esd::module
--- /dev/null
+/*
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef EVENTSYSTEM_MODULES_CION_CION_MODULE_HH_
+#define EVENTSYSTEM_MODULES_CION_CION_MODULE_HH_
+
+#include <list>
+#include <memory>
+#include <optional>
+#include <string>
+#include <imodule.hh>
+
+#include "cion_ondemand_server.h"
+#include "cion_service_info.hh"
+#include "database.hpp"
+
+namespace esd::module {
+
+class CionModule : public api::IModule {
+ public:
+ CionModule() = default;
+ virtual ~CionModule() = default;
+
+ bool Startup(api::ToolBox* tools) override;
+ void Shutdown() override;
+
+ void AddEnabledApp(const std::string& service_name,
+ const std::string& app_id, const std::string& display_name);
+ void RemoveEnabledApp(const std::string& service_name,
+ const std::string& app_id);
+ std::optional<std::list<CionServiceInfo>> GetEnabledServiceList();
+ void GetUuidWithGenerate(const std::string& appid,
+ std::optional<std::string>& uuid);
+
+ private:
+ bool Init();
+ bool DbInit();
+ void ChangeListenStatusCionServer();
+ void SetDisplayName(const std::string& appid, const std::string& service_name,
+ const std::string& display_name, int& ret);
+ void GetDisplayName(const std::string& appid, const std::string& service_name,
+ std::string& display_name, int& ret);
+ void SetEnabled(const std::string& appid, const std::string& service_name,
+ bool enabled, int& ret);
+ void GetEnabled(const std::string& appid, const std::string& service_name,
+ bool& enabled, int& ret);
+ bool GetUuidFromDb(const tizen_base::Database& db,
+ const std::string& appid, std::string& uuid);
+ bool SetUuidToDb(const tizen_base::Database& db,
+ const std::string& appid, const std::string& uuid);
+ std::string GenUuid();
+
+ private:
+ std::shared_ptr<CionOndemandServer> esd_cion_server_;
+ bool is_listening_ = false;
+};
+
+} // namespace esd::module
+
+#endif // EVENTSYSTEM_MODULES_CION_CION_MODULE_HH_
\ No newline at end of file
* limitations under the License.
*/
-#include <dlog.h>
#include <glib.h>
#include <stdlib.h>
#include <string.h>
#include <system_info.h>
#include <cion/common/data_payload.hh>
-#include "eventsystem_daemon.h"
+#include <log.hh>
#include "cion_ondemand_server.h"
#include "cion_peer_info.h"
-
+#include "cion_module.hh"
namespace {
-std::string GetAppVersion(const char* appid) {
+std::string GetAppVersion(const std::string& appid) {
char *pkgid;
char *pkg_version = NULL;
pkgmgrinfo_appinfo_h appinfo = NULL;
- int retval = pkgmgrinfo_appinfo_get_usr_appinfo(appid, getuid(), &appinfo);
+ int retval = pkgmgrinfo_appinfo_get_usr_appinfo(appid.c_str(),
+ getuid(), &appinfo);
if (retval != PMINFO_R_OK)
return {};
return val_str;
}
-void FreeList(gpointer data) {
- cion_service_info_s *info = (cion_service_info_s *)data;
-
- free(info->appid);
- free(info->service_name);
- if (info->display_name)
- free(info->display_name);
- free(info);
-}
-
std::string device_id = GetSystemInfoPlatformString("http://tizen.org/system/tizenid");
std::string device_name = GetVconfString(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
std::string device_platform = "Tizen";
} // namespace
CionOndemandServer::CionOndemandServer(std::string service_name,
- std::string display_name)
- : cion::channel::ServerChannel(service_name, display_name) {
+ std::string display_name, esd::api::IModule* module)
+ : cion::channel::ServerChannel(service_name, display_name), module_(module) {
LoadOndemandServiceList();
}
}
void CionOndemandServer::LoadOndemandServiceList() {
- GList *list = nullptr;
- int ret = esd_cion_get_enabled_service_list(&list);
- if (ret != 0 || list == nullptr) {
- _E("Get list error");
- } else {
- for (GList *it = g_list_first(list); it; it = g_list_next(it)) {
- cion_service_info *cion_info = (cion_service_info_s *)(it->data);
- char *app_id = cion_info->appid;
- char *service_name = cion_info->service_name;
- char *display_name = cion_info->display_name;
- char *uuid;
- ret = esd_cion_get_uuid_with_generate(app_id, &uuid);
- if (ret != 0) {
- _E("Get uuid for %s", app_id);
- }
-
- std::string app_version = GetAppVersion(app_id);
-
- tizen_base::Parcel parcel;
- parcel.WriteString(device_id);
- parcel.WriteString(device_name);
- parcel.WriteString(device_platform);
- parcel.WriteString(device_platform_version);
- parcel.WriteString(device_type);
- parcel.WriteString(std::string(app_id));
- parcel.WriteString(app_version);
- parcel.WriteString(std::string(uuid));
- parcel.WriteString(std::string(display_name));
-
- std::shared_ptr<CionPeerInfo> pi =
- std::make_shared<CionPeerInfo>(std::string(service_name),
- parcel.GetData(), parcel.GetDataSize());
- ondemand_peer_list_.emplace_back(pi);
-
- free(uuid);
+ auto* mod = static_cast<esd::module::CionModule*>(module_);
+ auto ret = mod->GetEnabledServiceList();
+
+ if (!ret)
+ return;
+
+ for (const auto& i : *ret) {
+ std::optional<std::string> uuid;
+ mod->GetUuidWithGenerate(i.GetAppId(), uuid);
+ if (!uuid) {
+ _E("Get uuid for %s", i.GetAppId().c_str());
}
- }
- g_list_free_full(list, FreeList);
+ std::string app_version = GetAppVersion(i.GetAppId());
+ tizen_base::Parcel parcel;
+ parcel.WriteString(device_id);
+ parcel.WriteString(device_name);
+ parcel.WriteString(device_platform);
+ parcel.WriteString(device_platform_version);
+ parcel.WriteString(device_type);
+ parcel.WriteString(i.GetAppId());
+ parcel.WriteString(app_version);
+ parcel.WriteString(*uuid);
+ parcel.WriteString(i.GetDisplayName());
+
+ std::shared_ptr<CionPeerInfo> pi =
+ std::make_shared<CionPeerInfo>(i.GetServiceName(),
+ parcel.GetData(), parcel.GetDataSize());
+ ondemand_peer_list_.emplace_back(pi);
+ }
}
void CionOndemandServer::AddOndemandServiceList(std::string service_name,
}
}
- char *uuid;
- int ret = esd_cion_get_uuid_with_generate(appid.c_str(), &uuid);
- if (ret != 0) {
+ std::optional<std::string> uuid;
+ auto* mod = static_cast<esd::module::CionModule*>(module_);
+ mod->GetUuidWithGenerate(appid, uuid);
+ if (!uuid) {
_E("Get uuid for %s", appid.c_str());
return;
}
- std::string app_version = GetAppVersion(appid.c_str());
+ std::string app_version = GetAppVersion(appid);
tizen_base::Parcel parcel;
parcel.WriteString(device_id);
parcel.WriteString(device_type);
parcel.WriteString(appid);
parcel.WriteString(app_version);
- parcel.WriteString(std::string(uuid));
+ parcel.WriteString(*uuid);
parcel.WriteString(display_name);
std::shared_ptr<CionPeerInfo> pi =
std::make_shared<CionPeerInfo>(service_name, parcel.GetData(),
parcel.GetDataSize());
ondemand_peer_list_.emplace_back(pi);
- free(uuid);
_D("[%s:%s] is added to list", appid.c_str(), service_name.c_str());
}
#include <cion/channel/server_channel.hh>
#include <cion/common/ipayload.hh>
#include <cion/common/exception.hh>
+#include <imodule.hh>
#include "cion_peer_info.h"
class CionOndemandServer : public cion::channel::ServerChannel {
public:
explicit CionOndemandServer(std::string service_name,
- std::string display_name);
+ std::string display_name, esd::api::IModule* module);
explicit CionOndemandServer(std::string service_name,
std::string display_name, cion::SecurityInfo security);
private:
std::list<std::shared_ptr<CionPeerInfo>> ondemand_peer_list_;
+ esd::api::IModule* module_ = nullptr;
};
#endif /* EVENTSYSTEM_DAEMON_CION_ONDEMAND_SERVER_H_ */
--- /dev/null
+/*
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef EVENTSYSTEM_MODULES_CION_CION_SERVICE_INFO_HH_
+#define EVENTSYSTEM_MODULES_CION_CION_SERVICE_INFO_HH_
+
+#include <memory>
+#include <string>
+
+#include <cion/common/peer_info.hh>
+
+class CionServiceInfo {
+public:
+ CionServiceInfo(std::string service_name, std::string appid,
+ std::string display_name) : service_name_(std::move(service_name)),
+ appid_(std::move(appid)), display_name_(std::move(display_name)) {}
+
+ const std::string& GetServiceName() const {
+ return service_name_;
+ }
+
+ const std::string& GetAppId() const {
+ return appid_;
+ }
+
+ const std::string& GetDisplayName() const {
+ return display_name_;
+ }
+
+private:
+ std::string service_name_;
+ std::string appid_;
+ std::string display_name_;
+};
+
+#endif // EVENTSYSTEM_MODULES_CION_CION_SERVICE_INFO_HH_
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef DATABASE_HPP_
+#define DATABASE_HPP_
+
+#include <sqlite3.h>
+
+#include <functional>
+#include <map>
+#include <memory>
+#include <string>
+#include <tuple>
+#include <variant>
+#include <vector>
+
+namespace tizen_base {
+
+using DbType = std::variant<int, double, std::string,
+ std::vector<unsigned char>>;
+using _ = DbType;
+
+template<typename T>
+T dbtype_cast(DbType v) {
+ return std::get<T>(v);
+}
+
+template<std::size_t N>
+struct num {
+ static const constexpr auto value = N;
+};
+
+template <class F, std::size_t... Is>
+void for_(F func, std::index_sequence<Is...>) {
+ (func(num<Is>{}), ...);
+}
+
+template <std::size_t N, typename F>
+void for_(F func) {
+ for_(func, std::make_index_sequence<N>());
+}
+
+class Database {
+ public:
+ class TransactionGuard {
+ public:
+ TransactionGuard(const TransactionGuard&) = delete;
+ TransactionGuard& operator = (const TransactionGuard&) = delete;
+
+ TransactionGuard(TransactionGuard&& t) noexcept {
+ db_ = t.db_;
+ t.db_ = nullptr;
+ }
+
+ TransactionGuard& operator = (TransactionGuard&& t) noexcept {
+ if (this != &t) {
+ if (db_)
+ sqlite3_exec(db_, "ROLLBACK", nullptr, nullptr, nullptr);
+ db_ = t.db_;
+ t.db_ = nullptr;
+ }
+
+ return *this;
+ }
+
+ TransactionGuard(sqlite3* db) : db_(db) {
+ if (sqlite3_exec(db, "BEGIN DEFERRED", NULL, NULL, NULL) != SQLITE_OK) {
+ throw std::runtime_error("begin transaction failed");
+ }
+ }
+
+ ~TransactionGuard() {
+ if (db_)
+ sqlite3_exec(db_, "ROLLBACK", nullptr, nullptr, nullptr);
+ }
+
+ int Commit() {
+ int ret = sqlite3_exec(db_, "COMMIT", nullptr, nullptr, nullptr);
+ if (ret != SQLITE_OK) {
+ sqlite3_exec(db_, "ROLLBACK", nullptr, nullptr, nullptr);
+ }
+
+ db_ = nullptr;
+ return ret;
+ }
+
+ private:
+ sqlite3* db_ = nullptr;
+ };
+
+ class Sql {
+ public:
+ Sql(std::string query) : query_(std::move(query)) {}
+
+ Sql& Bind(std::string val) {
+ bindings_.push_back(DbType(std::move(val)));
+ return *this;
+ }
+
+ Sql& Bind(int val) {
+ bindings_.push_back(DbType(val));
+ return *this;
+ }
+
+ Sql& Bind(double val) {
+ bindings_.push_back(DbType(val));
+ return *this;
+ }
+
+ Sql& Bind(std::vector<unsigned char> val) {
+ bindings_.push_back(DbType(std::move(val)));
+ return *this;
+ }
+
+ Sql& Bind(int pos, std::string val) {
+ binding_map_[pos] = DbType(std::move(val));
+ return *this;
+ }
+
+ Sql& Bind(int pos, int val) {
+ binding_map_[pos] = DbType(val);
+ return *this;
+ }
+
+ Sql& Bind(int pos, double val) {
+ binding_map_[pos] = DbType(val);
+ return *this;
+ }
+
+ Sql& Bind(int pos, std::vector<unsigned char> val) {
+ binding_map_[pos] = DbType(std::move(val));
+ return *this;
+ }
+
+ Sql& Bind(std::string name, std::string val) {
+ binding_name_map_[std::move(name)] = DbType(std::move(val));
+ return *this;
+ }
+
+ Sql& Bind(std::string name, int val) {
+ binding_name_map_[std::move(name)] = DbType(val);
+ return *this;
+ }
+
+ Sql& Bind(std::string name, double val) {
+ binding_name_map_[std::move(name)] = DbType(val);
+ return *this;
+ }
+
+ Sql& Bind(std::string name, std::vector<unsigned char> val) {
+ binding_name_map_[std::move(name)] = DbType(std::move(val));
+ return *this;
+ }
+
+ const std::vector<DbType>& GetBindings() const {
+ return bindings_;
+ }
+
+ const std::map<int, DbType>& GetBindingMap() const {
+ return binding_map_;
+ }
+
+ const std::map<std::string, DbType>& GetBindingNameMap() const {
+ return binding_name_map_;
+ }
+
+ const std::string& GetQuery() const {
+ return query_;
+ }
+
+ private:
+ std::string query_;
+ std::vector<DbType> bindings_;
+ std::map<int, DbType> binding_map_;
+ std::map<std::string, DbType> binding_name_map_;
+ };
+
+ class Result {
+ public:
+ Result() = default;
+ ~Result() {
+ if (stmt_)
+ sqlite3_finalize(stmt_);
+ }
+
+ Result(const Result&) = delete;
+ Result& operator = (const Result&) = delete;
+
+ Result(Result&& r) noexcept {
+ stmt_ = r.stmt_;
+ r.stmt_ = nullptr;
+ }
+
+ Result& operator = (Result&& r) noexcept {
+ if (this != &r) {
+ if (stmt_)
+ sqlite3_finalize(stmt_);
+ stmt_ = r.stmt_;
+ r.stmt_ = nullptr;
+ }
+
+ return *this;
+ }
+
+ class Record {
+ public:
+ Record(const sqlite3_stmt* stmt) : stmt_(stmt) {}
+
+ DbType Get(int pos) const {
+ sqlite3_stmt* stmt = const_cast<sqlite3_stmt*>(stmt_);
+ int type = sqlite3_column_type(stmt, pos);
+ if (type == SQLITE_NULL)
+ throw std::runtime_error("invalid column");;
+
+ DbType dbt;
+ if (type == SQLITE_TEXT) {
+ dbt = DbType(reinterpret_cast<const char*>(
+ sqlite3_column_text(stmt, pos)));
+ } else if (type == SQLITE_INTEGER) {
+ dbt = DbType(sqlite3_column_int(stmt, pos));
+ } else if (type == SQLITE_FLOAT) {
+ dbt = DbType(sqlite3_column_double(stmt, pos));
+ } else if (type == SQLITE_BLOB) {
+ const unsigned char* val = reinterpret_cast<const unsigned char*>(
+ sqlite3_column_blob(stmt, pos));
+ int len = sqlite3_column_bytes(stmt, pos);
+
+ if (!val || len < 0) {
+ throw std::runtime_error("invalid blob");;
+ } else {
+ dbt = DbType(std::vector<unsigned char>(val, val + len));
+ }
+ } else {
+ throw std::runtime_error("invalid column type");
+ }
+
+ return dbt;
+ }
+
+ template <typename ...Types>
+ auto Get() const {
+ std::tuple<Types...> t;
+ int pos = 0;
+ for_<std::tuple_size_v<std::tuple<Types...>>>([&] (auto i) {
+ std::get<i.value>(t) = Get(pos++);
+ });
+
+ return t;
+ }
+
+ private:
+ const sqlite3_stmt* stmt_;
+ };
+
+ class Iterator {
+ public:
+ Iterator(sqlite3_stmt* stmt) : stmt_(stmt) {}
+
+ Record operator*() { return Record(stmt_); }
+
+ bool operator != (const Iterator& rhs) const {
+ return stmt_ != rhs.stmt_;
+ }
+
+ void operator ++() {
+ int r = sqlite3_step(stmt_);
+ if (r != SQLITE_ROW)
+ stmt_ = nullptr;
+ }
+
+ private:
+ sqlite3_stmt* stmt_ = nullptr;
+ };
+
+ Iterator begin() const {
+ return Iterator(stmt_);
+ }
+
+ Iterator end() const {
+ return Iterator(nullptr);
+ }
+
+ explicit operator bool() {
+ if (stmt_ == nullptr)
+ return false;
+ return true;
+ }
+
+ explicit operator int() {
+ if (db_ == nullptr)
+ return SQLITE_ERROR;
+ return sqlite3_errcode(db_);
+ }
+
+ operator const char*() {
+ if (db_ == nullptr)
+ return "";
+ return sqlite3_errmsg(db_);
+ }
+
+ private:
+ friend class Database;
+ Result(sqlite3_stmt* stmt, sqlite3* db) : stmt_(stmt), db_(db) {}
+
+ sqlite3_stmt* stmt_ = nullptr;
+ sqlite3* db_ = nullptr;
+ };
+
+ Database(std::string db, int flags) {
+ int r = sqlite3_open_v2(db.c_str(), &db_, flags, nullptr);
+ if (r != SQLITE_OK)
+ throw std::runtime_error("open failed");
+ }
+
+ Database(std::string db, int flags, std::function<bool(int)> busy_handler) {
+ int r = sqlite3_open_v2(db.c_str(), &db_, flags, nullptr);
+ if (r != SQLITE_OK)
+ throw std::runtime_error("sqlite3_open_v2() failed");
+
+ busy_handler_ = std::move(busy_handler);
+ r = sqlite3_busy_handler(db_, [](void* data, int count) {
+ Database* pDb = static_cast<Database*>(data);
+ if (pDb->busy_handler_(count))
+ return 1;
+ return 0;
+ }, this);
+
+ if (r != SQLITE_OK) {
+ sqlite3_close_v2(db_);
+ throw std::runtime_error("sqlite3_busy_handler() failed");
+ }
+ }
+
+ ~Database() {
+ if (db_)
+ sqlite3_close_v2(db_);
+ }
+
+ Database() = default;
+ Database(const Database&) = delete;
+ Database& operator = (const Database&) = delete;
+
+ Database(Database&& db) noexcept {
+ db_ = db.db_;
+ db.db_ = nullptr;
+ }
+
+ explicit operator bool() {
+ if (db_ == nullptr)
+ return false;
+ return true;
+ }
+
+ Database& operator = (Database&& db) noexcept {
+ if (this != &db) {
+ if (db_)
+ sqlite3_close_v2(db_);
+ db_ = db.db_;
+ db.db_ = nullptr;
+ }
+
+ return *this;
+ }
+
+ TransactionGuard CreateTransactionGuard() {
+ return TransactionGuard(db_);
+ }
+
+ Result Exec(const Sql& sql) const {
+ if (!db_)
+ throw std::runtime_error("Not opened");
+
+ sqlite3_stmt* stmt = nullptr;
+ int r = sqlite3_prepare_v2(db_, sql.GetQuery().c_str(),
+ -1, &stmt, nullptr);
+ if (r != SQLITE_OK) {
+ return { nullptr, nullptr };
+ }
+
+ std::unique_ptr<sqlite3_stmt, decltype(sqlite3_finalize)*> stmt_auto(stmt,
+ sqlite3_finalize);
+ int pos = 1;
+ for (const auto& i : sql.GetBindings()) {
+ Bind(pos++, i, stmt);
+ }
+
+ for (const auto& i : sql.GetBindingMap()) {
+ Bind(i.first, i.second, stmt);
+ }
+
+ for (const auto& i : sql.GetBindingNameMap()) {
+ int pos = sqlite3_bind_parameter_index(stmt, i.first.c_str());
+ if (pos == 0)
+ throw std::runtime_error("Invalid binding");
+ Bind(pos, i.second, stmt);
+ }
+
+ r = sqlite3_step(stmt);
+ if (r != SQLITE_ROW && r != SQLITE_DONE) {
+ return { nullptr, db_ };
+ }
+
+ return { stmt_auto.release(), db_ };
+ }
+
+ private:
+ void Bind(int pos, const DbType& type, sqlite3_stmt* stmt) const {
+ int r;
+ if (const std::string* pstr = std::get_if<std::string>(&type)) {
+ r = sqlite3_bind_text(stmt, pos, (*pstr).c_str(), -1,
+ SQLITE_TRANSIENT);
+ } else if (const int* pint = std::get_if<int>(&type)) {
+ r = sqlite3_bind_int(stmt, pos, (*pint));
+ } else if (const double* pdouble = std::get_if<double>(&type)) {
+ r = sqlite3_bind_double(stmt, pos, (*pdouble));
+ } else if (const std::vector<unsigned char>* pvector =
+ std::get_if<std::vector<unsigned char>>(&type)) {
+ r = sqlite3_bind_blob(stmt, pos, (*pvector).data(),
+ (*pvector).size(), nullptr);
+ } else {
+ r = -1;
+ }
+
+ if (r != SQLITE_OK) {
+ throw std::runtime_error("Invalid binding");
+ }
+ }
+
+ private:
+ sqlite3* db_ = nullptr;
+ std::function<bool(int)> busy_handler_;
+};
+
+} // namespace tizen_base
+
+#endif // DATABASE_HPP_
--- /dev/null
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} ESD_MOD_DBUS_EVENT_SRC)
+
+ADD_LIBRARY(${TARGET_ESD_MOD_DBUS_EVENT} ${ESD_MOD_DBUS_EVENT_SRC})
+
+TARGET_INCLUDE_DIRECTORIES(${TARGET_ESD_MOD_DBUS_EVENT} PUBLIC
+ ${CMAKE_CURRENT_SOURCE_DIR}/../../lib)
+
+TARGET_LINK_LIBRARIES(${TARGET_ESD_MOD_DBUS_EVENT} PRIVATE ${TARGET_LIB_ESD})
+
+APPLY_PKG_CONFIG(${TARGET_ESD_MOD_DBUS_EVENT} PUBLIC
+ AUL_DEPS
+ DLOG_DEPS
+ GIO_DEPS
+ GLIB_DEPS
+ VCONF_DEPS
+ PKGMGR_INFO_DEPS
+ SECURITY_MANAGER_DEPS
+ CYNARA_CLIENT_DEPS
+ CYNARA_CREDS_DBUS_DEPS
+ CYNARA_SESSION_DEPS
+ LIBTZPLATFORM_CONFIG_DEPS
+ CERT_SVC_VCORE_DEPS
+ CAPI_SYSTEM_INFO_DEPS
+ PKGMGR_DEPS
+ EVENTSYSTEM_DEPS
+)
+
+INSTALL(TARGETS ${TARGET_ESD_MOD_DBUS_EVENT} DESTINATION ${ESD_MODULES_DIR}/mod
+ COMPONENT RuntimeLibraries)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/eventsystem.conf DESTINATION /etc/dbus-1/system.d)
--- /dev/null
+/*
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include "dbus_event_module.hh"
+
+#undef EXPORT_API
+#define EXPORT_API __attribute__((visibility("default")))
+
+extern "C" EXPORT_API esd::api::IModule* ESD_GET_MODULE() {
+ return new esd::module::DbusEventModule();
+}
\ No newline at end of file
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <glib.h>
+#include <aul.h>
+#include <aul_svc.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <gio/gio.h>
+#include <package-manager.h>
+#include <pkgmgr-info.h>
+#include <appsvc/appsvc.h>
+#include <eventsystem.h>
+#include <bundle_internal.h>
+#include <fcntl.h>
+#include <vconf.h>
+#include <tzplatform_config.h>
+#include <cert-svc/ccert.h>
+#include <cert-svc/cinstance.h>
+#include <cynara-client.h>
+#include <cynara-creds-gdbus.h>
+#include <cynara-session.h>
+#include <security-manager.h>
+#include "log.hh"
+#include "dbus_event_module.hh"
+
+#define FREE_AND_NULL(ptr) do { \
+ if (ptr) { \
+ free((void *)ptr); \
+ ptr = NULL; \
+ } \
+} while (0)
+
+int __esd_register_vconf_callbacks();
+
+namespace {
+
+#include "introspection_cb.hh"
+
+constexpr const char ESD_BOOT_COMPLETED[] = "/tmp/esd_ready";
+constexpr const char SYSTEMD_DBUS_DEST[] = "org.freedesktop.systemd1";
+constexpr const char SYSTEMD_DBUS_IFACE_MANAGER[] = "org.freedesktop.systemd1.Manager";
+constexpr const char SYSTEMD_DBUS_PATH[] = "/org/freedesktop/systemd1";
+constexpr const char SYSTEMD_DBUS_SIGNAL_STARTUP_FINISHED[] = "StartupFinished";
+constexpr const char SYSTEMD_DBUS_SIGNAL_USER_STARTUP_FINISHED[] = "UserSessionStartupFinished";
+
+#define DEFAULT_USER tzplatform_getuid(TZ_SYS_DEFAULT_USER)
+#define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
+constexpr const int ROOT_USER = 0;
+
+constexpr const char SYS_EVENT_NAME_PREFIX[] = "tizen.system.event";
+constexpr const char SYS_EVENT_OBJ_PATH[] = "/tizen/system/event";
+constexpr const char REQUEST_LAST_DATA[] = "request_last_data";
+
+GHashTable *event_launch_table; /* table of events for launch_on_event*/
+
+const char *event_launch_support_list[] = {
+ SYS_EVENT_BATTERY_CHARGER_STATUS,
+ SYS_EVENT_USB_STATUS,
+ SYS_EVENT_EARJACK_STATUS,
+ SYS_EVENT_INCOMMING_MSG,
+ SYS_EVENT_OUTGOING_MSG,
+ SYS_EVENT_WIFI_STATE
+};
+
+struct privilege_info {
+ const char *event_name;
+ const char *privilege_name;
+};
+
+const struct privilege_info privilege_check_list[] = {
+ {SYS_EVENT_DISPLAY_STATE, "http://tizen.org/privilege/display"},
+ {SYS_EVENT_WIFI_STATE, "http://tizen.org/privilege/network.get"},
+ {SYS_EVENT_INCOMMING_MSG, "http://tizen.org/privilege/message.read"},
+ {SYS_EVENT_OUTGOING_MSG, "http://tizen.org/privilege/message.read"}
+};
+
+int privilege_check_size = sizeof(privilege_check_list)/sizeof(struct privilege_info);
+
+const char *earlier_event_list[] = {
+ SYS_EVENT_ESD_STATUS,
+ SYS_EVENT_LOW_MEMORY,
+ SYS_EVENT_BOOT_COMPLETED,
+ SYS_EVENT_SYSTEM_SHUTDOWN,
+ SYS_EVENT_BATTERY_CHARGER_STATUS
+};
+
+GHashTable *earlier_event_table; /* table of events for earlier_data */
+
+typedef struct __earlier_table_item {
+ char *event_name;
+ guint reg_id;
+ bundle *earlier_data; /* event-data from earlier occurrence */
+} earlier_item;
+
+GHashTable *user_last_event_table; /* table of user events for last data */
+
+struct __last_event_item {
+ char *key;
+ char *app_id;
+ char *event_name;
+ char *own_name;
+ uid_t uid;
+};
+
+GHashTable *trusted_busname_table; /* table of dbus bus-names for trusted user-event */
+
+typedef struct __trusted_busname_item {
+ char *app_id;
+ char *bus_name;
+ int pid;
+ uid_t uid;
+} trusted_item;
+
+typedef struct __eventlaunch_item_param {
+ char *app_id;
+} eventlaunch_item_param_s;
+
+enum trusted_result {
+ TRUSTED_UNKNOWN,
+ TRUSTED_ALLOWED,
+ TRUSTED_DENIED,
+};
+
+typedef struct esd_list_item {
+ char *pkg_id;
+ char *app_id;
+ int trusted_info;
+ uid_t uid;
+} esd_list_item_s;
+
+typedef struct __event_launch_table_item {
+ char *event_name;
+ char *package_name; /* just for passing pointer to app-list removal func */
+ GList *app_list_evtlaunch; /* app-list for on-event-launch */
+ guint reg_id;
+ uid_t uid;
+} event_launch_item;
+
+enum __pkg_event_type {
+ UNKNOWN = 0,
+ INSTALL,
+ UNINSTALL,
+ UPDATE,
+};
+
+typedef struct __pkgmgr_event {
+ int type;
+ char *pkgid;
+} esd_pkgmgr_event;
+
+typedef struct __esd_event_param {
+ char *event_name;
+ bundle *event_data;
+ uid_t sender_uid;
+ char *sender_appid;
+ bool is_user_event;
+ bool trusted;
+ void *user_data;
+} esd_event_param;
+
+typedef struct esd_info {
+ pkgmgr_client *client;
+} esd_info_s;
+static esd_info_s s_info;
+
+typedef struct __esd_appctrl_cb_data {
+ char *appid;
+ char *pkgid;
+ uid_t uid;
+} esd_appctrl_cb_data;
+
+void __esd_event_handler(char *event_name, bundle *data, void *user_data);
+int __esd_add_appinfo_handler(const pkgmgrinfo_appinfo_h handle, void *data);
+
+cynara *r_cynara;
+
+int __esd_init_cynara() {
+ int ret;
+
+ ret = cynara_initialize(&r_cynara, NULL);
+ if (ret != CYNARA_API_SUCCESS) {
+ _E("cynara initialize failed.");
+ return ret;
+ }
+
+ return 0;
+}
+
+void __esd_finish_cynara() {
+ if (r_cynara)
+ cynara_finish(r_cynara);
+ r_cynara = NULL;
+}
+
+void free_saved_event(struct __last_event_item *item) {
+ if (!item)
+ return;
+
+ free(item->event_name);
+ free(item->own_name);
+ free(item->app_id);
+ free(item);
+}
+
+int __esd_check_earlier_support(const char *event_name) {
+ int i = 0;
+ int size = sizeof(earlier_event_list)/sizeof(*earlier_event_list);
+
+ for (i = 0; i < size; i++) {
+ if (strcmp(earlier_event_list[i], event_name) == 0)
+ return true;
+ }
+
+ return false;
+}
+
+bool __esd_check_platform_cert(const char *pkgid, uid_t uid) {
+ _D("Checking if %s has a platform certification", pkgid);
+
+ int r;
+ const char *cert_value;
+ pkgmgrinfo_certinfo_h certinfo;
+ CertSvcInstance instance;
+ CertSvcCertificate certificate;
+ CertSvcVisibility visibility = CERTSVC_VISIBILITY_PUBLIC;
+
+ r = pkgmgrinfo_pkginfo_create_certinfo(&certinfo);
+ if (r != PMINFO_R_OK) {
+ _E("Failed to create certinfo");
+ return false;
+ }
+
+ r = pkgmgrinfo_pkginfo_load_certinfo(pkgid, certinfo, uid);
+ if (r != PMINFO_R_OK) {
+ _E("Failed to load certinfo");
+ pkgmgrinfo_pkginfo_destroy_certinfo(certinfo);
+ return false;
+ }
+
+ r = pkgmgrinfo_pkginfo_get_cert_value(certinfo,
+ PMINFO_DISTRIBUTOR_ROOT_CERT, &cert_value);
+ if (r != PMINFO_R_OK || cert_value == NULL) {
+ _E("Failed to get cert value");
+ pkgmgrinfo_pkginfo_destroy_certinfo(certinfo);
+ return false;
+ }
+
+ r = certsvc_instance_new(&instance);
+ if (r != CERTSVC_SUCCESS) {
+ _E("certsvc_instance_new() is failed.");
+ pkgmgrinfo_pkginfo_destroy_certinfo(certinfo);
+ return false;
+ }
+
+ r = certsvc_certificate_new_from_memory(instance,
+ (const unsigned char *)cert_value,
+ strlen(cert_value),
+ CERTSVC_FORM_DER_BASE64,
+ &certificate);
+ if (r != CERTSVC_SUCCESS) {
+ _E("certsvc_certificate_new_from_memory() is failed.");
+ pkgmgrinfo_pkginfo_destroy_certinfo(certinfo);
+ certsvc_instance_free(instance);
+ return false;
+ }
+
+ r = certsvc_certificate_get_visibility(certificate, &visibility);
+ if (r != CERTSVC_SUCCESS)
+ _E("certsvc_certificate_get_visibility() is failed.");
+
+ pkgmgrinfo_pkginfo_destroy_certinfo(certinfo);
+ certsvc_certificate_free(certificate);
+ certsvc_instance_free(instance);
+
+ _D("visibility is %d", visibility);
+ if (visibility & CERTSVC_VISIBILITY_PLATFORM) {
+ _D("%s has a platform certification", pkgid);
+ return true;
+ }
+
+ return false;
+}
+
+int __esd_check_event_launch_support(const char *event_name) {
+ int i = 0;
+ int size = sizeof(event_launch_support_list)/sizeof(*event_launch_support_list);
+
+ for (i = 0; i < size; i++) {
+ if (strcmp(event_launch_support_list[i], event_name) == 0)
+ return true;
+ }
+
+ return false;
+}
+
+int __get_sender_unixinfo(GDBusConnection *conn, const char *sender_name, const char *type) {
+ GDBusMessage *msg = NULL;
+ GDBusMessage *reply = NULL;
+ GError *err = NULL;
+ GVariant *body;
+ int ret = -1;
+ unsigned int value;
+
+ msg = g_dbus_message_new_method_call("org.freedesktop.DBus", "/org/freedesktop/DBus",
+ "org.freedesktop.DBus", type);
+ if (!msg) {
+ _E("Can't allocate new method call");
+ goto out;
+ }
+
+ g_dbus_message_set_body(msg, g_variant_new("(s)", sender_name));
+ reply = g_dbus_connection_send_message_with_reply_sync(conn, msg,
+ G_DBUS_SEND_MESSAGE_FLAGS_NONE, -1, NULL, NULL, &err);
+
+ if (!reply) {
+ if (err != NULL) {
+ _E("Failed to get info [%s]", err->message);
+ g_error_free(err);
+ }
+ goto out;
+ }
+
+ body = g_dbus_message_get_body(reply);
+ g_variant_get(body, "(u)", &value);
+ ret = (int)value;
+
+out:
+ if (msg)
+ g_object_unref(msg);
+ if (reply)
+ g_object_unref(reply);
+
+ return ret;
+}
+
+int __get_sender_pid(GDBusConnection *conn, const char *sender_name) {
+ int pid = 0;
+
+ pid = __get_sender_unixinfo(conn, sender_name, "GetConnectionUnixProcessID");
+ if (pid < 0) {
+ _E("failed to get pid");
+ pid = 0;
+ }
+
+ _D("sender_name(%s), pid(%d)", sender_name, pid);
+
+ return pid;
+}
+
+int __get_sender_uid(GDBusConnection *conn, const char *sender_name) {
+ int uid = -1;
+
+ uid = __get_sender_unixinfo(conn, sender_name, "GetConnectionUnixUser");
+ if (uid < 0)
+ _E("failed to get uid");
+
+ _D("sender_name(%s), uid(%d)", sender_name, uid);
+
+ return uid;
+}
+
+int __esd_check_certificate_match(uid_t uid, const char *app_id, uid_t from_uid, const char *from_appid) {
+ pkgmgrinfo_cert_compare_result_type_e res;
+ int ret = 0;
+
+ _D("uid(%d), app_id(%s), from_uid(%d), from_appid(%s)", uid, app_id, from_uid, from_appid);
+
+ ret = pkgmgrinfo_pkginfo_compare_usr_app_cert_info(app_id, from_appid, from_uid, &res);
+ if (ret < 0) {
+ _E("failed to check certificate");
+ return ES_R_ERROR;
+ }
+
+ if (res != PMINFO_CERT_COMPARE_MATCH) {
+ _D("certificat not match (%s)", app_id);
+ return ES_R_EINVAL;
+ }
+
+ return ES_R_OK;
+}
+
+bool __esd_check_application_validation(uid_t uid, const char *appid) {
+ int ret = 0;
+ pkgmgrinfo_appinfo_h handle;
+
+ ret = pkgmgrinfo_appinfo_get_usr_appinfo(appid, uid, &handle);
+ if (ret != PMINFO_R_OK)
+ return false;
+
+ pkgmgrinfo_appinfo_destroy_appinfo(handle);
+
+ if (!aul_app_is_running_for_uid(appid, uid))
+ return false;
+
+ return true;
+}
+
+void __esd_trusted_busname_print_items() {
+ GHashTableIter iter;
+ gpointer key;
+ gpointer value;
+
+ g_hash_table_iter_init(&iter, trusted_busname_table);
+
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ trusted_item *item = (trusted_item *)value;
+ if (item)
+ _D("uid(%d), appid(%s), pid(%d), busname(%s)", item->uid, item->app_id, item->pid, item->bus_name);
+ }
+}
+
+int __esd_trusted_busname_add_item(uid_t uid, const char *appid, const char *busname, int pid) {
+ char *app_id = NULL;
+ char *bus_name = NULL;
+ trusted_item *item = NULL;
+ trusted_item *new_item;
+
+ app_id = strdup(appid);
+ if (app_id == NULL) {
+ _E("out of memory");
+ return ES_R_ENOMEM;
+ }
+
+ bus_name = strdup(busname);
+ if (bus_name == NULL) {
+ _E("out of memory");
+ FREE_AND_NULL(app_id);
+ return ES_R_ENOMEM;
+ }
+
+ item = (trusted_item *)g_hash_table_lookup(trusted_busname_table, app_id);
+
+ if (item && item->bus_name && strcmp(item->bus_name, bus_name) == 0 &&
+ (item->uid == uid)) {
+ _D("already exist (%s, %s)", app_id, bus_name);
+ FREE_AND_NULL(app_id);
+ FREE_AND_NULL(bus_name);
+ } else {
+ new_item = (trusted_item *)calloc(1, sizeof(trusted_item));
+ if (new_item == NULL) {
+ _E("memory alloc failed");
+ FREE_AND_NULL(app_id);
+ FREE_AND_NULL(bus_name);
+ return ES_R_ENOMEM;
+ }
+ new_item->uid = uid;
+ new_item->app_id = app_id;
+ new_item->bus_name = bus_name;
+ new_item->pid = pid;
+ g_hash_table_insert(trusted_busname_table, new_item->app_id, new_item);
+ _D("added busname(%s)", new_item->bus_name);
+ }
+
+ return ES_R_OK;
+}
+
+int __esd_check_trusted_events(GDBusConnection *conn, const char *list_name) {
+ GVariant *result;
+ GError *error = NULL;
+ GVariantIter *iter;
+ gchar *str;
+ char tmp_appid[128] = {0, };
+ int pid = 0;
+ int uid = 0;
+ int ret = 0;
+
+ result = g_dbus_connection_call_sync(conn,
+ "org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus",
+ list_name, NULL, G_VARIANT_TYPE("(as)"), G_DBUS_CALL_FLAGS_NONE,
+ -1, NULL, &error);
+
+ if (result == NULL) {
+ _E("get (%s) error(%s)", list_name, error->message);
+ g_error_free(error);
+ return ES_R_ERROR;
+ }
+
+ g_variant_get(result, "(as)", &iter);
+ while (g_variant_iter_loop(iter, "s", &str)) {
+ if (!strstr((const char *)str, "event.busname.session"))
+ continue;
+
+ _D("list(%s), name(%s)", list_name, str);
+ pid = __get_sender_pid(conn, (const char *)str);
+ if (pid <= 0) {
+ _E("failed to get pid(%d)", pid);
+ continue;
+ }
+
+ uid = __get_sender_uid(conn, (const char *)str);
+ if (uid < 0) {
+ _E("failed to get uid(%d)", uid);
+ continue;
+ }
+ _D("uid(%d)", uid);
+
+ memset(tmp_appid, 0, sizeof(tmp_appid));
+ ret = aul_app_get_appid_bypid_for_uid(pid, tmp_appid, sizeof(tmp_appid), (uid_t)uid);
+ if (ret != AUL_R_OK) {
+ _E("failed to get appid by pid(%d)", pid);
+ continue;
+ }
+
+ _D("appid(%s)", tmp_appid);
+ if (__esd_check_application_validation((uid_t)uid, tmp_appid)) {
+ _D("add to table");
+ ret = __esd_trusted_busname_add_item((uid_t)uid, tmp_appid, (const char *)str, pid);
+ if (ret < 0)
+ _E("failed to add item");
+ }
+ }
+ g_variant_iter_free(iter);
+ g_variant_unref(result);
+
+ return ES_R_OK;
+}
+
+int __esd_check_privilege_name(const char *event_name, char **privilege_name) {
+ int i = 0;
+
+ *privilege_name = NULL;
+
+ for (i = 0; i < privilege_check_size; i++) {
+ if (strcmp(event_name, privilege_check_list[i].event_name) == 0) {
+ *privilege_name = (char *)privilege_check_list[i].privilege_name;
+ _D("[%d] privilege_name(%s)", i, *privilege_name);
+ break;
+ }
+ }
+
+ return ES_R_OK;
+}
+
+bool __esd_check_valid_privilege_by_cynara(const char *appid, const char *client,
+ const char *session, const char *user, const char *privilege_name) {
+ int ret = 0;
+ bool has_privilege = false;
+
+ _D("check privilege, (%s, %s, %s, %s, %s)", appid, client, session, user, privilege_name);
+
+ ret = cynara_check(r_cynara, client, session, user, privilege_name);
+ if (ret == CYNARA_API_ACCESS_ALLOWED) {
+ _D("valid privilege");
+ has_privilege = true;
+ } else if (ret == CYNARA_API_ACCESS_DENIED) {
+ _E("invalid privilege");
+ } else {
+ _E("failed to check privilege, error(%d)", ret);
+ }
+
+ return has_privilege;
+}
+
+int __esd_check_app_privileged_event(uid_t uid, const char *appid, const char *pkgid, const char *event_name) {
+ char *privilege_name = NULL;
+ int ret = 0;
+ int result = 0;
+
+ _D("event_name(%s), uid(%d), appid(%s), pkgid(%s)", event_name, uid, appid, pkgid);
+
+ __esd_check_privilege_name(event_name, &privilege_name);
+
+ if (privilege_name) {
+ ret = security_manager_app_has_privilege(appid, privilege_name, uid, &result);
+ if (ret != SECURITY_MANAGER_SUCCESS)
+ _E("failed to check privilege(%d)", ret);
+ _D("result(%d)", result);
+ } else {
+ result = 1;
+ }
+
+ return result;
+}
+
+void __esd_print_appid_with_eventid(gpointer data, gpointer user_data) {
+ esd_list_item_s *item = (esd_list_item_s *)data;
+ char *event_name = (char *)user_data;
+
+ _D("event_name(%s)-uid(%d)-app_id(%s)-pkg_id(%s)", event_name, item->uid, item->app_id, item->pkg_id);
+}
+
+void __esd_print_interested_event(gpointer data, gpointer user_data) {
+ event_launch_item *el_item = (event_launch_item *)data;
+ char *event_name = (char *)el_item->event_name;
+ _D("event_name = (%s)", event_name);
+ g_list_foreach(el_item->app_list_evtlaunch, __esd_print_appid_with_eventid, event_name);
+}
+
+void __esd_launch_table_print_items() {
+ GHashTableIter iter;
+ gpointer key;
+ gpointer value;
+
+ g_hash_table_iter_init(&iter, event_launch_table);
+
+ while (g_hash_table_iter_next(&iter, &key, &value))
+ __esd_print_interested_event(value, NULL);
+}
+
+int __esd_find_compare_by_list_item(gconstpointer data, gconstpointer user_data) {
+ esd_list_item_s *item_1 = (esd_list_item_s *)user_data;
+ esd_list_item_s *item_2 = (esd_list_item_s *)data;
+
+ return (item_1->uid != item_2->uid) |
+ strcmp(item_1->app_id, item_2->app_id) |
+ strcmp(item_1->pkg_id, item_2->pkg_id);
+}
+
+int __esd_add_list_item(uid_t uid, event_launch_item *el_item,
+ const char *app_id, const char *pkg_id) {
+ esd_list_item_s *item_of_list = NULL;
+
+ item_of_list = (esd_list_item_s *)calloc(1, sizeof(esd_list_item_s));
+ if (item_of_list == NULL) {
+ _E("out_of_memory");
+ return ES_R_ENOMEM;
+ }
+ item_of_list->uid = uid;
+ item_of_list->app_id = (char *)app_id;
+ item_of_list->pkg_id = (char *)pkg_id;
+ item_of_list->trusted_info = TRUSTED_UNKNOWN;
+ el_item->app_list_evtlaunch =
+ g_list_append(el_item->app_list_evtlaunch, item_of_list);
+
+ return ES_R_OK;
+}
+
+int __esd_add_launch_item(uid_t uid, const char *event_name,
+ const char *appid, const char *pkgid) {
+ GList *app_list = NULL;
+ guint subscription_id = 0;
+ char *app_id = NULL;
+ char *pkg_id = NULL;
+ esd_list_item_s *item_of_list = NULL;
+ event_launch_item *eli;
+ event_launch_item *el_item =
+ (event_launch_item *)g_hash_table_lookup(event_launch_table, event_name);
+
+ if (el_item) {
+ item_of_list = (esd_list_item_s *)calloc(1, sizeof(esd_list_item_s));
+ if (item_of_list == NULL) {
+ _E("memory alloc failed");
+ return ES_R_ENOMEM;
+ }
+ item_of_list->uid = uid;
+ item_of_list->app_id = (char *)appid;
+ item_of_list->pkg_id = (char *)pkgid;
+
+ app_list = g_list_find_custom(el_item->app_list_evtlaunch,
+ item_of_list, (GCompareFunc)__esd_find_compare_by_list_item);
+ free(item_of_list);
+ if (app_list == NULL) {
+ _D("add new item (list item only)");
+ app_id = strdup((char *)appid);
+ if (!app_id) {
+ _E("out_of_memory");
+ return ES_R_ENOMEM;
+ }
+ pkg_id = strdup((char *)pkgid);
+ if (!pkg_id) {
+ _E("out_of_memory");
+ FREE_AND_NULL(app_id);
+ return ES_R_ENOMEM;
+ }
+ if (__esd_add_list_item(uid, el_item, app_id, pkg_id) < 0) {
+ _E("failed to add list item");
+ FREE_AND_NULL(app_id);
+ FREE_AND_NULL(pkg_id);
+ return ES_R_ERROR;
+ }
+ }
+ } else {
+ _D("add new item (all)");
+ eli = (event_launch_item *)calloc(1, sizeof(event_launch_item));
+ if (!eli) {
+ _E("memory alloc failed");
+ return ES_R_ENOMEM;
+ }
+
+ eli->event_name = strdup(event_name);
+ if (!eli->event_name) {
+ _E("out_of_memory");
+ FREE_AND_NULL(eli);
+ return ES_R_ENOMEM;
+ }
+
+ app_id = strdup((char *)appid);
+ if (!app_id) {
+ _E("out_of_memory");
+ FREE_AND_NULL(eli->event_name);
+ FREE_AND_NULL(eli);
+ return ES_R_ENOMEM;
+ }
+
+ pkg_id = strdup((char *)pkgid);
+ if (!pkg_id) {
+ _E("out_of_memory");
+ FREE_AND_NULL(app_id);
+ FREE_AND_NULL(eli->event_name);
+ FREE_AND_NULL(eli);
+ return ES_R_ENOMEM;
+ }
+
+ if (__esd_add_list_item(uid, eli, app_id, pkg_id) < 0) {
+ _E("failed to add list item");
+ FREE_AND_NULL(app_id);
+ FREE_AND_NULL(pkg_id);
+ FREE_AND_NULL(eli->event_name);
+ FREE_AND_NULL(eli);
+ return ES_R_ERROR;
+ }
+
+ g_hash_table_insert(event_launch_table, eli->event_name, eli);
+
+ eventsystem_register_event(eli->event_name, &subscription_id,
+ (eventsystem_handler)__esd_event_handler, NULL);
+ if (subscription_id == 0) {
+ _E("signal subscription error, event_name(%s), app_id(%s)",
+ eli->event_name, app_id);
+ return ES_R_ERROR;
+ } else {
+ eli->reg_id = subscription_id;
+ }
+ }
+
+ return ES_R_OK;
+}
+
+void __esd_remove_all_private_usr_app_list(gpointer data, gpointer user_data) {
+ esd_list_item_s *item = (esd_list_item_s *)data;
+ event_launch_item *eli = (event_launch_item *)user_data;
+
+ if (item->uid != GLOBAL_USER && !strcmp(eli->package_name, item->pkg_id)) {
+ _D("uid(%d), app_id(%s), pkg_id(%s)", item->uid, item->app_id, eli->package_name);
+ eli->app_list_evtlaunch = g_list_remove_all(eli->app_list_evtlaunch, data);
+ }
+}
+
+int __esd_launch_table_remove_private_usr_items() {
+ GHashTableIter iter;
+ gpointer key;
+ gpointer value;
+ event_launch_item *eli = NULL;
+ GList *first_list = NULL;
+
+ g_hash_table_iter_init(&iter, event_launch_table);
+
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ eli = (event_launch_item *)value;
+ g_list_foreach(eli->app_list_evtlaunch, __esd_remove_all_private_usr_app_list, eli);
+
+ first_list = g_list_first(eli->app_list_evtlaunch);
+ if (first_list == NULL) {
+ if (eli->reg_id)
+ eventsystem_unregister_event(eli->reg_id);
+
+ g_hash_table_iter_remove(&iter);
+ }
+ }
+
+ return ES_R_OK;
+}
+
+void __esd_remove_app_list(gpointer data, gpointer user_data) {
+ bool skip = false;
+ esd_list_item_s *item = (esd_list_item_s *)data;
+ event_launch_item *eli = (event_launch_item *)user_data;
+
+ if (eli->uid != GLOBAL_USER && eli->uid != item->uid)
+ skip = true;
+
+ if (!skip && !strcmp(eli->package_name, item->pkg_id)) {
+ _D("pkg_id(%s), app_id(%s)", eli->package_name, item->app_id);
+ eli->app_list_evtlaunch =
+ g_list_remove_all(eli->app_list_evtlaunch, data);
+ }
+}
+
+int __esd_remove_launch_item(uid_t uid, gpointer data, const char *pkg_id) {
+ event_launch_item *eli = (event_launch_item *)data;
+ GList *first_list = NULL;
+
+ eli->uid = uid;
+ eli->package_name = (char *)pkg_id;
+ g_list_foreach(eli->app_list_evtlaunch, __esd_remove_app_list, eli);
+
+ first_list = g_list_first(eli->app_list_evtlaunch);
+ if (first_list == NULL) {
+ if (eli->reg_id)
+ eventsystem_unregister_event(eli->reg_id);
+
+ return ES_R_REMOVE;
+ }
+
+ return ES_R_OK;
+}
+
+int __esd_launch_table_remove_items(uid_t uid, const char *pkg_id) {
+ GHashTableIter iter;
+ gpointer key;
+ gpointer value;
+
+ g_hash_table_iter_init(&iter, event_launch_table);
+
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ if (__esd_remove_launch_item(uid, value, pkg_id) == ES_R_REMOVE) {
+ _D("remove item itself");
+ g_hash_table_iter_remove(&iter);
+ }
+ }
+
+ return ES_R_OK;
+}
+
+void __esd_event_launch_with_appid(gpointer data, gpointer user_data) {
+ esd_list_item_s *item = (esd_list_item_s *)data;
+ uid_t uid = item->uid;
+ char *app_id = item->app_id;
+ esd_event_param *eep = (esd_event_param *)user_data;
+ static unsigned int req_id;
+ int pid;
+ char event_uri[1024];
+ bundle *b;
+ int ret;
+
+ _D("launch_on_event: app_id(%s), event_name(%s), uid(%d), is_user(%d), trusted(%d)",
+ app_id, eep->event_name, uid, eep->is_user_event, eep->trusted);
+
+ if (eep->is_user_event && eep->trusted) {
+ if (item->trusted_info == TRUSTED_UNKNOWN) {
+ ret = __esd_check_certificate_match(uid, app_id, eep->sender_uid, eep->sender_appid);
+ if (ret == ES_R_EINVAL) {
+ item->trusted_info = TRUSTED_DENIED;
+ return;
+ } else if (ret == ES_R_ERROR) {
+ return;
+ } else {
+ item->trusted_info = TRUSTED_ALLOWED;
+ }
+ } else if (item->trusted_info == TRUSTED_DENIED) {
+ return;
+ }
+ }
+
+ if (!aul_app_is_running_for_uid(app_id, uid)) {
+ b = bundle_dup(eep->event_data);
+ if (eep->is_user_event)
+ snprintf(event_uri, sizeof(event_uri), "%s%s", USER_EVENT_NAME_PREFIX, eep->event_name);
+ else
+ snprintf(event_uri, sizeof(event_uri), "%s%s", SYSTEM_EVENT_NAME_PREFIX, eep->event_name);
+
+ appsvc_set_operation(b, APPSVC_OPERATION_LAUNCH_ON_EVENT);
+ appsvc_set_uri(b, event_uri);
+ appsvc_set_appid(b, app_id);
+
+ pid = aul_svc_run_service_async_for_uid(b, req_id++, NULL, eep->user_data, uid);
+ _D("uid(%d), pid(%d)", uid, pid);
+
+ bundle_free(b);
+ } else {
+ _D("already is running or launch failed");
+ }
+}
+
+void __esd_check_event_launch_with_eventid(gpointer data, gpointer user_data) {
+ event_launch_item *el_item = (event_launch_item *)data;
+ esd_event_param *eep = (esd_event_param *)user_data;
+
+ if (strcmp(eep->event_name, (char *)el_item->event_name) == 0) {
+ g_list_foreach(el_item->app_list_evtlaunch,
+ __esd_event_launch_with_appid, user_data);
+ }
+}
+
+void __esd_launch_event_handler(char *event_name, bundle *data,
+ const bool is_user_event, gboolean trusted,
+ const uid_t sender_uid, char *sender_appid, void *user_data) {
+ const char *val;
+ const char *msg_type;
+ const char *msg_id;
+ esd_event_param *eep;
+ event_launch_item *el_item;
+
+ _D("event_name(%s)", event_name);
+
+ el_item = (event_launch_item *)g_hash_table_lookup(event_launch_table, event_name);
+ if (el_item == NULL)
+ return;
+
+ if (el_item->app_list_evtlaunch != NULL) {
+ if (is_user_event == false) {
+ if (strcmp(SYS_EVENT_BATTERY_CHARGER_STATUS, event_name) == 0) {
+ val = bundle_get_val(data, EVT_KEY_BATTERY_CHARGER_STATUS);
+ _D("charger val(%s)", val);
+ if (val && (strcmp(EVT_VAL_BATTERY_CHARGER_CONNECTED, val) != 0))
+ return;
+ } else if (strcmp(SYS_EVENT_USB_STATUS, event_name) == 0) {
+ val = bundle_get_val(data, EVT_KEY_USB_STATUS);
+ _D("usb val(%s)", val);
+ if (val && (strcmp(EVT_VAL_USB_CONNECTED, val) != 0))
+ return;
+ } else if (strcmp(SYS_EVENT_EARJACK_STATUS, event_name) == 0) {
+ val = bundle_get_val(data, EVT_KEY_EARJACK_STATUS);
+ _D("earjack val(%s)", val);
+ if (val && (strcmp(EVT_VAL_EARJACK_CONNECTED, val) != 0))
+ return;
+ } else if (strcmp(SYS_EVENT_INCOMMING_MSG, event_name) == 0) {
+ msg_type = bundle_get_val(data, EVT_KEY_MSG_TYPE);
+ _D("msg_type(%s)", msg_type);
+ if (msg_type == NULL)
+ return;
+
+ msg_id = bundle_get_val(data, EVT_KEY_MSG_ID);
+ _D("msg_id(%s)", msg_id);
+ if (msg_id == NULL)
+ return;
+ } else if (strcmp(SYS_EVENT_WIFI_STATE, event_name) == 0) {
+ val = bundle_get_val(data, EVT_KEY_WIFI_STATE);
+ if (val == NULL)
+ return;
+ _D("wifi_state(%s)", val);
+ if (strcmp(EVT_VAL_WIFI_CONNECTED, val) != 0)
+ return;
+ }
+ }
+
+ eep = (esd_event_param *)calloc(1, sizeof(esd_event_param));
+ if (!eep) {
+ _E("memory alloc failed");
+ return;
+ }
+ eep->event_name = event_name;
+ eep->event_data = data;
+ eep->sender_uid = sender_uid;
+ eep->sender_appid = sender_appid;
+ eep->is_user_event = is_user_event;
+ eep->trusted = (bool)trusted;
+ eep->user_data = (void *)user_data;
+ __esd_check_event_launch_with_eventid(el_item, eep);
+ free(eep);
+ }
+}
+
+void __esd_print_earlier_event(gpointer data, gpointer user_data) {
+ earlier_item *item = (earlier_item *)data;
+ char *event_name = (char *)item->event_name;
+ const char *val;
+
+ _D("event_name = (%s)", event_name);
+
+ if (strcmp(event_name, SYS_EVENT_BOOT_COMPLETED) == 0) {
+ if (item->earlier_data) {
+ val = bundle_get_val(item->earlier_data, EVT_KEY_BOOT_COMPLETED);
+ _D("boot_completed(%s)", val);
+ }
+ } else if (strcmp(event_name, SYS_EVENT_SYSTEM_SHUTDOWN) == 0) {
+ if (item->earlier_data) {
+ val = bundle_get_val(item->earlier_data, EVT_KEY_SYSTEM_SHUTDOWN);
+ _D("shutdown(%s)", val);
+ }
+ } else if (strcmp(event_name, SYS_EVENT_LOW_MEMORY) == 0) {
+ if (item->earlier_data) {
+ val = bundle_get_val(item->earlier_data, EVT_KEY_LOW_MEMORY);
+ _D("low_memory(%s)", val);
+ }
+ } else if (strcmp(event_name, SYS_EVENT_BATTERY_CHARGER_STATUS) == 0) {
+ if (item->earlier_data) {
+ val = bundle_get_val(item->earlier_data, EVT_KEY_BATTERY_CHARGER_STATUS);
+ _D("charger_status(%s)", val);
+ }
+ }
+}
+
+void __esd_earlier_table_print_items() {
+ GHashTableIter iter;
+ gpointer key;
+ gpointer value;
+
+ g_hash_table_iter_init(&iter, earlier_event_table);
+
+ while (g_hash_table_iter_next(&iter, &key, &value))
+ __esd_print_earlier_event(value, NULL);
+}
+
+void __esd_earlier_event_handler(char *event_name, bundle *data, void *user_data) {
+ earlier_item *item;
+ _D("event_name(%s)", event_name);
+
+ item = (earlier_item *)g_hash_table_lookup(earlier_event_table, event_name);
+ if (item) {
+ /* update earlier value */
+ if (item->earlier_data != NULL)
+ bundle_free(item->earlier_data);
+
+ item->earlier_data = bundle_dup(data);
+ }
+}
+
+void __esd_event_handler(char *event_name, bundle *data, void *user_data) {
+ _D("event_name(%s)", event_name);
+
+ if (__esd_check_earlier_support(event_name))
+ __esd_earlier_event_handler(event_name, data, user_data);
+
+ if (__esd_check_event_launch_support(event_name))
+ __esd_launch_event_handler(event_name, data,
+ false, TRUE, ROOT_USER, NULL, user_data);
+}
+
+void __esd_trusted_busname_remove_item(char *bus_name) {
+ GHashTableIter iter;
+ gpointer key;
+ gpointer value;
+ trusted_item *item;
+
+ g_hash_table_iter_init(&iter, trusted_busname_table);
+
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ item = (trusted_item *)value;
+ if (item) {
+ if (strcmp(bus_name, item->bus_name) == 0) {
+ _D("remove trusted busname item(%s, %s)", item->app_id, item->bus_name);
+ FREE_AND_NULL(item->app_id);
+ FREE_AND_NULL(item->bus_name);
+ FREE_AND_NULL(item);
+ g_hash_table_iter_remove(&iter);
+
+ __esd_trusted_busname_print_items();
+ }
+ }
+ }
+}
+
+void __esd_filter_name_owner_changed(GDBusConnection *connection,
+ const gchar *sender_name, const gchar *object_path,
+ const gchar *interface_name, const gchar *signal_name,
+ GVariant *parameters, gpointer user_data) {
+ char *name = NULL;
+ char *old_owner = NULL;
+ char *new_owner = NULL;
+ int old_len = 0;
+ int new_len = 0;
+
+ g_variant_get(parameters, "(&s&s&s)", &name, &old_owner, &new_owner);
+
+ if (strstr(name, "event.busname.session")) {
+ old_len = strlen(old_owner);
+ new_len = strlen(new_owner);
+
+ _D("changed name(%s), old_onwer(%s)(%d) -> new_onwer(%s)(%d)",
+ name, old_owner, old_len, new_owner, new_len);
+
+ if (old_len > 0 && new_len == 0)
+ __esd_trusted_busname_remove_item(name);
+ else if (old_len == 0 && new_len > 0)
+ _D("new name owned");
+ else
+ _E("not-expected name change");
+ }
+}
+
+int __esd_dbus_name_monitor(GDBusConnection *connection) {
+ guint name_owner_changed_id = 0;
+
+ name_owner_changed_id = g_dbus_connection_signal_subscribe(connection,
+ "org.freedesktop.DBus", "org.freedesktop.DBus",
+ "NameOwnerChanged", "/org/freedesktop/DBus", NULL, G_DBUS_SIGNAL_FLAGS_NONE,
+ __esd_filter_name_owner_changed, NULL, NULL);
+
+ _I("name_owner_changed_id(%d)", name_owner_changed_id);
+
+ return ES_R_OK;
+}
+
+int __esd_get_user_items(uid_t uid) {
+ int ret = 0;
+ pkgmgrinfo_appinfo_filter_h handle = NULL;
+
+ _I("get user items for uid(%d)", uid);
+ /* reset user's item */
+ __esd_launch_table_remove_private_usr_items();
+
+ ret = pkgmgrinfo_appinfo_filter_create(&handle);
+ if (ret < 0) {
+ _E("failed to create appinfo filter");
+ return ES_R_ERROR;
+ }
+ ret = pkgmgrinfo_appinfo_filter_add_string(handle,
+ PMINFO_APPINFO_PROP_APP_COMPONENT, "svcapp");
+ if (ret < 0) {
+ _E("failed to add appinfo filter string");
+ pkgmgrinfo_appinfo_filter_destroy(handle);
+ return ES_R_ERROR;
+ }
+ ret = pkgmgrinfo_appinfo_filter_add_string(handle,
+ PMINFO_APPINFO_PROP_APP_OPERATION, APPSVC_OPERATION_LAUNCH_ON_EVENT);
+ if (ret < 0) {
+ _E("failed to add appinfo filter string");
+ pkgmgrinfo_appinfo_filter_destroy(handle);
+ return ES_R_ERROR;
+ }
+ ret = pkgmgrinfo_appinfo_usr_filter_foreach_appinfo(handle,
+ __esd_add_appinfo_handler, &uid, uid);
+ if (ret < 0) {
+ _E("appinfo filter foreach error");
+ pkgmgrinfo_appinfo_filter_destroy(handle);
+ return ES_R_ERROR;
+ }
+ pkgmgrinfo_appinfo_filter_destroy(handle);
+
+ __esd_launch_table_print_items();
+
+ return ES_R_OK;
+}
+
+void __esd_signal_handler(GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer user_data) {
+ int handle;
+ bundle *b;
+ guint64 uid = 0;
+
+ if (!g_strcmp0(signal_name,
+ SYSTEMD_DBUS_SIGNAL_STARTUP_FINISHED)) {
+ _I("System session finished");
+
+ b = bundle_create();
+ bundle_add_str(b, EVT_KEY_BOOT_COMPLETED,
+ EVT_VAL_BOOT_COMPLETED_TRUE);
+ eventsystem_send_system_event(SYS_EVENT_BOOT_COMPLETED, b);
+ bundle_free(b);
+
+ handle = creat(ESD_BOOT_COMPLETED, 0640);
+ if (handle != -1)
+ close(handle);
+ } else if (!g_strcmp0(signal_name,
+ SYSTEMD_DBUS_SIGNAL_USER_STARTUP_FINISHED)) {
+ g_variant_get(parameters, "(t)", &uid);
+ _I("User session finished uid : %d", (int)uid);
+ if ((uid_t)uid != DEFAULT_USER)
+ __esd_get_user_items((uid_t)uid);
+ }
+}
+
+static GDBusNodeInfo *introspection_data;
+
+int __esd_get_appid_by_pid_for_uid(int pid, uid_t uid, char *app_id, int buf_size) {
+ int retval = ES_R_OK;
+ int ret = 0;
+
+ if (pid <= 0) {
+ _E("invalid pid(%d)", pid);
+ retval = ES_R_ERROR;
+ } else if (uid <= 0) {
+ _E("invalid uid(%d)", uid);
+ retval = ES_R_ERROR;
+ } else {
+ ret = aul_app_get_appid_bypid_for_uid(pid, app_id, buf_size, (uid_t)uid);
+ if (ret != AUL_R_OK) {
+ _E("failed to get appid by pid");
+ retval = ES_R_ERROR;
+ }
+ _D("pid(%d)-uid(%d)-appid(%s)", pid, uid, app_id);
+ }
+
+ return retval;
+}
+
+int __esd_get_appid_by_pid(int pid, char *app_id, int buf_size) {
+ int ret;
+ int fd;
+ char buf[128] = { 0, };
+
+ ret = aul_app_get_appid_bypid(pid, app_id, buf_size);
+ if (ret != AUL_R_OK) {
+ snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid);
+
+ fd = open(buf, O_RDONLY);
+ if (fd < 0)
+ return ES_R_ERROR;
+
+ ret = read(fd, app_id, buf_size - 1);
+ close(fd);
+
+ if (ret <= 0)
+ return ES_R_ERROR;
+
+ app_id[ret] = '\0';
+ ret = ES_R_OK;
+ }
+
+ return ret;
+}
+
+int check_user_event_sender_valid(const char *event_name, const char *app_id) {
+ char *valid_name = NULL;
+ char *temp_name = NULL;
+ char *tmp = NULL;
+ int retval = ES_R_OK;
+ int len = 0;
+ int valid_name_len = 0;
+
+ temp_name = strdup(event_name);
+ if (temp_name == NULL) {
+ _E("out of memory");
+ return ES_R_ENOMEM;
+ }
+
+ tmp = strrchr(temp_name, '.');
+ if (tmp == NULL || strlen(tmp) == 0) {
+ _E("invalid event name");
+ FREE_AND_NULL(temp_name);
+ return ES_R_EINVAL;
+ }
+ len = strlen(tmp);
+ if (len <= 1 || len > 128) {
+ _E("invalid length(%d) of user-defined name", len);
+ FREE_AND_NULL(temp_name);
+ return ES_R_EINVAL;
+ }
+ *tmp = '\0';
+
+ _D("app_id(%s), len(%zu)", app_id, strlen(app_id));
+
+ valid_name_len = strlen(USER_EVENT_NAME_PREFIX) + strlen(app_id) + 1;
+ valid_name = (char *)calloc(1, valid_name_len);
+ if (valid_name == NULL) {
+ _E("memory alloc failed");
+ FREE_AND_NULL(temp_name);
+ return ES_R_ENOMEM;
+ }
+ snprintf(valid_name, valid_name_len, "%s%s", USER_EVENT_NAME_PREFIX, app_id);
+ _D("valid_name(%s)", valid_name);
+
+ if (strcmp(temp_name, valid_name) != 0) {
+ _E("appid misamatch");
+ retval = ES_R_EINVAL;
+ }
+
+ FREE_AND_NULL(temp_name);
+ FREE_AND_NULL(valid_name);
+
+ return retval;
+}
+
+static const GDBusInterfaceVTable interface_vtable = {
+ esd::module::DbusEventModule::HandleMethodCallCb,
+ nullptr,
+ nullptr
+};
+
+void __esd_on_bus_acquired(GDBusConnection *connection,
+ const gchar *name, gpointer user_data) {
+ _I("bus acquired(%s)", name);
+
+ guint reg_id = 0;
+ guint boot_id = 0;
+ guint user_boot_id = 0;
+ GError *error = NULL;
+
+ reg_id = g_dbus_connection_register_object(connection,
+ ESD_OBJECT_PATH,
+ introspection_data->interfaces[0],
+ &interface_vtable,
+ user_data, NULL, &error);
+ if (reg_id == 0) {
+ _E("g_dbus_connection_register_object error(%s)", error->message);
+ g_error_free(error);
+ }
+
+ boot_id = g_dbus_connection_signal_subscribe(connection,
+ NULL,
+ SYSTEMD_DBUS_IFACE_MANAGER,
+ SYSTEMD_DBUS_SIGNAL_STARTUP_FINISHED,
+ SYSTEMD_DBUS_PATH,
+ NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ __esd_signal_handler,
+ NULL,
+ NULL);
+
+ if (boot_id == 0)
+ _E("g_dbus_connection_signal_subscribe() is failed.");
+
+ user_boot_id = g_dbus_connection_signal_subscribe(connection,
+ NULL,
+ SYSTEMD_DBUS_IFACE_MANAGER,
+ SYSTEMD_DBUS_SIGNAL_USER_STARTUP_FINISHED,
+ SYSTEMD_DBUS_PATH,
+ NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ __esd_signal_handler,
+ NULL,
+ NULL);
+
+ if (user_boot_id == 0)
+ _E("g_dbus_connection_signal_subscribe() is failed.");
+}
+
+void __esd_on_name_acquired(GDBusConnection *connection,
+ const gchar *name, gpointer user_data) {
+ bundle *b;
+
+ __esd_check_trusted_events(connection, "ListNames");
+ __esd_check_trusted_events(connection, "ListActivatableNames");
+
+ b = bundle_create();
+ bundle_add_str(b, EVT_KEY_ESD_STATUS, EVT_VAL_ESD_STARTED);
+ eventsystem_send_system_event(SYS_EVENT_ESD_STATUS, b);
+ bundle_free(b);
+
+ __esd_register_vconf_callbacks();
+
+ __esd_trusted_busname_print_items();
+
+ __esd_get_user_items(DEFAULT_USER);
+
+ __esd_dbus_name_monitor(connection);
+}
+
+void __esd_on_name_lost(GDBusConnection *connection,
+ const gchar *name, gpointer user_data) {
+}
+
+void __esd_pkgmgr_event_free(esd_pkgmgr_event *pkg_event) {
+ pkg_event->type = UNKNOWN;
+ if (pkg_event->pkgid) {
+ free(pkg_event->pkgid);
+ pkg_event->pkgid = NULL;
+ }
+}
+
+int __esd_appcontrol_cb(const char *operation,
+ const char *uri, const char *mime, void *data) {
+ esd_appctrl_cb_data *cb_data = (esd_appctrl_cb_data *)data;
+ char *appid = NULL;
+ char *pkgid = NULL;
+ char *event_name = NULL;
+ uid_t uid = 0;
+
+ if (cb_data == NULL) {
+ _E("invalid data");
+ return 0;
+ }
+ appid = cb_data->appid;
+ pkgid = cb_data->pkgid;
+ uid = cb_data->uid;
+
+ _D("uid(%d), appid(%s), pkgid(%s), operation(%s), uri(%s), mime(%s)",
+ uid, appid, pkgid, operation, uri, mime);
+
+ if (!strcmp(operation, APPSVC_OPERATION_LAUNCH_ON_EVENT)) {
+ if (uri && !strncmp(uri, SYSTEM_EVENT_NAME_PREFIX, strlen(SYSTEM_EVENT_NAME_PREFIX))) {
+ event_name = strdup(&uri[8]);
+ if (event_name) {
+ _D("appid(%s), event_name(%s)", appid, event_name);
+ if (!__esd_check_event_launch_support(event_name))
+ _E("failed to add item (not support event)");
+ else if (!__esd_check_app_privileged_event(uid, appid, pkgid, event_name))
+ _E("failed to add item (no privilege)");
+ else if (__esd_add_launch_item(uid, event_name, appid, pkgid))
+ _E("failed to add item");
+
+ } else {
+ _E("out of memory");
+ }
+ } else if (uri && !strncmp(uri, USER_EVENT_NAME_PREFIX, strlen(USER_EVENT_NAME_PREFIX))) {
+ event_name = strdup(uri);
+ if (event_name) {
+ _D("appid(%s), event_name(%s)", appid, event_name);
+ if (__esd_check_platform_cert(pkgid, uid)) {
+ if (__esd_add_launch_item(uid, event_name, appid, pkgid))
+ _E("failed to add item");
+ }
+ } else {
+ _E("out of memory");
+ }
+ }
+ FREE_AND_NULL(event_name);
+ }
+
+ return 0;
+}
+
+int __esd_add_appinfo_handler(const pkgmgrinfo_appinfo_h handle, void *data) {
+ char *appid = NULL;
+ char *pkgid = NULL;
+ int ret = 0;
+ uid_t *p_uid = NULL;
+
+ if (data == NULL) {
+ _E("invalid data");
+ return ES_R_ERROR;
+ }
+
+ p_uid = (uid_t *)data;
+
+ ret = pkgmgrinfo_appinfo_get_pkgid(handle, &pkgid);
+ if (ret < 0) {
+ _E("failed to get appid");
+ return ES_R_ERROR;
+ }
+
+ ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
+ if (ret < 0) {
+ _E("failed to get appid");
+ return ES_R_ERROR;
+ }
+
+ esd_appctrl_cb_data *cb_data = (esd_appctrl_cb_data *)calloc(1, sizeof(esd_appctrl_cb_data));
+
+ if (cb_data == NULL) {
+ _E("memory alloc failed");
+ return ES_R_ENOMEM;
+ }
+ cb_data->appid = strdup(appid);
+ if (cb_data->appid == NULL) {
+ _E("out_of_memory");
+ FREE_AND_NULL(cb_data);
+ return ES_R_ENOMEM;
+ }
+ cb_data->pkgid = strdup(pkgid);
+ if (cb_data->pkgid == NULL) {
+ _E("out_of_memory");
+ FREE_AND_NULL(cb_data->appid);
+ FREE_AND_NULL(cb_data);
+ return ES_R_ENOMEM;
+ }
+ cb_data->uid = *p_uid;
+
+ ret = pkgmgrinfo_appinfo_foreach_appcontrol(handle,
+ (pkgmgrinfo_app_control_list_cb)__esd_appcontrol_cb, cb_data);
+
+ FREE_AND_NULL(cb_data->pkgid);
+ FREE_AND_NULL(cb_data->appid);
+ FREE_AND_NULL(cb_data);
+
+ if (ret < 0) {
+ _E("failed to get appcontrol info");
+ return ES_R_ERROR;
+ }
+
+ return ES_R_OK;
+}
+
+int __esd_pkgmgr_event_callback(uid_t target_uid, int req_id,
+ const char *pkg_type, const char *pkgid, const char *key,
+ const char *val, const void *pmsg, void *data) {
+ esd_pkgmgr_event *pkg_event = (esd_pkgmgr_event *)data;
+ pkgmgrinfo_pkginfo_h handle = NULL;
+ int ret = 0;
+
+ _D("target_uid(%d), req_id(%d), pkg_type(%s), pkgid(%s), key(%s), val(%s)",
+ target_uid, req_id, pkg_type, pkgid, key, val);
+
+ if (strncmp(key, "start", strlen(key)) == 0) {
+ if (strcmp(val, "install") == 0) {
+ _D("install start");
+ pkg_event->type = INSTALL;
+ } else if (strcmp(val, "uninstall") == 0) {
+ _D("unistall start");
+ pkg_event->type = UNINSTALL;
+ } else if (strcmp(val, "update") == 0) {
+ _D("update start");
+ pkg_event->type = UPDATE;
+ } else {
+ _D("val(%s) start", val);
+ __esd_pkgmgr_event_free(pkg_event);
+ }
+ } else if (strcmp(key, "end") == 0 && strcmp(val, "ok") == 0) {
+ if (pkg_event->type == INSTALL || pkg_event->type == UPDATE) {
+ _D("install end (ok)");
+ ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, target_uid, &handle);
+ if (ret < 0) {
+ _E("failed to get pkginfo");
+ __esd_pkgmgr_event_free(pkg_event);
+ return 0;
+ }
+ ret = pkgmgrinfo_appinfo_get_usr_list(handle,
+ PMINFO_SVC_APP, __esd_add_appinfo_handler, &target_uid, target_uid);
+ if (ret < 0) {
+ _E("failed to get appinfo");
+ pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+ __esd_pkgmgr_event_free(pkg_event);
+ return 0;
+ }
+ ret = pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+ if (ret < 0) {
+ _E("failed to destroy pkginfo");
+ __esd_pkgmgr_event_free(pkg_event);
+ return 0;
+ }
+ } else if (pkg_event->type == UNINSTALL) {
+ _D("uninstall end (ok)");
+ __esd_launch_table_remove_items(target_uid, pkgid);
+ __esd_launch_table_print_items();
+ }
+ __esd_pkgmgr_event_free(pkg_event);
+ } else if (strcmp(key, "end") == 0 && strcmp(val, "fail") == 0) {
+ _E("pkg_event(%d) falied", pkg_event->type);
+ __esd_pkgmgr_event_free(pkg_event);
+ } else {
+ if (strcmp(key, "install_percent") != 0)
+ __esd_pkgmgr_event_free(pkg_event);
+ }
+
+ return 0;
+}
+
+void __esd_remove_esd_list_item(gpointer data, gpointer user_data) {
+ esd_list_item_s *item = (esd_list_item_s *)data;
+
+ free(item->app_id);
+ free(item->pkg_id);
+}
+
+} // namespace
+
+namespace esd::module {
+
+bool DbusEventModule::Startup(api::ToolBox* tools) {
+ tools_ = tools;
+ if (!Init())
+ return false;
+ return BeforeLoop();
+}
+
+void DbusEventModule::Shutdown() {
+ Fini();
+}
+
+bool DbusEventModule::Init() {
+ int req_id = 0;
+ int ret = 0;
+ pkgmgr_client *client;
+ esd_pkgmgr_event *pkg_event;
+
+ __esd_init_cynara();
+
+ client = pkgmgr_client_new(PC_LISTENING);
+ if (client == NULL) {
+ _E("set pkgmgr client failed");
+ __esd_finish_cynara();
+ return false;
+ }
+
+ pkg_event = (esd_pkgmgr_event *)calloc(1, sizeof(esd_pkgmgr_event));
+ if (pkg_event == NULL) {
+ _E("memory alloc failed");
+ ret = pkgmgr_client_free(client);
+ if (ret != PKGMGR_R_OK)
+ _E("pkgmgr_client_free failed(%d)", ret);
+ __esd_finish_cynara();
+ return false;
+ }
+
+ req_id = pkgmgr_client_listen_status(client, __esd_pkgmgr_event_callback, pkg_event);
+ if (req_id < 0) {
+ _E("pkgmgr client listen failed");
+ ret = pkgmgr_client_free(client);
+ if (ret != PKGMGR_R_OK)
+ _E("pkgmgr_client_free failed(%d)", ret);
+ free(pkg_event);
+ __esd_finish_cynara();
+ return false;
+ }
+
+ s_info.client = client;
+
+ _I("esd init done");
+
+ return true;
+}
+
+void DbusEventModule::Fini() {
+ gpointer key;
+ gpointer value;
+ GHashTableIter iter;
+ trusted_item *item;
+ event_launch_item *el_item;
+ int ret = 0;
+ earlier_item *er_item;
+
+ _D("esd finalize");
+
+ if (trusted_busname_table) {
+ g_hash_table_iter_init(&iter, trusted_busname_table);
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ item = (trusted_item *)value;
+ if (item) {
+ free(item->app_id);
+ free(item->bus_name);
+ free(item);
+ } else {
+ _E("item is null");
+ }
+ g_hash_table_iter_remove(&iter);
+ }
+ g_hash_table_unref(trusted_busname_table);
+ }
+
+ if (earlier_event_table) {
+ g_hash_table_iter_init(&iter, earlier_event_table);
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ er_item = (earlier_item *)value;
+ if (er_item) {
+ eventsystem_unregister_event(er_item->reg_id);
+ free(er_item->event_name);
+ bundle_free(er_item->earlier_data);
+ free(er_item);
+ } else {
+ _E("ealier item is NULL");
+ }
+ g_hash_table_iter_remove(&iter);
+ }
+ g_hash_table_unref(earlier_event_table);
+ }
+
+ g_hash_table_destroy(user_last_event_table);
+
+ if (event_launch_table) {
+ g_hash_table_iter_init(&iter, event_launch_table);
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ el_item = (event_launch_item *)value;
+ if (el_item) {
+ eventsystem_unregister_event(el_item->reg_id);
+ free(el_item->event_name);
+ g_list_foreach(el_item->app_list_evtlaunch,
+ __esd_remove_esd_list_item, NULL);
+ g_list_free(el_item->app_list_evtlaunch);
+ free(el_item);
+ } else {
+ _E("item is NULL");
+ }
+ g_hash_table_iter_remove(&iter);
+ }
+ g_hash_table_unref(event_launch_table);
+ }
+
+ if (introspection_data)
+ g_dbus_node_info_unref(introspection_data);
+
+ if (s_info.client) {
+ ret = pkgmgr_client_free(s_info.client);
+ if (ret != PKGMGR_R_OK)
+ _E("pkgmgr_client_free failed(%d)", ret);
+ }
+
+ __esd_finish_cynara();
+
+ _D("esd finalize end");
+}
+
+bool DbusEventModule::BeforeLoop() {
+ int ret = 0;
+ GError *error = NULL;
+ guint owner_id = 0;
+
+ guint subscription_id = 0;
+ int i;
+ int size;
+ char *event_name;
+ int fd;
+ int val;
+ int status;
+ int charger_status;
+ int charge_now;
+ earlier_item *item;
+
+ earlier_event_table = g_hash_table_new(g_str_hash, g_str_equal);
+ user_last_event_table = g_hash_table_new_full(g_str_hash,
+ g_str_equal, NULL, (GDestroyNotify)free_saved_event);
+
+ _I("register events for earlier_data");
+ size = sizeof(earlier_event_list)/sizeof(*earlier_event_list);
+ for (i = 0; i < size; i++) {
+ event_name = (char *)earlier_event_list[i];
+ _I("event_name(%s)", event_name);
+
+ item = (earlier_item *)calloc(1, sizeof(earlier_item));
+ if (item == NULL) {
+ _E("memery alloc failed");
+ return false;
+ }
+ item->event_name = strdup(event_name);
+ if (item->event_name == NULL) {
+ _E("out of memory");
+ free(item);
+ return false;
+ }
+
+ /* set initial data */
+ if (strcmp(event_name, SYS_EVENT_BOOT_COMPLETED) == 0) {
+ fd = open(ESD_BOOT_COMPLETED, O_RDONLY);
+ if (fd < 0) {
+ _D("open file error(%d)", fd);
+ } else {
+ item->earlier_data = bundle_create();
+ bundle_add_str(item->earlier_data, EVT_KEY_BOOT_COMPLETED,
+ EVT_VAL_BOOT_COMPLETED_TRUE);
+ close(fd);
+ }
+ } else if (strcmp(event_name, SYS_EVENT_SYSTEM_SHUTDOWN) == 0) {
+ ret = vconf_get_int(VCONFKEY_SYSMAN_POWER_OFF_STATUS, &val);
+ if (ret != VCONF_OK) {
+ _E("failed to get power_off status (%d)", ret);
+ } else {
+ if (val == VCONFKEY_SYSMAN_POWER_OFF_DIRECT ||
+ val == VCONFKEY_SYSMAN_POWER_OFF_RESTART) {
+ /* power-off requested */
+ item->earlier_data = bundle_create();
+ bundle_add_str(item->earlier_data, EVT_KEY_SYSTEM_SHUTDOWN,
+ EVT_VAL_SYSTEM_SHUTDOWN_TRUE);
+ }
+ }
+ } else if (strcmp(event_name, SYS_EVENT_LOW_MEMORY) == 0) {
+ ret = vconf_get_int(VCONFKEY_SYSMAN_LOW_MEMORY, &status);
+ if (ret != VCONF_OK) {
+ _E("failed to get low_memory status (%d)", ret);
+ } else {
+ item->earlier_data = bundle_create();
+ if (status == VCONFKEY_SYSMAN_LOW_MEMORY_SOFT_WARNING)
+ bundle_add_str(item->earlier_data, EVT_KEY_LOW_MEMORY,
+ EVT_VAL_MEMORY_SOFT_WARNING);
+ else if (status == VCONFKEY_SYSMAN_LOW_MEMORY_HARD_WARNING)
+ bundle_add_str(item->earlier_data, EVT_KEY_LOW_MEMORY,
+ EVT_VAL_MEMORY_HARD_WARNING);
+ else
+ bundle_add_str(item->earlier_data, EVT_KEY_LOW_MEMORY,
+ EVT_VAL_MEMORY_NORMAL);
+ }
+ } else if (strcmp(event_name, SYS_EVENT_BATTERY_CHARGER_STATUS) == 0) {
+ ret = vconf_get_int(VCONFKEY_SYSMAN_CHARGER_STATUS, &charger_status);
+ if (ret != VCONF_OK) {
+ _E("failed to get charger_status (%d)", ret);
+ } else {
+ ret = vconf_get_int(VCONFKEY_SYSMAN_BATTERY_CHARGE_NOW, &charge_now);
+ if (ret != VCONF_OK)
+ _E("failed to get charge_now (%d)", ret);
+ }
+
+ if (ret == VCONF_OK) {
+ item->earlier_data = bundle_create();
+ if (charger_status == VCONFKEY_SYSMAN_CHARGER_CONNECTED) {
+ if (charge_now == 0) {
+ bundle_add_str(item->earlier_data,
+ EVT_KEY_BATTERY_CHARGER_STATUS,
+ EVT_VAL_BATTERY_CHARGER_DISCHARGING);
+ } else {
+ bundle_add_str(item->earlier_data,
+ EVT_KEY_BATTERY_CHARGER_STATUS,
+ EVT_VAL_BATTERY_CHARGER_CHARGING);
+ }
+ } else {
+ bundle_add_str(item->earlier_data,
+ EVT_KEY_BATTERY_CHARGER_STATUS,
+ EVT_VAL_BATTERY_CHARGER_DISCONNECTED);
+ }
+ }
+ }
+
+ eventsystem_register_event(event_name, &subscription_id,
+ (eventsystem_handler)__esd_event_handler, NULL);
+ if (subscription_id == 0) {
+ _E("signal subscription error, event_name(%s)", event_name);
+ if (item->earlier_data)
+ bundle_free(item->earlier_data);
+ free(item->event_name);
+ free(item);
+
+ return false;
+ } else {
+ item->reg_id = subscription_id;
+ }
+
+ g_hash_table_insert(earlier_event_table, event_name, item);
+ }
+
+ __esd_earlier_table_print_items();
+
+ event_launch_table = g_hash_table_new(g_str_hash, g_str_equal);
+ trusted_busname_table = g_hash_table_new(g_str_hash, g_str_equal);
+
+ /* gdbus setup for method call */
+ introspection_data = g_dbus_node_info_new_for_xml(INTROSPECTION_XML, &error);
+ if (!introspection_data) {
+ _E("g_dbus_node_info_new_for_xml error(%s)", error->message);
+ g_error_free(error);
+ return false;
+ }
+
+ owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
+ ESD_BUS_NAME,
+ G_BUS_NAME_OWNER_FLAGS_NONE,
+ __esd_on_bus_acquired,
+ __esd_on_name_acquired,
+ __esd_on_name_lost,
+ this, NULL);
+ if (!owner_id) {
+ _E("g_bus_own_name error");
+ g_dbus_node_info_unref(introspection_data);
+ return false;
+ }
+
+ _I("esd before_loop done");
+
+ return true;
+}
+
+void DbusEventModule::HandleMethodCallCb(GDBusConnection *connection,
+ const gchar *sender, const gchar *object_path,
+ const gchar *interface_name, const gchar *method_name,
+ GVariant *parameters, GDBusMethodInvocation *invocation,
+ gpointer user_data) {
+
+ static std::map<std::string,
+ std::function<void (DbusEventModule&, GDBusConnection*,
+ const gchar*, GVariant*, GDBusMethodInvocation*)>> dispatcher = {
+ { "CheckSenderValidation", &DbusEventModule::CheckSenderValidMethodCall },
+ { "GetTrustedPeerList", &DbusEventModule::GetTrustedPeerMethodCall },
+ { "SetupTrustedPeer", &DbusEventModule::SetupTrustedPeerMethodCall },
+ { "CheckPrivilegeValidation", &DbusEventModule::CheckPrivilegeValidMethodCall },
+ { "CheckUserSendValidation", &DbusEventModule::CheckSendEventValidMethodCall },
+ { "GetEarlierData", &DbusEventModule::GetEarlierDataMethodCall },
+ { "KeepLastData", &DbusEventModule::KeepLastDataMethodCall },
+ { "CheckLastData", &DbusEventModule::CheckLastDataMethodCall },
+ { "LaunchOnEventFromUserEvent", &DbusEventModule::LaunchOnEventFromUserEventMethodCall },
+ { "CionGetUuid", &DbusEventModule::GetUuidMethodCall },
+ { "CionSetDisplayName", &DbusEventModule::SetDisplayNameMethodCall },
+ { "CionGetDisplayName", &DbusEventModule::GetDisplayNameMethodCall },
+ { "CionSetEnabled", &DbusEventModule::SetEnabledMethodCall },
+ { "CionGetEnabled", &DbusEventModule::GetEnabledMethodCall }
+ };
+
+ if (dispatcher.find(method_name) == dispatcher.end())
+ return;
+
+ auto* mod = reinterpret_cast<esd::module::DbusEventModule*>(user_data);
+ dispatcher[method_name](*mod, connection, sender, parameters, invocation);
+}
+
+std::string DbusEventModule::GetSenderAppId(GDBusConnection* connection,
+ const gchar* sender) {
+ int sender_pid = __get_sender_pid(connection, sender);
+ char app_id[128] = { 0, };
+ if (__esd_get_appid_by_pid(sender_pid, app_id, sizeof(app_id)) < 0) {
+ _E("failed to get appid by pid");
+ return "";
+ }
+
+ return app_id;
+}
+
+void DbusEventModule::CheckSendEventValidMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation) {
+ GVariant *param = NULL;
+ int result = 0;
+ char *event_name = NULL;
+ char app_id[128] = {0, };
+ int sender_pid = 0;
+ uid_t sender_uid = 0;
+
+ g_variant_get(parameters, "(&s)", &event_name);
+ _D("event_name(%s)", event_name);
+
+ sender_pid = __get_sender_pid(connection, sender);
+ sender_uid = (uid_t)__get_sender_uid(connection, sender);
+ if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id, sizeof(app_id)) < 0) {
+ result = ES_R_ERROR;
+ } else {
+ if (check_user_event_sender_valid(event_name, app_id) < 0) {
+ _E("invalid sender");
+ result = ES_R_EINVAL;
+ } else {
+ result = 1;
+ }
+ }
+
+ param = g_variant_new("(i)", result);
+ _D("event_name(%s), result(%d)", event_name, result);
+ g_dbus_method_invocation_return_value(invocation, param);
+}
+
+void DbusEventModule::CheckSenderValidMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation) {
+ GVariant *param = NULL;
+ int result = 0;
+ char *event_name = NULL;
+ char app_id[128] = {0, };
+ int event_sender_pid = 0;
+ uid_t sender_uid = 0;
+
+ g_variant_get(parameters, "(i&s)", &event_sender_pid, &event_name);
+ _D("event_sender_pid(%d), event_name(%s)", event_sender_pid, event_name);
+
+ sender_uid = (uid_t)__get_sender_uid(connection, sender);
+ if (__esd_get_appid_by_pid_for_uid(event_sender_pid, sender_uid, app_id, sizeof(app_id)) < 0) {
+ result = ES_R_ERROR;
+ } else {
+ if (check_user_event_sender_valid(event_name, app_id) < 0) {
+ _E("invalid sender");
+ result = ES_R_EINVAL;
+ } else {
+ result = 1;
+ }
+ }
+
+ param = g_variant_new("(is)", result, app_id);
+ _D("event_name(%s), result(%d)", event_name, result);
+ g_dbus_method_invocation_return_value(invocation, param);
+}
+
+void DbusEventModule::GetTrustedPeerMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation) {
+ GVariant *param = NULL;
+ int result = 0;
+ GVariantBuilder *builder = NULL;
+ GHashTableIter iter;
+ gpointer key, value;
+ char *event_name = NULL;
+ char app_id[128] = {0, };
+ int sender_pid = 0;
+ uid_t sender_uid = 0;
+ int ret = 0;
+ uid_t uid = 0;
+ char *_appid = NULL;
+ char *_busname = NULL;
+ trusted_item *item;
+
+ g_variant_get(parameters, "(&s)", &event_name);
+ _D("event_name(%s)", event_name);
+
+ sender_pid = __get_sender_pid(connection, sender);
+ sender_uid = (uid_t)__get_sender_uid(connection, sender);
+ if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id, sizeof(app_id)) < 0) {
+ result = ES_R_ERROR;
+ } else {
+ builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
+
+ g_hash_table_iter_init(&iter, trusted_busname_table);
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ item = (trusted_item *)value;
+ uid = item->uid;
+ _appid = item->app_id;
+ _busname = item->bus_name;
+
+ if (uid != GLOBAL_USER && uid != sender_uid)
+ continue;
+
+ ret = __esd_check_certificate_match(uid, _appid, sender_uid, app_id);
+ if (ret == ES_R_OK)
+ g_variant_builder_add(builder, "s", _busname);
+ }
+
+ result = 1;
+ }
+
+ param = g_variant_new("(ias)", result, builder);
+ _D("result(%d)", result);
+ g_dbus_method_invocation_return_value(invocation, param);
+ if (builder)
+ g_variant_builder_unref(builder);
+}
+
+void DbusEventModule::SetupTrustedPeerMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation) {
+ GVariant *param = NULL;
+ int result = 0;
+ char *event_name = NULL;
+ char *destination_name = NULL;
+ char app_id[128] = {0, };
+ int sender_pid = 0;
+ uid_t sender_uid = 0;
+ int ret = 0;
+
+ g_variant_get(parameters, "(&s&s)", &event_name, &destination_name);
+ _D("event_name(%s), destination_name(%s)", event_name, destination_name);
+
+ if (destination_name && destination_name[0] != '\0') {
+ sender_pid = __get_sender_pid(connection, sender);
+ sender_uid = (uid_t)__get_sender_uid(connection, sender);
+ if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id, sizeof(app_id)) < 0) {
+ result = ES_R_ERROR;
+ } else {
+ ret = __esd_trusted_busname_add_item(sender_uid, app_id, destination_name,
+ sender_pid);
+ if (ret < 0) {
+ _E("failed to add trusted busname item");
+ result = ES_R_ERROR;
+ } else {
+ result = 1;
+ }
+ }
+ } else {
+ _E("invalid destination name");
+ result = ES_R_ERROR;
+ }
+
+ param = g_variant_new("(i)", result);
+ _D("event_name(%s), result(%d)", event_name, result);
+ g_dbus_method_invocation_return_value(invocation, param);
+}
+
+void DbusEventModule::CheckPrivilegeValidMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation) {
+ GVariant *param = NULL;
+ int result = 0;
+ char *event_name = NULL;
+ char *privilege_name = NULL;
+ char app_id[128] = {0, };
+ int sender_pid = 0;
+ uid_t sender_uid = 0;
+ char *client = NULL;
+ char *session = NULL;
+ char *user = NULL;
+ int ret = 0;
+
+ g_variant_get(parameters, "(&s)", &event_name);
+ __esd_check_privilege_name(event_name, &privilege_name);
+ _D("event_name(%s), privilege_name(%s)", event_name, privilege_name);
+
+ if (privilege_name) {
+ sender_pid = __get_sender_pid(connection, sender);
+ sender_uid = (uid_t)__get_sender_uid(connection, sender);
+ if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id, sizeof(app_id)) < 0) {
+ result = ES_R_ERROR;
+ } else {
+ ret = cynara_creds_gdbus_get_client(connection, sender, CLIENT_METHOD_DEFAULT, &client);
+ if (ret != CYNARA_API_SUCCESS) {
+ _E("failed to get client");
+ result = ES_R_EINVAL;
+ goto out;
+ }
+
+ ret = cynara_creds_gdbus_get_user(connection, sender, USER_METHOD_DEFAULT, &user);
+ if (ret != CYNARA_API_SUCCESS) {
+ _E("failed to get user");
+ result = ES_R_EINVAL;
+ goto out;
+ }
+
+ session = cynara_session_from_pid(sender_pid);
+ if (session == NULL) {
+ _E("failed to get session");
+ result = ES_R_EINVAL;
+ goto out;
+ }
+
+ _D("app_id(%s), client(%s), session(%s), user(%s)", app_id, client, session, user);
+ if (__esd_check_valid_privilege_by_cynara(app_id, client, session, user, privilege_name))
+ result = 1;
+ else
+ result = ES_R_EINVAL;
+ }
+ } else {
+ result = 1;
+ }
+
+out:
+ g_free(client);
+ g_free(user);
+ g_free(session);
+ param = g_variant_new("(i)", result);
+ _D("event_name(%s), result(%d)", event_name, result);
+ g_dbus_method_invocation_return_value(invocation, param);
+}
+
+void DbusEventModule::GetEarlierDataMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation) {
+ GVariant *param = NULL;
+ int result = ES_R_ERROR;
+ char *event_name = NULL;
+ bundle *b = NULL;
+ bundle_raw *raw = NULL;
+ int len = 0;
+ earlier_item *item;
+
+ g_variant_get(parameters, "(&s)", &event_name);
+ _D("event_name(%s)", event_name);
+
+ item = (earlier_item *)g_hash_table_lookup(earlier_event_table, event_name);
+ if (item != NULL) {
+ if (item->earlier_data) {
+ b = bundle_dup(item->earlier_data);
+ bundle_add_str(b, "is_earlier_data", "true");
+ result = ES_R_OK;
+ }
+ }
+
+ if (result == ES_R_ERROR)
+ b = bundle_create();
+
+ bundle_encode(b, &raw, &len);
+ bundle_free(b);
+
+ param = g_variant_new("(iis)", result, len, raw);
+
+ _D("result(%d), len(%d)", result, len);
+ g_dbus_method_invocation_return_value(invocation, param);
+
+ bundle_free_encoded_rawdata(&raw);
+}
+
+void DbusEventModule::KeepLastDataMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation) {
+ GVariant *param;
+ int result = ES_R_OK;
+ char *event_name;
+ char *own_name;
+ char *key;
+ char app_id[128];
+ int sender_pid;
+ uid_t sender_uid;
+ struct __last_event_item *item;
+
+ g_variant_get(parameters, "(&s&s)", &event_name, &own_name);
+
+ if (!event_name || !own_name) {
+ result = ES_R_ERROR;
+ _E("invalid event_name and own_name");
+ goto out;
+ }
+
+ sender_pid = __get_sender_pid(connection, sender);
+ sender_uid = (uid_t)__get_sender_uid(connection, sender);
+ if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id,
+ sizeof(app_id)) < 0) {
+ _E("failed to get appid by pid");
+ result = ES_R_ERROR;
+ goto out;
+ }
+
+ key = (char *)malloc(sizeof(event_name) + 10);
+ if (!key) {
+ result = ES_R_ENOMEM;
+ _E("out of memory");
+ goto out;
+ }
+
+ snprintf(key, sizeof(event_name) + 10, "%s_%d", event_name, sender_uid);
+ item = (struct __last_event_item *)g_hash_table_lookup(user_last_event_table,
+ key);
+ if (!item) {
+ item = (struct __last_event_item *)calloc(1, sizeof(*item));
+ if (!item) {
+ result = ES_R_ERROR;
+ goto out;
+ }
+ item->key = key;
+ item->event_name = strdup(event_name);
+ item->own_name = strdup(own_name);
+ item->uid = sender_uid;
+ item->app_id = strdup(app_id);
+ g_hash_table_insert(user_last_event_table,
+ item->key, item);
+ } else {
+ free(item->own_name);
+ item->own_name = strdup(own_name);
+ }
+
+out:
+ param = g_variant_new("(i)", result);
+
+ g_dbus_method_invocation_return_value(invocation, param);
+}
+
+void DbusEventModule::CheckLastDataMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation) {
+ GVariant *param;
+ int result = ES_R_OK;
+ char *event_name;
+ char *own_name;
+ char *key;
+ char app_id[128];
+ int sender_pid;
+ uid_t sender_uid;
+ struct __last_event_item *item;
+
+ g_variant_get(parameters, "(&s&s)", &event_name, &own_name);
+
+ if (!event_name || !own_name) {
+ result = ES_R_ERROR;
+ _E("invalid event_name and own_name");
+ goto out;
+ }
+
+ sender_pid = __get_sender_pid(connection, sender);
+ sender_uid = (uid_t)__get_sender_uid(connection, sender);
+ if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id,
+ sizeof(app_id)) < 0) {
+ result = ES_R_ERROR;
+ _E("failed to get appid by pid");
+ goto out;
+ }
+
+ key = (char *)malloc(sizeof(event_name) + 10);
+ if (!key) {
+ result = ES_R_ENOMEM;
+ _E("out of memory");
+ goto out;
+ }
+
+ snprintf(key, sizeof(event_name) + 10, "%s_%d", event_name, sender_uid);
+ item = (struct __last_event_item *)g_hash_table_lookup(user_last_event_table,
+ key);
+ free(key);
+ if (item) {
+ GVariant *gv;
+ bundle *b;
+ bundle_raw *raw;
+ int len;
+ int ret;
+ GError *error = NULL;
+
+ b = bundle_create();
+ if (!b) {
+ result = ES_R_ERROR;
+ goto out;
+ }
+ bundle_add_str(b, EVT_KEY_KEPT_EVENT_NAME, event_name);
+ bundle_add_str(b, EVT_KEY_KEPT_OWN_NAME, own_name);
+ if (__esd_check_certificate_match(item->uid, item->app_id,
+ sender_uid, app_id) == ES_R_OK)
+ bundle_add_str(b, EVT_KEY_KEPT_IS_TRUSTED, "true");
+ else
+ bundle_add_str(b, EVT_KEY_KEPT_IS_TRUSTED, "false");
+
+ bundle_encode(b, &raw, &len);
+ gv = g_variant_new("(us)", len, raw);
+ ret = g_dbus_connection_emit_signal(connection,
+ item->own_name,
+ SYS_EVENT_OBJ_PATH,
+ SYS_EVENT_NAME_PREFIX,
+ REQUEST_LAST_DATA,
+ gv,
+ &error);
+ if (ret == FALSE) {
+ _E("Unable to emit signal: %s", error->message);
+ g_error_free(error);
+ }
+ bundle_free_encoded_rawdata(&raw);
+ bundle_free(b);
+ }
+
+out:
+ param = g_variant_new("(i)", result);
+
+ g_dbus_method_invocation_return_value(invocation, param);
+}
+
+void DbusEventModule::LaunchOnEventFromUserEventMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation) {
+ GVariant *param;
+ int result = ES_R_OK;
+ int len;
+ gboolean trusted;
+ int sender_pid;
+ uid_t sender_uid;
+ char *event_name;
+ char app_id[128];
+ char *buf;
+ bundle *b;
+
+ g_variant_get(parameters, "(&s&sib)", &event_name, &buf, &len, &trusted);
+
+ if (!event_name) {
+ result = ES_R_ERROR;
+ _E("invalid event_name");
+ goto out;
+ }
+
+ sender_pid = __get_sender_pid(connection, sender);
+ sender_uid = (uid_t)__get_sender_uid(connection, sender);
+ if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id,
+ sizeof(app_id)) < 0) {
+ _E("failed to get appid by pid");
+ result = ES_R_ERROR;
+ goto out;
+ }
+
+ b = bundle_decode((bundle_raw *)buf, len);
+ if (b == NULL) {
+ _E("Out of memory");
+ result = ES_R_ENOMEM;
+ goto out;
+ }
+
+ __esd_launch_event_handler(event_name, b, true, trusted,
+ sender_uid, app_id, NULL);
+
+ bundle_free(b);
+
+out:
+ param = g_variant_new("(i)", result);
+
+ g_dbus_method_invocation_return_value(invocation, param);
+}
+
+void DbusEventModule::GetUuidMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation) {
+ GVariant* param = nullptr;
+ int result = ES_R_OK;
+ std::optional<std::string> uuid;
+
+ std::string app_id = GetSenderAppId(connection, sender);
+ if (app_id.empty()) {
+ param = g_variant_new("(is)", ES_R_ERROR, "");
+ g_dbus_method_invocation_return_value(invocation, param);
+ return;
+ }
+
+ if (tools_->GetMethodBroker().Invoke("Cion.GetUuidWithGenerate",
+ app_id, uuid)) {
+ param = g_variant_new("(is)", ES_R_OK, (*uuid).c_str());
+ } else {
+ result = ES_R_ERROR;
+ }
+
+ if (param == nullptr)
+ param = g_variant_new("(is)", result, "");
+
+ g_dbus_method_invocation_return_value(invocation, param);
+}
+
+void DbusEventModule::SetDisplayNameMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation) {
+ GVariant* param = nullptr;
+ int result = ES_R_OK;
+ char* display_name = nullptr;
+ char* service_name = nullptr;
+ int ret = 0;
+
+ std::string app_id = GetSenderAppId(connection, sender);
+ if (app_id.empty()) {
+ param = g_variant_new("(i)", ES_R_ERROR);
+ g_dbus_method_invocation_return_value(invocation, param);
+ return;
+ }
+
+ g_variant_get(parameters, "(&s&s)", &service_name, &display_name);
+
+ if (!tools_->GetMethodBroker().Invoke("Cion.SetDisplayName", app_id,
+ service_name, display_name, ret)) {
+ result = ES_R_ERROR;
+ }
+
+ if (ret != 0)
+ result = ES_R_ERROR;
+
+ param = g_variant_new("(i)", result);
+ g_dbus_method_invocation_return_value(invocation, param);
+}
+
+void DbusEventModule::GetDisplayNameMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation) {
+ GVariant* param = nullptr;
+ int result = ES_R_OK;
+ char* service_name = nullptr;
+ std::string display_name;
+ int ret = -1;
+
+ std::string app_id = GetSenderAppId(connection, sender);
+ if (app_id.empty()) {
+ param = g_variant_new("(is)", ES_R_ERROR, "");
+ g_dbus_method_invocation_return_value(invocation, param);
+ return;
+ }
+
+ g_variant_get(parameters, "(&s)", &service_name);
+
+ if (tools_->GetMethodBroker().Invoke("Cion.GetDisplayName",
+ app_id.c_str(), service_name, display_name, ret)) {
+ if (ret == 0)
+ param = g_variant_new("(is)", result, display_name);
+ } else {
+ result = ES_R_ERROR;
+ }
+
+ if (param == nullptr)
+ param = g_variant_new("(is)", result, "");
+
+ g_dbus_method_invocation_return_value(invocation, param);
+}
+
+void DbusEventModule::SetEnabledMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation) {
+ GVariant* param = nullptr;
+ int result = ES_R_OK;
+ gboolean enabled;
+ char* service_name = nullptr;
+ int ret = -1;
+
+ std::string app_id = GetSenderAppId(connection, sender);
+ if (app_id.empty()) {
+ param = g_variant_new("(i)", ES_R_ERROR);
+ g_dbus_method_invocation_return_value(invocation, param);
+ return;
+ }
+
+ g_variant_get(parameters, "(&sb)", &service_name, &enabled);
+
+ if (!tools_->GetMethodBroker().Invoke("Cion.SetEnabled", app_id,
+ service_name, (bool)enabled, ret)) {
+ result = ES_R_ERROR;
+ }
+
+ if (ret != 0)
+ result = ES_R_ERROR;
+
+ param = g_variant_new("(i)", result);
+ g_dbus_method_invocation_return_value(invocation, param);
+}
+
+void DbusEventModule::GetEnabledMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation) {
+ GVariant* param = nullptr;
+ int result = ES_R_OK;
+ char* service_name = nullptr;
+ bool enabled = false;
+ int ret = -1;
+
+ std::string app_id = GetSenderAppId(connection, sender);
+ if (app_id.empty()) {
+ param = g_variant_new("(ib)", ES_R_ERROR, false);
+ g_dbus_method_invocation_return_value(invocation, param);
+ return;
+ }
+
+ g_variant_get(parameters, "(&s)", &service_name);
+ if (!tools_->GetMethodBroker().Invoke("Cion.GetEnabled", app_id,
+ service_name, enabled, ret)) {
+ result = ES_R_ERROR;
+ } else if (ret != 0) {
+ result = ES_R_ERROR;
+ } else {
+ param = g_variant_new("(ib)", result, enabled);
+ }
+
+ if (param == nullptr)
+ param = g_variant_new("(ib)", result, false);
+
+ g_dbus_method_invocation_return_value(invocation, param);
+}
+
+
+} // namespace esd::module
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef EVENTSYSTEM_MODULES_DBUS_EVENT_DBUS_EVENT_MODULE_HH_
+#define EVENTSYSTEM_MODULES_DBUS_EVENT_DBUS_EVENT_MODULE_HH_
+
+#include <glib.h>
+#include <gio/gio.h>
+
+#include <imodule.hh>
+
+namespace esd::module {
+
+class DbusEventModule : public api::IModule {
+ public:
+ DbusEventModule() = default;
+ virtual ~DbusEventModule() = default;
+
+ bool Startup(api::ToolBox* tools) override;
+ void Shutdown() override;
+
+ static void HandleMethodCallCb(GDBusConnection *connection,
+ const gchar *sender, const gchar *object_path,
+ const gchar *interface_name, const gchar *method_name,
+ GVariant *parameters, GDBusMethodInvocation *invocation,
+ gpointer user_data);
+
+ private:
+ bool Init();
+ void Fini();
+ bool BeforeLoop();
+ void GetUuidMethodCall(GDBusConnection* connection, const gchar* sender,
+ GVariant* parameters, GDBusMethodInvocation* invocation);
+ void SetDisplayNameMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters, GDBusMethodInvocation* invocation);
+ void GetDisplayNameMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation);
+ void SetEnabledMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation);
+ void GetEnabledMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation);
+ void CheckSenderValidMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation);
+ void GetTrustedPeerMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation);
+ void SetupTrustedPeerMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation);
+ void CheckPrivilegeValidMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation);
+ void GetEarlierDataMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation);
+ void KeepLastDataMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation);
+ void CheckLastDataMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation);
+ void LaunchOnEventFromUserEventMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation);
+ void CheckSendEventValidMethodCall(GDBusConnection* connection,
+ const gchar* sender, GVariant* parameters,
+ GDBusMethodInvocation* invocation);
+ std::string GetSenderAppId(GDBusConnection* connection, const gchar* sender);
+
+ private:
+ api::ToolBox* tools_ = nullptr;
+};
+
+} // namespace esd::module
+
+#endif // EVENTSYSTEM_MODULES_DBUS_EVENT_DBUS_EVENT_MODULE_HH_
\ No newline at end of file
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <glib.h>
+#include <vconf.h>
+#include <bundle.h>
+#include <eventsystem.h>
+
+#include <log.hh>
+
+namespace {
+
+/* table item : sent system-event by esd */
+static GHashTable *esd_sent_table;
+
+typedef struct __esd_sent_table_item {
+ char *event_name;
+ bundle *event_data;
+} esd_sent_item;
+
+struct esd_vconf_handler {
+ const char *key;
+ void (*esd_vconfcb_fn) (keynode_t *node, void *user_data);
+};
+
+int __esd_event_data_compare(bundle *b1, bundle *b2, const char *key) {
+ int ret = 0;
+ int tmp1 = 0;
+ int tmp2 = 0;
+ char *str1 = NULL;
+ char *str2 = NULL;
+
+ if (bundle_get_count(b1) == bundle_get_count(b2)) {
+ tmp1 = bundle_get_str(b1, key, &str1);
+ tmp2 = bundle_get_str(b2, key, &str2);
+ if (tmp1 == BUNDLE_ERROR_NONE && tmp2 == BUNDLE_ERROR_NONE) {
+ if (strcmp(str1, str2) != 0) {
+ _D("new event_data : value check");
+ ret = 1;
+ }
+ }
+ } else {
+ _D("new event_data : bundle_count check");
+ ret = 1;
+ }
+
+ if (ret == 0)
+ _D("same event_data");
+
+ return ret;
+}
+
+int __esd_send_system_event(const char *event_name, bundle *b, const char *key) {
+ int ret = ES_R_OK;
+ esd_sent_item *item =
+ (esd_sent_item *)g_hash_table_lookup(esd_sent_table, event_name);
+
+ if (item && __esd_event_data_compare(item->event_data, b, key) == 0) {
+ _D("skip send: same with previous data");
+ } else {
+ ret = eventsystem_send_system_event(event_name, b);
+ if (ret != ES_R_OK) {
+ _E("failed to send event");
+ goto out;
+ }
+
+ if (item) {
+ bundle_free(item->event_data);
+ item->event_data = bundle_dup(b);
+ } else {
+ item = (esd_sent_item *)calloc(1, sizeof(esd_sent_item));
+ if (item == NULL) {
+ _E("memory alloc failed");
+ ret = ES_R_ERROR;
+ goto out;
+ }
+ item->event_name = strdup(event_name);
+ if (item->event_name == NULL) {
+ _E("out of memory");
+ free(item);
+ item = nullptr;
+ ret = ES_R_ERROR;
+ goto out;
+ }
+ item->event_data = bundle_dup(b);
+ }
+
+ g_hash_table_insert(esd_sent_table, item->event_name, item);
+ }
+
+out:
+ return ret;
+}
+
+void __esd_vconfcb_location_use_mylocation(keynode_t *node, void *user_data) {
+ int ret = 0;
+ int enabled = 0;
+ bundle *b = NULL;
+ const char *key = NULL;
+ const char *val = NULL;
+
+ _D("vconfcb called");
+
+ ret = vconf_get_int(VCONFKEY_LOCATION_USE_MY_LOCATION, &enabled);
+ if (ret != VCONF_OK) {
+ _E("failed to get vconf (%d)", ret);
+ return;
+ }
+
+ key = EVT_KEY_LOCATION_ENABLE_STATE;
+
+ if (enabled)
+ val = EVT_VAL_LOCATION_ENABLED;
+ else
+ val = EVT_VAL_LOCATION_DISABLED;
+
+ b = bundle_create();
+ bundle_add_str(b, key, val);
+
+ if (__esd_send_system_event(SYS_EVENT_LOCATION_ENABLE_STATE, b, key) != ES_R_OK)
+ _E("failed to send event");
+
+ if (b)
+ bundle_free(b);
+}
+
+void __esd_vconfcb_location_enabled(keynode_t *node, void *user_data) {
+ int ret = 0;
+ int enabled = 0;
+ bundle *b = NULL;
+ const char *key = NULL;
+ const char *val = NULL;
+
+ _D("vconfcb called");
+
+ ret = vconf_get_int(VCONFKEY_LOCATION_ENABLED, &enabled);
+ if (ret != VCONF_OK) {
+ _E("failed to get vconf (%d)", ret);
+ return;
+ }
+
+ key = EVT_KEY_GPS_ENABLE_STATE;
+
+ if (enabled)
+ val = EVT_VAL_GPS_ENABLED;
+ else
+ val = EVT_VAL_GPS_DISABLED;
+
+ b = bundle_create();
+ bundle_add_str(b, key, val);
+
+ if (__esd_send_system_event(SYS_EVENT_GPS_ENABLE_STATE, b, key) != ES_R_OK)
+ _E("failed to send event");
+
+ if (b)
+ bundle_free(b);
+}
+
+void __esd_vconfcb_location_network_enabled(keynode_t *node, void *user_data) {
+ int ret = 0;
+ int enabled = 0;
+ bundle *b = NULL;
+ const char *key = NULL;
+ const char *val = NULL;
+
+ _D("vconfcb called");
+
+ ret = vconf_get_int(VCONFKEY_LOCATION_NETWORK_ENABLED, &enabled);
+ if (ret != VCONF_OK) {
+ _E("failed to get vconf (%d)", ret);
+ return;
+ }
+
+ key = EVT_KEY_NPS_ENABLE_STATE;
+
+ if (enabled)
+ val = EVT_VAL_NPS_ENABLED;
+ else
+ val = EVT_VAL_NPS_DISABLED;
+
+ b = bundle_create();
+ bundle_add_str(b, key, val);
+
+ if (__esd_send_system_event(SYS_EVENT_NPS_ENABLE_STATE, b, key) != ES_R_OK)
+ _E("failed to send event");
+
+ if (b)
+ bundle_free(b);
+}
+
+void __esd_vconfcb_language_set(keynode_t *node, void *user_data) {
+ char *str = 0;
+ bundle *b = NULL;
+ const char *key = NULL;
+
+ _D("vconfcb called");
+
+ str = vconf_get_str(VCONFKEY_LANGSET);
+ if (str == NULL) {
+ _E("failed to get vconf str");
+ return;
+ }
+
+ key = EVT_KEY_LANGUAGE_SET;
+
+ b = bundle_create();
+ bundle_add_str(b, key, str);
+
+ if (__esd_send_system_event(SYS_EVENT_LANGUAGE_SET, b, key) != ES_R_OK)
+ _E("failed to send event");
+
+ if (b)
+ bundle_free(b);
+ if (str)
+ free(str);
+}
+
+void __esd_vconfcb_hour_format(keynode_t *node, void *user_data) {
+ int ret = 0;
+ int hours = 0;
+ bundle *b = NULL;
+ const char *key = NULL;
+ const char *val = NULL;
+
+ _D("vconfcb called");
+
+ ret = vconf_get_int(VCONFKEY_REGIONFORMAT_TIME1224, &hours);
+ if (ret != VCONF_OK) {
+ _E("failed to get vconf (%d)", ret);
+ return;
+ }
+
+ key = EVT_KEY_HOUR_FORMAT;
+
+ if (hours == VCONFKEY_TIME_FORMAT_24)
+ val = EVT_VAL_HOURFORMAT_24;
+ else
+ val = EVT_VAL_HOURFORMAT_12;
+
+ b = bundle_create();
+ bundle_add_str(b, key, val);
+
+ if (__esd_send_system_event(SYS_EVENT_HOUR_FORMAT, b, key) != ES_R_OK)
+ _E("failed to send event");
+
+ if (b)
+ bundle_free(b);
+}
+
+void __esd_vconfcb_region_format(keynode_t *node, void *user_data) {
+ char *str = 0;
+ bundle *b = NULL;
+ const char *key = NULL;
+
+ _D("vconfcb called");
+
+ str = vconf_get_str(VCONFKEY_REGIONFORMAT);
+ if (str == NULL) {
+ _E("failed to get vconf str");
+ return;
+ }
+
+ key = EVT_KEY_REGION_FORMAT;
+
+ b = bundle_create();
+ bundle_add_str(b, key, str);
+
+ if (__esd_send_system_event(SYS_EVENT_REGION_FORMAT, b, key) != ES_R_OK)
+ _E("failed to send event");
+
+ if (b)
+ bundle_free(b);
+ if (str)
+ free(str);
+}
+
+void __esd_vconfcb_vibration_status(keynode_t *node, void *user_data) {
+ int ret = 0;
+ int vibration_on = 0;
+ int sound_on = 0;
+ bundle *b = NULL;
+ char *key = NULL;
+ char *val = NULL;
+
+ _D("vconfcb called");
+
+ ret = vconf_get_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, &vibration_on);
+ if (ret != VCONF_OK) {
+ _E("failed to get vconf (%d)", ret);
+ return;
+ }
+
+ ret = vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &sound_on);
+ if (ret != VCONF_OK) {
+ _E("failed to get vconf (%d)", ret);
+ return;
+ }
+
+ if (vibration_on) {
+ key = EVT_KEY_VIBRATION_STATE;
+ val = EVT_VAL_VIBRATION_ON;
+ b = bundle_create();
+ bundle_add_str(b, key, val);
+ if (__esd_send_system_event(SYS_EVENT_VIBRATION_STATE, b, key) != ES_R_OK)
+ _E("failed to send event");
+
+ if (b)
+ bundle_free(b);
+
+ key = EVT_KEY_SILENT_MODE;
+ val = EVT_VAL_SILENTMODE_OFF;
+ b = bundle_create();
+ bundle_add_str(b, key, val);
+ if (__esd_send_system_event(SYS_EVENT_SILENT_MODE, b, key) != ES_R_OK)
+ _E("failed to send event");
+
+ if (b)
+ bundle_free(b);
+ } else {
+ key = EVT_KEY_VIBRATION_STATE;
+ val = EVT_VAL_VIBRATION_OFF;
+ b = bundle_create();
+ bundle_add_str(b, key, val);
+ if (__esd_send_system_event(SYS_EVENT_VIBRATION_STATE, b, key) != ES_R_OK)
+ _E("failed to send event");
+
+ if (b)
+ bundle_free(b);
+
+ if (!sound_on) {
+ key = EVT_KEY_SILENT_MODE;
+ val = EVT_VAL_SILENTMODE_ON;
+ b = bundle_create();
+ bundle_add_str(b, key, val);
+ if (__esd_send_system_event(SYS_EVENT_SILENT_MODE, b, key) != ES_R_OK)
+ _E("failed to send event");
+
+ if (b)
+ bundle_free(b);
+ }
+ }
+}
+
+void __esd_vconfcb_sound_status(keynode_t *node, void *user_data) {
+ int ret = 0;
+ int vibration_on = 0;
+ int sound_on = 0;
+ bundle *b = NULL;
+ char *key = NULL;
+ char *val = NULL;
+
+ _D("vconfcb called");
+
+ ret = vconf_get_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, &vibration_on);
+ if (ret != VCONF_OK) {
+ _E("failed to get vconf (%d)", ret);
+ return;
+ }
+
+ ret = vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &sound_on);
+ if (ret != VCONF_OK) {
+ _E("failed to get vconf (%d)", ret);
+ return;
+ }
+
+ if (sound_on) {
+ key = EVT_KEY_VIBRATION_STATE;
+ val = EVT_VAL_VIBRATION_OFF;
+ b = bundle_create();
+ bundle_add_str(b, key, val);
+ if (__esd_send_system_event(SYS_EVENT_VIBRATION_STATE, b, key) != ES_R_OK)
+ _E("failed to send event");
+
+ if (b)
+ bundle_free(b);
+
+ key = EVT_KEY_SILENT_MODE;
+ val = EVT_VAL_SILENTMODE_OFF;
+ b = bundle_create();
+ bundle_add_str(b, key, val);
+ if (__esd_send_system_event(SYS_EVENT_SILENT_MODE, b, key) != ES_R_OK)
+ _E("failed to send event");
+
+ if (b)
+ bundle_free(b);
+ } else {
+ if (!vibration_on) {
+ key = EVT_KEY_SILENT_MODE;
+ val = EVT_VAL_SILENTMODE_ON;
+ b = bundle_create();
+ bundle_add_str(b, key, val);
+ if (__esd_send_system_event(SYS_EVENT_SILENT_MODE, b, key) != ES_R_OK)
+ _E("failed to send event");
+
+ if (b)
+ bundle_free(b);
+ }
+ }
+}
+
+void __esd_vconfcb_auto_rotate(keynode_t *node, void *user_data) {
+ int ret = 0;
+ int enabled = 0;
+ bundle *b = NULL;
+ const char *key = NULL;
+ const char *val = NULL;
+
+ _D("vconfcb called");
+
+ ret = vconf_get_bool(VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, &enabled);
+ if (ret != VCONF_OK) {
+ _E("failed to get vconf (%d)", ret);
+ return;
+ }
+
+ key = EVT_KEY_SCREEN_AUTOROTATE_STATE;
+
+ if (enabled)
+ val = EVT_VAL_SCREEN_AUTOROTATE_ON;
+ else
+ val = EVT_VAL_SCREEN_AUTOROTATE_OFF;
+
+ b = bundle_create();
+ bundle_add_str(b, key, val);
+
+ if (__esd_send_system_event(SYS_EVENT_SCREEN_AUTOROTATE_STATE, b, key) != ES_R_OK)
+ _E("failed to send event");
+
+ if (b)
+ bundle_free(b);
+}
+
+void __esd_vconfcb_mobiledata_state(keynode_t *node, void *user_data) {
+ int ret = 0;
+ int enabled = 0;
+ bundle *b = NULL;
+ const char *key = NULL;
+ const char *val = NULL;
+
+ _D("vconfcb called");
+
+ ret = vconf_get_bool(VCONFKEY_3G_ENABLE, &enabled);
+ if (ret != VCONF_OK) {
+ _E("failed to get vconf (%d)", ret);
+ return;
+ }
+
+ key = EVT_KEY_MOBILE_DATA_STATE;
+
+ if (enabled)
+ val = EVT_VAL_MOBILE_DATA_ON;
+ else
+ val = EVT_VAL_MOBILE_DATA_OFF;
+
+ b = bundle_create();
+ bundle_add_str(b, key, val);
+
+ if (__esd_send_system_event(SYS_EVENT_MOBILE_DATA_STATE, b, key) != ES_R_OK)
+ _E("failed to send event");
+
+ if (b)
+ bundle_free(b);
+}
+
+void __esd_vconfcb_roaming_state(keynode_t *node, void *user_data) {
+ int ret = 0;
+ int enabled = 0;
+ bundle *b = NULL;
+ const char *key = NULL;
+ const char *val = NULL;
+
+ _D("vconfcb called");
+
+ ret = vconf_get_bool(VCONFKEY_SETAPPL_STATE_DATA_ROAMING_BOOL, &enabled);
+ if (ret != VCONF_OK) {
+ _E("failed to get vconf (%d)", ret);
+ return;
+ }
+
+ key = EVT_KEY_DATA_ROAMING_STATE;
+
+ if (enabled)
+ val = EVT_VAL_DATA_ROAMING_ON;
+ else
+ val = EVT_VAL_DATA_ROAMING_OFF;
+
+ b = bundle_create();
+ bundle_add_str(b, key, val);
+
+ if (__esd_send_system_event(SYS_EVENT_DATA_ROAMING_STATE, b, key) != ES_R_OK)
+ _E("failed to send event");
+
+ if (b)
+ bundle_free(b);
+}
+
+void __esd_vconfcb_font_set(keynode_t *node, void *user_data) {
+ char *str = 0;
+ bundle *b = NULL;
+ const char *key = NULL;
+
+ _D("vconfcb called");
+
+ str = vconf_get_str(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_NAME);
+ if (str == NULL) {
+ _E("failed to get vconf str");
+ return;
+ }
+
+ key = EVT_KEY_FONT_SET;
+
+ b = bundle_create();
+ bundle_add_str(b, key, str);
+
+ if (__esd_send_system_event(SYS_EVENT_FONT_SET, b, key) != ES_R_OK)
+ _E("failed to send event");
+
+ if (b)
+ bundle_free(b);
+ if (str)
+ free(str);
+}
+
+struct esd_vconf_handler vconf_callbacks[] = {
+ {VCONFKEY_LOCATION_USE_MY_LOCATION, __esd_vconfcb_location_use_mylocation},
+ {VCONFKEY_LOCATION_ENABLED, __esd_vconfcb_location_enabled},
+ {VCONFKEY_LOCATION_NETWORK_ENABLED, __esd_vconfcb_location_network_enabled},
+ {VCONFKEY_LANGSET, __esd_vconfcb_language_set},
+ {VCONFKEY_REGIONFORMAT_TIME1224, __esd_vconfcb_hour_format},
+ {VCONFKEY_REGIONFORMAT, __esd_vconfcb_region_format},
+ {VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, __esd_vconfcb_vibration_status},
+ {VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, __esd_vconfcb_sound_status},
+ {VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, __esd_vconfcb_auto_rotate},
+ {VCONFKEY_3G_ENABLE, __esd_vconfcb_mobiledata_state},
+ {VCONFKEY_SETAPPL_STATE_DATA_ROAMING_BOOL, __esd_vconfcb_roaming_state},
+ {VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_NAME, __esd_vconfcb_font_set},
+};
+
+int vconfcbs_size = sizeof(vconf_callbacks)/sizeof(struct esd_vconf_handler);
+
+} // namespace
+
+int __esd_register_vconf_callbacks() {
+ int i = 0;
+ int ret = 0;
+ int result = ES_R_OK;
+
+ esd_sent_table = g_hash_table_new(g_str_hash, g_str_equal);
+
+ _D("vconf callbacks size(%d)", vconfcbs_size);
+ for (i = 0; i < vconfcbs_size; i++) {
+ ret = vconf_notify_key_changed(vconf_callbacks[i].key,
+ vconf_callbacks[i].esd_vconfcb_fn, NULL);
+ if (ret != VCONF_OK) {
+ _E("failed to register vconf callback (%s)", vconf_callbacks[i].key);
+ result = ES_R_ERROR;
+ break;
+ }
+ }
+
+ return result;
+}
--- /dev/null
+/*
+* Copyright (c) 2022 Samsung Electronics Co., Ltd.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+constexpr const char INTROSPECTION_XML[] = R"__esd(
+<node>
+ <interface name='tizen.system.event.app2esd'>
+ <method name='CheckSenderValidation'>
+ <arg type='i' name='senderpid' direction='in'/>
+ <arg type='s' name='eventname' direction='in'/>
+ <arg type='i' name='ret' direction='out'/>
+ <arg type='s' name='senderid' direction='out'/>
+ </method>
+ <method name='GetTrustedPeerList'>
+ <arg type='s' name='eventname' direction='in'/>
+ <arg type='i' name='ret' direction='out'/>
+ <arg type='as' name='dest_list' direction='out'/>
+ </method>
+ <method name='SetupTrustedPeer'>
+ <arg type='s' name='eventname' direction='in'/>
+ <arg type='s' name='destination' direction='in'/>
+ <arg type='i' name='ret' direction='out'/>
+ </method>
+ <method name='CheckPrivilegeValidation'>
+ <arg type='s' name='eventname' direction='in'/>
+ <arg type='i' name='ret' direction='out'/>
+ </method>
+ <method name='CheckUserSendValidation'>
+ <arg type='s' name='eventname' direction='in'/>
+ <arg type='i' name='ret' direction='out'/>
+ </method>
+ <method name='RequestTrustedEventLaunch'>
+ <arg type='s' name='eventname' direction='in'/>
+ <arg type='s' name='eventdata' direction='in'/>
+ <arg type='i' name='datalen' direction='in'/>
+ <arg type='i' name='ret' direction='out'/>
+ </method>
+ <method name='RequestEventLaunch'>
+ <arg type='s' name='eventname' direction='in'/>
+ <arg type='s' name='eventdata' direction='in'/>
+ <arg type='i' name='datalen' direction='in'/>
+ <arg type='i' name='ret' direction='out'/>
+ </method>
+ <method name='RequestSendingEvent'>
+ <arg type='s' name='eventname' direction='in'/>
+ <arg type='s' name='eventdata' direction='in'/>
+ <arg type='i' name='datalen' direction='in'/>
+ <arg type='i' name='ret' direction='out'/>
+ </method>
+ <method name='GetEarlierData'>
+ <arg type='s' name='appid' direction='in'/>
+ <arg type='i' name='ret' direction='out'/>
+ <arg type='i' name='len' direction='out'/>
+ <arg type='s' name='earlier_data' direction='out'/>
+ </method>
+ <method name='KeepLastData'>
+ <arg type='s' name='eventname' direction='in'/>
+ <arg type='s' name='own_name' direction='in'/>
+ <arg type='i' name='ret' direction='out'/>
+ </method>
+ <method name='CheckLastData'>
+ <arg type='s' name='eventname' direction='in'/>
+ <arg type='s' name='own_name' direction='in'/>
+ <arg type='i' name='ret' direction='out'/>
+ </method>
+ <method name='LaunchOnEventFromUserEvent'>
+ <arg type='s' name='eventname' direction='in'/>
+ <arg type='s' name='eventdata' direction='in'/>
+ <arg type='i' name='datalen' direction='in'/>
+ <arg type='b' name='trusted' direction='in'/>
+ <arg type='i' name='ret' direction='out'/>
+ </method>
+ <method name='CionGetUuid'>
+ <arg type='i' name='ret' direction='out'/>
+ <arg type='s' name='uuid' direction='out'/>
+ </method>
+ <method name='CionSetDisplayName'>
+ <arg type='s' name='service_name' direction='in'/>
+ <arg type='s' name='display_name' direction='in'/>
+ <arg type='i' name='ret' direction='out'/>
+ </method>
+ <method name='CionGetDisplayName'>
+ <arg type='s' name='service_name' direction='in'/>
+ <arg type='i' name='ret' direction='out'/>
+ <arg type='s' name='display_name' direction='out'/>
+ </method>
+ <method name='CionSetEnabled'>
+ <arg type='s' name='service_name' direction='in'/>
+ <arg type='b' name='enabled' direction='in'/>
+ <arg type='i' name='ret' direction='out'/>
+ </method>
+ <method name='CionGetEnabled'>
+ <arg type='s' name='service_name' direction='in'/>
+ <arg type='i' name='ret' direction='out'/>
+ <arg type='b' name='enabled' direction='out'/>
+ </method>
+ </interface>
+</node>
+)__esd";