Add db integrity check
[platform/core/pim/contacts-service.git] / client / ctsvc_client_db_notification.c
1 /*
2  * Contacts Service
3  *
4  * Copyright (c) 2010 - 2015 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 "contacts.h"
21 #include "ctsvc_internal.h"
22 #include "ctsvc_inotify.h"
23 #include "ctsvc_client_handle.h"
24 #include "ctsvc_client_ipc.h"
25
26 static int _client_noti_check_read_permission(const char *view_uri)
27 {
28         int ret;
29         bool result = false;
30
31         if (STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_ADDRESSBOOK, strlen(CTSVC_VIEW_URI_ADDRESSBOOK))
32                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_PERSON, strlen(CTSVC_VIEW_URI_PERSON))
33                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_CONTACT, strlen(CTSVC_VIEW_URI_CONTACT))
34                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_SIMPLE_CONTACT, strlen(CTSVC_VIEW_URI_SIMPLE_CONTACT))
35                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_GROUP, strlen(CTSVC_VIEW_URI_GROUP))
36                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_MY_PROFILE, strlen(CTSVC_VIEW_URI_MY_PROFILE))
37                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_NAME, strlen(CTSVC_VIEW_URI_NAME))
38                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_NUMBER, strlen(CTSVC_VIEW_URI_NUMBER))
39                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_EMAIL, strlen(CTSVC_VIEW_URI_EMAIL))
40                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_ADDRESS, strlen(CTSVC_VIEW_URI_ADDRESS))
41                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_NOTE, strlen(CTSVC_VIEW_URI_NOTE))
42                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_URL, strlen(CTSVC_VIEW_URI_URL))
43                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_EVENT, strlen(CTSVC_VIEW_URI_EVENT))
44                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_IMAGE, strlen(CTSVC_VIEW_URI_IMAGE))
45                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_COMPANY, strlen(CTSVC_VIEW_URI_COMPANY))
46                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_NICKNAME, strlen(CTSVC_VIEW_URI_NICKNAME))
47                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_MESSENGER, strlen(CTSVC_VIEW_URI_MESSENGER))
48                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_EXTENSION, strlen(CTSVC_VIEW_URI_EXTENSION))
49                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_PROFILE, strlen(CTSVC_VIEW_URI_PROFILE))
50                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_RELATIONSHIP, strlen(CTSVC_VIEW_URI_RELATIONSHIP))
51                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_ACTIVITY, strlen(CTSVC_VIEW_URI_ACTIVITY))
52                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_ACTIVITY_PHOTO, strlen(CTSVC_VIEW_URI_ACTIVITY_PHOTO))
53                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_SPEEDDIAL, strlen(CTSVC_VIEW_URI_SPEEDDIAL))
54                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_SDN, strlen(CTSVC_VIEW_URI_SDN))
55                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_GROUP_RELATION, strlen(CTSVC_VIEW_URI_GROUP_RELATION))
56                         || STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_SIP, strlen(CTSVC_VIEW_URI_SIP))) {
57                 ret = ctsvc_ipc_client_check_permission(CTSVC_PERMISSION_CONTACT_READ, &result);
58                 if (CONTACTS_ERROR_NONE != ret) {
59                         /* LCOV_EXCL_START */
60                         ERR("ctsvc_ipc_client_check_permission() Fail(%d)", ret);
61                         return ret;
62                         /* LCOV_EXCL_STOP */
63                 }
64
65                 RETVM_IF(result == false, CONTACTS_ERROR_PERMISSION_DENIED,
66                                 "Permission denied(contact read)");
67         } else if (STRING_EQUAL == strncmp(view_uri, CTSVC_VIEW_URI_PHONELOG, strlen(CTSVC_VIEW_URI_PHONELOG))) {
68                 ret = ctsvc_ipc_client_check_permission(CTSVC_PERMISSION_PHONELOG_READ, &result);
69                 if (CONTACTS_ERROR_NONE != ret) {
70                         /* LCOV_EXCL_START */
71                         ERR("ctsvc_ipc_client_check_permission() Fail(%d)", ret);
72                         return ret;
73                         /* LCOV_EXCL_STOP */
74                 }
75
76                 RETVM_IF(result == false, CONTACTS_ERROR_PERMISSION_DENIED,
77                                 "Permission denied(phonelog read)");
78         }
79
80         return CONTACTS_ERROR_NONE;
81 }
82
83 EXPORT_API int contacts_db_add_changed_cb(const char *view_uri, contacts_db_changed_cb cb,
84                 void *user_data)
85 {
86         CHECK_CONTACT_SUPPORTED(CONTACT_FEATURE);
87         int ret;
88
89         RETV_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER);
90         RETV_IF(NULL == cb, CONTACTS_ERROR_INVALID_PARAMETER);
91
92         ret = _client_noti_check_read_permission(view_uri);
93         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret,
94                         "_client_noti_check_read_permission() Fail(%d)", ret);
95
96         ret = ctsvc_inotify_subscribe(view_uri, cb, user_data);
97         if (CONTACTS_ERROR_NONE != ret) {
98                 /* LCOV_EXCL_START */
99                 ERR("ctsvc_inotify_subscribe(%s) Fail(%d)", view_uri, ret);
100                 return ret;
101                 /* LCOV_EXCL_STOP */
102         }
103
104         return CONTACTS_ERROR_NONE;
105 }
106
107 EXPORT_API int contacts_db_remove_changed_cb(const char *view_uri, contacts_db_changed_cb cb,
108                 void *user_data)
109 {
110         CHECK_CONTACT_SUPPORTED(CONTACT_FEATURE);
111         int ret;
112
113         RETV_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER);
114         RETV_IF(NULL == cb, CONTACTS_ERROR_INVALID_PARAMETER);
115
116         ret = ctsvc_inotify_unsubscribe(view_uri, cb, user_data);
117         if (CONTACTS_ERROR_NONE != ret) {
118                 /* LCOV_EXCL_START */
119                 ERR("ctsvc_inotify_unsubscribe(%s) Fail(%d)", view_uri, ret);
120                 return ret;
121                 /* LCOV_EXCL_STOP */
122         }
123
124         return CONTACTS_ERROR_NONE;
125 }
126