Coverity issue fixes for email service
[platform/core/messaging/email-service.git] / email-core / email-core-container.c
1 /*
2 *  email-service
3 *
4 * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
5 *
6 * Contact: Kyuho Jo <kyuho.jo@samsung.com>, Sunghyun Kwon <sh0701.kwon@samsung.com>
7 *
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 *
20 */
21
22 /**
23  *
24  * This file contains functionality related to KNOX
25  * to interact with email-service.
26  * @file                email-core-container.c
27  * @author
28  * @version     0.1
29  * @brief               This file contains functionality to provide KNOX support in email-service.
30  */
31 #ifdef __FEATURE_CONTAINER_ENABLE__
32 #include <vasum.h>
33 #endif /* __FEATURE_CONTAINER_ENABLE__ */
34
35 #include "email-utilities.h"
36 #include "email-core-container.h"
37 #include "email-debug-log.h"
38
39 int vsm_state_handle = 0;
40 int vsm_event_handle = 0;
41 #ifdef __FEATURE_CONTAINER_ENABLE__
42 vsm_context_h container;
43
44
45 static int container_state_listener(vsm_zone_h zone, vsm_zone_state_t state, void *user_data)
46 {
47     EM_DEBUG_FUNC_BEGIN();
48     EM_DEBUG_LOG("Container name : [%s]", vsm_get_zone_name(zone));
49     EM_DEBUG_LOG("Container state : [%d]", state);
50     EM_DEBUG_FUNC_END();
51     return 0;
52 }
53
54 static int container_event_listener(vsm_zone_h zone, vsm_zone_event_t event, void *user_data)
55 {
56     EM_DEBUG_FUNC_BEGIN();
57     EM_DEBUG_LOG("Container name : [%s]", vsm_get_zone_name(zone));
58     EM_DEBUG_LOG("Container event : [%d]", event);
59     EM_DEBUG_FUNC_END();
60     return 0;
61 }
62 #endif /* __FEATURE_CONTAINER_ENABLE__ */
63
64 INTERNAL_FUNC void emcore_create_container()
65 {
66     EM_DEBUG_FUNC_BEGIN();
67 #ifdef __FEATURE_CONTAINER_ENABLE__
68     container = NULL;
69
70     container = vsm_create_context();
71     if (container == NULL) {
72         EM_DEBUG_EXCEPTION("vsm_create_context failed");
73         return;
74     }
75
76     vsm_state_handle = vsm_add_state_changed_callback(container, container_state_listener, NULL);
77
78         vsm_event_handle = vsm_add_event_callback(container, container_event_listener, NULL);
79 #endif /* __FEATURE_CONTAINER_ENABLE__ */
80     EM_DEBUG_FUNC_END();
81 }
82
83 INTERNAL_FUNC void emcore_destroy_container()
84 {
85     EM_DEBUG_FUNC_BEGIN();
86 #ifdef __FEATURE_CONTAINER_ENABLE__
87
88     if (container) {
89         vsm_del_state_changed_callback(container, vsm_state_handle);
90
91                 vsm_del_event_callback(container, vsm_event_handle);
92
93         vsm_cleanup_context(container);
94
95         container = NULL;
96     }
97 #endif /* __FEATURE_CONTAINER_ENABLE__ */
98
99     EM_DEBUG_FUNC_END();
100 }
101
102 #ifdef __FEATURE_CONTAINER_ENABLE__
103 static gboolean mainloop_callback(GIOChannel *channel, GIOCondition condition, void *data)
104 {
105     EM_DEBUG_FUNC_BEGIN();
106
107     vsm_context_h ctx = (vsm_context_h)data;
108
109     EM_DEBUG_LOG("Enter event loop");
110     vsm_enter_eventloop(ctx, 0, 0);
111     EM_DEBUG_LOG("Finish event loop");
112
113     EM_DEBUG_FUNC_END();
114     return TRUE;
115 }
116 #endif /* __FEATURE_CONTAINER_ENABLE__ */
117
118 INTERNAL_FUNC void emcore_bind_vsm_context()
119 {
120         EM_DEBUG_FUNC_BEGIN();
121
122 #ifdef __FEATURE_CONTAINER_ENABLE__
123         int fd;
124
125         GIOChannel *domain_channel = NULL;
126
127         fd = vsm_get_poll_fd(container);
128
129         domain_channel = g_io_channel_unix_new(fd);
130         if (domain_channel == NULL) {
131                 EM_DEBUG_EXCEPTION("Channel allocation failed\n");
132                 return;
133         }
134
135         g_io_add_watch(domain_channel, G_IO_IN, mainloop_callback, container);
136 #endif /* __FEATURE_CONTAINER_ENABLE__ */
137
138         EM_DEBUG_FUNC_END();
139 }
140
141 INTERNAL_FUNC int emcore_get_container_path(char *multi_user, char **container_path)
142 {
143         EM_DEBUG_FUNC_BEGIN();
144         int err = EMAIL_ERROR_NONE;
145
146         if (multi_user == NULL) {
147                 EM_DEBUG_LOG("user_name is NULL");
148                 return EMAIL_ERROR_INVALID_PARAM;
149         }
150
151 #ifdef __FEATURE_CONTAINER_ENABLE__
152         if (container == NULL) {
153                 EM_DEBUG_LOG("Container not intialize");
154                 return EMAIL_ERROR_CONTAINER_NOT_INITIALIZATION;
155         }
156
157         vsm_zone_h zone = NULL;
158         char *p_container_path = NULL;
159         char errno_buf[ERRNO_BUF_SIZE] = {0};
160
161         if (EM_SAFE_STRLEN(multi_user) == 0) {
162                 EM_DEBUG_LOG("multi_user name is NULL");
163                 goto FINISH_OFF;
164         }
165
166         EM_DEBUG_LOG("name : [%s], container : [%p]", multi_user, container);
167         zone = vsm_lookup_zone_by_name(container, multi_user);
168         if (zone == NULL) {
169                 EM_DEBUG_EXCEPTION("NULL returned : %s, %d", EM_STRERROR(errno_buf), errno);
170                 err = EMAIL_ERROR_CONTAINER_GET_DOMAIN;
171                 goto FINISH_OFF;
172         }
173
174         p_container_path = (char *)vsm_get_zone_rootpath(zone);
175
176 FINISH_OFF:
177
178         if (container_path)
179                 *container_path = EM_SAFE_STRDUP(p_container_path);
180
181 #endif /* __FEATURE_CONTAINER_ENABLE__ */
182         EM_DEBUG_FUNC_END();
183         return err;
184 }
185
186 INTERNAL_FUNC int emcore_get_user_name(int pid, char **multi_user)
187 {
188         EM_DEBUG_FUNC_BEGIN();
189
190         int err = EMAIL_ERROR_NONE;
191
192         if (pid <= 0) {
193                         EM_DEBUG_EXCEPTION("Invalid parameter");
194                         return EMAIL_ERROR_INVALID_PARAM;
195         }
196 #ifdef __FEATURE_CONTAINER_ENABLE__
197
198         char *user_name = NULL;
199         vsm_zone_h zone = NULL;
200         char errno_buf[ERRNO_BUF_SIZE] = {0};
201
202         EM_DEBUG_LOG("pid : [%d], container : [%p]", pid, container);
203         zone = vsm_lookup_zone_by_pid(container, pid);
204         if (zone == NULL) {
205                 EM_DEBUG_EXCEPTION("NULL returned : %s, %d", EM_STRERROR(errno_buf), errno);
206                 err = EMAIL_ERROR_CONTAINER_GET_DOMAIN;
207                 goto FINISH_OFF;
208         }
209
210         user_name = (char *)vsm_get_zone_name(zone);
211         EM_DEBUG_LOG("user_name : [%s]", user_name);
212
213 FINISH_OFF:
214
215         if (multi_user)
216                 *multi_user = EM_SAFE_STRDUP(user_name);
217
218 #endif /* __FEATURE_CONTAINER_ENABLE__ */
219         EM_DEBUG_FUNC_END();
220         return err;
221 }
222
223 INTERNAL_FUNC int emcore_lookup_zone_by_name(char *user_name)
224 {
225         EM_DEBUG_FUNC_BEGIN();
226         int ret = false;
227
228         if (EM_SAFE_STRLEN(user_name) == 0) {
229                 EM_DEBUG_LOG("user_name is NULL");
230                 return ret;
231         }
232
233 #ifdef __FEATURE_CONTAINER_ENABLE__
234         if (container == NULL) {
235                 EM_DEBUG_LOG("Container not intialize");
236                 return ret;
237         }
238
239         vsm_zone_h zone = NULL;
240         char errno_buf[ERRNO_BUF_SIZE] = {0};
241
242         EM_DEBUG_LOG("name : [%s], container : [%p]", user_name, container);
243         zone = vsm_lookup_zone_by_name(container, user_name);
244         if (zone == NULL) {
245                 EM_DEBUG_EXCEPTION("NULL returned : %s, %d", EM_STRERROR(errno_buf), errno);
246                 goto FINISH_OFF;
247         }
248
249         ret = true;
250
251 FINISH_OFF:
252
253 #endif /* __FEATURE_CONTAINER_ENABLE__ */
254         EM_DEBUG_FUNC_END();
255         return ret;
256 }
257
258 INTERNAL_FUNC void emcore_set_declare_link(const char *file_path)
259 {
260     EM_DEBUG_FUNC_BEGIN();
261
262 #ifdef __FEATURE_CONTAINER_ENABLE__
263     if (container == NULL) {
264         EM_DEBUG_EXCEPTION("Not initialize");
265         return;
266     }
267
268     int ret = 0;
269     if ((ret = vsm_declare_link(container, file_path /* src path */, file_path /* dst path */)) != 0) {
270         EM_DEBUG_EXCEPTION("vsm_declare_link failed : [%s] [%d]", file_path, ret);
271     }
272 #endif /* __FEATURE_CONTAINER_ENABLE__ */
273
274     EM_DEBUG_FUNC_END();
275 }
276
277 #ifdef __FEATURE_CONTAINER_ENABLE__
278 void iterate_callback(vsm_zone_h zone, void *user_data)
279 {
280     EM_DEBUG_FUNC_BEGIN();
281     char *zone_name = NULL;
282     GList *zone_name_list = (GList *)user_data;
283
284     zone_name = EM_SAFE_STRDUP(vsm_get_zone_name(zone));
285         if (EM_SAFE_STRLEN(zone_name) > 0)
286             zone_name_list = g_list_append(zone_name_list, zone_name);
287
288     EM_DEBUG_FUNC_END();
289 }
290 #endif /* __FEATURE_CONTAINER_ENABLE__ */
291
292 INTERNAL_FUNC int emcore_get_zone_name_list(GList **output_name_list)
293 {
294     EM_DEBUG_FUNC_BEGIN();
295     int err = EMAIL_ERROR_NONE;
296     GList *zone_name_list = NULL;
297     GList *node = NULL;
298
299     if (output_name_list == NULL) {
300         EM_DEBUG_EXCEPTION("Invalid parameter");
301         err = EMAIL_ERROR_INVALID_PARAM;
302         goto FINISH_OFF;
303     }
304
305 #ifdef __FEATURE_CONTAINER_ENABLE__
306     int ret = 0;
307
308     if (container == NULL) {
309         EM_DEBUG_EXCEPTION("Not initialize");
310         err = EMAIL_ERROR_CONTAINER_CREATE_FAILED;
311         goto FINISH_OFF;
312     }
313
314     zone_name_list = g_list_alloc();
315     if (zone_name_list == NULL) {
316         EM_DEBUG_EXCEPTION("g_list_alloc failed");
317         err = EMAIL_ERROR_OUT_OF_MEMORY;
318         goto FINISH_OFF;
319     }
320
321     if ((ret = vsm_iterate_zone(container, iterate_callback, (void *)zone_name_list)) < 0) {
322         EM_DEBUG_EXCEPTION("vsm_iterate_domain failed : [%d]", ret);
323         err = EMAIL_ERROR_CONTAINER_ITERATE_DOMAIN;
324         goto FINISH_OFF;
325     }
326 #endif /* __FEATURE_CONTAINER_ENABLE__ */
327
328 FINISH_OFF:
329
330     if (err != EMAIL_ERROR_NONE) {
331         node = g_list_first(zone_name_list);
332         while (node != NULL) {
333             /* Free the domain name */
334             EM_SAFE_FREE(node->data);
335             node = g_list_next(node);
336         }
337         g_list_free(zone_name_list);
338         zone_name_list = NULL;
339     }
340
341     if (output_name_list)
342         *output_name_list = zone_name_list;
343
344     EM_DEBUG_FUNC_END();
345         return err;
346 }
347
348 INTERNAL_FUNC int emcore_get_canonicalize_path(char *db_path, char **output_path)
349 {
350     EM_DEBUG_FUNC_BEGIN();
351     int err = EMAIL_ERROR_NONE;
352
353 #ifdef __FEATURE_CONTAINER_ENABLE__
354         int ret = 0;
355         ret = vsm_canonicalize_path(db_path, output_path);
356         if (ret < 0) {
357                 EM_DEBUG_EXCEPTION("vsm_canonicalize_path failed : [%d]", ret);
358                 err = EMAIL_ERROR_FILE_NOT_FOUND;
359         }
360 #endif /* __FEATURE_CONTAINER_ENABLE__ */
361
362     EM_DEBUG_FUNC_END();
363     return err;
364 }
365
366 INTERNAL_FUNC int emcore_set_join_zone(char *multi_user_name, void **join_zone)
367 {
368     EM_DEBUG_FUNC_BEGIN();
369     int err = EMAIL_ERROR_NONE;
370 #ifdef __FEATURE_CONTAINER_ENABLE__
371         char errno_buf[ERRNO_BUF_SIZE] = {0};
372         vsm_zone_h temp_zone = NULL;
373         vsm_zone_h p_join_zone = NULL;
374
375         if (EM_SAFE_STRLEN(multi_user_name) == 0) {
376                 EM_DEBUG_LOG("multi_user_name is NULL");
377                 return err;
378         }
379
380         temp_zone = vsm_lookup_zone_by_name(container, multi_user_name);
381         if (temp_zone == NULL) {
382                 EM_DEBUG_EXCEPTION("NULL returned : %s %d", EM_STRERROR(errno_buf), errno);
383                 err = EMAIL_ERROR_CONTAINER_LOOKUP_ZONE_FAILED;
384                 goto FINISH_OFF;
385         }
386
387         p_join_zone = vsm_join_zone(temp_zone);
388         if (p_join_zone == NULL) {
389                 EM_DEBUG_EXCEPTION("NULL returned : %s %d", EM_STRERROR(errno_buf), errno);
390                 err = EMAIL_ERROR_CONTAINER_JOIN_ZONE_FAILED;
391                 goto FINISH_OFF;
392         }
393
394 FINISH_OFF:
395
396         if (join_zone)
397                 *join_zone = (void *)p_join_zone;
398
399 #endif /* __FEATURE_CONTAINER_ENABLE__ */
400     EM_DEBUG_FUNC_END();
401     return err;
402 }
403
404 INTERNAL_FUNC void emcore_unset_join_zone(void *join_zone)
405 {
406     EM_DEBUG_FUNC_BEGIN();
407 #ifdef __FEATURE_CONTAINER_ENABLE__
408
409         char errno_buf[ERRNO_BUF_SIZE] = {0};
410         vsm_zone_h temp_zone = NULL;
411
412
413         temp_zone = vsm_join_zone((vsm_zone_h)join_zone);
414         if (temp_zone == NULL) {
415                 EM_DEBUG_EXCEPTION("NULL returned : %s %d", EM_STRERROR(errno_buf), errno);
416         }
417
418 #endif /* __FEATURE_CONTAINER_ENABLE__ */
419     EM_DEBUG_FUNC_END();
420 }