From 6203dbd47fd06b8ab3182a858d49c1ac60cef373 Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Tue, 23 Feb 2021 17:32:03 +0900 Subject: [PATCH] Implement getting datacontrol privilege API Signed-off-by: Junghyun Yeon --- src/manager/pkginfo_manager.cc | 47 +++++++++++++++++++++++++++++++++++ src/manager/pkginfo_manager.h | 3 +++ src/pkgmgrinfo_appinfo.c | 56 ++++++++++++------------------------------ 3 files changed, 66 insertions(+), 40 deletions(-) diff --git a/src/manager/pkginfo_manager.cc b/src/manager/pkginfo_manager.cc index f3fe21e..9fc0a70 100644 --- a/src/manager/pkginfo_manager.cc +++ b/src/manager/pkginfo_manager.cc @@ -279,4 +279,51 @@ extern "C" EXPORT_API int _appinfo_get_datacontrol_trusted_info( } return PMINFO_R_OK; +} + +extern "C" EXPORT_API int _appinfo_get_datacontrol_privileges( + const char *providerid, const char *type, uid_t uid, + GList **privileges) { + char *query = nullptr; + query = sqlite3_mprintf( + "SELECT privilege FROM package_app_data_control_privilege " + "WHERE providerid=%Q AND type=%Q", providerid, type); + if (query == NULL) { + LOGE("Out of memory"); + return PMINFO_R_ERROR; + } + + std::shared_ptr parcelable( + new pkgmgr_common::parcel::QueryParcelable(uid, std::string(query))); + + pkgmgr_client::PkgInfoClient client(parcelable, uid); + if (!client.SendRequest()) + return PMINFO_R_ERROR; + // TODO: deliver rawdata to reqhandler directly if server is not working + + std::shared_ptr return_parcel( + std::static_pointer_cast( + client.GetResultParcel())); + tizen_base::Parcel parcel; + parcel.ReadParcelable(return_parcel.get()); + sqlite3_free(query); + // result_list is vector of string vector + auto result_list = return_parcel->GetResult(); + if (result_list.size() == 0) + return PMINFO_R_ENOENT; + + for (auto result : result_list) { + if (result.size() != 1) + return PMINFO_R_ERROR; + if (result.front().empty() || result.front().size() == 0) + return PMINFO_R_ERROR; + char *privilege = strdup(result.front().c_str()); + if (privilege == nullptr) { + LOG(ERROR) << "Out of memory"; + return PMINFO_R_ERROR; + } + *privileges = g_list_append(*privileges, privilege); + } + + return PMINFO_R_OK; } \ No newline at end of file diff --git a/src/manager/pkginfo_manager.h b/src/manager/pkginfo_manager.h index 07fb9dc..dd0bf42 100644 --- a/src/manager/pkginfo_manager.h +++ b/src/manager/pkginfo_manager.h @@ -45,6 +45,9 @@ int _appinfo_get_datacontrol_appid(const char *providerid, uid_t uid, int _appinfo_get_datacontrol_trusted_info(const char *providerid, const char *type, uid_t uid, char **appid, char **trusted); +int _appinfo_get_datacontrol_privileges( + const char *providerid, const char *type, uid_t uid, + GList **privileges); #ifdef __cplusplus } #endif diff --git a/src/pkgmgrinfo_appinfo.c b/src/pkgmgrinfo_appinfo.c index 4d99c7a..957d22f 100644 --- a/src/pkgmgrinfo_appinfo.c +++ b/src/pkgmgrinfo_appinfo.c @@ -1527,59 +1527,35 @@ API int pkgmgrinfo_appinfo_get_datacontrol_trsuted_info(const char *providerid, type, _getuid(), appid, is_trusted); } -static int _appinfo_foreach_datacontrol_privileges( - const char *providerid, const char *type, - pkgmgrinfo_pkg_privilege_list_cb callback, void *user_data) -{ - char *query = NULL; - - query = sqlite3_mprintf( - "SELECT privilege FROM package_app_data_control_privilege " - "WHERE providerid=%Q AND type=%Q", providerid, type); - if (query == NULL) { - LOGE("Out of memory"); - return PMINFO_R_ERROR; - } - - // TODO: need to change to use pkginfo-client APIs - sqlite3_free(query); - return 0; -} - -static int _pkgmgrinfo_appinfo_foreach_datacontrol_privileges(uid_t uid, - const char *providerid, const char *type, - pkgmgrinfo_pkg_privilege_list_cb callback, void *user_data) -{ - int ret; - - ret = _appinfo_foreach_datacontrol_privileges(providerid, type, - callback, user_data); - - return ret; -} - API int pkgmgrinfo_appinfo_usr_foreach_datacontrol_privileges( const char *providerid, const char *type, pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data, uid_t uid) { int ret; - + int count = 0; + GList *list = NULL; + GList *tmp = NULL; if (providerid == NULL || type == NULL || privilege_func == NULL) { LOGE("invalid parameter"); return PMINFO_R_EINVAL; } - ret = _pkgmgrinfo_appinfo_foreach_datacontrol_privileges(GLOBAL_USER, - providerid, type, privilege_func, user_data); - if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER) - ret = _pkgmgrinfo_appinfo_foreach_datacontrol_privileges(uid, - providerid, type, privilege_func, user_data); + ret = _appinfo_get_datacontrol_privileges(providerid, type, uid, &list); + if (PMINFO_R_ERROR) { + g_list_free_full(list, free); + return ret; + } - if (ret == PMINFO_R_ENOENT) - ret = PMINFO_R_OK; + for (tmp = list; tmp != NULL; tmp = g_list_next(tmp)) { + count++; + ret = privilege_func((char *)tmp->data, user_data); + if (ret < 0); + break; + } - return ret; + g_list_free_full(list, free); + return PMINFO_R_OK; } API int pkgmgrinfo_appinfo_foreach_datacontrol_privileges( -- 2.7.4