Remove tizen-locale dependency
[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 <glib.h>
23
24 #include <privilege_db_manager.h>
25 #include <privilege_info.h>
26
27 #include "privilege_information.h"
28
29 #ifdef LOG_TAG
30 #undef LOG_TAG
31 #define LOG_TAG "PRIVILEGE_INFO"
32 #endif
33
34 #define PRIVACY_FEATURE "http://tizen.org/feature/security.privacy_privilege"
35 #define CHECK_FEATURE_SUPPORTED(feature_name) \
36         do { \
37                 bool is_supported = false; \
38                 int ret = system_info_get_platform_bool(feature_name, &is_supported); \
39                 if (ret != SYSTEM_INFO_ERROR_NONE) { \
40                         LOGE("system_info_get_platform_bool failed. ret = %d", ret); \
41                         return PRVINFO_ERROR_INTERNAL_ERROR; \
42                 } \
43                 if (!is_supported) { \
44                         LOGE("%s is disabled", feature_name); \
45                         return PRVINFO_ERROR_NOT_SUPPORTED; \
46                 } \
47         } while (0)
48
49 #define TryReturn(condition, expr, returnValue, ...)  \
50         if (!(condition)) { \
51                 expr; \
52                 LOGE(__VA_ARGS__); \
53                 return returnValue; \
54         }
55
56 #define SAFE_FREE(var) { if (var) { free(var); var = NULL; } }
57
58 #ifndef PI_API
59 #define PI_API __attribute__((visibility("default")))
60 #endif
61
62 static int __convert_package_type(const char* package_type_string)
63 {
64         if (strcmp(package_type_string, "PRVINFO_PACKAGE_TYPE_WEB") == 0)
65                 return PRVMGR_PACKAGE_TYPE_WRT;
66         if (strcmp(package_type_string, "PRVINFO_PACKAGE_TYPE_NATIVE") == 0)
67                 return PRVMGR_PACKAGE_TYPE_CORE;
68
69         return PRVMGR_PACKAGE_TYPE_NONE;
70 }
71
72 static int __convert_return_value(int ret, const char* result)
73 {
74         switch (ret) {
75         case PRVMGR_ERR_NONE:
76                 if (result == NULL)
77                         return PRVINFO_ERROR_NO_MATCHING_PRIVILEGE;
78                 return PRVINFO_ERROR_NONE;
79         case PRVMGR_ERR_INVALID_PARAMETER:
80                 return PRVINFO_ERROR_INVALID_PARAMETER;
81         case PRVMGR_ERR_OUT_OF_MEMORY:
82                 return PRVINFO_ERROR_OUT_OF_MEMORY;
83         case PRVMGR_ERR_NO_EXIST_PRIVILEGE:
84                 return PRVINFO_ERROR_NO_MATCHING_PRIVILEGE;
85         case PRVMGR_ERR_INTERNAL_ERROR:
86         default:
87                 return PRVINFO_ERROR_INTERNAL_ERROR;
88         }
89 }
90
91 static int __convert_result_code(int result)
92 {
93         switch (result) {
94         case PRIVILEGE_NOTI_INFO_RESULT_CODE_SUCCESS:
95                 return PRIVILEGE_CONSUMER_RETURN_CODE_SUCCESS;
96         case PRIVILEGE_NOTI_INFO_RESULT_CODE_UNKNOWN_LOCALE_CODE:
97                 return PRIVILEGE_CONSUMER_RETURN_CODE_UNKNOWN_LOCALE_CODE;
98         case PRIVILEGE_NOTI_INFO_RESULT_CODE_INVALID_PARAMETER:
99         default:
100                 return PRIVILEGE_CONSUMER_RETURN_CODE_INVALID_PARAMETER;
101         }
102 }
103
104 PI_API
105 int privilege_info_get_display_name(const char *api_version, const char *privilege, char **display_name)
106 {
107         TryReturn(api_version != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] api_version is NULL");
108         TryReturn(privilege != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege is NULL");
109
110         int ret = privilege_info_get_privilege_display_name(privilege, display_name);
111
112         return __convert_return_value(ret, *display_name);
113 }
114
115 PI_API
116 int privilege_info_get_description(const char *api_version, const char *privilege, char **description)
117 {
118         TryReturn(api_version != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] api_version is NULL");
119         TryReturn(privilege != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege is NULL");
120
121         int ret = privilege_info_get_privilege_description(privilege, description);
122
123         return __convert_return_value(ret, *description);
124 }
125
126 PI_API
127 int privilege_info_get_display_name_by_pkgtype(const char *package_type, const char *api_version, const char *privilege, char **display_name)
128 {
129         TryReturn(package_type != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] package_type is NULL");
130         TryReturn(api_version != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] api_version is NULL");
131         TryReturn(privilege != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege is NULL");
132
133         int ret = privilege_info_get_privilege_display_name_by_package_type(privilege, api_version, __convert_package_type(package_type), display_name);
134
135         return __convert_return_value(ret, *display_name);
136 }
137
138 PI_API
139 int privilege_info_get_description_by_pkgtype(const char *package_type, const char *api_version, const char *privilege, char **description)
140 {
141         TryReturn(package_type != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] package_type is NULL");
142         TryReturn(api_version != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] api_version is NULL");
143         TryReturn(privilege != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege is NULL");
144
145         int ret = privilege_info_get_privilege_description_by_package_type(privilege, api_version, __convert_package_type(package_type), description);
146
147         return __convert_return_value(ret, *description);
148 }
149
150 PI_API
151 int privilege_info_get_privacy_display_name(const char *privilege, char **privacy_display_name)
152 {
153         CHECK_FEATURE_SUPPORTED(PRIVACY_FEATURE);
154         TryReturn(privilege != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege is NULL");
155         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);
156
157         char* privacy_name = NULL;
158         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);
159
160         int ret = privilege_info_get_privacy_display(privacy_name, privacy_display_name);
161         SAFE_FREE(privacy_name);
162
163         return __convert_return_value(ret, *privacy_display_name);
164 }
165
166 PI_API
167 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)
168 {
169         TryReturn(privilege_name_list != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege_name_list is NULL.");
170
171         privilege_noti_info_result_e result;
172         int ret = privilege_info_get_privilege_noti_info_list(locale, privilege_name_list, privilege_info_list, &result);
173         *return_result = __convert_result_code(result);
174
175         return __convert_return_value(ret, "");
176 }
177
178 PI_API
179 int privilege_info_free_privilege_info_list(GList* privilege_info_list)
180 {
181         return __convert_return_value(privilege_info_free_privilege_noti_info_list(privilege_info_list), "");
182 }
183
184