From c9e6dcfee91e2f2dedddcd54cac6f6fd6de83a12 Mon Sep 17 00:00:00 2001 From: Soyoung Kim Date: Mon, 21 Oct 2013 19:34:51 +0900 Subject: [PATCH] Check MDM policy before uninstalling [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 | 24 +++++++++++++++++++++ src/jobs/widget_uninstall/job_widget_uninstall.h | 1 + src/jobs/widget_uninstall/task_check.cpp | 14 ++++++++++++ src/jobs/widget_uninstall/task_check.h | 1 + src/jobs/widget_uninstall/task_delete_pkginfo.cpp | 25 ++++++---------------- src/jobs/widget_uninstall/uninstaller_context.h | 1 + .../widget_uninstall/widget_uninstall_errors.h | 1 + 7 files changed, 48 insertions(+), 19 deletions(-) diff --git a/src/jobs/widget_uninstall/job_widget_uninstall.cpp b/src/jobs/widget_uninstall/job_widget_uninstall.cpp index 8a674c3..71de26f 100644 --- a/src/jobs/widget_uninstall/job_widget_uninstall.cpp +++ b/src/jobs/widget_uninstall/job_widget_uninstall.cpp @@ -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; diff --git a/src/jobs/widget_uninstall/job_widget_uninstall.h b/src/jobs/widget_uninstall/job_widget_uninstall.h index 0a33a4a..21bb764 100644 --- a/src/jobs/widget_uninstall/job_widget_uninstall.h +++ b/src/jobs/widget_uninstall/job_widget_uninstall.h @@ -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); diff --git a/src/jobs/widget_uninstall/task_check.cpp b/src/jobs/widget_uninstall/task_check.cpp index 56af94c..22a7e91 100644 --- a/src/jobs/widget_uninstall/task_check.cpp +++ b/src/jobs/widget_uninstall/task_check.cpp @@ -28,6 +28,8 @@ #include #include #include +#include +#include #include 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 diff --git a/src/jobs/widget_uninstall/task_check.h b/src/jobs/widget_uninstall/task_check.h index 0e39345..29c00db 100644 --- a/src/jobs/widget_uninstall/task_check.h +++ b/src/jobs/widget_uninstall/task_check.h @@ -39,6 +39,7 @@ class TaskCheck : //steps void StepUninstallPreCheck(); + void StepCheckMDM(); void StartStep(); void EndStep(); diff --git a/src/jobs/widget_uninstall/task_delete_pkginfo.cpp b/src/jobs/widget_uninstall/task_delete_pkginfo.cpp index d86af93..88db8e2 100644 --- a/src/jobs/widget_uninstall/task_delete_pkginfo.cpp +++ b/src/jobs/widget_uninstall/task_delete_pkginfo.cpp @@ -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 diff --git a/src/jobs/widget_uninstall/uninstaller_context.h b/src/jobs/widget_uninstall/uninstaller_context.h index 25c25e3..b6cf5bd 100644 --- a/src/jobs/widget_uninstall/uninstaller_context.h +++ b/src/jobs/widget_uninstall/uninstaller_context.h @@ -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_ diff --git a/src/jobs/widget_uninstall/widget_uninstall_errors.h b/src/jobs/widget_uninstall/widget_uninstall_errors.h index 93f3031..3c5970b 100644 --- a/src/jobs/widget_uninstall/widget_uninstall_errors.h +++ b/src/jobs/widget_uninstall/widget_uninstall_errors.h @@ -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 -- 2.7.4