coverity issue fixes for contact-service
[platform/core/pim/contacts-service.git] / server / ctsvc_server.c
1 /*
2  * Contact Service
3  *
4  * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <fcntl.h>
24 #include <unistd.h>
25 #include <sys/stat.h>
26 #include <pims-ipc.h>
27 #include <pims-ipc-svc.h>
28 #include <unistd.h>
29 #include <grp.h>
30
31 #include "ctsvc_internal.h"
32 #include "ctsvc_db_init.h"
33 #include "ctsvc_db_schema.h"
34 #include "ctsvc_schema_recovery.h"
35 #include "ctsvc_server_socket.h"
36 #include "ctsvc_server_utils.h"
37 #include "ctsvc_server_bg.h"
38 #include "ctsvc_server_update.h"
39 #include "ctsvc_server_service.h"
40 #include "ctsvc_notification.h"
41 #include "ctsvc_db_access_control.h"
42 #include "ctsvc_ipc_define.h"
43 #include "ctsvc_ipc_server.h"
44 #include "ctsvc_ipc_server2.h"
45 #include "ctsvc_notify.h"
46 #include "ctsvc_inotify.h"
47
48 #define CTSVC_TIMEOUT_FOR_DEFAULT 0
49
50 static int ctsvc_timeout_sec = CTSVC_TIMEOUT_FOR_DEFAULT;
51 static GMainLoop *main_loop = NULL;
52
53 static int __server_main(void)
54 {
55         int ret;
56
57         char sock_file[CTSVC_PATH_MAX_LEN] = {0};
58         snprintf(sock_file, sizeof(sock_file), CTSVC_SOCK_PATH"/.%s", getuid(), CTSVC_IPC_SERVICE);
59         pims_ipc_svc_init(sock_file, CTS_SECURITY_FILE_GROUP, 0777);
60
61         do {
62                 /*
63                  * register handle functions
64                  * These functions will be called when requesting from client module depends on module name and function name (pims_ipc_call, ctsvc_ipc_call)
65                  * pims_ipc_svc_register(MODULE_NAME, FUNCTION_NAME ...);
66                  */
67                 if (pims_ipc_svc_register(CTSVC_IPC_MODULE,
68                                         CTSVC_IPC_SERVER_CONNECT,
69                                         ctsvc_ipc_server_connect, NULL) != 0)
70                         break;
71                 if (pims_ipc_svc_register(CTSVC_IPC_MODULE,
72                                         CTSVC_IPC_SERVER_DISCONNECT,
73                                         ctsvc_ipc_server_disconnect, NULL) != 0)
74                         break;
75                 if (pims_ipc_svc_register(CTSVC_IPC_MODULE,
76                                         CTSVC_IPC_SERVER_CHECK_PERMISSION,
77                                         ctsvc_ipc_server_check_permission, NULL) != 0)
78                         break;
79                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
80                                         CTSVC_IPC_SERVER_DB_INSERT_RECORD,
81                                         ctsvc_ipc_server_db_insert_record, NULL) != 0)
82                         break;
83                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
84                                         CTSVC_IPC_SERVER_DB_GET_RECORD,
85                                         ctsvc_ipc_server_db_get_record, NULL) != 0)
86                         break;
87                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
88                                         CTSVC_IPC_SERVER_DB_UPDATE_RECORD,
89                                         ctsvc_ipc_server_db_update_record, NULL) != 0)
90                         break;
91                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
92                                         CTSVC_IPC_SERVER_DB_DELETE_RECORD,
93                                         ctsvc_ipc_server_db_delete_record, NULL) != 0)
94                         break;
95                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
96                                         CTSVC_IPC_SERVER_DB_REPLACE_RECORD,
97                                         ctsvc_ipc_server_db_replace_record, NULL) != 0)
98                         break;
99                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
100                                         CTSVC_IPC_SERVER_DB_GET_ALL_RECORDS,
101                                         ctsvc_ipc_server_db_get_all_records, NULL) != 0)
102                         break;
103                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
104                                         CTSVC_IPC_SERVER_DB_GET_RECORDS_WITH_QUERY,
105                                         ctsvc_ipc_server_db_get_records_with_query, NULL) != 0)
106                         break;
107                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
108                                         CTSVC_IPC_SERVER_DB_GET_COUNT,
109                                         ctsvc_ipc_server_db_get_count, NULL) != 0)
110                         break;
111                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
112                                         CTSVC_IPC_SERVER_DB_GET_COUNT_WITH_QUERY,
113                                         ctsvc_ipc_server_db_get_count_with_query, NULL) != 0)
114                         break;
115                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
116                                         CTSVC_IPC_SERVER_DB_INSERT_RECORDS,
117                                         ctsvc_ipc_server_db_insert_records, NULL) != 0)
118                         break;
119                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
120                                         CTSVC_IPC_SERVER_DB_UPDATE_RECORDS,
121                                         ctsvc_ipc_server_db_update_records, NULL) != 0)
122                         break;
123                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
124                                         CTSVC_IPC_SERVER_DB_DELETE_RECORDS,
125                                         ctsvc_ipc_server_db_delete_records, NULL) != 0)
126                         break;
127                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
128                                         CTSVC_IPC_SERVER_DB_REPLACE_RECORDS,
129                                         ctsvc_ipc_server_db_replace_records, NULL) != 0)
130                         break;
131                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
132                                         CTSVC_IPC_SERVER_DB_CHANGES_BY_VERSION,
133                                         ctsvc_ipc_server_db_get_changes_by_version, NULL) != 0)
134                         break;
135                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
136                                         CTSVC_IPC_SERVER_DB_GET_CURRENT_VERSION,
137                                         ctsvc_ipc_server_db_get_current_version, NULL) != 0)
138                         break;
139                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
140                                         CTSVC_IPC_SERVER_DB_SEARCH_RECORDS,
141                                         ctsvc_ipc_server_db_search_records, NULL) != 0)
142                         break;
143                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
144                                         CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_RANGE,
145                                         ctsvc_ipc_server_db_search_records_with_range, NULL) != 0)
146                         break;
147                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
148                                         CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_QUERY,
149                                         ctsvc_ipc_server_db_search_records_with_query, NULL) != 0)
150                         break;
151                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
152                                         CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_FOR_SNIPPET,
153                                         ctsvc_ipc_server_db_search_records_for_snippet, NULL) != 0)
154                         break;
155                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
156                                         CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_RANGE_FOR_SNIPPET,
157                                         ctsvc_ipc_server_db_search_records_with_range_for_snippet, NULL) != 0)
158                         break;
159                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
160                                         CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_QUERY_FOR_SNIPPET,
161                                         ctsvc_ipc_server_db_search_records_with_query_for_snippet, NULL) != 0)
162                         break;
163                 if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
164                                         CTSVC_IPC_SERVER_DB_GET_STATUS,
165                                         ctsvc_ipc_server_db_get_status, NULL) != 0)
166                         break;
167                 if (pims_ipc_svc_register(CTSVC_IPC_ACTIVITY_MODULE,
168                                         CTSVC_IPC_SERVER_ACTIVITY_DELETE_BY_CONTACT_ID,
169                                         ctsvc_ipc_activity_delete_by_contact_id, NULL) != 0)
170                         break;
171                 if (pims_ipc_svc_register(CTSVC_IPC_ACTIVITY_MODULE,
172                                         CTSVC_IPC_SERVER_ACTIVITY_DELETE_BY_ACCOUNT_ID,
173                                         ctsvc_ipc_activity_delete_by_account_id, NULL) != 0)
174                         break;
175                 if (pims_ipc_svc_register(CTSVC_IPC_GROUP_MODULE,
176                                         CTSVC_IPC_SERVER_GROUP_ADD_CONTACT,
177                                         ctsvc_ipc_group_add_contact, NULL) != 0)
178                         break;
179                 if (pims_ipc_svc_register(CTSVC_IPC_GROUP_MODULE,
180                                         CTSVC_IPC_SERVER_GROUP_REMOVE_CONTACT,
181                                         ctsvc_ipc_group_remove_contact, NULL) != 0)
182                         break;
183                 if (pims_ipc_svc_register(CTSVC_IPC_GROUP_MODULE,
184                                         CTSVC_IPC_SERVER_GROUP_SET_GROUP_ORDER,
185                                         ctsvc_ipc_group_set_group_order, NULL) != 0)
186                         break;
187                 if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE,
188                                         CTSVC_IPC_SERVER_PERSON_LINK_PERSON,
189                                         ctsvc_ipc_person_link_person, NULL) != 0)
190                         break;
191                 if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE,
192                                         CTSVC_IPC_SERVER_PERSON_UNLINK_CONTACT,
193                                         ctsvc_ipc_person_unlink_contact, NULL) != 0)
194                         break;
195                 if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE,
196                                         CTSVC_IPC_SERVER_PERSON_RESET_USAGE,
197                                         ctsvc_ipc_person_reset_usage, NULL) != 0)
198                         break;
199                 if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE,
200                                         CTSVC_IPC_SERVER_PERSON_SET_FAVORITE_ORDER,
201                                         ctsvc_ipc_person_set_favorite_order, NULL) != 0)
202                         break;
203                 if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE,
204                                         CTSVC_IPC_SERVER_PERSON_SET_DEFAULT_PROPERTY,
205                                         ctsvc_ipc_person_set_default_property, NULL) != 0)
206                         break;
207                 if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE,
208                                         CTSVC_IPC_SERVER_PERSON_GET_DEFAULT_PROPERTY,
209                                         ctsvc_ipc_person_get_default_property, NULL) != 0)
210                         break;
211                 if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE,
212                                         CTSVC_IPC_SERVER_PERSON_GET_AGGREGATION_SUGGESTIONS,
213                                         ctsvc_ipc_person_get_aggregation_suggestions, NULL) != 0)
214                         break;
215 #ifdef ENABLE_LOG_FEATURE
216                 if (pims_ipc_svc_register(CTSVC_IPC_PHONELOG_MODULE,
217                                         CTSVC_IPC_SERVER_PHONELOG_RESET_STATISTICS,
218                                         ctsvc_ipc_phone_log_reset_statistics, NULL) != 0)
219                         break;
220                 if (pims_ipc_svc_register(CTSVC_IPC_PHONELOG_MODULE,
221                                         CTSVC_IPC_SERVER_PHONELOG_RESET_STATISTICS_BY_SIM,
222                                         ctsvc_ipc_phone_log_reset_statistics_by_sim, NULL) != 0)
223                         break;
224
225                 if (pims_ipc_svc_register(CTSVC_IPC_PHONELOG_MODULE,
226                                         CTSVC_IPC_SERVER_PHONELOG_DELETE,
227                                         ctsvc_ipc_phone_log_delete, NULL) != 0)
228                         break;
229 #endif /* ENABLE_LOG_FEATURE */
230                 if (pims_ipc_svc_register(CTSVC_IPC_SETTING_MODULE,
231                                         CTSVC_IPC_SERVER_SETTING_GET_NAME_DISPLAY_ORDER,
232                                         ctsvc_ipc_setting_get_name_display_order, NULL) != 0)
233                         break;
234                 if (pims_ipc_svc_register(CTSVC_IPC_SETTING_MODULE,
235                                         CTSVC_IPC_SERVER_SETTING_SET_NAME_DISPLAY_ORDER,
236                                         ctsvc_ipc_setting_set_name_display_order, NULL) != 0)
237                         break;
238                 if (pims_ipc_svc_register(CTSVC_IPC_SETTING_MODULE,
239                                         CTSVC_IPC_SERVER_SETTING_GET_NAME_SORTING_ORDER,
240                                         ctsvc_ipc_setting_get_name_sorting_order, NULL) != 0)
241                         break;
242                 if (pims_ipc_svc_register(CTSVC_IPC_SETTING_MODULE,
243                                         CTSVC_IPC_SERVER_SETTING_SET_NAME_SORTING_ORDER,
244                                         ctsvc_ipc_setting_set_name_sorting_order, NULL) != 0)
245                         break;
246
247                 snprintf(sock_file, sizeof(sock_file), CTSVC_SOCK_PATH"/.%s_for_subscribe",
248                                 getuid(), CTSVC_IPC_SERVICE);
249                 pims_ipc_svc_init_for_publish(sock_file, CTS_SECURITY_FILE_GROUP, CTS_SECURITY_DEFAULT_PERMISSION);
250                 ctsvc_noti_publish_socket_initialize();
251
252                 ret = ctsvc_connect();
253                 if (CONTACTS_ERROR_NONE != ret) {
254                         /* LCOV_EXCL_START */
255                         ERR("contacts_connect fail(%d)", ret);
256                         break;
257                         /* LCOV_EXCL_STOP */
258                 }
259                 ctsvc_set_client_access_info(NULL, NULL);
260                 ctsvc_server_bg_add_cb();
261                 ctsvc_server_bg_delete_start();
262
263                 ret = ctsvc_server_init_configuration();
264                 DBG("%d", ret);
265
266                 main_loop = g_main_loop_new(NULL, FALSE);
267                 pims_ipc_svc_run_main_loop(&main_loop);
268
269                 ctsvc_server_final_configuration();
270                 ctsvc_server_bg_remove_cb();
271                 ctsvc_unset_client_access_info();
272                 ctsvc_disconnect();
273
274                 pims_ipc_svc_deinit_for_publish();
275                 pims_ipc_svc_deinit();
276
277                 return 0;
278         } while (0);
279
280         /* LCOV_EXCL_START */
281         ERR("pims_ipc_svc_register error");
282         return -1;
283         /* LCOV_EXCL_STOP */
284 }
285
286 void ctsvc_server_quit(void)
287 {
288         g_main_loop_quit(main_loop);
289         main_loop = NULL;
290 }
291
292 int ctsvc_server_get_timeout_sec(void)
293 {
294         DBG("ctsvc_timeout_sec:%d", ctsvc_timeout_sec);
295         return ctsvc_timeout_sec;
296 }
297
298 void __ctsvc_create_rep_set_permission(const char *directory, mode_t mode)
299 {
300         if (-1 == access(directory, F_OK))
301                 if (mkdir(directory, mode) != 0)
302                         ERR("failed to make new directory \n");
303 }
304
305 void __ctsvc_create_noti_file_set_permission(const char *file, mode_t mode)
306 {
307         int fd;
308         char* path = ctsvc_inotify_makepath(file);
309         if (NULL == path) {
310                 ERR("ctsvc_inotify_makepath() fail");
311                 return;
312         }
313         fd = creat(path,  mode);
314         if (0 <= fd) {
315                 close(fd);
316                 chmod(path, CTS_SECURITY_DEFAULT_PERMISSION);
317         }
318         free(path);
319 }
320
321 int main(int argc, char *argv[])
322 {
323         CTS_FN_CALL;
324         INFO("Start contacts-service");
325         int ret;
326
327 #ifdef TIZEN_TEST_GCOV
328         setenv("GCOV_PREFIX", "/tmp/daemon", 1);
329 #endif
330
331         if (getuid() == 0) {   /* root */
332                 gid_t glist[] = {CTS_SECURITY_FILE_GROUP};
333                 ret = setgroups(1, glist);   /* client and server should have same Groups */
334                 WARN_IF(ret < 0, "setgroups Fail(%d)", ret);
335         }
336
337         if (2 <= argc && STRING_EQUAL == strcmp(argv[1], "timeout"))
338                 ctsvc_timeout_sec = atoi(argv[2]);
339
340         ctsvc_server_check_schema();
341
342         __ctsvc_create_rep_set_permission(DATA_REPERTORY, 0755);
343         __ctsvc_create_rep_set_permission(CTSVC_DATA_REPERTORY, 0775);
344         __ctsvc_create_rep_set_permission(CTSVC_IMG_REPERTORY, 0750);
345         __ctsvc_create_rep_set_permission(CTSVC_VCARD_IMAGE_LOCATION, 0770);
346         __ctsvc_create_rep_set_permission(CTS_MY_IMAGE_LOCATION, 0750);
347         __ctsvc_create_rep_set_permission(CTS_GROUP_IMAGE_LOCATION, 0750);
348         __ctsvc_create_rep_set_permission(CTS_LOGO_IMAGE_LOCATION, 0750);
349         __ctsvc_create_rep_set_permission(CTSVC_CONTACT_IMG_FULL_LOCATION, 0750);
350
351         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_IPC_READY, CTS_SECURITY_DEFAULT_PERMISSION);
352         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_ADDRESSBOOK_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
353         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_GROUP_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
354         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_PERSON_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
355         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_CONTACT_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
356         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_MY_PROFILE_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
357         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_NAME_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
358         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_NUMBER_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
359         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_EMAIL_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
360         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_EVENT_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
361         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_URL_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
362         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_GROUP_RELATION_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
363         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_ADDRESS_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
364         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_NOTE_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
365         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_COMPANY_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
366         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_RELATIONSHIP_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
367         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_IMAGE_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
368         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_NICKNAME_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
369         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_MESSENGER_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
370         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_DATA_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
371         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_SDN_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
372         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_PROFILE_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
373         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_ACTIVITY_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
374         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_ACTIVITY_PHOTO_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
375         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_PHONELOG_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
376         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_SPEEDDIAL_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
377         __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_SIP_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
378
379         /* update DB for compatability */
380         ctsvc_server_db_update();
381
382         ctsvc_server_load_feature_list();
383         ctsvc_server_socket_init();
384
385         __server_main();
386
387         ctsvc_server_socket_deinit();
388
389         return 0;
390 }
391