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 MDPP_MODE_ENFORCING
22 #define MDPP_MODE_ENFORCING "Enforcing"
25 #ifndef MDPP_MODE_ENABLED
26 #define MDPP_MODE_ENABLED "Enabled"
29 #ifndef VCONFKEY_SECURITY_MDPP_STATE
30 #define VCONFKEY_SECURITY_MDPP_STATE "file/security_mdpp/security_mdpp_state"
35 // Let's operate in background
38 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Error in fork!");
45 // Let's disconnect from terminal
47 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Error in fork!");
51 // Let's close all descriptors
52 // for (result = getdtablesize(); result>=0; --result)
59 result = open("/dev/null", O_RDWR); // open stdin
63 fd_stdout = dup(result); // stdout
64 fd_stderr = dup(result); // stderr
65 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "%d : %s", fd_stdout, "stdout file descriptor");
66 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "%d : %s", fd_stderr, "stderr file descriptor");
71 // Let's change current directory
72 if (-1 == chdir("/")) {
73 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Error in chdir!");
77 // Let's create lock file
78 result = open("/tmp/ckm-listener.lock", O_RDWR | O_CREAT, 0640);
80 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Error in opening lock file!");
84 if (lockf(result, F_TLOCK, 0) < 0) {
85 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Daemon already working!");
90 sprintf(str, "%d\n", getpid());
91 result = write(result, str, strlen(str));
93 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "%s", str);
96 void callSetCCMode(const char *mdpp_state)
98 auto control = CKM::Control::create();
99 int ret = CKM_API_SUCCESS;
100 if ( !strcmp(mdpp_state, MDPP_MODE_ENABLED) ||
101 !strcmp(mdpp_state, MDPP_MODE_ENFORCING) )
102 ret = control->setCCMode(CKM::CCModeState::CC_MODE_ON);
104 ret = control->setCCMode(CKM::CCModeState::CC_MODE_OFF);
106 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "Callback caller process id : %d\n", getpid());
108 if ( ret != CKM_API_SUCCESS )
109 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "CKM::Control::setCCMode error. ret : %d\n", ret);
111 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "CKM::Control::setCCMode success. mdpp_state : %s", mdpp_state);
114 void packageUninstalledEventCallback(
117 package_manager_event_type_e eventType,
118 package_manager_event_state_e eventState,
120 package_manager_error_e error,
128 if (eventType != PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL ||
129 eventState != PACKAGE_MANAGER_EVENT_STATE_STARTED ||
131 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "PackageUninstalled Callback error of Invalid Param");
134 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "PackageUninstalled Callback. Uninstalation of: %s", package);
135 auto control = CKM::Control::create();
137 if ( CKM_API_SUCCESS != (ret = control->removeApplicationData(std::string(package))) ) {
138 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "CKM::Control::removeApplicationData error. ret : %d\n", ret);
141 SLOG(LOG_DEBUG, CKM_LISTENER_TAG,
142 "CKM::Control::removeApplicationData success. Uninstallation package : %s\n", package);
147 void ccModeChangedEventCallback(
154 char *mdpp_state = vconf_get_str(VCONFKEY_SECURITY_MDPP_STATE);
155 callSetCCMode(mdpp_state);
159 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "%s", "Start!");
163 // Let's start to listen
164 GMainLoop *main_loop = g_main_loop_new(NULL, FALSE);
166 package_manager_h request;
167 package_manager_create(&request);
169 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "register uninstalledApp event callback start");
170 if (0 != package_manager_set_event_cb(request, packageUninstalledEventCallback, NULL)) {
171 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Error in package_manager_set_event_cb");
174 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "register uninstalledApp event callback success");
177 char *mdpp_state = vconf_get_str(VCONFKEY_SECURITY_MDPP_STATE);
178 if ( mdpp_state ) { // set CC mode and register event callback only when mdpp vconf key exists
179 callSetCCMode(mdpp_state);
181 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "register vconfCCModeChanged event callback start");
182 if ( 0 != (ret = vconf_notify_key_changed(VCONFKEY_SECURITY_MDPP_STATE, ccModeChangedEventCallback, NULL)) ) {
183 SLOG(LOG_ERROR, CKM_LISTENER_TAG, "Error in vconf_notify_key_changed. ret : %d", ret);
186 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "register vconfCCModeChanged event callback success");
189 SLOG(LOG_DEBUG, CKM_LISTENER_TAG,
190 "vconfCCModeChanged event callback is not registered. No vconf key exists : %s", VCONFKEY_SECURITY_MDPP_STATE);
192 SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "%s", "Ready to listen!");
193 g_main_loop_run(main_loop);