Block different type installation with same pkgid
[platform/core/appfw/app-installers.git] / src / common / pkgmgr_interface.cc
index b95d2a7..a754585 100644 (file)
@@ -14,7 +14,7 @@
 #include <fstream>
 
 #include "common/app_query_interface.h"
-#include "common/pkgmgr_query.h"
+#include "common/utils/pkgmgr_query.h"
 #include "common/pkgmgr_signal.h"
 #include "common/pkgmgr_registration.h"
 #include "common/utils/file_util.h"
@@ -80,7 +80,7 @@ bool PkgmgrInstaller::ShouldCreateSignal() const {
 
 PkgMgrPtr PkgMgrInterface::Create(int argc, char** argv,
     PkgmgrInstallerInterface* pkgmgr_installer_interface,
-    AppQueryInterface* interface) {
+    std::shared_ptr<AppQueryInterface> interface) {
   PkgMgrPtr instance(new PkgMgrInterface(pkgmgr_installer_interface,
                                          interface));
   int result = instance->InitInternal(argc, argv);
@@ -104,8 +104,15 @@ int PkgMgrInterface::InitInternal(int argc, char** argv) {
     return -1;
   }
 
+  boost::optional<bool> is_admin_user =
+      IsAdminUser(pkgmgr_installer_get_uid(pi_));
+  if (!is_admin_user) {
+    LOG(ERROR) << "Cannot get admin user info. Aborting.";
+    return -1;
+  }
+
   // Set target uid as tizenglobalapp if admin user's request
-  if (IsAdminUser(pkgmgr_installer_get_uid(pi_))) {
+  if (*is_admin_user) {
     result = pkgmgr_installer_set_uid(pi_, kGlobalUserUid);
     if (result) {
       LOG(ERROR) << "Failed to set global uid";
@@ -141,12 +148,34 @@ bool PkgMgrInterface::SetAppQueryInterface(int idx) {
 }
 
 void PkgMgrInterface::AddAppQueryInterface(
-    int idx, AppQueryInterface* interface) {
+    int idx, std::shared_ptr<AppQueryInterface> interface) {
   query_interface_map_.emplace(idx, interface);
 }
 
+std::shared_ptr<AppQueryInterface> PkgMgrInterface::GetAppQueryInterface() {
+  return query_interface_;
+}
+
 RequestType PkgMgrInterface::GetRequestType(int idx) const {
-  AppQueryInterface* query_interface = query_interface_;
+  // These type could be determined even if there are no query_interface_.
+  switch (pkgmgr_installer_get_request_type(pi_)) {
+    case PKGMGR_REQ_DISABLE_PKG:
+      return RequestType::DisablePkg;
+    case PKGMGR_REQ_ENABLE_PKG:
+      return RequestType::EnablePkg;
+    case PKGMGR_REQ_MIGRATE_EXTIMG:
+      return RequestType::MigrateExtImg;
+    case PKGMGR_REQ_RECOVER_DB:
+      return RequestType::RecoverDB;
+    case PKGMGR_REQ_REINSTALL:
+      return RequestType::Reinstall;
+    case PKGMGR_REQ_RECOVER:
+      return RequestType::Recovery;
+    case PKGMGR_REQ_MOVE:
+      return RequestType::Move;
+  }
+
+  std::shared_ptr<AppQueryInterface> query_interface = query_interface_;
   if (!query_interface) {
     auto it = query_interface_map_.find(idx);
     if (it == query_interface_map_.end())
@@ -209,12 +238,6 @@ RequestType PkgMgrInterface::GetRequestType(int idx) const {
       else
         return RequestType::Uninstall;
     }
-    case PKGMGR_REQ_REINSTALL:
-      return RequestType::Reinstall;
-    case PKGMGR_REQ_RECOVER:
-      return RequestType::Recovery;
-    case PKGMGR_REQ_MOVE:
-      return RequestType::Move;
     case PKGMGR_REQ_MANIFEST_DIRECT_INSTALL:
       if (!is_app_installed_.get()) {
         if (GetIsPreloadRequest() && GetIsPartialRW())
@@ -227,19 +250,22 @@ RequestType PkgMgrInterface::GetRequestType(int idx) const {
         else
           return RequestType::ManifestDirectUpdate;
       }
-    case PKGMGR_REQ_MOUNT_INSTALL:
-      if (!is_app_installed_.get())
+    case PKGMGR_REQ_MOUNT_INSTALL: {
+      if (!is_app_installed_.get()) {
         return RequestType::MountInstall;
-      else
-        return RequestType::MountUpdate;
-    case PKGMGR_REQ_DISABLE_PKG:
-      return RequestType::DisablePkg;
-    case PKGMGR_REQ_ENABLE_PKG:
-      return RequestType::EnablePkg;
-    case PKGMGR_REQ_MIGRATE_EXTIMG:
-      return RequestType::MigrateExtImg;
-    case PKGMGR_REQ_RECOVER_DB:
-      return RequestType::RecoverDB;
+      } else {
+        std::string pkgid = query_interface->GetPkgId(GetRequestInfo(idx));
+        uid_t uid = GetUid();
+        ci::PkgQueryInterface pkg_query(pkgid, uid);
+        if (CheckIfAppFilesExists(pkgid, uid, pkg_query.IsReadonlyPackage())) {
+          return RequestType::MountUpdate;
+        } else {
+          RequestMode request_mode = GetRequestMode(uid);
+          UnregisterAppInPkgmgrForPkgId(pkgid, uid, request_mode);
+          return RequestType::MountInstall;
+        }
+      }
+    }
     default:
       return RequestType::Unknown;
   }
@@ -322,4 +348,8 @@ int PkgMgrInterface::GetRequestInfoCount() const {
   return pkgmgr_installer_get_request_info_count(pi_);
 }
 
+bool PkgMgrInterface::GetRecoveryCleanup() const {
+  return (pkgmgr_installer_get_recovery_cleanup(pi_) == 1);
+}
+
 }  // namespace common_installer