From: Bartlomiej Grzelewski Date: Thu, 7 Aug 2014 12:23:45 +0000 (+0200) Subject: First implementation of ckm-listener-daemon. X-Git-Tag: accepted/tizen/common/20140925.172038~27 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4df3687bb88d0b9793c9794696e163759e34dd3c;p=platform%2Fcore%2Fsecurity%2Fkey-manager.git First implementation of ckm-listener-daemon. Change-Id: I80bb8dd113568a7059755a0d1a446c9feae25e6b --- diff --git a/CMakeLists.txt b/CMakeLists.txt index dc38ff6..4d83b58 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,6 +63,7 @@ SET(TARGET_KEY_MANAGER_CLIENT "key-manager-client") SET(TARGET_KEY_MANAGER_CONTROL_CLIENT "key-manager-control-client") SET(TARGET_KEY_MANAGER_COMMON "key-manager-commons") SET(TARGET_KEY_MANAGER_KEY_PROVIDER "key-manager-key-provider") +SET(TARGET_LISTENER "key-manager-listener") SET(TARGET_TEST_MERGED "ckm-tests-internal") diff --git a/packaging/key-manager.spec b/packaging/key-manager.spec index f5137b0..f1ac51d 100755 --- a/packaging/key-manager.spec +++ b/packaging/key-manager.spec @@ -13,6 +13,8 @@ BuildRequires: libattr-devel BuildRequires: pkgconfig(libsmack) BuildRequires: pkgconfig(libsystemd-daemon) BuildRequires: pkgconfig(db-util) +BuildRequires: pkgconfig(capi-appfw-package-manager) +BuildRequires: pkgconfig(glib-2.0) BuildRequires: boost-devel Requires: boost-test %{?systemd_requires} @@ -123,6 +125,7 @@ fi %files -n key-manager %manifest %{_datadir}/key-manager.manifest %attr(755,root,root) /usr/bin/key-manager +%attr(755,root,root) /usr/bin/key-manager-listener %{_libdir}/libkey-manager-commons.so* %{_libdir}/libkey-manager-key-provider.so* %attr(-,root,root) /usr/lib/systemd/system/multi-user.target.wants/central-key-manager.service diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6d54883..86f1344 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -207,3 +207,4 @@ INSTALL(FILES ################################################################################ ADD_SUBDIRECTORY(manager) +ADD_SUBDIRECTORY(listener) diff --git a/src/listener/CMakeLists.txt b/src/listener/CMakeLists.txt new file mode 100644 index 0000000..b3e1328 --- /dev/null +++ b/src/listener/CMakeLists.txt @@ -0,0 +1,24 @@ +PKG_CHECK_MODULES(LISTENER_DEP + REQUIRED + dlog + glib-2.0 + capi-appfw-package-manager + ) + +SET(LISTENER_SOURCES ${PROJECT_SOURCE_DIR}/src/listener/listener-daemon.cpp) + +INCLUDE_DIRECTORIES( + ${PROJECT_SOURCE_DIR}/src/include + ${LISTENER_DEP_INCLUDE_DIRS} + ) + +ADD_EXECUTABLE(${TARGET_LISTENER} ${LISTENER_SOURCES}) + +TARGET_LINK_LIBRARIES( + ${TARGET_LISTENER} + ${LISTENER_DEP_LIBRARIES} + ${TARGET_KEY_MANAGER_CLIENT} + ${TARGET_KEY_MANAGER_CONTROL_CLIENT} + ) + +INSTALL(TARGETS ${TARGET_LISTENER} DESTINATION bin) diff --git a/src/listener/listener-daemon.cpp b/src/listener/listener-daemon.cpp new file mode 100644 index 0000000..bf5ea95 --- /dev/null +++ b/src/listener/listener-daemon.cpp @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define CKM_TAG "CKM_LISTENER" + +void eventCallback( + const char *type, + const char *package, + package_manager_event_type_e eventType, + package_manager_event_state_e eventState, + int progress, + package_manager_error_e error, + void *userData) +{ + (void) type; + (void) progress; + (void) error; + (void) userData; + + if (eventType != PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL) + return; + + if (eventState != PACKAGE_MANAGER_EVENT_STATE_STARTED) + return; + + if (package == NULL) + return; + + SLOG(LOG_DEBUG, CKM_TAG, "Get callback. Uninstalation of: %s", package); + auto control = CKM::Control::create(); + control->removeApplicationData(std::string(package)); +} + +int main(void) { + SLOG(LOG_DEBUG, CKM_TAG, "%s", "Start!"); + + // Let's operate in background + int result = fork(); + if (result < 0){ + SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in fork!"); + exit(1); + } + + if (result > 0) + exit(0); + + // Let's disconnect from terminal + if (-1 == setsid()) { + SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in fork!"); + exit(1); + } + + // Let's close all descriptors +// for (result = getdtablesize(); result>=0; --result) +// close(result); + +// result = open("/dev/null", O_RDWR); // open stdin +// dup(result); // stdout +// dup(result); // stderr + + umask(027); + + // Let's change current directory + if (-1 == chdir("/")) { + SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in chdir!"); + exit(1); + } + + // Let's create lock file + result = open("/tmp/ckm-listener.lock", O_RDWR | O_CREAT, 0640); + if (result < 0) { + SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in opening lock file!"); + exit(1); + } + + if (lockf(result, F_TLOCK, 0) < 0) { + SLOG(LOG_DEBUG, CKM_TAG, "%s", "Daemon already working!"); + exit(0); + } + + char str[100]; + sprintf(str, "%d\n", getpid()); + result = write(result, str, strlen(str)); + + SLOG(LOG_DEBUG, CKM_TAG, "%s", str); + + // Let's start to listen + GMainLoop *main_loop = g_main_loop_new(NULL, FALSE); + package_manager_h request; + + package_manager_create(&request); + if (0 != package_manager_set_event_cb(request, eventCallback, NULL)) { + SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in package_manager_set_event_cb"); + exit(-1); + } + + /* Change file mode mask */ + + SLOG(LOG_DEBUG, CKM_TAG, "%s", "Ready to listen!"); + g_main_loop_run(main_loop); + return 0; +} +