Fix source files access rights
[platform/core/security/privilege-info.git] / src / privilege_information.c
1 /*
2  * Copyright (c) 2014-2020 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <libintl.h>
20 #include <dlog.h>
21 #include <system_info.h>
22 #include <locale.h>
23 #include <glib.h>
24
25 #include <privilege_db_manager.h>
26 #include <privilege_info.h>
27
28 #include "privilege_information.h"
29
30 #ifdef LOG_TAG
31 #undef LOG_TAG
32 #define LOG_TAG "PRIVILEGE_INFO"
33 #endif
34
35 #define PRIVACY_FEATURE "http://tizen.org/feature/security.privacy_privilege"
36 #define CHECK_FEATURE_SUPPORTED(feature_name) \
37         do { \
38                 bool is_supported = false; \
39                 int ret = system_info_get_platform_bool(feature_name, &is_supported); \
40                 if (ret != SYSTEM_INFO_ERROR_NONE) { \
41                         LOGE("system_info_get_platform_bool failed. ret = %d", ret); \
42                         return PRVINFO_ERROR_INTERNAL_ERROR; \
43                 } \
44                 if (!is_supported) { \
45                         LOGE("%s is disabled", feature_name); \
46                         return PRVINFO_ERROR_NOT_SUPPORTED; \
47                 } \
48         } while (0)
49
50 #define TryReturn(condition, expr, returnValue, ...)  \
51         if (!(condition)) { \
52                 expr; \
53                 LOGE(__VA_ARGS__); \
54                 return returnValue; \
55         }
56
57 #define SAFE_FREE(var) { if (var) { free(var); var = NULL; } }
58
59 #ifndef PI_API
60 #define PI_API __attribute__((visibility("default")))
61 #endif
62
63 static int __convert_package_type(const char* package_type_string)
64 {
65         if (strcmp(package_type_string, "PRVINFO_PACKAGE_TYPE_WEB") == 0)
66                 return PRVMGR_PACKAGE_TYPE_WRT;
67         if (strcmp(package_type_string, "PRVINFO_PACKAGE_TYPE_NATIVE") == 0)
68                 return PRVMGR_PACKAGE_TYPE_CORE;
69
70         return PRVMGR_PACKAGE_TYPE_NONE;
71 }
72
73 static int __convert_return_value(int ret, const char* result)
74 {
75         switch (ret) {
76         case PRVMGR_ERR_NONE:
77                 if (result == NULL)
78                         return PRVINFO_ERROR_NO_MATCHING_PRIVILEGE;
79                 return PRVINFO_ERROR_NONE;
80         case PRVMGR_ERR_INVALID_PARAMETER:
81                 return PRVINFO_ERROR_INVALID_PARAMETER;
82         case PRVMGR_ERR_OUT_OF_MEMORY:
83                 return PRVINFO_ERROR_OUT_OF_MEMORY;
84         case PRVMGR_ERR_NO_EXIST_PRIVILEGE:
85                 return PRVINFO_ERROR_NO_MATCHING_PRIVILEGE;
86         case PRVMGR_ERR_INTERNAL_ERROR:
87         default:
88                 return PRVINFO_ERROR_INTERNAL_ERROR;
89         }
90 }
91
92 static int __convert_result_code(int result)
93 {
94         switch (result) {
95         case PRIVILEGE_NOTI_INFO_RESULT_CODE_SUCCESS:
96                 return PRIVILEGE_CONSUMER_RETURN_CODE_SUCCESS;
97         case PRIVILEGE_NOTI_INFO_RESULT_CODE_UNKNOWN_LOCALE_CODE:
98                 return PRIVILEGE_CONSUMER_RETURN_CODE_UNKNOWN_LOCALE_CODE;
99         case PRIVILEGE_NOTI_INFO_RESULT_CODE_INVALID_PARAMETER:
100         default:
101                 return PRIVILEGE_CONSUMER_RETURN_CODE_INVALID_PARAMETER;
102         }
103 }
104
105 PI_API
106 int privilege_info_get_display_name(const char *api_version, const char *privilege, char **display_name)
107 {
108         TryReturn(api_version != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] api_version is NULL");
109         TryReturn(privilege != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege is NULL");
110
111         int ret = privilege_info_get_privilege_display_name(privilege, display_name);
112
113         return __convert_return_value(ret, *display_name);
114 }
115
116 PI_API
117 int privilege_info_get_description(const char *api_version, const char *privilege, char **description)
118 {
119         TryReturn(api_version != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] api_version is NULL");
120         TryReturn(privilege != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege is NULL");
121
122         int ret = privilege_info_get_privilege_description(privilege, description);
123
124         return __convert_return_value(ret, *description);
125 }
126
127 PI_API
128 int privilege_info_get_display_name_by_pkgtype(const char *package_type, const char *api_version, const char *privilege, char **display_name)
129 {
130         TryReturn(package_type != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] package_type is NULL");
131         TryReturn(api_version != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] api_version is NULL");
132         TryReturn(privilege != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege is NULL");
133
134         int ret = privilege_info_get_privilege_display_name_by_package_type(privilege, api_version, __convert_package_type(package_type), display_name);
135
136         return __convert_return_value(ret, *display_name);
137 }
138
139 PI_API
140 int privilege_info_get_description_by_pkgtype(const char *package_type, const char *api_version, const char *privilege, char **description)
141 {
142         TryReturn(package_type != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] package_type is NULL");
143         TryReturn(api_version != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] api_version is NULL");
144         TryReturn(privilege != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege is NULL");
145
146         int ret = privilege_info_get_privilege_description_by_package_type(privilege, api_version, __convert_package_type(package_type), description);
147
148         return __convert_return_value(ret, *description);
149 }
150
151 PI_API
152 int privilege_info_get_privacy_display_name(const char *privilege, char **privacy_display_name)
153 {
154         CHECK_FEATURE_SUPPORTED(PRIVACY_FEATURE);
155         TryReturn(privilege != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege is NULL");
156         TryReturn(privilege_info_has_privacy_attr(privilege) == 1, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege %s does not exist or does not have privacy attribute", privilege);
157
158         char* privacy_name = NULL;
159         TryReturn(privilege_info_get_privacy_by_privilege(privilege, &privacy_name) == PRVMGR_ERR_NONE && privacy_name != NULL, SAFE_FREE(privacy_name), PRVINFO_ERROR_INTERNAL_ERROR, "[PRVINFO_ERROR_INTERNAL_ERROR] privilege_info_get_privacy_by_privilege() failed. privilege = %s", privilege);
160
161         int ret = privilege_info_get_privacy_display(privacy_name, privacy_display_name);
162         SAFE_FREE(privacy_name);
163
164         return __convert_return_value(ret, *privacy_display_name);
165 }
166
167 PI_API
168 int privilege_info_get_privilege_info_list(const char* locale, GList* privilege_name_list, GList** privilege_info_list, privilege_consumer_return_code_e* return_result)
169 {
170         TryReturn(privilege_name_list != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege_name_list is NULL.");
171
172         privilege_noti_info_result_e result;
173         int ret = privilege_info_get_privilege_noti_info_list(locale, privilege_name_list, privilege_info_list, &result);
174         *return_result = __convert_result_code(result);
175
176         return __convert_return_value(ret, "");
177 }
178
179 PI_API
180 int privilege_info_free_privilege_info_list(GList* privilege_info_list)
181 {
182         return __convert_return_value(privilege_info_free_privilege_noti_info_list(privilege_info_list), "");
183 }
184
185