Add new API for getting privilege info as list 73/196073/8 accepted/tizen/unified/20190128.061507 submit/tizen/20190122.110325
authorYunjin Lee <yunjin-.lee@samsung.com>
Fri, 21 Dec 2018 04:37:23 +0000 (13:37 +0900)
committerYunjin Lee <yunjin-.lee@samsung.com>
Fri, 18 Jan 2019 07:25:59 +0000 (16:25 +0900)
- 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 <yunjin-.lee@samsung.com>
packaging/privilege-info.spec
src/CMakeLists.txt
src/include/privilege_information.h
src/privilege_information.c [moved from src/privilege_info.c with 72% similarity]
test/tc_privilege_info.c

index b23542c..10378b7 100644 (file)
@@ -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
index 2103600..b0789ab 100755 (executable)
@@ -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)
index fbfad92..d85e6d8 100755 (executable)
  */
 
 
-#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 <tizen.h>
+#include <glib.h>
 
+#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 */
similarity index 72%
rename from src/privilege_info.c
rename to src/privilege_information.c
index 79b2ea7..17ef740 100755 (executable)
 #include <stdlib.h>
 #include <libintl.h>
 #include <dlog.h>
-#include <privilege_db_manager.h>
-#include <cynara-session.h>
-#include <cynara-client.h>
 #include <unistd.h>
 #include <sys/smack.h>
 #include <system_info.h>
+#include <locale.h>
+#include <glib.h>
+
+#include <privilege_db_manager.h>
+#include <privilege_info.h>
+
+#include <cynara-session.h>
+#include <cynara-client.h>
+
 #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;
+}
index fb7e7c6..ecc8b9f 100755 (executable)
@@ -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);