Enable smack submit/tizen_2.1_smack/20130503.025258
authorSoyoung Kim <sy037.kim@samsung.com>
Thu, 28 Mar 2013 07:45:19 +0000 (16:45 +0900)
committerSoyoung Kim <sy037.kim@samsung.com>
Fri, 3 May 2013 02:51:57 +0000 (11:51 +0900)
[Issue#] N/A
[Problem] N/A
[Cause] N/A
[Solution] enable smacke
- label to directory and set privilege.
[SCMRequest] N/A

Change-Id: I36dd8522da653c7c0d0ae0cdc60f6b6617933b2d

CMakeLists.txt
packaging/wrt-installer.spec
src/CMakeLists.txt
src/jobs/widget_install/job_widget_install.cpp
src/jobs/widget_install/task_smack.cpp
src/jobs/widget_install/task_smack.h
src/jobs/widget_uninstall/task_smack.cpp
src/jobs/widget_uninstall/uninstaller_context.h

index d095c83..8ffd80d 100644 (file)
@@ -88,7 +88,7 @@ ADD_DEFINITIONS("-Wextra")              # Generate even more extra warnings
 ADD_DEFINITIONS("-Wno-variadic-macros") # Inhibit variadic macros warnings (needed for ORM)
 ADD_DEFINITIONS("-Wno-deprecated")      # No warnings about deprecated features
 ADD_DEFINITIONS("-std=c++0x")           # accept C++11x standard
-#ADD_DEFINITIONS("-DWRT_SMACK_ENABLED")
+ADD_DEFINITIONS("-DWRT_SMACK_ENABLED")
 
 ############################# Targets names ###################################
 
index fdb0340..e73f837 100644 (file)
@@ -42,6 +42,7 @@ BuildRequires:  pkgconfig(web-provider)
 BuildRequires:  pkgconfig(libprivilege-control)
 BuildRequires:  pkgconfig(osp-appfw)
 BuildRequires:  osp-appfw-internal-devel
+BuildRequires: pkgconfig(libsmack)
 Requires: osp-appfw
 Requires: xmlsec1
 
index 5e33b52..f0ff76c 100644 (file)
@@ -124,6 +124,7 @@ PKG_CHECK_MODULES(INSTALLER_STATIC_DEP
     pkgmgr-parser
     web-provider
     osp-appfw
+    libsmack
     REQUIRED
 )
 
index d733180..43caf84 100644 (file)
@@ -192,7 +192,6 @@ JobWidgetInstall::JobWidgetInstall(
         }
 
         AddTask(new TaskFileManipulation(m_installerContext));
-
         AddTask(new TaskManifestFile(m_installerContext));
         if (m_installerContext.widgetConfig.packagingType ==
             PKG_TYPE_HYBRID_WEB_APP)
index a5624a9..0211dcb 100644 (file)
 #include <widget_install/widget_install_context.h>
 #include <widget_install/widget_install_errors.h>
 #include <widget_install/job_widget_install.h>
+#include <dpl/wrt-dao-ro/common_dao_types.h>
 #include <dpl/foreach.h>
 #include <dpl/wrt-dao-ro/common_dao_types.h>
 #include <dpl/utils/bash_utils.h>
 #ifdef WRT_SMACK_ENABLED
 #include <privilege-control.h>
+#include <sys/smack.h>
 #endif
 
 #include <sstream>
 
 namespace {
 const int MAX_BUF_SIZE = 128;
-const char* SMACK_RULE_STR = "/usr/bin/smackload-app.sh";
 }
 
 namespace Jobs {
@@ -46,101 +47,151 @@ TaskSmack::TaskSmack(InstallerContext& context) :
 {
     AddStep(&TaskSmack::SmackFolderLabelingStep);
     AddStep(&TaskSmack::SmackPrivilegeStep);
-    AddStep(&TaskSmack::SmackTemporaryStep);
     AddStep(&TaskSmack::SetEndofInstallation);
+
+    AddAbortStep(&TaskSmack::StepAbortSmack);
 }
 
 void TaskSmack::SmackFolderLabelingStep()
 {
-    LogInfo(
-        "----------------> SMACK: \
+    LogInfo("----------------> SMACK:\
             Jobs::WidgetInstall::TaskSmack::SmackFolderLabelingStep()");
-
 #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());
+
+    if (m_context.widgetConfig.packagingType !=
+            WrtDB::PkgType::PKG_TYPE_HYBRID_WEB_APP)
+    {
+            if (PC_OPERATION_SUCCESS != app_install(pkgId)) {
+            free(pkgId);
+            ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
+                    "failure in creating smack rules file.");
+        }
+    }
+
     /* /opt/usr/apps/[pkgid] directory's label is "_" */
-    std::string tzPkgid = DPL::ToUTF8String(m_context.widgetConfig.tzPkgid);
     if (PC_OPERATION_SUCCESS != app_label_dir("_",
-                                              m_context.locations->
-                                                  getPackageInstallationDir().
-                                                  c_str()))
-    {
-        LogError("Set smack failure. Failed to add label for app root directory");
+                m_context.locations->getPackageInstallationDir().c_str())) {
+        free(pkgId);
         ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
-                                         "Add Label failure");
+                "Add Label failure");
     }
 
     /* res directory */
     std::string resDir = m_context.locations->getPackageInstallationDir() +
         "/res";
-    if (PC_OPERATION_SUCCESS != app_label_dir(tzPkgid.c_str(),
-                                              resDir.c_str()))
+    if (PC_OPERATION_SUCCESS != app_label_dir(pkgId,
+                resDir.c_str())) {
+        free(pkgId);
+        ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
+                "Add Label failure");
+    }
+
+    /* for prealod */
+    if (m_context.job->getInstallerStruct().m_installMode
+            == InstallMode::INSTALL_MODE_PRELOAD)
     {
-        LogError("Set smack failure. Failed to add label for resource directory");
+        if (PC_OPERATION_SUCCESS != app_label_dir("_",
+                    m_context.locations->getUserDataRootDir().c_str())) {
+            free(pkgId);
+            ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
+                    "Add Label failure");
+        }
+    }
+
+    /* data directory */
+    if (PC_OPERATION_SUCCESS != app_label_dir(pkgId,
+                m_context.locations->getPrivateStorageDir().c_str())) {
+        free(pkgId);
         ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
-                                         "Add Label failure");
+                "Add Label failure");
     }
 
     /* bin directory */
-    if (PC_OPERATION_SUCCESS != app_label_dir(tzPkgid.c_str(),
-                                              m_context.locations->getBinaryDir()
-                                                  .c_str()))
-    {
-        LogError("Set smack failure. Failed to add label for binary directory");
+    if (PC_OPERATION_SUCCESS != app_label_dir(pkgId,
+                m_context.locations->getBinaryDir().c_str())) {
+        free(pkgId);
         ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
-                                         "Add Label failure");
+                "Add Label failure");
     }
 
-    /* data directory */
-    if (PC_OPERATION_SUCCESS != app_label_dir(tzPkgid.c_str(),
-                                              m_context.locations->
-                                                  getPrivateStorageDir().c_str()))
-    {
-        LogError("Set smack failure. Failed to add label for private storage directory");
+    free(pkgId);
+
+    /* TODO : set label at wrt-client 
+
+    std::string app = DPL::ToUTF8String(m_context.widgetConfig.tzAppid);
+    char* appId = NULL;
+    appId = (char*)calloc(1, app.length() + 1);
+    snprintf(appId, app.length() + 1, "%s", app.c_str());
+
+    if (0 != smack_lsetlabel(m_context.locations->getExecFile().c_str(),
+                appId, SMACK_LABEL_ACCESS)) {
+        free(pkgId);
+        free(appId);
+        ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
+                "Add ACESS Label for binary failure");
+    }
+
+    if (0 != smack_lsetlabel(m_context.locations->getExecFile().c_str(),
+                appId, SMACK_LABEL_EXEC)) {
+        free(pkgId);
+        free(appId);
         ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
-                                         "Add Label failure");
+                "Add EXEC Label for binary failure");
     }
 
+   if (PC_OPERATION_SUCCESS != app_add_friend(pkgId, appId)) {
+        free(pkgId);
+        free(appId);
+        ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
+                "Add friend failure");
+   }
+
+    if (PC_OPERATION_SUCCESS != app_label_shared_dir(appId, pkgId,
+                m_context.locations->getBinaryDir().c_str())) {
+        free(pkgId);
+        free(appId);
+        ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
+                "Add Label failure");
+    }
+    */
 #endif
 }
 
 void TaskSmack::SmackPrivilegeStep()
 {
-    LogInfo(
-        "----------------> SMACK: \
+    LogInfo("----------------> SMACK:\
             Jobs::WidgetInstall::TaskSmack::SmackPrivilegeStep()");
 #ifdef WRT_SMACK_ENABLED
-    WrtDB::TizenPkgId tzPkgid = m_context.widgetConfig.tzPkgid;
-#if 0
-    char** perm_list = new char*[m_context.staticPermittedDevCaps.size()];
-
+    /* TODO : 
+    std::string id = DPL::ToUTF8String(m_context.widgetConfig.tzAppid);
+    */
+    std::string id = DPL::ToUTF8String(m_context.widgetConfig.tzPkgid);
+    char* appId = NULL;
+    appId = (char*)calloc(1, id.length() + 1);
+    snprintf(appId, id.length() + 1, "%s", id.c_str());
+
+    WrtDB::ConfigParserData::PrivilegeList privileges =
+        m_context.widgetConfig.configInfo.privilegeList;
+
+    const char** perm_list = new const char*[privileges.size() + 1];
     int index = 0;
-    FOREACH(it, m_context.staticPermittedDevCaps) {
-        if (it->second) {
-            LogInfo("Permission : " << it->first);
-            perm_list[index++] =
-                const_cast<char*>(DPL::ToUTF8String(it->first).c_str());
-        }
+    FOREACH(it, privileges) {
+        LogInfo("Permission : " << it->name);
+        int length = DPL::ToUTF8String(it->name).length();
+        char *priv = (char*) calloc(1, (sizeof(char) * length) + 1);
+        snprintf(priv, length + 1, "%s",
+                DPL::ToUTF8String(it->name).c_str());
+        perm_list[index++] = priv;
     }
     perm_list[index] = NULL;
 
-    int result = app_add_permissions(
-            DPL::ToUTF8String(tzPkgid).c_str(),
-            const_cast<const char**>(perm_list));
-
-#else
-    const char* perm_list[0];
-    perm_list[0] = NULL;
-#endif
-    if (m_context.job->getInstallerStruct().m_installMode
-            != InstallMode::INSTALL_MODE_PRELOAD)
-    {
-        int result = app_add_permissions(
-                DPL::ToUTF8String(tzPkgid).c_str(), perm_list);
-        if (PC_OPERATION_SUCCESS != result) {
-            LogError("Failed to add permission to privilege");
-            ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
-                    "SMACK check failure");
-        }
+    if (PC_OPERATION_SUCCESS != app_enable_permissions(appId, APP_TYPE_WGT,
+                perm_list, "true")) {
+        LogError("failure in contructing smack rules based on perm_list");
     }
 
     m_context.job->UpdateProgress(
@@ -149,29 +200,32 @@ void TaskSmack::SmackPrivilegeStep()
 #endif
 }
 
-void TaskSmack::SmackTemporaryStep()
+void TaskSmack::StepAbortSmack()
 {
+    LogInfo("----------------> SMACK:\
+            Jobs::WidgetInstall::TaskSmack::StepAbortSmack()");
 #ifdef WRT_SMACK_ENABLED
-    //This step is temporary for smack
-
-    LogInfo("----------------> SMACK: \
-            Jobs::WidgetInstall::TaskSmack::SmackTemporaryStep()");
-    std::ostringstream commStr;
-    std::string tzPkgid = DPL::ToUTF8String(m_context.widgetConfig.tzPkgid);
-    commStr << SMACK_RULE_STR << " " << BashUtils::escape_arg(tzPkgid);
-    LogDebug("set smack rule command : " << commStr.str());
-
-    char readBuf[MAX_BUF_SIZE];
-    memset(readBuf, 0x00, MAX_BUF_SIZE);
-
-    FILE *fd;
-    fd = popen(commStr.str().c_str(), "r");
-    if (NULL == fd) {
-        LogError("Set smack rule failure. Failed to call script.");
-        ThrowMsg(Exceptions::NotAllowed, "Instalation failure. "
-                "SMACK check failure");
+    /* TODO :
+    std::string id = DPL::ToUTF8String(m_context.widgetConfig.tzAppid);
+    std::string id = DPL::ToUTF8String(m_context.widgetConfig.tzPkgid);
+    char* appId = NULL;
+    appId = (char*)calloc(1, id.length() + 1);
+    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)) {
+        LogError("failure in revoking smack permissions");
+    }
+
+    if (PC_OPERATION_SUCCESS != app_uninstall(pkgId)) {
+        LogError("failure in removing smack rules file");
     }
-    pclose(fd);
+    free(pkgId);
 #endif
 }
 
index 4b09f19..8448613 100644 (file)
@@ -38,8 +38,8 @@ class TaskSmack :
 
     void SmackFolderLabelingStep();
     void SmackPrivilegeStep();
-    void SmackTemporaryStep();
     void SetEndofInstallation();
+    void StepAbortSmack();
 
   public:
     TaskSmack(InstallerContext& context);
index be66932..4e7d467 100644 (file)
@@ -43,14 +43,18 @@ void TaskSmack::Step()
     LogInfo(
         "------------------------> SMACK: Jobs::WidgetUninstall::TaskSmack::Step()");
 #ifdef WRT_SMACK_ENABLED
-    int result = app_revoke_permissions(m_context.tzPkgid.c_str());
-    if (PC_OPERATION_SUCCESS != result) {
-        LogError("Revoke permissions failure : " << result);
+    const char* pkgId = m_context.tzPkgid.c_str();
+    if (PC_OPERATION_SUCCESS != app_revoke_permissions(pkgId)) {
+        LogError("failure in revoking smack permissions");
+    }
+
+    if (PC_OPERATION_SUCCESS != app_uninstall(pkgId)) {
+        LogError("failure in removing smack rules file");
     }
 
     m_context.job->UpdateProgress(
-        UninstallerContext::UNINSTALL_SMACK_ENABLE,
-        "Widget SMACK Enabled");
+        UninstallerContext::UNINSTALL_SMACK_DISABLE,
+        "Widget SMACK Disabled");
 #endif
 }
 } //namespace WidgetUninstall
index f3eb7c1..3d9fe28 100644 (file)
@@ -38,13 +38,13 @@ struct UninstallerContext
     enum UninstallStep
     {
         UNINSTALL_START,
-        UNINSTALL_SMACK_ENABLE,
         UNINSTALL_PRECHECK,
         UNINSTALL_REMOVE_WIDGETDIR,
         UNINSTALL_REMOVE_DESKTOP,
         UNINSTALL_REMOVE_FINISHED,
         UNINSTALL_DB_UPDATE,
         UNINSTALL_REMOVE_OSPSVC,
+        UNINSTALL_SMACK_DISABLE,
         UNINSTALL_END
     };