From: Piotr Kosko Date: Thu, 21 Apr 2016 07:30:54 +0000 (+0200) Subject: [Common] Changed way of handling privileges for API versions X-Git-Tag: submit/tizen/20160427.040804^2~2^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c56689fb298ec746d33d019f8eb8b1d0b3afb5ce;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [Common] Changed way of handling privileges for API versions [Feature] privilege_manager_get_mapped_privilege_list function is used to get proper mapping of privileges for application version and current platform. Such solution replaces hardcoded mapping for 3.0 in utils_api.js file. [Verification] auto TCT's passrate didn't change. Change-Id: If39de763d92a4489e56a824bd035ee5db1548df9 Signed-off-by: Piotr Kosko --- diff --git a/packaging/webapi-plugins.spec b/packaging/webapi-plugins.spec index 51a0351e..7c3f839d 100644 --- a/packaging/webapi-plugins.spec +++ b/packaging/webapi-plugins.spec @@ -272,6 +272,7 @@ Source0: %{name}-%{version}.tar.gz %endif # tizen_profile_tv +BuildRequires: pkgconfig(security-privilege-manager) BuildRequires: ninja BuildRequires: pkgconfig(appcore-common) BuildRequires: pkgconfig(dlog) diff --git a/src/alarm/alarm_manager.cc b/src/alarm/alarm_manager.cc index cd341041..5a66ba6f 100755 --- a/src/alarm/alarm_manager.cc +++ b/src/alarm/alarm_manager.cc @@ -37,7 +37,7 @@ namespace alarm { namespace { const int kDateSize = 22; //"yyy mm dd hh mm ss dd" e.g 115 11 28 11 25 50 -1 -const std::string kPrivilegeAlarm = "http://tizen.org/privilege/alarm.get"; +const std::string kPrivilegeAlarm = "http://tizen.org/privilege/alarm"; const std::string kAlarmRelative = "AlarmRelative"; const std::string kAlarmAbsolute = "AlarmAbsolute"; diff --git a/src/application/application_instance.cc b/src/application/application_instance.cc index 3364901d..67ff539d 100755 --- a/src/application/application_instance.cc +++ b/src/application/application_instance.cc @@ -28,10 +28,10 @@ namespace application { namespace { // The privileges that are required in Application API -const std::string kPrivilegeAppManagerCertificate = "http://tizen.org/privilege/notexist"; +const std::string kPrivilegeAppManagerCertificate = "http://tizen.org/privilege/appmanager.certificate"; const std::string kPrivilegeAppManagerKill = "http://tizen.org/privilege/appmanager.kill"; -const std::string kPrivilegeApplicationInfo = "http://tizen.org/privilege/packagemanager.info"; -const std::string kPrivilegeApplicationLaunch = "http://tizen.org/privilege/appmanager.launch"; +const std::string kPrivilegeApplicationInfo = "http://tizen.org/privilege/application.info"; +const std::string kPrivilegeApplicationLaunch = "http://tizen.org/privilege/application.launch"; } // namespace using namespace common; diff --git a/src/archive/archive_instance.cc b/src/archive/archive_instance.cc index 8cf1af7f..ce687033 100755 --- a/src/archive/archive_instance.cc +++ b/src/archive/archive_instance.cc @@ -38,8 +38,8 @@ using common::tools::ReportSuccess; using common::tools::ReportError; namespace { -const std::string kPrivilegeFilesystemRead = "http://tizen.org/privilege/systemsettings.admin"; -const std::string kPrivilegeFilesystemWrite = "http://tizen.org/privilege/systemsettings.admin"; +const std::string kPrivilegeFilesystemRead = "http://tizen.org/privilege/filesystem.read"; +const std::string kPrivilegeFilesystemWrite = "http://tizen.org/privilege/filesystem.write"; const std::string kArchiveFileEntryOptDest = "destination"; const std::string kArchiveFileEntryOptStrip = "stripSourceDirectory"; diff --git a/src/bookmark/bookmark_instance.cc b/src/bookmark/bookmark_instance.cc index 14bd0340..7f8e4bd8 100755 --- a/src/bookmark/bookmark_instance.cc +++ b/src/bookmark/bookmark_instance.cc @@ -37,8 +37,8 @@ namespace { const char kParentId[] = "parentId"; const char kUrl[] = "url"; - const std::string kPrivilegeBookmarkRead = "http://tizen.org/privilege/bookmark.admin"; - const std::string kPrivilegeBookmarkWrite = "http://tizen.org/privilege/bookmark.admin"; + const std::string kPrivilegeBookmarkRead = "http://tizen.org/privilege/bookmark.read"; + const std::string kPrivilegeBookmarkWrite = "http://tizen.org/privilege/bookmark.write"; } // namespace BookmarkInstance::BookmarkInstance() { diff --git a/src/common/common.gyp b/src/common/common.gyp index f89186c4..a4e9414c 100644 --- a/src/common/common.gyp +++ b/src/common/common.gyp @@ -74,6 +74,7 @@ 'capi-appfw-app-manager', 'capi-appfw-package-manager', 'storage', + 'security-privilege-manager', ] }, 'conditions': [ diff --git a/src/common/tools.cc b/src/common/tools.cc index 9a8b8e0f..9b468847 100644 --- a/src/common/tools.cc +++ b/src/common/tools.cc @@ -16,6 +16,10 @@ #include "common/tools.h" +#include +#include +#include + #ifdef PRIVILEGE_USE_DB #include #include "common/current_application.h" @@ -253,20 +257,115 @@ class AccessControl { } // namespace + PlatformResult CheckAccess(const std::string& privilege) { return CheckAccess(std::vector{privilege}); } PlatformResult CheckAccess(const std::vector& privileges) { LoggerD("Enter"); - if (AccessControl::GetInstance().CheckAccess(privileges)) { - return PlatformResult(ErrorCode::NO_ERROR); - } else { - for (const auto& privilege : privileges) { - LoggerD("Access to privilege: %s has been denied.", privilege.c_str()); + + std::string api_version; + PlatformResult res = common::tools::GetPkgApiVersion(&api_version); + if (res.IsError()) { + return res; + } + LoggerD("Application api version: %s", api_version.c_str()); + + for (auto input_priv : privileges) { + LoggerD("Input privilege: %s", input_priv.c_str()); + GList *input_glist = nullptr; + GList *mapped_glist = nullptr; + + SCOPE_EXIT { + g_list_free(input_glist); + g_list_free(mapped_glist); + }; + + input_glist = g_list_append(input_glist, (void*)input_priv.c_str()); + int ret = privilege_manager_get_mapped_privilege_list(api_version.c_str(), + PRVMGR_PACKAGE_TYPE_WRT, + input_glist, + &mapped_glist); + if (ret != PRVMGR_ERR_NONE) { + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Fail to get mapped privilege list"); + } + + LoggerD("Mapped privileges:"); + std::vector mapped_vector; + auto push_elem = [](gpointer data, gpointer user_data) -> void { + if (data && user_data) { + std::vector* mapped_vector = + static_cast*>(user_data); + char* char_data = static_cast(data); + mapped_vector->push_back(char_data); + LoggerD("mapped to: %s", char_data); + } + }; + g_list_foreach (mapped_glist, push_elem, &mapped_vector); + + if (!AccessControl::GetInstance().CheckAccess(mapped_vector)){ + for (const auto& mapped_priv : mapped_vector) { + LoggerD("Access to privilege: %s has been denied.", mapped_priv.c_str()); + } + return PlatformResult(ErrorCode::SECURITY_ERR, "Permission denied"); + } + } + return PlatformResult(ErrorCode::NO_ERROR); +} + +PlatformResult GetPkgApiVersion(std::string* api_version) { + LoggerD("Entered"); + + char* app_id = nullptr; + char* pkgid = nullptr; + char* api_ver = nullptr; + app_info_h app_handle = nullptr; + pkgmgrinfo_pkginfo_h pkginfo_handle = nullptr; + + SCOPE_EXIT { + if (app_id) { + free(app_id); } - return PlatformResult(ErrorCode::SECURITY_ERR, "Permission denied"); + if (pkgid) { + free(pkgid); + } + if (app_handle) { + app_info_destroy(app_handle); + } + if (pkginfo_handle) { + pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_handle); + } + }; + + pid_t pid = getpid(); + int ret = app_manager_get_app_id(pid, &app_id); + if (ret != APP_MANAGER_ERROR_NONE) { + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Fail to get app id"); } + + ret = app_info_create(app_id, &app_handle); + if (ret != APP_MANAGER_ERROR_NONE) { + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Fail to get app info"); + } + + ret = app_info_get_package(app_handle, &pkgid); + if ((ret != APP_MANAGER_ERROR_NONE) || (pkgid == nullptr)) { + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Fail to get pkg id"); + } + + ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, getuid(), &pkginfo_handle); + if (ret != PMINFO_R_OK) { + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Fail to get pkginfo_h"); + } + + ret = pkgmgrinfo_pkginfo_get_api_version(pkginfo_handle, &api_ver); + if (ret != PMINFO_R_OK) { + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Fail to get api version"); + } + + *api_version = api_ver; + return PlatformResult(ErrorCode::NO_ERROR); } std::string GetErrorString(int error_code) { diff --git a/src/common/tools.h b/src/common/tools.h index fcd98689..c3df3a98 100644 --- a/src/common/tools.h +++ b/src/common/tools.h @@ -35,6 +35,7 @@ void ReportError(const PlatformResult& error, picojson::object* out); common::PlatformResult CheckAccess(const std::string& privilege); common::PlatformResult CheckAccess(const std::vector& privileges); +common::PlatformResult GetPkgApiVersion(std::string* api_version); #define CHECK_PRIVILEGE_ACCESS(privilege, out) \ do { \ diff --git a/src/datacontrol/datacontrol_instance.cc b/src/datacontrol/datacontrol_instance.cc index 7e71cebd..cfb1521b 100755 --- a/src/datacontrol/datacontrol_instance.cc +++ b/src/datacontrol/datacontrol_instance.cc @@ -37,7 +37,7 @@ namespace datacontrol { namespace { // The privileges that required in Datacontrol API -const std::string kPrivilegeDatacontrol = "http://tizen.org/privilege/datasharing"; +const std::string kPrivilegeDatacontrol = "http://tizen.org/privilege/datacontrol.consumer"; } // namespace diff --git a/src/filesystem/filesystem_instance.cc b/src/filesystem/filesystem_instance.cc index df1d003a..54b0a2e1 100644 --- a/src/filesystem/filesystem_instance.cc +++ b/src/filesystem/filesystem_instance.cc @@ -30,8 +30,8 @@ namespace filesystem { namespace { // The privileges that required in Filesystem API -const std::string kPrivilegeFilesystemRead = "http://tizen.org/privilege/systemsettings.admin"; -const std::string kPrivilegeFilesystemWrite = "http://tizen.org/privilege/systemsettings.admin"; +const std::string kPrivilegeFilesystemRead = "http://tizen.org/privilege/filesystem.read"; +const std::string kPrivilegeFilesystemWrite = "http://tizen.org/privilege/filesystem.write"; } using namespace common; diff --git a/src/messaging/messaging_instance.cc b/src/messaging/messaging_instance.cc index 1b7d18c9..cd656a7c 100755 --- a/src/messaging/messaging_instance.cc +++ b/src/messaging/messaging_instance.cc @@ -120,8 +120,8 @@ auto getServiceIdFromJSON = [](picojson::object& data) -> int { } }; -const std::string kPrivilegeMessagingRead = "http://tizen.org/privilege/message.read"; -const std::string kPrivilegeMessagingWrite = "http://tizen.org/privilege/message.write"; +const std::string kPrivilegeMessagingRead = "http://tizen.org/privilege/messaging.read"; +const std::string kPrivilegeMessagingWrite = "http://tizen.org/privilege/messaging.write"; const long kDumbCallbackId= -1; } diff --git a/src/networkbearerselection/networkbearerselection_instance.cc b/src/networkbearerselection/networkbearerselection_instance.cc index 6e392146..809c8361 100644 --- a/src/networkbearerselection/networkbearerselection_instance.cc +++ b/src/networkbearerselection/networkbearerselection_instance.cc @@ -29,7 +29,7 @@ namespace networkbearerselection { namespace { // The privileges that required in NetworkBearerSelection API -const std::string kPrivilegeNetworkBearerSelection = "http://tizen.org/privilege/network.set"; +const std::string kPrivilegeNetworkBearerSelection = "http://tizen.org/privilege/networkbearerselection"; const std::string kPrivilegeInternet = "http://tizen.org/privilege/internet"; const std::vector kNbsPrivileges{kPrivilegeNetworkBearerSelection, kPrivilegeInternet}; diff --git a/src/nfc/nfc_instance.cc b/src/nfc/nfc_instance.cc index f29a2984..781f90e8 100644 --- a/src/nfc/nfc_instance.cc +++ b/src/nfc/nfc_instance.cc @@ -40,9 +40,9 @@ namespace { const std::string kPrivilegeNfcAdmin = "http://tizen.org/privilege/nfc.admin"; const std::string kPrivilegeNfcCardEmulation = "http://tizen.org/privilege/nfc.cardemulation"; -const std::string kPrivilegeNfcCommon = "http://tizen.org/privilege/nfc"; -const std::string kPrivilegeNfcP2P = "http://tizen.org/privilege/nfc"; -const std::string kPrivilegeNfcTag = "http://tizen.org/privilege/nfc"; +const std::string kPrivilegeNfcCommon = "http://tizen.org/privilege/nfc.common"; +const std::string kPrivilegeNfcP2P = "http://tizen.org/privilege/nfc.p2p"; +const std::string kPrivilegeNfcTag = "http://tizen.org/privilege/nfc.tag"; } // namespace diff --git a/src/package/package_instance.cc b/src/package/package_instance.cc index d7b5f53b..81250763 100644 --- a/src/package/package_instance.cc +++ b/src/package/package_instance.cc @@ -40,7 +40,7 @@ using common::PlatformResult; namespace { // The privileges that required in Package API -const std::string kPrivilegePackageInstall = "http://tizen.org/privilege/packagemanager.admin"; +const std::string kPrivilegePackageInstall = "http://tizen.org/privilege/packagemanager.install"; const std::string kPrivilegePackageInfo = "http://tizen.org/privilege/packagemanager.info"; } // namespace diff --git a/src/power/power_instance.cc b/src/power/power_instance.cc index 6d7d2df7..a4b566de 100755 --- a/src/power/power_instance.cc +++ b/src/power/power_instance.cc @@ -34,7 +34,7 @@ namespace power { namespace { // The privileges that required in Power API -const std::string kPrivilegePower = "http://tizen.org/privilege/display"; +const std::string kPrivilegePower = "http://tizen.org/privilege/power"; const std::map kPowerResourceMap = { {"SCREEN", POWER_RESOURCE_SCREEN}, diff --git a/src/systemsetting/systemsetting_instance.cc b/src/systemsetting/systemsetting_instance.cc index c95fbcae..55d6891d 100644 --- a/src/systemsetting/systemsetting_instance.cc +++ b/src/systemsetting/systemsetting_instance.cc @@ -36,7 +36,7 @@ const std::string SETTING_LOCK_SCREEN = "LOCK_SCREEN"; const std::string SETTING_INCOMING_CALL = "INCOMING_CALL"; const std::string SETTING_NOTIFICATION_EMAIL = "NOTIFICATION_EMAIL"; -const std::string kPrivilegeSetting = "http://tizen.org/privilege/systemsettings.admin"; +const std::string kPrivilegeSetting = "http://tizen.org/privilege/setting"; } using namespace common; diff --git a/src/utils/utils_api.js b/src/utils/utils_api.js index 038ecaef..76206062 100644 --- a/src/utils/utils_api.js +++ b/src/utils/utils_api.js @@ -72,18 +72,18 @@ function Utils() { ACCOUNT_READ: 'http://tizen.org/privilege/account.read', ACCOUNT_WRITE: 'http://tizen.org/privilege/account.write', ALARM: 'http://tizen.org/privilege/alarm.get', - APPLICATION_INFO: 'http://tizen.org/privilege/packagemanager.info', - APPLICATION_LAUNCH: 'http://tizen.org/privilege/appmanager.launch', - APPMANAGER_CERTIFICATE: 'http://tizen.org/privilege/notexist', + APPLICATION_INFO: 'http://tizen.org/privilege/application.info', + APPLICATION_LAUNCH: 'http://tizen.org/privilege/application.launch', + APPMANAGER_CERTIFICATE: 'http://tizen.org/privilege/appmanager.certificate', APPMANAGER_KILL: 'http://tizen.org/privilege/appmanager.kill', - BLUETOOTH_ADMIN: 'http://tizen.org/privilege/bluetooth', - BLUETOOTH_GAP: 'http://tizen.org/privilege/bluetooth', - BLUETOOTH_HEALTH: 'http://tizen.org/privilege/bluetooth', - BLUETOOTH_SPP: 'http://tizen.org/privilege/bluetooth', - BLUETOOTHMANAGER: 'http://tizen.org/privilege/bluetooth.admin', + BLUETOOTH_ADMIN: 'http://tizen.org/privilege/bluetooth.admin', + BLUETOOTH_GAP: 'http://tizen.org/privilege/bluetooth.gap', + BLUETOOTH_HEALTH: 'http://tizen.org/privilege/bluetooth.health', + BLUETOOTH_SPP: 'http://tizen.org/privilege/bluetooth.spp', + BLUETOOTHMANAGER: 'http://tizen.org/privilege/bluetoothmanager', BLUETOOTH: 'http://tizen.org/privilege/bluetooth', - BOOKMARK_READ: 'http://tizen.org/privilege/bookmark.admin', - BOOKMARK_WRITE: 'http://tizen.org/privilege/bookmark.admin', + BOOKMARK_READ: 'http://tizen.org/privilege/bookmark.read', + BOOKMARK_WRITE: 'http://tizen.org/privilege/bookmark.write', CALENDAR_READ: 'http://tizen.org/privilege/calendar.read', CALENDAR_WRITE: 'http://tizen.org/privilege/calendar.write', CALLHISTORY_READ: 'http://tizen.org/privilege/callhistory.read', @@ -93,36 +93,38 @@ function Utils() { CONTENT_READ: 'http://tizen.org/privilege/content.write', CONTENT_WRITE: 'http://tizen.org/privilege/content.write', D2D_DATASHARING: 'http://tizen.org/privilege/d2d.datasharing', - DATACONTROL_CONSUMER: 'http://tizen.org/privilege/datasharing', - DATASYNC: 'http://tizen.org/privilege/notexist', + DATACONTROL_CONSUMER: 'http://tizen.org/privilege/datacontrol.consumer', + DATASYNC: 'http://tizen.org/privilege/datasync', DOWNLOAD: 'http://tizen.org/privilege/download', - FILESYSTEM_READ: 'http://tizen.org/privilege/systemsettings.admin', - FILESYSTEM_WRITE: 'http://tizen.org/privilege/systemsettings.admin', + FILESYSTEM_READ: 'http://tizen.org/privilege/filesystem.read', + FILESYSTEM_WRITE: 'http://tizen.org/privilege/filesystem.write', HEALTHINFO: 'http://tizen.org/privilege/healthinfo', INTERNET: 'http://tizen.org/privilege/internet', LED: 'http://tizen.org/privilege/led', LOCATION: 'http://tizen.org/privilege/location', MEDIACONTROLLER_SERVER: 'http://tizen.org/privilege/mediacontroller.server', MEDIACONTROLLER_CLIENT: 'http://tizen.org/privilege/mediacontroller.client', - MESSAGING_READ: 'http://tizen.org/privilege/message.read', - MESSAGING_WRITE: 'http://tizen.org/privilege/message.write', - NETWORKBEARERSELECTION: 'http://tizen.org/privilege/network.set', + MESSAGING_READ: 'http://tizen.org/privilege/messaging.read', + MESSAGING_WRITE: 'http://tizen.org/privilege/messaging.write', + NETWORKBEARERSELECTION: 'http://tizen.org/privilege/networkbearerselection', NFC_ADMIN: 'http://tizen.org/privilege/nfc.admin', NFC_CARDEMULATION: 'http://tizen.org/privilege/nfc.cardemulation', - NFC_COMMON: 'http://tizen.org/privilege/nfc', - NFC_P2P: 'http://tizen.org/privilege/nfc', - NFC_TAG: 'http://tizen.org/privilege/nfc', + NFC_COMMON: 'http://tizen.org/privilege/nfc.common', + NFC_P2P: 'http://tizen.org/privilege/nfc.p2p', + NFC_TAG: 'http://tizen.org/privilege/nfc.tag', NOTIFICATION: 'http://tizen.org/privilege/notification', PACKAGE_INFO: 'http://tizen.org/privilege/packagemanager.info', - PACKAGEMANAGER_INSTALL: 'http://tizen.org/privilege/packagemanager.admin', - POWER: 'http://tizen.org/privilege/display', + PACKAGEMANAGER_INSTALL: 'http://tizen.org/privilege/packagemanager.install', + POWER: 'http://tizen.org/privilege/power', PUSH: 'http://tizen.org/privilege/push', SECUREELEMENT: 'http://tizen.org/privilege/secureelement', - SETTING: 'http://tizen.org/privilege/systemsettings.admin', - SYSTEM: 'http://tizen.org/privilege/telephony', - SYSTEMMANAGER: 'http://tizen.org/privilege/telephony', + SETTING_ADMIN: 'http://tizen.org/privilege/systemsettings.admin', + SETTING: 'http://tizen.org/privilege/setting', + SYSTEM: 'http://tizen.org/privilege/system', + SYSTEMMANAGER: 'http://tizen.org/privilege/systemmanager', TELEPHONY: 'http://tizen.org/privilege/telephony', - VOLUME_SET: 'http://tizen.org/privilege/volume.set' + VOLUME_SET: 'http://tizen.org/privilege/volume.set', + WEBSETTING: 'http://tizen.org/privilege/websetting' }; Object.freeze(privilege); diff --git a/src/utils/utils_instance.cc b/src/utils/utils_instance.cc index 96a7e4ed..be751eeb 100644 --- a/src/utils/utils_instance.cc +++ b/src/utils/utils_instance.cc @@ -6,8 +6,6 @@ #include #include #include -#include -#include #include "common/logger.h" #include "common/scope_exit.h" @@ -44,63 +42,11 @@ UtilsInstance::UtilsInstance() { void UtilsInstance::GetPkgApiVersion(const picojson::value& args, picojson::object& out) { LoggerD("Entered"); - char* app_id = nullptr; - char* pkgid = nullptr; - app_info_h app_handle = nullptr; - pkgmgrinfo_pkginfo_h pkginfo_handle = nullptr; - char *api_version = nullptr; - - SCOPE_EXIT { - if (app_id) { - free(app_id); - } - if (pkgid) { - free(pkgid); - } - if (app_handle) { - app_info_destroy(app_handle); - } - if (pkginfo_handle) { - pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_handle); - } - }; - - pid_t pid = getpid(); - int ret = app_manager_get_app_id(pid, &app_id); - if (ret != APP_MANAGER_ERROR_NONE) { - LoggerE("Failed to get app id"); - ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to get app id"), &out); - return; - } - - ret = app_info_create(app_id, &app_handle); - if (ret != APP_MANAGER_ERROR_NONE) { - LoggerE("Fail to get app info"); - ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Fail to get app info"), &out); - return; + std::string api_version; + PlatformResult ret = common::tools::GetPkgApiVersion(&api_version); + if (ret.IsError()) { + ReportError(ret, &out); } - - ret = app_info_get_package(app_handle, &pkgid); - if ((ret != APP_MANAGER_ERROR_NONE) || (pkgid == nullptr)) { - LoggerE("Fail to get pkg id"); - ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Fail to get pkg id"), &out); - return; - } - - ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, getuid(), &pkginfo_handle); - if (ret != PMINFO_R_OK) { - LoggerE("Fail to get pkginfo_h"); - ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Fail to get pkginfo_h"), &out); - return; - } - - ret = pkgmgrinfo_pkginfo_get_api_version(pkginfo_handle, &api_version); - if (ret != PMINFO_R_OK) { - LoggerE("Fail to get api version"); - ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Fail to get api version"), &out); - return; - } - ReportSuccess(picojson::value(api_version), out); }