4 * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
27 #include <pims-ipc-svc.h>
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"
48 #define CTSVC_TIMEOUT_FOR_DEFAULT 0
50 static int ctsvc_timeout_sec = CTSVC_TIMEOUT_FOR_DEFAULT;
51 static GMainLoop *main_loop = NULL;
53 static int __server_main(void)
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);
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 ...);
67 if (pims_ipc_svc_register(CTSVC_IPC_MODULE,
68 CTSVC_IPC_SERVER_CONNECT,
69 ctsvc_ipc_server_connect, NULL) != 0)
71 if (pims_ipc_svc_register(CTSVC_IPC_MODULE,
72 CTSVC_IPC_SERVER_DISCONNECT,
73 ctsvc_ipc_server_disconnect, NULL) != 0)
75 if (pims_ipc_svc_register(CTSVC_IPC_MODULE,
76 CTSVC_IPC_SERVER_CHECK_PERMISSION,
77 ctsvc_ipc_server_check_permission, NULL) != 0)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
220 if (pims_ipc_svc_register(CTSVC_IPC_PHONELOG_MODULE, CTSVC_IPC_SERVER_PHONELOG_RESET_STATISTICS_BY_SIM, ctsvc_ipc_phone_log_reset_statistics_by_sim, NULL) != 0) break;
222 if (pims_ipc_svc_register(CTSVC_IPC_PHONELOG_MODULE,
223 CTSVC_IPC_SERVER_PHONELOG_DELETE,
224 ctsvc_ipc_phone_log_delete, NULL) != 0)
226 #endif /* ENABLE_LOG_FEATURE */
227 if (pims_ipc_svc_register(CTSVC_IPC_SETTING_MODULE,
228 CTSVC_IPC_SERVER_SETTING_GET_NAME_DISPLAY_ORDER,
229 ctsvc_ipc_setting_get_name_display_order, NULL) != 0)
231 if (pims_ipc_svc_register(CTSVC_IPC_SETTING_MODULE,
232 CTSVC_IPC_SERVER_SETTING_SET_NAME_DISPLAY_ORDER,
233 ctsvc_ipc_setting_set_name_display_order, NULL) != 0)
235 if (pims_ipc_svc_register(CTSVC_IPC_SETTING_MODULE,
236 CTSVC_IPC_SERVER_SETTING_GET_NAME_SORTING_ORDER,
237 ctsvc_ipc_setting_get_name_sorting_order, NULL) != 0)
239 if (pims_ipc_svc_register(CTSVC_IPC_SETTING_MODULE,
240 CTSVC_IPC_SERVER_SETTING_SET_NAME_SORTING_ORDER,
241 ctsvc_ipc_setting_set_name_sorting_order, NULL) != 0)
244 snprintf(sock_file, sizeof(sock_file), CTSVC_SOCK_PATH"/.%s_for_subscribe",
245 getuid(), CTSVC_IPC_SERVICE);
246 pims_ipc_svc_init_for_publish(sock_file, CTS_SECURITY_FILE_GROUP, CTS_SECURITY_DEFAULT_PERMISSION);
247 ctsvc_noti_publish_socket_initialize();
249 ret = ctsvc_connect();
250 if (CONTACTS_ERROR_NONE != ret) {
251 /* LCOV_EXCL_START */
252 ERR("contacts_connect fail(%d)", ret);
256 ctsvc_set_client_access_info(NULL, NULL);
257 ctsvc_server_bg_add_cb();
258 ctsvc_server_bg_delete_start();
260 ret = ctsvc_server_init_configuration();
263 main_loop = g_main_loop_new(NULL, FALSE);
264 pims_ipc_svc_run_main_loop(main_loop);
266 ctsvc_server_final_configuration();
267 ctsvc_server_bg_remove_cb();
268 ctsvc_unset_client_access_info();
271 pims_ipc_svc_deinit_for_publish();
272 pims_ipc_svc_deinit();
277 /* LCOV_EXCL_START */
278 ERR("pims_ipc_svc_register error");
283 void ctsvc_server_quit(void)
285 g_main_loop_quit(main_loop);
289 int ctsvc_server_get_timeout_sec(void)
291 DBG("ctsvc_timeout_sec:%d", ctsvc_timeout_sec);
292 return ctsvc_timeout_sec;
295 void __ctsvc_create_rep_set_permission(const char *directory, mode_t mode)
297 if (-1 == access(directory, F_OK))
298 mkdir(directory, mode);
301 void __ctsvc_create_noti_file_set_permission(const char *file, mode_t mode)
304 char* path = ctsvc_inotify_makepath(file);
306 ERR("ctsvc_inotify_makepath() fail");
309 fd = creat(path, mode);
312 chmod(path, CTS_SECURITY_DEFAULT_PERMISSION);
318 void __ctsvc_create_noti_rep_set_permission(mode_t mode)
320 char path[CTSVC_PATH_MAX_LEN] = {0};
321 snprintf(path, CTSVC_PATH_MAX_LEN, CTSVC_NOTI_PATH, getuid());
323 if (-1 == access(path, F_OK))
328 int main(int argc, char *argv[])
331 INFO("Start contacts-service");
332 setenv("GCOV_PREFIX", "/tmp/server", 1);
335 if (getuid() == 0) { /* root */
336 gid_t glist[] = {CTS_SECURITY_FILE_GROUP};
337 ret = setgroups(1, glist); /* client and server should have same Groups */
338 WARN_IF(ret < 0, "setgroups Fail(%d)", ret);
341 if (2 <= argc && STRING_EQUAL == strcmp(argv[1], "timeout"))
342 ctsvc_timeout_sec = atoi(argv[2]);
344 ctsvc_server_check_schema();
346 __ctsvc_create_rep_set_permission(DATA_REPERTORY, 0755);
347 __ctsvc_create_rep_set_permission(CTSVC_DATA_REPERTORY, 0775);
348 __ctsvc_create_rep_set_permission(CTSVC_IMG_REPERTORY, 0750);
349 __ctsvc_create_rep_set_permission(CTSVC_VCARD_IMAGE_LOCATION, 0770);
350 __ctsvc_create_rep_set_permission(CTS_MY_IMAGE_LOCATION, 0750);
351 __ctsvc_create_rep_set_permission(CTS_GROUP_IMAGE_LOCATION, 0750);
352 __ctsvc_create_rep_set_permission(CTS_LOGO_IMAGE_LOCATION, 0750);
353 __ctsvc_create_rep_set_permission(CTSVC_CONTACT_IMG_FULL_LOCATION, 0750);
355 __ctsvc_create_noti_rep_set_permission(0755);
356 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_IPC_READY, CTS_SECURITY_DEFAULT_PERMISSION);
357 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_ADDRESSBOOK_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
358 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_GROUP_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
359 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_PERSON_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
360 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_CONTACT_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
361 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_MY_PROFILE_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
362 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_NAME_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
363 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_NUMBER_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
364 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_EMAIL_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
365 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_EVENT_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
366 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_URL_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
367 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_GROUP_RELATION_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
368 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_ADDRESS_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
369 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_NOTE_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
370 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_COMPANY_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
371 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_RELATIONSHIP_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
372 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_IMAGE_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
373 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_NICKNAME_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
374 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_MESSENGER_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
375 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_DATA_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
376 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_SDN_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
377 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_PROFILE_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
378 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_ACTIVITY_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
379 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_ACTIVITY_PHOTO_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
380 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_PHONELOG_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
381 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_SPEEDDIAL_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
382 __ctsvc_create_noti_file_set_permission(CTSVC_NOTI_SIP_CHANGED, CTS_SECURITY_DEFAULT_PERMISSION);
384 /* update DB for compatability */
385 ctsvc_server_db_update();
387 ctsvc_server_load_feature_list();
388 ctsvc_server_socket_init();
392 ctsvc_server_socket_deinit();