Implement app cert compare internal API
authorJunghyun Yeon <jungh.yeon@samsung.com>
Thu, 4 Mar 2021 09:07:03 +0000 (18:07 +0900)
committer연정현/Tizen Platform Lab(SR)/Staff Engineer/삼성전자 <jungh.yeon@samsung.com>
Fri, 5 Mar 2021 00:05:43 +0000 (09:05 +0900)
Signed-off-by: Junghyun Yeon <jungh.yeon@samsung.com>
src/manager/pkginfo_manager.cc
src/manager/pkginfo_manager.h

index 7b16049..aad1e8c 100644 (file)
@@ -660,7 +660,7 @@ extern "C" EXPORT_API int _certinfo_compare_pkg_certinfo(const char *l_pkgid,
                const char *r_pkgid, pkgmgrinfo_cert_compare_result_type_e *result) {
        char *query = sqlite3_mprintf("SELECT package, "
                        "COALESCE(author_signer_cert, -1) FROM package_cert_info WHERE "
-                       "package IN (%Q, %Q)");
+                       "package IN (%Q, %Q)", l_pkgid, r_pkgid);
        if (query == nullptr) {
                LOG(ERROR) << "Out of memory";
                return PMINFO_R_ERROR;
@@ -704,13 +704,57 @@ extern "C" EXPORT_API int _certinfo_compare_pkg_certinfo(const char *l_pkgid,
        else
                *result = PMINFO_CERT_COMPARE_MISMATCH;
 
-/*
-       auto cert_list = return_parcel->GetResult();
-       for (auto& cert : cert_list) {
+       return PMINFO_R_OK;
+}
 
+extern "C" EXPORT_API int _certinfo_compare_app_certinfo(uid_t uid,
+               const char *l_appid, const char *r_appid,
+               pkgmgrinfo_cert_compare_result_type_e *result) {
+       char* query = sqlite3_mprintf("SELECT app_id, package FROM "
+                       "package_app_info WHERE app_id IN (%Q, %Q)", l_appid, r_appid);
+       if (query == nullptr) {
+               LOG(ERROR) << "Out of memory";
+               return PMINFO_R_ERROR;
        }
-*/
-       return PMINFO_R_OK;
+       std::vector<std::string> queries;
+       queries.emplace_back(query);
+       sqlite3_free(query);
+
+       std::shared_ptr<pkgmgr_common::parcel::AbstractParcelable> parcelable(
+               new pkgmgr_common::parcel::QueryParcelable(uid, queries,
+                               pkgmgr_common::database::AbstractDBHandler::DBType::DB_TYPE_FILE_PKGDB,
+                               pkgmgr_common::database::AbstractDBHandler::OperationType::OPERATION_TYPE_READ));
+       pkgmgr_client::PkgInfoClient client(parcelable, uid,
+                       pkgmgr_common::ReqType::QUERY);
+       if (!client.SendRequest()) {
+               return PMINFO_R_ERROR;
+       }
+
+       std::shared_ptr<pkgmgr_common::parcel::ResultParcelable> return_parcel(
+                       std::static_pointer_cast<pkgmgr_common::parcel::ResultParcelable>(
+                                       client.GetResultParcel()));
+
+       auto pkgid_list = return_parcel->GetResult();
+       std::map<std::string, std::string> result_map;
+       for (auto& pkgid : pkgid_list)
+               result_map.insert(make_pair(pkgid.front(), pkgid.back()));
+
+       if (result_map.find(std::string(l_appid)) == result_map.end()) {
+               LOG(ERROR) << "Cannot find pkgid of app " << l_appid
+                               << " for uid " << uid;
+               return PMINFO_R_ENOENT;
+       } else if (result_map.find(std::string(r_appid)) == result_map.end()) {
+               LOG(ERROR) << "Cannot find pkgid of app " << r_appid
+                               << " for uid " << uid;
+               return PMINFO_R_ENOENT;
+       }
+
+       const char* l_pkgid = result_map.find(
+                       std::string(l_appid))->second.c_str();
+       const char* r_pkgid = result_map.find(
+                       std::string(r_appid))->second.c_str();
+
+       return _certinfo_compare_pkg_certinfo(l_pkgid, r_pkgid, result);
 }
 
 extern "C" EXPORT_API int _parser_execute_write_query(const char *query, uid_t uid)
index f6367a7..a80416d 100644 (file)
@@ -69,6 +69,9 @@ int _pkginfo_set_usr_installed_storage(const char *pkgid,
 int _certinfo_compare_pkg_certinfo(const char *l_pkgid, const char *r_pkgid,
                pkgmgrinfo_cert_compare_result_type_e *result);
 
+int _certinfo_compare_app_certinfo(uid_t uid, const char *l_appid,
+               const char *r_appid, pkgmgrinfo_cert_compare_result_type_e *result);
+
 int _parser_execute_write_query(const char *query, uid_t uid);
 
 int _parser_execute_write_queries(const char **queries, int len, uid_t uid);