28a2bb0351a00a2f195d2ebba411ce9924e7a2be
[platform/core/security/key-manager.git] / src / listener / listener-daemon.cpp
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <fcntl.h>
4 #include <errno.h>
5 #include <unistd.h>
6 #include <syslog.h>
7 #include <string.h>
8 #include <sys/types.h>
9 #include <sys/stat.h>
10 #include <systemd/sd-daemon.h>
11
12 #include <glib.h>
13 #include <package_manager.h>
14 #include <ckm/ckm-control.h>
15 #include <ckm/ckm-type.h>
16 #include <vconf/vconf.h>
17 #include <dlog.h>
18
19 #define CKM_LISTENER_TAG "CKM_LISTENER"
20
21 #ifndef VCONFKEY_SECURITY_MDPP_STATE
22 #define VCONFKEY_SECURITY_MDPP_STATE "file/security_mdpp/security_mdpp_state"
23 #endif
24
25 void daemonize()
26 {
27     // Let's operate in background
28     int result = fork();
29     if (result < 0){
30         SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Error in fork!");
31         exit(1);
32     }
33
34     if (result > 0)
35         exit(0);
36
37     // Let's disconnect from terminal
38     if (-1 == setsid()) {
39         SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Error in fork!");
40         exit(1);
41     }
42
43     // Let's close all descriptors
44 //    for (result = getdtablesize(); result>=0; --result)
45 //    close(result);
46
47     close(0);
48     close(1);
49     close(2);
50
51     result = open("/dev/null", O_RDWR); // open stdin
52
53     int fd_stdout = 0;
54     int fd_stderr = 0;
55     fd_stdout = dup(result); // stdout
56     fd_stderr = dup(result); // stderr
57     SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "%d : %s", fd_stdout, "stdout file descriptor");
58     SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "%d : %s", fd_stderr, "stderr file descriptor");
59
60
61     umask(027);
62
63     // Let's change current directory
64     if (-1 == chdir("/")) {
65         SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Error in chdir!");
66         exit(1);
67     }
68
69     // Let's create lock file
70     result = open("/tmp/ckm-listener.lock", O_RDWR | O_CREAT, 0640);
71     if (result < 0) {
72         SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Error in opening lock file!");
73         exit(1);
74     }
75
76     if (lockf(result, F_TLOCK, 0) < 0) {
77         SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Daemon already working!");
78         exit(0);
79     }
80
81     char str[100];
82     sprintf(str, "%d\n", getpid());
83     result = write(result, str, strlen(str));
84
85     SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "%s", str);
86 }
87
88 void callUpdateCCMode()
89 {
90     // TODO make it call ckm only if it's already running (lock file)
91     auto control = CKM::Control::create();
92     int ret = control->updateCCMode();
93
94     SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "Callback caller process id : %d\n", getpid());
95
96     if ( ret != CKM_API_SUCCESS )
97         SLOG(LOG_ERROR, CKM_LISTENER_TAG, "CKM::Control::updateCCMode error. ret : %d\n", ret);
98     else
99         SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "CKM::Control::updateCCMode success.\n");
100 }
101
102 void packageUninstalledEventCallback(
103     const char *type,
104     const char *package,
105     package_manager_event_type_e eventType,
106     package_manager_event_state_e eventState,
107     int progress,
108     package_manager_error_e error,
109     void *userData)
110 {
111     (void) type;
112     (void) progress;
113     (void) error;
114     (void) userData;
115
116     if (eventType != PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL ||
117             eventState != PACKAGE_MANAGER_EVENT_STATE_STARTED ||
118             package == NULL) {
119         SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "PackageUninstalled Callback error of Invalid Param");
120     }
121     else {
122         SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "PackageUninstalled Callback. Uninstalation of: %s", package);
123         auto control = CKM::Control::create();
124         int ret = 0;
125         if ( CKM_API_SUCCESS != (ret = control->removeApplicationData(std::string(package))) ) {
126             SLOG(LOG_ERROR, CKM_LISTENER_TAG, "CKM::Control::removeApplicationData error. ret : %d\n", ret);
127         }
128         else {
129             SLOG(LOG_DEBUG, CKM_LISTENER_TAG,
130                 "CKM::Control::removeApplicationData success. Uninstallation package : %s\n", package);
131         }
132     }
133 }
134
135 void ccModeChangedEventCallback(keynode_t*, void*)
136 {
137     callUpdateCCMode();
138 }
139
140 int main(void) {
141     SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "%s", "Start!");
142
143     daemonize();
144
145     // Let's start to listen
146     GMainLoop *main_loop = g_main_loop_new(NULL, FALSE);
147
148     package_manager_h request;
149     package_manager_create(&request);
150
151     SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "register uninstalledApp event callback start");
152     if (0 != package_manager_set_event_cb(request, packageUninstalledEventCallback, NULL)) {
153         SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Error in package_manager_set_event_cb");
154         exit(-1);
155     }
156     SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "register uninstalledApp event callback success");
157
158     int ret = 0;
159     char *mdpp_state = vconf_get_str(VCONFKEY_SECURITY_MDPP_STATE);
160     if ( mdpp_state ) { // Update cc mode and register event callback only when mdpp vconf key exists
161         callUpdateCCMode();
162
163         SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "register vconfCCModeChanged event callback start");
164         if ( 0 != (ret = vconf_notify_key_changed(VCONFKEY_SECURITY_MDPP_STATE, ccModeChangedEventCallback, NULL)) ) {
165             SLOG(LOG_ERROR, CKM_LISTENER_TAG, "Error in vconf_notify_key_changed. ret : %d", ret);
166             exit(-1);
167         }
168         SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "register vconfCCModeChanged event callback success");
169     }
170     else
171         SLOG(LOG_DEBUG, CKM_LISTENER_TAG,
172             "vconfCCModeChanged event callback is not registered. No vconf key exists : %s", VCONFKEY_SECURITY_MDPP_STATE);
173
174     SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "%s", "Ready to listen!");
175     g_main_loop_run(main_loop);
176     return 0;
177 }
178