5 #include <privilege_db_manager.h>
6 #include <cynara-session.h>
7 #include <cynara-client.h>
10 #include "privilege_information.h"
13 #define LOG_TAG "PRIVILEGE_INFO"
18 #define TryReturn(condition, expr, returnValue, ...) \
26 #define PI_API __attribute__((visibility("default")))
30 PRVINFO_ERROR_NO_MATCHING_PRIVILEGE = TIZEN_ERROR_PRIVILEGE_INFORMATION | 0x01
31 } privilege_info_internal_error_e;
33 int privilege_info_get_string_id(const char *package_type_string, int display, const char *api_version, const char *privilege, char **string_id)
35 TryReturn(api_version != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] api_version is NULL");
36 TryReturn(privilege != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege is NULL");
40 privilege_db_manager_package_type_e package_type;
42 if (package_type_string != NULL)
43 goto get_string_id_with_package_type;
47 ret = privilege_db_manager_get_privilege_display(PRIVILEGE_DB_MANAGER_PACKAGE_TYPE_CORE, privilege, api_version, &temp);
49 ret = privilege_db_manager_get_privilege_description(PRIVILEGE_DB_MANAGER_PACKAGE_TYPE_CORE, privilege, api_version, &temp);
51 if (ret == PRIVILEGE_DB_MANAGER_ERR_NONE)
53 else if (ret != PRIVILEGE_DB_NO_EXIST_RESULT)
54 goto err_internal_error;
58 get_string_id_with_package_type:
59 if (package_type_string == NULL || strcmp(package_type_string, "PRVINFO_PACKAGE_TYPE_WEB") == 0)
60 package_type = PRIVILEGE_DB_MANAGER_PACKAGE_TYPE_WRT;
61 else if (strcmp(package_type_string, "PRVINFO_PACKAGE_TYPE_NATIVE") == 0)
62 package_type = PRIVILEGE_DB_MANAGER_PACKAGE_TYPE_CORE;
64 return PRVINFO_ERROR_INVALID_PARAMETER;
67 ret = privilege_db_manager_get_privilege_display(package_type, privilege, api_version, &temp);
69 ret = privilege_db_manager_get_privilege_description(package_type, privilege, api_version, &temp);
72 if (ret == PRIVILEGE_DB_MANAGER_ERR_NONE)
74 else if (ret == PRIVILEGE_DB_NO_EXIST_RESULT)
75 goto err_no_matching_privilege;
77 goto err_internal_error;
80 *string_id = strdup(temp);
81 TryReturn(*string_id != NULL, free(temp), PRVINFO_ERROR_OUT_OF_MEMORY, "[PRVINFO_ERROR_OUT_OF_MEMORY] Memory allocation is failed.");
83 return PRVINFO_ERROR_NONE;
85 err_no_matching_privilege:
88 return PRVINFO_ERROR_NO_MATCHING_PRIVILEGE;
92 return PRVINFO_ERROR_INTERNAL_ERROR;
95 int privilege_info_get_string_by_string_id(const char *string_id, char **string)
98 TryReturn(string_id != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] string_id is NULL");
100 temp = dgettext("privilege", string_id);
102 *string = strdup(temp);
103 TryReturn(*string != NULL, , PRVINFO_ERROR_OUT_OF_MEMORY, "[PRVINFO_ERROR_OUT_OF_MEMORY] strdup of string failed.");
105 return PRVINFO_ERROR_NONE;
109 int privilege_info_get_display_name(const char *api_version, const char *privilege, char **display_name)
112 char* string_id = NULL;
114 TryReturn(api_version != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] api_version is NULL");
115 TryReturn(privilege != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege is NULL");
117 ret = privilege_info_get_string_id(NULL, 1, api_version, privilege, &string_id);
119 if (ret == PRVINFO_ERROR_NO_MATCHING_PRIVILEGE) {
120 char* tempPrivilege = NULL;
125 tempPrivilege = strdup(privilege);
126 TryReturn(tempPrivilege != NULL, free(tempPrivilege), PRVINFO_ERROR_OUT_OF_MEMORY, "[PRVINFO_ERROR_OUT_OF_MEMORY] tempPrivilege's strdup is failed.");
128 token = strtok_r(tempPrivilege, "/", &save);
131 token = strtok_r(NULL, "/", &save);
133 *display_name = strdup(temp);
134 TryReturn(*display_name != NULL, free(tempPrivilege), PRVINFO_ERROR_OUT_OF_MEMORY, "[PRVINFO_ERROR_OUT_OF_MEMORY] Memory allocation failed.");
136 } else if (ret == PRVINFO_ERROR_NONE) {
137 ret = privilege_info_get_string_by_string_id(string_id, display_name);
139 TryReturn(ret == PRVINFO_ERROR_NONE, , PRVINFO_ERROR_OUT_OF_MEMORY, "[PRVINFO_ERROR_OUT_OF_MEMORY] Memory allocation failed.");
141 return PRVINFO_ERROR_INTERNAL_ERROR;
143 return PRVINFO_ERROR_NONE;
148 int privilege_info_get_description(const char *api_version, const char *privilege, char **description)
151 char* string_id = NULL;
153 TryReturn(api_version != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] api_version is NULL");
154 TryReturn(privilege != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege is NULL");
156 ret = privilege_info_get_string_id(NULL, 0, api_version, privilege, &string_id);
158 if (ret == PRVINFO_ERROR_NO_MATCHING_PRIVILEGE) {
159 ret = privilege_info_get_string_by_string_id("IDS_TPLATFORM_BODY_THIS_PRIVILEGE_IS_NOT_DEFINED", description);
160 TryReturn(ret == PRVINFO_ERROR_NONE, , PRVINFO_ERROR_OUT_OF_MEMORY, "[PRVINFO_ERROR_OUT_OF_MEMORY] Memory allocation failed.");
161 } else if (ret == PRVINFO_ERROR_NONE) {
162 ret = privilege_info_get_string_by_string_id(string_id, description);
164 TryReturn(ret == PRVINFO_ERROR_NONE, , PRVINFO_ERROR_OUT_OF_MEMORY, "[PRVINFO_ERROR_OUT_OF_MEMORY] Memory allocation failed.");
166 return PRVINFO_ERROR_INTERNAL_ERROR;
168 return PRVINFO_ERROR_NONE;
172 int privilege_info_get_display_name_by_pkgtype(const char *package_type, const char *api_version, const char *privilege, char **display_name)
175 char* string_id = NULL;
177 TryReturn(package_type != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] package_type is NULL");
178 TryReturn(api_version != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] api_version is NULL");
179 TryReturn(privilege != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege is NULL");
181 ret = privilege_info_get_string_id(package_type, 1, api_version, privilege, &string_id);
182 TryReturn(ret != PRVINFO_ERROR_INVALID_PARAMETER, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] invalid package_type : %s", package_type);
184 if (ret == PRVINFO_ERROR_NO_MATCHING_PRIVILEGE) {
185 char* tempPrivilege = NULL;
189 tempPrivilege = strdup(privilege);
190 TryReturn(tempPrivilege != NULL, free(tempPrivilege), PRVINFO_ERROR_OUT_OF_MEMORY, "[PRVINFO_ERROR_OUT_OF_MEMORY] tempPrivilege's strdup is failed.");
191 token = strtok_r(tempPrivilege, "/", &save);
194 token = strtok_r(NULL, "/", &save);
196 *display_name = strdup(temp);
197 TryReturn(*display_name != NULL, free(tempPrivilege), PRVINFO_ERROR_OUT_OF_MEMORY, "[PRVINFO_ERROR_OUT_OF_MEMORY] Memory allocation failed.");
199 } else if (ret == PRVINFO_ERROR_NONE) {
200 ret = privilege_info_get_string_by_string_id(string_id, display_name);
202 TryReturn(ret == PRVINFO_ERROR_NONE, , PRVINFO_ERROR_OUT_OF_MEMORY, "[PRVINFO_ERROR_OUT_OF_MEMORY] Memory allocation failed.");
204 return PRVINFO_ERROR_INTERNAL_ERROR;
206 return PRVINFO_ERROR_NONE;
210 int privilege_info_get_description_by_pkgtype(const char *package_type, const char *api_version, const char *privilege, char **description)
213 char* string_id = NULL;
215 TryReturn(package_type != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] package_type is NULL");
216 TryReturn(api_version != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] api_version is NULL");
217 TryReturn(privilege != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege is NULL");
219 ret = privilege_info_get_string_id(package_type, 0, api_version, privilege, &string_id);
220 TryReturn(ret != PRVINFO_ERROR_INVALID_PARAMETER, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] invalid package_type : %s", package_type);
222 if (ret == PRVINFO_ERROR_NO_MATCHING_PRIVILEGE) {
223 ret = privilege_info_get_string_by_string_id("IDS_TPLATFORM_BODY_THIS_PRIVILEGE_IS_NOT_DEFINED", description);
224 TryReturn(ret == PRVINFO_ERROR_NONE, , PRVINFO_ERROR_OUT_OF_MEMORY, "[PRVINFO_ERROR_OUT_OF_MEMORY] Memory allocation failed.");
225 } else if (ret == PRVINFO_ERROR_NONE) {
226 ret = privilege_info_get_string_by_string_id(string_id, description);
228 TryReturn(ret == PRVINFO_ERROR_NONE, , PRVINFO_ERROR_OUT_OF_MEMORY, "[PRVINFO_ERROR_OUT_OF_MEMORY] Memory allocation failed.");
230 return PRVINFO_ERROR_INTERNAL_ERROR;
232 return PRVINFO_ERROR_NONE;
236 int privilege_info_get_privacy_display_name(const char *privilege, char **privacy_display_name)
238 TryReturn(privilege != NULL, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege is NULL");
239 TryReturn(privilege_db_manager_is('p', privilege) == 1, , PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege does not exist or is not a privacy related");
241 char* privacy_id = NULL;
242 char* privacy_display_string_id = NULL;
244 TryReturn(privilege_db_manager_get_privacy_by_privilege(privilege, &privacy_id) == PRIVILEGE_DB_MANAGER_ERR_NONE && privacy_id != NULL, , PRVINFO_ERROR_INTERNAL_ERROR, "[PRVINFO_ERROR_INTERNAL_ERROR] privilege_db_manager_get_privacy_by_privilege failed");
246 TryReturn(privilege_db_manager_get_privacy_display(privacy_id, &privacy_display_string_id) == PRIVILEGE_DB_MANAGER_ERR_NONE && privacy_display_string_id != NULL, free(privacy_id), PRVINFO_ERROR_INTERNAL_ERROR, "[PRVINFO_ERROR_INTERNAL_ERROR] privilege_db_manager_get_privacy_display failed");
248 TryReturn(privilege_info_get_string_by_string_id(privacy_display_string_id, privacy_display_name) == PRVINFO_ERROR_NONE && *privacy_display_name != NULL, free(privacy_id); free(privacy_display_string_id), PRVINFO_ERROR_OUT_OF_MEMORY, "[PRVINFO_ERROR_OUT_OF_MEMORY] Memory allocation failed.");
251 free(privacy_display_string_id);
252 return PRVINFO_ERROR_NONE;
256 int privilege_info_get_privacy_privilege_status(const char *privilege, bool *status)
258 TryReturn(privilege != NULL, *status = true, PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege is NULL");
259 TryReturn(privilege_db_manager_is('p', privilege) == 1, *status = true, PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege does not exist or is not a privacy related");
261 char* smack_label = NULL;
262 TryReturn(smack_new_label_from_self(&smack_label) != -1, *status = true, PRVINFO_ERROR_INTERNAL_ERROR, "[PRVINFO_ERROR_INTERNAL_ERROR] smack_new_label_from_self() failed.");
264 cynara *cynara = NULL;
265 TryReturn(cynara_initialize(&cynara, NULL) == CYNARA_API_SUCCESS, *status = true; cynara = NULL, PRVINFO_ERROR_INTERNAL_ERROR, "[PRVINFO_ERROR_INTERNAL_ERROR] cynara_initialize() failed.");
267 char *session = NULL;
268 session = cynara_session_from_pid(getpid());
269 TryReturn(session != NULL, *status = true; cynara_finish(cynara), PRVINFO_ERROR_INTERNAL_ERROR, "[PRVINFO_ERROR_INTERNAL_ERROR] cynara_session_from_pid() failed");
272 int result = snprintf(uid, UIDMAXLEN, "%d", getuid());
273 TryReturn(uid != NULL && result > 0, *status = true; free(session); cynara_finish(cynara), PRVINFO_ERROR_INTERNAL_ERROR, "[PRVINFO_ERROR_INTERNAL_ERROR] snprintf() for uid failed.");
275 result = cynara_simple_check(cynara, smack_label, session, uid, privilege);
276 int ret = PRVINFO_ERROR_NONE;
278 cynara_finish(cynara);
280 LOGD("result of cynara_check(cynara %s, session, %s, %s) result = %d", smack_label, uid, privilege, result);
281 if (result == CYNARA_API_ACCESS_DENIED) {
283 } else if (result == CYNARA_API_ACCESS_ALLOWED) {
287 LOGE("[PRVINFO_ERROR_INTERNAL_ERROR] cynara_check() failed. ret = %d", result);
288 ret = PRVINFO_ERROR_INTERNAL_ERROR;