From: Yunjin Lee Date: Mon, 24 Aug 2020 10:03:49 +0000 (+0900) Subject: Get privilege display name or description with package type X-Git-Tag: submit/tizen/20200903.083407~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7e19011cde51a2347bcd90b484b222951bc5fff8;p=platform%2Fcore%2Fsecurity%2Fprivilege-checker.git Get privilege display name or description with package type - To make privilege-info to wrapper of this package, add proper functions for that - Revise privilege db APIs to get privilege display name or description regardless of the package type if the given package type is PRVMGR_PACKAGE_TYPE_NONE Change-Id: I98d869f1a238faeaa486f17c831471c46c81b3c6 Signed-off-by: Yunjin Lee --- diff --git a/capi/include/privilege_db_manager.h b/capi/include/privilege_db_manager.h index 688ddb4..75b99b2 100755 --- a/capi/include/privilege_db_manager.h +++ b/capi/include/privilege_db_manager.h @@ -81,7 +81,8 @@ int privilege_db_manager_get_privilege_level_info_list(privilege_manager_package int privilege_db_manager_get_mapped_privilege_list(const char* api_version, privilege_manager_package_type_e package_type, GList* privilege_list, GList** mapped_privilege_list); /** - * @brief Get privilege display name + * @brief Get privilege display name by the given privilege name and package type + * @remarks If @a package_type is PRVMGR_PACKAGE_TYPE_NONE then get privilege display regardless of the @a package_type * @remarks @a privilege_display must be released by you. * @param [in] package_type The package type * @param [in] privilege_name The privilege name @@ -98,7 +99,8 @@ int privilege_db_manager_get_mapped_privilege_list(const char* api_version, priv int privilege_db_manager_get_privilege_display(privilege_manager_package_type_e package_type, const char* privilege_name, const char* api_version, char** privilege_display); /** - * @brief Get privilege description + * @brief Get privilege description by then given privilege name and package type + * @remarks If @a package_type is PRVMGR_PACKAGE_TYPE_NONE then get privilege description regardless of the @a package_type * @remarks @a privilege_description must be released by you. * @param [in] package_type The package type * @param [in] privilege_name The privilege name diff --git a/capi/include/privilege_info.h b/capi/include/privilege_info.h index 8baedf2..ba61bbc 100644 --- a/capi/include/privilege_info.h +++ b/capi/include/privilege_info.h @@ -124,6 +124,7 @@ EXPORT_API int privilege_info_get_privilege_group_display_name(const char *privi /** * @brief Gets the display name of privilege with the given privilege. + * @remarks If the given @a privilege not exist then it returns PRVMGR_ERR_NONE with NULL @a name. * @remarks @a name must be released with free() by you. * @param [in] privilege The privilege * @param [out] name The display name of the privilege @@ -131,11 +132,29 @@ EXPORT_API int privilege_info_get_privilege_group_display_name(const char *privi * @retval #PRVMGR_ERR_NONE Successful * @retval #PRVMGR_ERR_OUT_OF_MEMORY Out of memory * @retval #PRVMGR_ERR_INVALID_PARAMETER Invalid parameter + * @retval #PRVMGR_ERR_INTERNAL_ERROR Internal error */ EXPORT_API int privilege_info_get_privilege_display_name(const char *privilege, char **name); +/** + * @brief Gets the display name of privilege with the given privilege and package_type + * @remarks @a display_name must be released with free() by you. + * @param [in] privilege The privilege + * @param [in] api_version The api version + * @param [in] package_type The package type + * @param [out] display_name The display name of the privilege + * @return 0 on success, otherwise a negative error value + * @retval #PRVMGR_ERR_NONE Successful + * @retval #PRVMGR_ERR_OUT_OF_MEMORY Out of memory + * @retval #PRVMGR_ERR_INVALID_PARAMETER Invalid parameter + * @retval #PRVMGR_ERR_NO_EXIST_PRIVILEGE The given privilege doesn't exist + * @retval #PRVMGR_ERR_INTERNAL_ERROR Internal error + */ +EXPORT_API int privilege_info_get_privilege_display_name_by_package_type(const char* privilege, const char* api_version, privilege_manager_package_type_e package_type, char** display_name); + /** * @brief Gets the description of privilege with the given privilege. + * @remarks If the given @a privilege not exist then it returns PRVMGR_ERR_NONE with NULL @a name. * @remarks @a description must be released with free() by you. * @param [in] privilege The privilege * @param [out] description The description of the privilege @@ -143,9 +162,26 @@ EXPORT_API int privilege_info_get_privilege_display_name(const char *privilege, * @retval #PRVMGR_ERR_NONE Successful * @retval #PRVMGR_ERR_OUT_OF_MEMORY Out of memory * @retval #PRVMGR_ERR_INVALID_PARAMETER Invalid parameter + * @retval #PRVMGR_ERR_INTERNAL_ERROR Internal error */ EXPORT_API int privilege_info_get_privilege_description(const char *privilege, char **description); +/* + * @brief Gets the description of privilege with the given privilege and package_type + * @remarks @a description must be released with free() by you. + * @param [in] privilege The privilege + * @param [in] api_version The api version + * @param [in] package_type The package type + * @param [out] description The description of the privilege + * @return 0 on success, otherwise a negative error value + * @retval #PRVMGR_ERR_NONE Successful + * @retval #PRVMGR_ERR_OUT_OF_MEMORY Out of memory + * @retval #PRVMGR_ERR_INVALID_PARAMETER Invalid parameter + * @retval #PRVMGR_ERR_NO_EXIST_PRIVILEGE The given privilege doesn't exist + * @retval #PRVMGR_ERR_INTERNAL_ERROR Internal error + */ +EXPORT_API int privilege_info_get_privilege_description_by_package_type(const char* privilege, const char* api_version, privilege_manager_package_type_e package_type, char** description); + /** * @brief Determines whether the given privilege is valid. * @param [in] privilege The privilege @@ -227,7 +263,7 @@ EXPORT_API int privilege_info_get_privilege_list_by_privacy(const char *privacy, * @brief Gets privacy id of the given privilege. * @remarks @a privacy must be released with free() by you. * @param [in] privilege The privilege - * @param [out] privacy The privacy id of the given privilege + * @param [out] privacy The privacy name of the given privilege * @return 0 on success, otherwise a nonzero error value. * @retval #PRVMGR_ERR_NONE Successful * @retval #PRVMGR_ERR_INTERNAL_ERROR Internal error diff --git a/capi/src/privilege_db_manager.c b/capi/src/privilege_db_manager.c index 89ed131..71eba39 100755 --- a/capi/src/privilege_db_manager.c +++ b/capi/src/privilege_db_manager.c @@ -248,7 +248,7 @@ static int __begin_transaction(sqlite3 *db) } } } - return PRIVILEGE_DB_MANAGER_ERR_NONE; + return PRIVILEGE_DB_MANAGER_ERR_NONE; } static int __make_privilege_list_str(GList *privilege_list, char** privilege_list_str) @@ -429,7 +429,11 @@ int privilege_db_manager_get_privilege_display(privilege_manager_package_type_e TRY_INIT_DB(PRIVILEGE_DB_TYPE_INFO, &db); - char *sql = sqlite3_mprintf("select privilege_display from privilege_info where package_type_id=%d and privilege_name=%Q", package_type, privilege_name); + char *sql = NULL; + if (package_type == PRVMGR_PACKAGE_TYPE_NONE) + sql = sqlite3_mprintf("select privilege_display from privilege_info where privilege_name=%Q", privilege_name); + else + sql = sqlite3_mprintf("select privilege_display from privilege_info where package_type_id=%d and privilege_name=%Q", package_type, privilege_name); TRY_PREPARE_STMT(db, sql, &stmt); @@ -452,7 +456,11 @@ int privilege_db_manager_get_privilege_description(privilege_manager_package_typ TRY_INIT_DB(PRIVILEGE_DB_TYPE_INFO, &db); - char *sql = sqlite3_mprintf("select privilege_description from privilege_info where package_type_id=%d and privilege_name=%Q", package_type, privilege_name); + char *sql = NULL; + if (package_type == PRVMGR_PACKAGE_TYPE_NONE) + sql = sqlite3_mprintf("select privilege_description from privilege_info where privilege_name=%Q", privilege_name); + else + sql = sqlite3_mprintf("select privilege_description from privilege_info where package_type_id=%d and privilege_name=%Q", package_type, privilege_name); TRY_PREPARE_STMT(db, sql, &stmt); diff --git a/capi/src/privilege_info.c b/capi/src/privilege_info.c index 0623bf0..9329cf3 100755 --- a/capi/src/privilege_info.c +++ b/capi/src/privilege_info.c @@ -318,7 +318,7 @@ int privilege_info_get_privilege_group_display_name(const char *privilege_group, return PRVMGR_ERR_NONE; } -static int __get_privilege_display_name_string_id_by_package_type(privilege_manager_package_type_e package_type, const char* privilege, char** string_id) +static int __get_privilege_display_name_string_id(privilege_manager_package_type_e package_type, const char* privilege, char** string_id) { char* temp = NULL; int ret = privilege_db_manager_get_privilege_display(package_type, privilege, NULL, &temp); @@ -327,11 +327,12 @@ static int __get_privilege_display_name_string_id_by_package_type(privilege_mana *string_id = strdup(temp); TryReturn(string_id != NULL, SafeFree(temp), PRVMGR_ERR_OUT_OF_MEMORY, "[PRVMGR_ERR_OUT_OF_MEMORY] strdup() failed."); } else { - LOGE("%s privilege %s exist but have no display name", package_type == PRVMGR_PACKAGE_TYPE_WRT ? "wrt" : "core", privilege); + //NOTE: This is a case that shouldn't happen, but if it does, return PRVMGR_ERR_NONE with NULL string_id + LOGE("%s privilege %s exist but have no display name", package_type == PRVMGR_PACKAGE_TYPE_WRT ? "wrt" : package_type == PRVMGR_PACKAGE_TYPE_CORE ? "core" : "", privilege); } ret = PRVMGR_ERR_NONE; } else if (ret == PRIVILEGE_DB_MANAGER_ERR_NO_EXIST_RESULT) { - LOGD("%s privilege %s not exist", package_type == PRVMGR_PACKAGE_TYPE_WRT ? "wrt" : "core", privilege); + LOGD("%s privilege %s not exist", package_type == PRVMGR_PACKAGE_TYPE_WRT ? "wrt" : package_type == PRVMGR_PACKAGE_TYPE_CORE ? "core" : "", privilege); ret = PRVMGR_ERR_NO_EXIST_PRIVILEGE; } else { LOGE("privilege_db_manager_get_privilege_display() failed. ret = %d", ret); @@ -341,21 +342,6 @@ static int __get_privilege_display_name_string_id_by_package_type(privilege_mana return ret; } -static int __get_privilege_display_name_string_id(const char *privilege, char **string_id) -{ - TryReturn(privilege != NULL, , PRVMGR_ERR_INVALID_PARAMETER, "[PRVMGR_ERR_INVALID_PARAMETER] privilege is NULL"); - - int ret = __get_privilege_display_name_string_id_by_package_type(PRVMGR_PACKAGE_TYPE_CORE, privilege, string_id); - - if (ret == PRVMGR_ERR_NO_EXIST_PRIVILEGE) - ret = __get_privilege_display_name_string_id_by_package_type(PRVMGR_PACKAGE_TYPE_WRT, privilege, string_id); - - if (ret == PRVMGR_ERR_NO_EXIST_PRIVILEGE) - LOGE("Privilege [%s] doesn't exist for any type of package", privilege); - - return ret; -} - int privilege_info_get_privilege_display_name(const char *privilege, char **name) { TryReturn(privilege != NULL, , PRVMGR_ERR_INVALID_PARAMETER, "[PRVMGR_ERR_INVALID_PARAMETER] privilege is NULL"); @@ -363,7 +349,7 @@ int privilege_info_get_privilege_display_name(const char *privilege, char **name char *string_id = NULL; int ret = 0; - ret = __get_privilege_display_name_string_id(privilege, &string_id); + ret = __get_privilege_display_name_string_id(PRVMGR_PACKAGE_TYPE_NONE, privilege, &string_id); if (ret == PRVMGR_ERR_NONE) { if (string_id != NULL) ret = privilege_info_get_privilege_string_by_string_id(string_id, name); @@ -378,7 +364,7 @@ int privilege_info_get_privilege_display_name(const char *privilege, char **name return ret; } -static int __get_privilege_description_string_id_by_package_type(privilege_manager_package_type_e package_type, const char* privilege, char** string_id) +static int __get_privilege_description_string_id(privilege_manager_package_type_e package_type, const char* privilege, char** string_id) { char* temp = NULL; int ret = privilege_db_manager_get_privilege_description(package_type, privilege, NULL, &temp); @@ -387,11 +373,12 @@ static int __get_privilege_description_string_id_by_package_type(privilege_manag *string_id = strdup(temp); TryReturn(string_id != NULL, SafeFree(temp), PRVMGR_ERR_OUT_OF_MEMORY, "[PRVMGR_ERR_OUT_OF_MEMORY] strdup() failed."); } else { - LOGE("%s privilege %s exist but have no description", package_type == PRVMGR_PACKAGE_TYPE_WRT ? "wrt" : "core", privilege); + //NOTE: This is a case that shouldn't happen, but if it does, return PRVMGR_ERR_NONE with NULL string_id + LOGE("%s privilege %s exist but have no description", package_type == PRVMGR_PACKAGE_TYPE_WRT ? "wrt" : package_type == PRVMGR_PACKAGE_TYPE_CORE ? "core" : "", privilege); } ret = PRVMGR_ERR_NONE; } else if (ret == PRIVILEGE_DB_MANAGER_ERR_NO_EXIST_RESULT) { - LOGD("%s privilege %s not exist", package_type == PRVMGR_PACKAGE_TYPE_WRT ? "wrt" : "core", privilege); + LOGD("%s privilege %s not exist", package_type == PRVMGR_PACKAGE_TYPE_WRT ? "wrt" : package_type == PRVMGR_PACKAGE_TYPE_CORE ? "core" : "", privilege); ret = PRVMGR_ERR_NO_EXIST_PRIVILEGE; } else { LOGE("privilege_db_manager_get_privilege_description() failed. ret = %d", ret); @@ -401,31 +388,57 @@ static int __get_privilege_description_string_id_by_package_type(privilege_manag return ret; } -static int __get_privilege_description_string_id(const char *privilege, char **string_id) +int privilege_info_get_privilege_description(const char *privilege, char **description) { TryReturn(privilege != NULL, , PRVMGR_ERR_INVALID_PARAMETER, "[PRVMGR_ERR_INVALID_PARAMETER] privilege is NULL"); - int ret = __get_privilege_description_string_id_by_package_type(PRVMGR_PACKAGE_TYPE_CORE, privilege, string_id); + char *string_id = NULL; + int ret = 0; + + ret = __get_privilege_description_string_id(PRVMGR_PACKAGE_TYPE_NONE, privilege, &string_id); + if (ret == PRVMGR_ERR_NONE) { + if (string_id != NULL) + ret = privilege_info_get_privilege_string_by_string_id(string_id, description); + } else if (ret == PRVMGR_ERR_NO_EXIST_PRIVILEGE) { + ret = PRVMGR_ERR_NONE; + } else { + LOGE("__get_privilege_description_string_id() failed. ret = %d", ret); + } - if (ret == PRVMGR_ERR_NO_EXIST_PRIVILEGE) - ret = __get_privilege_description_string_id_by_package_type(PRVMGR_PACKAGE_TYPE_WRT, privilege, string_id); + SafeFree(string_id); return ret; } -int privilege_info_get_privilege_description(const char *privilege, char **description) +int privilege_info_get_privilege_display_name_by_package_type(const char* privilege, __attribute__((unused)) const char* api_version, privilege_manager_package_type_e package_type, char** display_name) { - TryReturn(privilege != NULL, , PRVMGR_ERR_INVALID_PARAMETER, "[PRVMGR_ERR_INVALID_PARAMETER] privilege is NULL"); + TryReturn(privilege != NULL, , PRVMGR_ERR_INVALID_PARAMETER, "[PRVMGR_ERR_INVALID_PARAMETER] privilege must not be NULL"); + TryReturn(package_type == PRVMGR_PACKAGE_TYPE_WRT || package_type == PRVMGR_PACKAGE_TYPE_CORE, , PRVMGR_ERR_INVALID_PARAMETER, "[PRVMGR_ERR_INVALID_PARAMETER] Unknown package_type %d", package_type); - char *string_id = NULL; - int ret = 0; + char* string_id = NULL; + int ret = __get_privilege_display_name_string_id(package_type, privilege, &string_id); + if (ret == PRVMGR_ERR_NONE) { + if (string_id != NULL) + ret = privilege_info_get_privilege_string_by_string_id(string_id, display_name); + } else { + LOGE("__get_privilege_display_name_string_id() failed. ret = %d", ret); + } + + SafeFree(string_id); + + return ret; +} + +int privilege_info_get_privilege_description_by_package_type(const char* privilege, __attribute__((unused)) const char* api_version, privilege_manager_package_type_e package_type, char** description) +{ + TryReturn(privilege != NULL, , PRVMGR_ERR_INVALID_PARAMETER, "[PRVMGR_ERR_INVALID_PARAMETER] privilege must not be NULL"); + TryReturn(package_type == PRVMGR_PACKAGE_TYPE_WRT || package_type == PRVMGR_PACKAGE_TYPE_CORE, , PRVMGR_ERR_INVALID_PARAMETER, "[PRVMGR_ERR_INVALID_PARAMETER] Unknown package_type %d", package_type); - ret = __get_privilege_description_string_id(privilege, &string_id); + char* string_id = NULL; + int ret = __get_privilege_description_string_id(package_type, privilege, &string_id); if (ret == PRVMGR_ERR_NONE) { if (string_id != NULL) ret = privilege_info_get_privilege_string_by_string_id(string_id, description); - } else if (ret == PRVMGR_ERR_NO_EXIST_PRIVILEGE) { - ret = PRVMGR_ERR_NONE; } else { LOGE("__get_privilege_description_string_id() failed. ret = %d", ret); }