Check MDM policy before uninstalling
authorSoyoung Kim <sy037.kim@samsung.com>
Mon, 21 Oct 2013 10:34:51 +0000 (19:34 +0900)
committerSoo-Hyun Choi <sh9.choi@samsung.com>
Tue, 22 Oct 2013 11:18:22 +0000 (20:18 +0900)
[Issue#]   N/A
[Problem]  installation success even though web app is blocked by MDM policy.
[Cause]    installer did not check MDM policy.
[Solution] add pkgmgr_parser_check_MDM_policy_for_uninstallation() to get MDM policy

[SCMRequest] N/A

Change-Id: I4eeda3119b151cf2db21ceac946c16828e4a940d

src/jobs/widget_uninstall/job_widget_uninstall.cpp
src/jobs/widget_uninstall/job_widget_uninstall.h
src/jobs/widget_uninstall/task_check.cpp
src/jobs/widget_uninstall/task_check.h
src/jobs/widget_uninstall/task_delete_pkginfo.cpp
src/jobs/widget_uninstall/uninstaller_context.h
src/jobs/widget_uninstall/widget_uninstall_errors.h

index 8a674c3..71de26f 100644 (file)
@@ -104,6 +104,7 @@ JobWidgetUninstall::JobWidgetUninstall(
             m_context.locations->registerAppid(m_context.tzAppid);
             m_context.installedPath =
                 DPL::Utils::Path(*dao.getWidgetInstalledPath());
+            m_context.manifestFile = getManifestFile();
 
             _D("Widget model exists. App id : %s", m_context.tzAppid.c_str());
 
@@ -197,6 +198,29 @@ bool JobWidgetUninstall::getRemoveFinishedFlag() const
     return m_context.removeFinished;
 }
 
+DPL::Utils::Path JobWidgetUninstall::getManifestFile() const
+{
+    std::ostringstream manifest_name;
+    manifest_name << m_context.tzPkgid << ".xml";
+    DPL::Utils::Path manifestFile;
+
+    const DPL::Utils::Path PRELOAD_INSTALLED_PATH("/usr/apps/" + m_context.tzPkgid);
+    const DPL::Utils::Path USR_PACKAGES_PATH("/usr/share/packages");
+    const DPL::Utils::Path OPT_PACKAGES_PATH("/opt/share/packages");
+
+    if (PRELOAD_INSTALLED_PATH == m_context.installedPath) {
+        _D("This widget is preloaded.");
+        manifestFile = USR_PACKAGES_PATH;
+    } else {
+        manifestFile = OPT_PACKAGES_PATH;
+    }
+
+    manifestFile /= manifest_name.str();
+    _D("Manifest file : %s", manifestFile.Fullpath().c_str());
+
+    return manifestFile;
+}
+
 void JobWidgetUninstall::SendProgress()
 {
     using namespace PackageManager;
index 0a33a4a..21bb764 100644 (file)
@@ -63,6 +63,7 @@ class JobWidgetUninstall :
     std::string getRemovedTizenId() const;
     bool getRemoveStartedFlag() const;
     bool getRemoveFinishedFlag() const;
+    DPL::Utils::Path getManifestFile() const;
 
     WidgetStatus getWidgetStatus(const std::string &appId);
 
index 56af94c..22a7e91 100644 (file)
@@ -28,6 +28,8 @@
 #include <dpl/wrt-dao-ro/global_config.h>
 #include <dpl/wrt-dao-ro/widget_dao_read_only.h>
 #include <app_manager.h>
+#include <pkgmgr/pkgmgr_parser.h>
+#include <pkgmgr-info.h>
 #include <installer_log.h>
 
 namespace Jobs {
@@ -38,6 +40,7 @@ TaskCheck::TaskCheck(UninstallerContext& context) :
 {
     AddStep(&TaskCheck::StartStep);
     AddStep(&TaskCheck::StepUninstallPreCheck);
+    AddStep(&TaskCheck::StepCheckMDM);
     AddStep(&TaskCheck::EndStep);
 }
 
@@ -114,5 +117,16 @@ void TaskCheck::StepUninstallPreCheck()
 
     _D("Widget Can be uninstalled, Pkgname : %s", m_context.tzAppid.c_str());
 }
+
+void TaskCheck::StepCheckMDM()
+{
+    _D("StepCheckMDM");
+
+    if (PMINFO_R_OK !=  pkgmgr_parser_check_mdm_policy_for_uninstallation(
+                m_context.manifestFile.Fullpath().c_str())) {
+        _E("Failed to check mdm policy");
+        ThrowMsg(Exceptions::CheckMDMPolicyFailure, "Can't uninstall! Because of MDM policy");
+    }
+}
 } //namespace WidgetUninstall
 } //namespace Jobs
index 0e39345..29c00db 100644 (file)
@@ -39,6 +39,7 @@ class TaskCheck :
 
     //steps
     void StepUninstallPreCheck();
+    void StepCheckMDM();
     void StartStep();
     void EndStep();
 
index d86af93..88db8e2 100644 (file)
@@ -57,32 +57,19 @@ void TaskDeletePkgInfo::StepDeletePkgInfo()
 {
     std::ostringstream manifest_name;
     manifest_name << m_context.tzPkgid << ".xml";
-    DPL::Utils::Path destFile;
-    const DPL::Utils::Path PRELOAD_INSTALLED_PATH("/usr/apps");
-    const DPL::Utils::Path USR_PACKAGES_PATH("/usr/share/packages");
-    const DPL::Utils::Path OPT_PACKAGES_PATH("/opt/share/packages");
-    if (0 == (m_context.installedPath.Fullpath()).compare(0,
-            PRELOAD_INSTALLED_PATH.Fullpath().length(),
-            PRELOAD_INSTALLED_PATH.Fullpath())) {
-        _D("This widget is preloaded.");
-        destFile = USR_PACKAGES_PATH;
-    } else {
-        destFile = OPT_PACKAGES_PATH;
-    }
-    destFile /= manifest_name.str();
-    DPL::Utils::Path pre_manifest = USR_PACKAGES_PATH;
+    DPL::Utils::Path pre_manifest("/usr/share/packages");
     pre_manifest /= manifest_name.str();
 
-    if (!(destFile.Exists() == 0 && pre_manifest.Exists())) {
+    if (!(m_context.manifestFile.Exists() == 0 && pre_manifest.Exists())) {
         if (0 !=  pkgmgr_parser_parse_manifest_for_uninstallation(
-                    destFile.Fullpath().c_str(), NULL)) {
+                    m_context.manifestFile.Fullpath().c_str(), NULL)) {
             _W("Manifest file failed to parse for uninstallation");
         }
     }
-    if (!DPL::Utils::TryRemove(destFile)) {
-        _W("No manifest file found: %s", destFile.Fullpath().c_str());
+    if (!DPL::Utils::TryRemove(m_context.manifestFile)) {
+        _W("No manifest file found: %s", m_context.manifestFile.Fullpath().c_str());
     } else {
-        _D("Manifest file removed: %s", destFile.Fullpath().c_str());
+        _D("Manifest file removed: %s", m_context.manifestFile.Fullpath().c_str());
     }
 }
 } //namespace WidgetUninstall
index 25c25e3..b6cf5bd 100644 (file)
@@ -64,6 +64,7 @@ struct UninstallerContext
     std::string tzPkgid;
     bool removeAbnormal;
     DPL::Utils::Path installedPath;
+    DPL::Utils::Path manifestFile;
 };
 
 #endif // WRT_SRC_INSTALLER_CORE_UNINSTALLER_TASKS_UNINSTALLER_CONTEXT_H_
index 93f3031..3c5970b 100644 (file)
@@ -44,6 +44,7 @@ DECLARE_JOB_EXCEPTION(Base, UninstallOspSvcFailed,
 DECLARE_JOB_EXCEPTION(Base, PlatformAPIFailure, ErrorWidgetUninstallationFailed)
 DECLARE_JOB_EXCEPTION(Base, RemoveFileFailure, ErrorWidgetUninstallationFailed)
 DECLARE_JOB_EXCEPTION(Base, Unremovable, ErrorWidgetUninstallationFailed)
+DECLARE_JOB_EXCEPTION(Base, CheckMDMPolicyFailure, ErrorWidgetUninstallationFailed)
 } //namespace
 } //namespace
 } //namespace