10 #include <systemd/sd-daemon.h>
13 #include <package_manager.h>
14 #include <ckm/ckm-control.h>
15 #include <ckm/ckm-type.h>
16 #include <vconf/vconf.h>
19 #define CKM_LISTENER_TAG "CKM_LISTENER"
21 #ifndef VCONFKEY_SECURITY_MDPP_STATE
22 #define VCONFKEY_SECURITY_MDPP_STATE "file/security_mdpp/security_mdpp_state"
26 const char* const CKM_LOCK = "/var/run/key-manager.pid";
27 const char* const LISTENER_LOCK = "/var/run/key-manager-listener.pid";
32 // Let's operate in background
36 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Error in fork!");
43 // Let's disconnect from terminal
45 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Error in fork!");
49 // Let's close all descriptors
50 // for (result = getdtablesize(); result>=0; --result)
57 result = open("/dev/null", O_RDWR); // open stdin
61 fd_stdout = dup(result); // stdout
62 fd_stderr = dup(result); // stderr
63 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "%d : %s", fd_stdout, "stdout file descriptor");
64 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "%d : %s", fd_stderr, "stderr file descriptor");
69 // Let's change current directory
70 if (-1 == chdir("/")) {
71 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "Error in chdir!");
75 // Let's create lock file
76 fd = TEMP_FAILURE_RETRY(creat(LISTENER_LOCK, 0640));
78 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "Error in opening lock file!");
82 if (lockf(fd, F_TLOCK, 0) < 0) {
83 if (errno == EACCES || errno == EAGAIN) {
84 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "Daemon already working!");
87 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "lockf failed with error: %s" , strerror(errno));
91 std::string pid = std::to_string(getpid());
92 if (TEMP_FAILURE_RETRY(write(fd, pid.c_str(), pid.size())) <= 0) {
93 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "Failed to write lock file. Error: %s", strerror(errno));
97 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "%s", pid.c_str());
102 int lock = TEMP_FAILURE_RETRY(open(CKM_LOCK, O_RDWR));
106 int ret = lockf(lock, F_TEST, 0);
109 // if lock test fails because of an error assume ckm is running
113 void callUpdateCCMode()
118 auto control = CKM::Control::create();
119 int ret = control->updateCCMode();
121 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "Callback caller process id : %d\n", getpid());
123 if ( ret != CKM_API_SUCCESS )
124 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "CKM::Control::updateCCMode error. ret : %d\n", ret);
126 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "CKM::Control::updateCCMode success.\n");
129 void packageUninstalledEventCallback(
132 package_manager_event_type_e eventType,
133 package_manager_event_state_e eventState,
135 package_manager_error_e error,
143 if (eventType != PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL ||
144 eventState != PACKAGE_MANAGER_EVENT_STATE_STARTED ||
146 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "PackageUninstalled Callback error of Invalid Param");
149 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "PackageUninstalled Callback. Uninstalation of: %s", package);
150 auto control = CKM::Control::create();
152 if ( CKM_API_SUCCESS != (ret = control->removeApplicationData(std::string(package))) ) {
153 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "CKM::Control::removeApplicationData error. ret : %d\n", ret);
156 SLOG(LOG_DEBUG, CKM_LISTENER_TAG,
157 "CKM::Control::removeApplicationData success. Uninstallation package : %s\n", package);
162 void ccModeChangedEventCallback(keynode_t*, void*)
168 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "%s", "Start!");
172 // Let's start to listen
173 GMainLoop *main_loop = g_main_loop_new(NULL, FALSE);
175 package_manager_h request;
176 package_manager_create(&request);
178 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "register uninstalledApp event callback start");
179 if (0 != package_manager_set_event_cb(request, packageUninstalledEventCallback, NULL)) {
180 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Error in package_manager_set_event_cb");
183 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "register uninstalledApp event callback success");
186 char *mdpp_state = vconf_get_str(VCONFKEY_SECURITY_MDPP_STATE);
187 if ( mdpp_state ) { // Update cc mode and register event callback only when mdpp vconf key exists
190 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "register vconfCCModeChanged event callback start");
191 if ( 0 != (ret = vconf_notify_key_changed(VCONFKEY_SECURITY_MDPP_STATE, ccModeChangedEventCallback, NULL)) ) {
192 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "Error in vconf_notify_key_changed. ret : %d", ret);
195 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "register vconfCCModeChanged event callback success");
198 SLOG(LOG_DEBUG, CKM_LISTENER_TAG,
199 "vconfCCModeChanged event callback is not registered. No vconf key exists : %s", VCONFKEY_SECURITY_MDPP_STATE);
201 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "%s", "Ready to listen!");
202 g_main_loop_run(main_loop);