Name: privilege-info
Summary: Privilege Information
-Version: 0.0.2
+Version: 0.0.3
Release: 1
Group: Security/API
License: Apache-2.0
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)
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)
*/
-#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" {
* @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);
+
+
/**
#endif
-#endif /* __TIZEN_SECURITY_PRIVILEGE_INFORMAION_H */
+#endif /* __TIZEN_SECURITY_PRIVILEGE_INFORMATION_H */
#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"
return PRVINFO_ERROR_NONE;
}
-
PI_API
int privilege_info_get_description(const char *api_version, const char *privilege, char **description)
{
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");
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;
+}
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();
__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);