fixed failed update preload web app
authorSoyoung Kim <sy037.kim@samsung.com>
Sun, 12 May 2013 11:52:39 +0000 (20:52 +0900)
committerJihoon Chung <jihoon.chung@samsung.com>
Fri, 17 May 2013 07:20:01 +0000 (16:20 +0900)
[Issue#] N/A
[Problem] can't install web app.
[Cause] check pakcage id from RO.
And failed set smack label at shared directory.
[Solution] To validate package id is only from RW.
And skip to set smack label if update.
[SCMRequest] N/A

Change-Id: I51fe5137134ce59fd862e2a8bb61fcf35ab50587

src/jobs/widget_install/job_widget_install.cpp
src/jobs/widget_install/task_smack.cpp
src/jobs/widget_install/task_smack.h

index 46d88b9..6245ed0 100644 (file)
@@ -545,13 +545,9 @@ bool JobWidgetInstall::validateTizenPackageID(
     std::string installPath =
         std::string(GlobalConfig::GetUserInstalledWidgetPath()) +
         "/" + pkgId;
-    std::string preinstallPath =
-        std::string(GlobalConfig::GetUserPreloadedWidgetPath()) +
-        "/" + pkgId;
 
     struct stat dirStat;
-    if ((stat(installPath.c_str(), &dirStat) == 0) ||
-        (stat(preinstallPath.c_str(), &dirStat) == 0))
+    if ((stat(installPath.c_str(), &dirStat) == 0))
     {
         return false;
     }
index 9769276..31a9d23 100644 (file)
@@ -54,39 +54,50 @@ namespace Jobs {
 namespace WidgetInstall {
 TaskSmack::TaskSmack(InstallerContext& context) :
     DPL::TaskDecl<TaskSmack>(this),
-    m_context(context)
+    m_context(context),
+    m_pkgId(NULL)
 {
-    AddStep(&TaskSmack::SmackFolderLabelingStep);
-    AddStep(&TaskSmack::SmackPrivilegeStep);
-    AddStep(&TaskSmack::SetEndofInstallation);
+    if (!m_context.isUpdateMode) {
+        AddStep(&TaskSmack::StepSetInstall);
+        AddStep(&TaskSmack::StepSmackFolderLabeling);
+        AddStep(&TaskSmack::StepSmackPrivilege);
+    } else {
+        AddStep(&TaskSmack::StepSmackPrivilege);
+    }
+    AddStep(&TaskSmack::StepSetEndofInstallation);
 
     AddAbortStep(&TaskSmack::StepAbortSmack);
 }
 
-void TaskSmack::SmackFolderLabelingStep()
+void TaskSmack::StepSetInstall()
 {
-    LogInfo("----------------> SMACK:\
-            Jobs::WidgetInstall::TaskSmack::SmackFolderLabelingStep()");
+    LogInfo("----------------> SMACK: StepStartSetSmack()");
 #ifdef WRT_SMACK_ENABLED
     std::string pkg = DPL::ToUTF8String(m_context.widgetConfig.tzPkgid);
-    char* pkgId = NULL;
-    pkgId = (char*)calloc(1, pkg.length() + 1);
-    snprintf(pkgId, pkg.length() + 1, "%s", pkg.c_str());
+    m_pkgId = (char*)calloc(1, pkg.length() + 1);
+    snprintf(m_pkgId, pkg.length() + 1, "%s", pkg.c_str());
 
     if (m_context.widgetConfig.packagingType !=
             WrtDB::PkgType::PKG_TYPE_HYBRID_WEB_APP)
     {
-            if (PC_OPERATION_SUCCESS != app_install(pkgId)) {
-            free(pkgId);
+            if (PC_OPERATION_SUCCESS != app_install(m_pkgId)) {
+            free(m_pkgId);
             ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
                     "failure in creating smack rules file.");
         }
     }
+#endif
+}
 
+void TaskSmack::StepSmackFolderLabeling()
+{
+    LogInfo("----------------> SMACK:\
+            Jobs::WidgetInstall::TaskSmack::SmackFolderLabelingStep()");
+#ifdef WRT_SMACK_ENABLED
     /* /opt/usr/apps/[pkgid] directory's label is "_" */
     if (PC_OPERATION_SUCCESS != app_label_dir("_",
                 m_context.locations->getPackageInstallationDir().c_str())) {
-        free(pkgId);
+        free(m_pkgId);
         ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
                 "Add Label failure");
     }
@@ -94,9 +105,9 @@ void TaskSmack::SmackFolderLabelingStep()
     /* res directory */
     std::string resDir = m_context.locations->getPackageInstallationDir() +
         "/res";
-    if (PC_OPERATION_SUCCESS != app_label_dir(pkgId,
+    if (PC_OPERATION_SUCCESS != app_label_dir(m_pkgId,
                 resDir.c_str())) {
-        free(pkgId);
+        free(m_pkgId);
         ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
                 "Add Label failure");
     }
@@ -106,34 +117,34 @@ void TaskSmack::SmackFolderLabelingStep()
     {
         if (PC_OPERATION_SUCCESS != app_label_dir("_",
                     m_context.locations->getUserDataRootDir().c_str())) {
-            free(pkgId);
+            free(m_pkgId);
             ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
                     "Add Label failure");
         }
     }
 
     /* data directory */
-    if (PC_OPERATION_SUCCESS != app_label_dir(pkgId,
+    if (PC_OPERATION_SUCCESS != app_label_dir(m_pkgId,
                 m_context.locations->getPrivateStorageDir().c_str())) {
-        free(pkgId);
+        free(m_pkgId);
         ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
                 "Add Label failure");
     }
 
     /* bin directory */
-    if (PC_OPERATION_SUCCESS != app_label_dir(pkgId,
+    if (PC_OPERATION_SUCCESS != app_label_dir(m_pkgId,
                 m_context.locations->getBinaryDir().c_str())) {
-        free(pkgId);
+        free(m_pkgId);
         ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
                 "Add Label failure");
     }
 
-    if(!setLabelForSharedDir(pkgId)) {
+    if(!setLabelForSharedDir(m_pkgId)) {
         ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
                 "Add Label failure");
     }
 
-    free(pkgId);
+    free(m_pkgId);
 
     /* TODO : set label at wrt-client 
 
@@ -144,7 +155,7 @@ void TaskSmack::SmackFolderLabelingStep()
 
     if (0 != smack_lsetlabel(m_context.locations->getExecFile().c_str(),
                 appId, SMACK_LABEL_ACCESS)) {
-        free(pkgId);
+        free(m_pkgId);
         free(appId);
         ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
                 "Add ACESS Label for binary failure");
@@ -152,22 +163,22 @@ void TaskSmack::SmackFolderLabelingStep()
 
     if (0 != smack_lsetlabel(m_context.locations->getExecFile().c_str(),
                 appId, SMACK_LABEL_EXEC)) {
-        free(pkgId);
+        free(m_pkgId);
         free(appId);
         ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
                 "Add EXEC Label for binary failure");
     }
 
-   if (PC_OPERATION_SUCCESS != app_add_friend(pkgId, appId)) {
-        free(pkgId);
+   if (PC_OPERATION_SUCCESS != app_add_friend(m_pkgId, appId)) {
+        free(m_pkgId);
         free(appId);
         ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
                 "Add friend failure");
    }
 
-    if (PC_OPERATION_SUCCESS != app_label_shared_dir(appId, pkgId,
+    if (PC_OPERATION_SUCCESS != app_label_shared_dir(appId, m_pkgId,
                 m_context.locations->getBinaryDir().c_str())) {
-        free(pkgId);
+        free(m_pkgId);
         free(appId);
         ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
                 "Add Label failure");
@@ -176,7 +187,7 @@ void TaskSmack::SmackFolderLabelingStep()
 #endif
 }
 
-void TaskSmack::SmackPrivilegeStep()
+void TaskSmack::StepSmackPrivilege()
 {
     LogInfo("----------------> SMACK:\
             Jobs::WidgetInstall::TaskSmack::SmackPrivilegeStep()");
@@ -217,6 +228,17 @@ void TaskSmack::SmackPrivilegeStep()
 #endif
 }
 
+void TaskSmack::StepRevokeForUpdate()
+{
+    LogInfo("----------------> SMACK:\
+            Jobs::WidgetInstall::TaskSmack::StepRevokePrivilegeForUpdate()");
+#ifdef WRT_SMACK_ENABLED
+    if (PC_OPERATION_SUCCESS != app_revoke_permissions(m_pkgId)) {
+        LogError("failure in revoking smack permissions");
+    }
+#endif
+}
+
 void TaskSmack::StepAbortSmack()
 {
     LogInfo("----------------> SMACK:\
@@ -230,23 +252,18 @@ void TaskSmack::StepAbortSmack()
     snprintf(appId, id.length() + 1, "%s", id.c_str());
     */
 
-    std::string pkg = DPL::ToUTF8String(m_context.widgetConfig.tzPkgid);
-    char* pkgId = NULL;
-    pkgId = (char*)calloc(1, pkg.length() + 1);
-    snprintf(pkgId, pkg.length() + 1, "%s", pkg.c_str());
-
-    if (PC_OPERATION_SUCCESS != app_revoke_permissions(pkgId)) {
+    if (PC_OPERATION_SUCCESS != app_revoke_permissions(m_pkgId)) {
         LogError("failure in revoking smack permissions");
     }
 
-    if (PC_OPERATION_SUCCESS != app_uninstall(pkgId)) {
+    if (PC_OPERATION_SUCCESS != app_uninstall(m_pkgId)) {
         LogError("failure in removing smack rules file");
     }
-    free(pkgId);
+    free(m_pkgId);
 #endif
 }
 
-void TaskSmack::SetEndofInstallation()
+void TaskSmack::StepSetEndofInstallation()
 {
     m_context.job->UpdateProgress(
         InstallerContext::INSTALL_END,
index 5dd15bf..ad32e5c 100644 (file)
@@ -35,10 +35,13 @@ class TaskSmack :
 {
   private:
     InstallerContext& m_context;
+    char* m_pkgId;
 
-    void SmackFolderLabelingStep();
-    void SmackPrivilegeStep();
-    void SetEndofInstallation();
+    void StepSetInstall();
+    void StepSmackFolderLabeling();
+    void StepSmackPrivilege();
+    void StepRevokeForUpdate();
+    void StepSetEndofInstallation();
     void StepAbortSmack();
 
     bool setLabelForSharedDir(const char* pkgId);