From ae5b9ecb314c27e4ab1dc1f04f2ca72b58060145 Mon Sep 17 00:00:00 2001 From: Yunjin Lee Date: Fri, 21 Dec 2018 13:37:23 +0900 Subject: [PATCH] Add new API for getting privilege info as list - Add API to get privilege info list of the given locale and privileges - Add struct for privilege info including privilege name, display name, and desciprtion. - Add enum to indicate the result of getting privilege info Change-Id: I359e51d734872b8a83b0b2fb9b821546c2404e28 Signed-off-by: Yunjin Lee --- packaging/privilege-info.spec | 2 +- src/CMakeLists.txt | 7 +- src/include/privilege_information.h | 73 ++++++++- src/{privilege_info.c => privilege_information.c} | 178 +++++++++++++++++++++- test/tc_privilege_info.c | 134 ++++++++++++++++ 5 files changed, 383 insertions(+), 11 deletions(-) rename src/{privilege_info.c => privilege_information.c} (72%) diff --git a/packaging/privilege-info.spec b/packaging/privilege-info.spec index b23542c..10378b7 100644 --- a/packaging/privilege-info.spec +++ b/packaging/privilege-info.spec @@ -1,6 +1,6 @@ Name: privilege-info Summary: Privilege Information -Version: 0.0.2 +Version: 0.0.3 Release: 1 Group: Security/API License: Apache-2.0 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2103600..b0789ab 100755 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,7 +3,7 @@ SET(PACKAGE_NAME privilege-info) PROJECT(${PACKAGE_NAME}) SET(PRIV_INFO_SOURCES - ${PROJECT_SOURCE_DIR}/privilege_info.c + ${PROJECT_SOURCE_DIR}/privilege_information.c ) INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include) @@ -40,4 +40,7 @@ TARGET_LINK_LIBRARIES(${TARGET_PRIV_INFO_LIB} ${${PACKAGE_NAME}_LDFLAGS}) INSTALL(TARGETS ${PACKAGE_NAME} DESTINATION ${LIBDIR}) INSTALL(FILES ${PROJECT_SOURCE_DIR}/include/privilege_information.h DESTINATION ${INCLUDEDIR}) -INSTALL(FILES ${CMAKE_SOURCE_DIR}/privilege-info.pc DESTINATION ${LIBDIR}/pkgconfig) + +SET(PC_LDFLAGS -l${PACKAGE_NAME}) +CONFIGURE_FILE(../${PACKAGE_NAME}.pc.in ${PACKAGE_NAME}.pc @ONLY) +INSTALL(FILES ${PACKAGE_NAME}.pc DESTINATION ${LIBDIR}/pkgconfig) diff --git a/src/include/privilege_information.h b/src/include/privilege_information.h index fbfad92..d85e6d8 100755 --- a/src/include/privilege_information.h +++ b/src/include/privilege_information.h @@ -15,12 +15,16 @@ */ -#ifndef __TIZEN_SECURITY_PRIVILEGE_INFORMAION_H -#define __TIZEN_SECURITY_PRIVILEGE_INFORMAION_H +#ifndef __TIZEN_SECURITY_PRIVILEGE_INFORMATION_H +#define __TIZEN_SECURITY_PRIVILEGE_INFORMATION_H #include +#include +#ifndef TIZEN_DEPRECATED_API +#define TIZEN_DEPRECATED_API __attribute__ ((__visibility__("default"), deprecated)) +#endif #ifdef __cplusplus extern "C" { @@ -152,7 +156,68 @@ int privilege_info_get_privacy_display_name(const char *privilege, char **privac * @retval #PRVINFO_ERROR_INTERNAL_ERROR Unknown error * @retval #PRVINFO_ERROR_NOT_SUPPORTED Not supported */ -int privilege_info_get_privacy_privilege_status(const char *privilege, bool *status); +int privilege_info_get_privacy_privilege_status(const char *privilege, bool *status) TIZEN_DEPRECATED_API; + + +/** + * @brief The structure for privilege information. + * @since_tizen 5.5 + */ +typedef struct _privilege_info_s { + char* privilege_name; /**< The privilege name */ + char* display_name; /**< The display name of the privilege */ + char* description; /**< The description of the privilege */ +} privilege_info_s; + +/** + * @brief Enumeration for return code to be sent to consumer. + * @since_tizen 5.5 + */ +typedef enum { + PRIVILEGE_CONSUMER_RETURN_CODE_SUCCESS = 0, /**< Successful */ + PRIVILEGE_CONSUMER_RETURN_CODE_UNKNOWN_LOCALE_CODE, /**< Unknown locale code. */ + PRIVILEGE_CONSUMER_RETURN_CODE_INVALID_PARAMETER, /**< Invalid parameter. */ +} privilege_consumer_return_code_e; + +/** + * @brief Gets the privilege information list of the given locale and privileges. + * @details If the given @a locale is not recognized, @a return_result is set to #PRIVILEGE_CONSUMER_RETURN_CODE_UNKNOWN_LOCALE_CODE and the result in the @a privilege_info_list is provided according to the current locale. If all of the privileges in @a privilege_name_list are invalid then @a return_result is set to #PRIVILEGE_CONSUMER_RETURN_CODE_INVALID_PARAMETER. Otherwise, @a return_result is set to #PRIVILEGE_CONSUMER_RETURN_CODE_SUCCESS. If some of the privileges in @a privilege_name_list are invalid then corresponding elements in the @a privilege_info_list will have the display_name and the description set to an empty string. + * @since_tizen 5.5 + * + * @remarks You must destroy the newly created privilege_info_list by calling privilege_info_free_privilege_info_list() if it is no longer needed. + * + * @param[in] locale The locale information + * @param[in] privilege_name_list The privilege name list + * @param[out] privilege_info_list The privilege information list of the given locale and privileges + * @param[out] return_result The return code to be sent to consumer. + * + * @return 0 on success, otherwise a negative error value. + * + * @retval #PRVINFO_ERROR_NONE Successful + * @retval #PRVINFO_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PRVINFO_ERROR_INVALID_PARAMETER Invalid function parameter + * @retval #PRVINFO_ERROR_INTERNAL_ERROR Unknown error + * @see privilege_info_free_privilege_info_list() + * @see privilege_consumer_return_code_e + */ +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); + +/** + * @brief Destroys the privilege information list. + * @since_tizen 5.5 + * + * @remarks If @a privilege_info_list is NULL, no operation is performed and #PRVINFO_ERROR_INVALID_PARAMETER will be returned. + * + * @param[in] privilege_info_list The privilege information list to destroy + * + * @return 0 on success, otherwise a negative error value. + * + * @retval #PRVINFO_ERROR_NONE Successful + * @retval #PRVINFO_ERROR_INVALID_PARAMETER Invalid function parameter + */ +int privilege_info_free_privilege_info_list(GList* privilege_info_list); + + /** @@ -165,4 +230,4 @@ int privilege_info_get_privacy_privilege_status(const char *privilege, bool *sta #endif -#endif /* __TIZEN_SECURITY_PRIVILEGE_INFORMAION_H */ +#endif /* __TIZEN_SECURITY_PRIVILEGE_INFORMATION_H */ diff --git a/src/privilege_info.c b/src/privilege_information.c similarity index 72% rename from src/privilege_info.c rename to src/privilege_information.c index 79b2ea7..17ef740 100755 --- a/src/privilege_info.c +++ b/src/privilege_information.c @@ -18,13 +18,20 @@ #include #include #include -#include -#include -#include #include #include #include +#include +#include + +#include +#include + +#include +#include + #include "privilege_information.h" + #ifdef LOG_TAG #undef LOG_TAG #define LOG_TAG "PRIVILEGE_INFO" @@ -175,7 +182,6 @@ int privilege_info_get_display_name(const char *api_version, const char *privile return PRVINFO_ERROR_NONE; } - PI_API int privilege_info_get_description(const char *api_version, const char *privilege, char **description) { @@ -288,6 +294,7 @@ int privilege_info_get_privacy_display_name(const char *privilege, char **privac PI_API int privilege_info_get_privacy_privilege_status(const char *privilege, bool *status) { + LOGW("DEPRECATION WARNING: privilege_info_get_privacy_privilege_status() is deprecated and will be removed from next release. Use ppm_check_permission() instead."); CHECK_FEATURE_SUPPORTED(PRIVACY_FEATURE); TryReturn(privilege != NULL, *status = true, PRVINFO_ERROR_INVALID_PARAMETER, "[PRVINFO_ERROR_INVALID_PARAMETER] privilege is NULL"); 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"); @@ -325,3 +332,166 @@ int privilege_info_get_privacy_privilege_status(const char *privilege, bool *sta return ret; } + +PI_API +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) +{ + GList *l; + GList *temp_privilege_info_list = NULL; + char* privilege_display = NULL; + char* privilege_description = NULL; + int is_invaild_parameter_count = 0; + int privilege_name_list_size = 0; + privilege_consumer_return_code_e consumer_return_code = PRIVILEGE_CONSUMER_RETURN_CODE_SUCCESS; + int ret = PRVINFO_ERROR_NONE; + + if (privilege_name_list == NULL) { + LOGE("[PRVINFO_ERROR_INVALID_PARAMETER] privilege_list is NULL"); + return PRVINFO_ERROR_INVALID_PARAMETER; + } + + char *orig_locale = (char *)setlocale(LC_ALL, NULL); + if (!orig_locale) { + LOGE("failed to get original locale. orig_locale = %s", orig_locale); + } + char *result = (char *)setlocale(LC_ALL, locale); + if (result) { + LOGI("succeeded in setting locale = %s", result); + } else { + LOGE("failed to set locale. result = %s", result); + setlocale(LC_ALL, "en_US.UTF8"); + + consumer_return_code = PRIVILEGE_CONSUMER_RETURN_CODE_UNKNOWN_LOCALE_CODE; + } + + for (l = privilege_name_list; l != NULL; l = l->next) { + char* privilege_name = (char*)l->data; + + LOGI("privilege_name = %s", privilege_name); + + ret = privilege_info_get_privilege_display_name(privilege_name, &privilege_display); + if (ret == PRVMGR_ERR_NONE) { + if (privilege_display != NULL) { + LOGI("display : %s", privilege_display); + } else { + privilege_display = strdup(""); + if (privilege_display == NULL) { + LOGE("[PRVINFO_ERROR_OUT_OF_MEMORY] Memory allocation failed."); + ret = PRVINFO_ERROR_OUT_OF_MEMORY; + goto FINISH; + } + is_invaild_parameter_count++; + } + } else { + LOGE("failed to call privilege_info_get_privilege_display_name."); + ret = PRVINFO_ERROR_INTERNAL_ERROR; + goto FINISH; + } + + LOGI("privilege_display = %s", privilege_display); + + ret = privilege_info_get_privilege_description(privilege_name, &privilege_description); + if (ret == PRVMGR_ERR_NONE) { + if (privilege_description != NULL) { + LOGI("description : %s", privilege_description); + } else { + privilege_description = strdup(""); + if (privilege_description == NULL) { + LOGE("[PRVINFO_ERROR_OUT_OF_MEMORY] Memory allocation failed."); + ret = PRVINFO_ERROR_OUT_OF_MEMORY; + goto FINISH; + } + } + } else { + LOGE("failed to call privilege_info_get_privilege_description."); + ret = PRVINFO_ERROR_INTERNAL_ERROR; + goto FINISH; + } + + LOGD("privilege_description = %s", privilege_description); + + privilege_info_s* privilege_info = (privilege_info_s*)malloc(sizeof(privilege_info_s)); + memset(privilege_info, 0, sizeof(privilege_info_s)); + + privilege_info->privilege_name = strdup(privilege_name); + if (privilege_info->privilege_name == NULL) { + LOGE("[PRVINFO_ERROR_OUT_OF_MEMORY] Memory allocation failed."); + ret = PRVINFO_ERROR_OUT_OF_MEMORY; + free(privilege_info); + goto FINISH; + } + privilege_info->display_name = strdup(privilege_display); + if (privilege_info->display_name == NULL) { + LOGE("[PRVINFO_ERROR_OUT_OF_MEMORY] Memory allocation failed."); + ret = PRVINFO_ERROR_OUT_OF_MEMORY; + free(privilege_info->privilege_name); + free(privilege_info); + goto FINISH; + } + privilege_info->description = strdup(privilege_description); + if (privilege_info->description == NULL) { + LOGE("[PRVINFO_ERROR_OUT_OF_MEMORY] Memory allocation failed."); + ret = PRVINFO_ERROR_OUT_OF_MEMORY; + free(privilege_info->privilege_name); + free(privilege_info->display_name); + free(privilege_info); + goto FINISH; + } + LOGI("privilege_info->privilege_name = %s", privilege_info->privilege_name); + LOGI("privilege_info->display_name = %s", privilege_info->display_name); + LOGI("privilege_info->description = %s", privilege_info->description); + + temp_privilege_info_list = g_list_append(temp_privilege_info_list, privilege_info); + + privilege_name_list_size++; + + if (privilege_display != NULL) { + free(privilege_display); + privilege_display = NULL; + } + + if (privilege_description != NULL) { + free(privilege_description); + privilege_description = NULL; + } + } + + if (is_invaild_parameter_count == privilege_name_list_size) + consumer_return_code = PRIVILEGE_CONSUMER_RETURN_CODE_INVALID_PARAMETER; + +FINISH: + + *privilege_info_list = temp_privilege_info_list; + *return_result = consumer_return_code; + + if (privilege_display != NULL) { + free(privilege_display); + privilege_display = NULL; + } + + if (privilege_description != NULL) { + free(privilege_description); + privilege_description = NULL; + } + + setlocale(LC_ALL, orig_locale); + + return ret; +} + +PI_API +int privilege_info_free_privilege_info_list(GList* privilege_info_list) +{ + if (privilege_info_list == NULL) + return PRVINFO_ERROR_INVALID_PARAMETER; + + GList* l = NULL; + for (l = privilege_info_list; l != NULL; l = l->next) { + privilege_info_s* privilege_info = (privilege_info_s*)l->data; + free(privilege_info->privilege_name); + free(privilege_info->display_name); + free(privilege_info->description); + } + g_list_free(privilege_info_list); + return PRVINFO_ERROR_NONE; +} diff --git a/test/tc_privilege_info.c b/test/tc_privilege_info.c index fb7e7c6..ecc8b9f 100755 --- a/test/tc_privilege_info.c +++ b/test/tc_privilege_info.c @@ -426,6 +426,135 @@ static void __test_privilege_info_get_privacy_display_name() free(privacy_display_name); } +static void __check_privilege_info_get_privilege_info(privilege_info_error_e expected_result, privilege_info_error_e result, GList* privilege_info_list, int return_result) +{ + printf("expected result = %s, result = %s\n", __get_result_string(expected_result), __get_result_string(result)); + + if (expected_result != result) { + __change_color_to_yellow(); + printf("not mached\n"); + __change_color_to_origin(); + } else { + __change_color_to_green(); + printf("mached\n"); + __change_color_to_origin(); + } + + printf("return_result = %d\n", return_result); + GList* l; + if (result == PRVINFO_ERROR_NONE) { + for (l = privilege_info_list; l != NULL; l = l->next) { + privilege_info_s* privilege_info = (privilege_info_s*)l->data; + + printf("privilege_info->privilege_name = %s\n", privilege_info->privilege_name); + printf("privilege_info->display_name = %s\n", privilege_info->display_name); + printf("privilege_info->description = %s\n", privilege_info->description); + printf("\n"); + } + } + + printf("\n"); +} + +static void __test_privilege_info_get_privilege_info_list() +{ + GList* privilege_name_list = NULL; + GList* privilege_info_list = NULL; + privilege_consumer_return_code_e return_result; + int ret; + + printf("case : SUCCESS\n"); + printf("locale : ko_KR.UTF8\n"); + printf("privilege name : http://tizen.org/privilege/call\n"); + printf("privilege name : http://tizen.org/privilege/content.read\n"); + printf("privilege name : http://tizen.org/privilege/filesystem.read\n"); + printf("expected result : PRVINFO_ERROR_NONE\n"); + privilege_name_list = g_list_append(privilege_name_list, "http://tizen.org/privilege/call"); + privilege_name_list = g_list_append(privilege_name_list, "http://tizen.org/privilege/content.read"); + privilege_name_list = g_list_append(privilege_name_list, "http://tizen.org/privilege/filesystem.read"); + + ret = privilege_info_get_privilege_info_list("ko_KR.UTF8", privilege_name_list, &privilege_info_list, &return_result); + __check_privilege_info_get_privilege_info(PRVINFO_ERROR_NONE, ret, privilege_info_list, return_result); + g_list_free(privilege_name_list); + privilege_name_list = NULL; + privilege_info_free_privilege_info_list(privilege_info_list); + privilege_info_list = NULL; + printf("-----------------------------------------------------------\n"); + + printf("case : SUCCESS2\n"); + printf("locale : ko_KR.UTF8\n"); + printf("privilege name : http://tizen.org/privilege/call\n"); + printf("privilege name : http://tizen.org/privilege/systemsettings.admin\n"); + printf("privilege name : http://tizen.org/privilege/bookmark.admin\n"); + printf("expected result : PRVINFO_ERROR_NONE\n"); + privilege_name_list = g_list_append(privilege_name_list, "http://tizen.org/privilege/call"); + privilege_name_list = g_list_append(privilege_name_list, "http://tizen.org/privilege/systemsettings.admin"); + privilege_name_list = g_list_append(privilege_name_list, "http://tizen.org/privilege/bookmark.admin"); + + ret = privilege_info_get_privilege_info_list("ko_KR.UTF8", privilege_name_list, &privilege_info_list, &return_result); + __check_privilege_info_get_privilege_info(PRVINFO_ERROR_NONE, ret, privilege_info_list, return_result); + g_list_free(privilege_name_list); + privilege_name_list = NULL; + privilege_info_free_privilege_info_list(privilege_info_list); + privilege_info_list = NULL; + printf("-----------------------------------------------------------\n"); + + printf("case : SUCCESS3\n"); + printf("locale : ko_KR.UTF8\n"); + printf("privilege name : http://tizen.org/privilege/call\n"); + printf("privilege name : http://tizen.org/privilege/alarm.xxxx\n"); + printf("privilege name : http://tizen.org/privilege/account.xxx\n"); + printf("expected result : PRVINFO_ERROR_NONE\n"); + privilege_name_list = g_list_append(privilege_name_list, "http://tizen.org/privilege/call"); + privilege_name_list = g_list_append(privilege_name_list, "http://tizen.org/privilege/alarm.xxxx"); + privilege_name_list = g_list_append(privilege_name_list, "http://tizen.org/privilege/account.xxx"); + + ret = privilege_info_get_privilege_info_list("ko_KR.UTF8", privilege_name_list, &privilege_info_list, &return_result); + __check_privilege_info_get_privilege_info(PRVINFO_ERROR_NONE, ret, privilege_info_list, return_result); + g_list_free(privilege_name_list); + privilege_name_list = NULL; + privilege_info_free_privilege_info_list(privilege_info_list); + privilege_info_list = NULL; + printf("-----------------------------------------------------------\n"); + + printf("case : UNKNOWN_LOCAL_CODE\n"); + printf("locale : xx_XX.UTF8\n"); + printf("privilege name : http://tizen.org/privilege/call\n"); + printf("privilege name : http://tizen.org/privilege/content.read\n"); + printf("privilege name : http://tizen.org/privilege/filesystem.read\n"); + printf("expected result : PRVINFO_ERROR_NONE\n"); + privilege_name_list = g_list_append(privilege_name_list, "http://tizen.org/privilege/call"); + privilege_name_list = g_list_append(privilege_name_list, "http://tizen.org/privilege/content.read"); + privilege_name_list = g_list_append(privilege_name_list, "http://tizen.org/privilege/filesystem.read"); + + ret = privilege_info_get_privilege_info_list("xx_XX.UTF8", privilege_name_list, &privilege_info_list, &return_result); + __check_privilege_info_get_privilege_info(PRVINFO_ERROR_NONE, ret, privilege_info_list, return_result); + g_list_free(privilege_name_list); + privilege_name_list = NULL; + privilege_info_free_privilege_info_list(privilege_info_list); + privilege_info_list = NULL; + printf("-----------------------------------------------------------\n"); + + printf("case : INVAILD_PARAMETER\n"); + printf("locale : ko_KR.UTF8\n"); + printf("privilege name : http://tizen.org/privilege/xxxx\n"); + printf("privilege name : http://tizen.org/privilege/alarm.xxxx\n"); + printf("privilege name : http://tizen.org/privilege/account.xxx\n"); + printf("expected result : PRVINFO_ERROR_NONE\n"); + privilege_name_list = g_list_append(privilege_name_list, "http://tizen.org/privilege/xxxx"); + privilege_name_list = g_list_append(privilege_name_list, "http://tizen.org/privilege/alarm.xxxx"); + privilege_name_list = g_list_append(privilege_name_list, "http://tizen.org/privilege/account.xxx"); + + ret = privilege_info_get_privilege_info_list("ko_KR.UTF8", privilege_name_list, &privilege_info_list, &return_result); + __check_privilege_info_get_privilege_info(PRVINFO_ERROR_NONE, ret, privilege_info_list, return_result); + g_list_free(privilege_name_list); + privilege_name_list = NULL; + privilege_info_free_privilege_info_list(privilege_info_list); + privilege_info_list = NULL; + printf("-----------------------------------------------------------\n"); + +} + int main() { __change_color_to_yellow(); @@ -453,6 +582,11 @@ int main() __change_color_to_origin(); __test_privilege_info_get_privacy_display_name(); + __change_color_to_yellow(); + printf("Test function : privilege_info_get_privilege_info_list\n"); + __change_color_to_origin(); + __test_privilege_info_get_privilege_info_list(); + __change_color_to_green(); printf("Test Complete\n"); printf("success : %d, ", success_cnt); -- 2.7.4