External file removal fix
authorTomasz Iwanek <t.iwanek@samsung.com>
Wed, 31 Oct 2012 10:25:11 +0000 (11:25 +0100)
committerGerrit Code Review <gerrit2@kim11>
Mon, 19 Nov 2012 14:39:54 +0000 (23:39 +0900)
[Issue#]       N/A
[Bug]          Broken wigdet update in database cause some widget's files may be removed
[Cause]        External files were removed before registeration of new version of widget.
This causes lost of file if file was in previous version (have been removed before registerWidget) but not in current/used by update version of widget.
[Solution]     Fix of database step
[Verification] Check if installer install and uninstall widgets with livebox confiugration. Configuration file should:
-> be present in database after installation.
-> should be removed in uninstallation (and mentioned in logs)
Additonally:
1. Install widget
2. Manipulate database to add non-existing locations.
3. During updating(or -if installation) or uninstalling this files should be listed as external files to be removed but not existing(warning in logs)

Change-Id: I2f365236c0cd1b7ac96fa8fedcc60d542402ac87

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

index 5fd9f80..d0c2aba 100644 (file)
  * @brief   Implementation file for main installer task
  */
 #include <memory>
+#include <string>
+#include <sys/time.h>
+#include <ctime>
+#include <cstdlib>
+#include <limits.h>
+#include <regex.h>
 
 #include <dpl/noncopyable.h>
 #include <dpl/abstract_waitable_input_adapter.h>
 #include <dpl/copy.h>
 #include <dpl/assert.h>
 #include <dpl/sstream.h>
-#include <dpl/wrt-dao-ro/common_dao_types.h>
 #include <dpl/file_input.h>
 #include <dpl/utils/wrt_utility.h>
+#include <dpl/wrt-dao-ro/common_dao_types.h>
+#include <dpl/wrt-dao-ro/widget_dao_read_only.h>
+#include <dpl/wrt-dao-ro/global_config.h>
+#include <dpl/wrt-dao-rw/global_dao.h> // TODO remove
+#include <dpl/localization/w3c_file_localization.h>
+
+#include <libiriwrapper.h>
+#include <pkg-manager/pkgmgr_signal.h>
+#include <app_manager.h>
+#include <drm_client.h>
+#include <drm-oem-intel.h> //temporary code
+
 #include "root_parser.h"
 #include "widget_parser.h"
 #include "parser_runner.h"
 
 #include <widget_install/widget_install_errors.h>
 #include <widget_install/widget_install_context.h>
-#include <string>
-#include <sys/time.h>
-#include <ctime>
-#include <cstdlib>
-#include <limits.h>
-#include <regex.h>
-#include <dpl/wrt-dao-ro/widget_dao_read_only.h>
-#include <dpl/wrt-dao-ro/global_config.h>
-#include <dpl/wrt-dao-rw/global_dao.h> // TODO remove
-#include <dpl/localization/w3c_file_localization.h>
-#include <libiriwrapper.h>
-#include <pkg-manager/pkgmgr_signal.h>
-#include <app_manager.h>
-#include <drm_client.h>
-#include <drm-oem-intel.h> //temporary code
 
 using namespace WrtDB;
 
@@ -83,7 +85,6 @@ const char * const WITH_OSP_XML = "res/wgt/config.xml";
 
 //allowed: a-z, A-Z, 0-9
 const char* REG_TIZENID_PATTERN = "^[a-zA-Z0-9]{10}$";
-const int MAX_TIZENID_LENGTH = 10;
 
 static const DPL::String SETTING_VALUE_ENCRYPTION = L"encryption";
 static const DPL::String SETTING_VALUE_ENCRYPTION_ENABLE = L"enable";
@@ -275,18 +276,6 @@ JobWidgetInstall::ConfigureResult JobWidgetInstall::PrePareInstallation(
     return result;
 }
 
-std::string JobWidgetInstall::generateTizenId() {
-    std::string allowed("0123456789"
-        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-        "abcdefghijklmnopqrstuvwxyz");
-    std::string tizenId;
-    tizenId.resize(MAX_TIZENID_LENGTH);
-    for (int i = 0; i < MAX_TIZENID_LENGTH; ++i) {
-        tizenId[i] = allowed[rand() % allowed.length()];
-    }
-    return tizenId;
-}
-
 bool JobWidgetInstall::setTizenId(
         const WrtDB::ConfigParserData &configInfo, ConfigureResult result)
 {
@@ -309,7 +298,7 @@ bool JobWidgetInstall::setTizenId(
         m_installerContext.widgetConfig.pkgname = configInfo.tizenId;
 
     } else {
-        std::string tizenId = generateTizenId();
+        WidgetPkgName tizenId = WidgetDAOReadOnly::generateTizenId();
 
         // only for installation, not for update
         if (result == ConfigureResult::Ok) {
@@ -324,7 +313,7 @@ bool JobWidgetInstall::setTizenId(
             while (true) {
                 if (stat(newPath.str().c_str(), &dirStat) == 0) {
                     //path exist, chose another one
-                    tizenId = generateTizenId();
+                    tizenId = WidgetDAOReadOnly::generateTizenId();
                     newPath.str("");
                     newPath << path << tizenId;
                     continue;
@@ -332,8 +321,7 @@ bool JobWidgetInstall::setTizenId(
                 break;
             }
 
-            m_installerContext.widgetConfig.pkgname =
-                DPL::FromUTF8String(tizenId);
+            m_installerContext.widgetConfig.pkgname = tizenId;
         }
         LogInfo("tizen_id name was generated by WRT: " << tizenId);
     }
@@ -344,11 +332,6 @@ bool JobWidgetInstall::setTizenId(
     return true;
 }
 
-DPL::OptionalString JobWidgetInstall::getNewTizenId() const
-{
-    return m_installerContext.widgetConfig.pkgname;
-}
-
 void JobWidgetInstall::configureWidgetLocation(const std::string & widgetPath,
                                                const std::string& tempPath)
 {
@@ -658,7 +641,7 @@ void JobWidgetInstall::SendFinishedSuccess()
     //inform widget info
     JobWidgetInstall::displayWidgetInfo();
 
-    DPL::OptionalString tizenId = getNewTizenId();
+    DPL::OptionalString & tizenId = m_installerContext.widgetConfig.pkgname;
 
     // send signal of pkgmgr
     PkgmgrSignalSingleton::Instance().sendSignal(
@@ -678,7 +661,7 @@ void JobWidgetInstall::SendFinishedFailure()
 
     LogError("Error in installation step: " << m_exceptionCaught);
     LogError("Message: " << m_exceptionMessage);
-    DPL::OptionalString tizenId = getNewTizenId();
+    DPL::OptionalString & tizenId = m_installerContext.widgetConfig.pkgname;
 
     LogDebug("Call widget install failure finishedCallback");
 
index fa39392..29ea4b2 100644 (file)
@@ -81,7 +81,6 @@ class JobWidgetInstall :
             const std::string &widgetSource,
             const std::string &tempPath);
     bool detectResourceEncryption(const WrtDB::ConfigParserData &configData);
-    std::string generateTizenId();
     bool isDRMWidget(std::string widgetPath);
     bool DecryptDRMWidget(std::string widgetPath, std::string destPath);
     ConfigureResult PrePareInstallation(const std::string &widgetPath);
@@ -93,8 +92,6 @@ class JobWidgetInstall :
     JobWidgetInstall(std::string const & widgetPath,
             const WidgetInstallationStruct &installerStruct);
 
-    DPL::OptionalString getNewTizenId() const;
-
     //overrides
     void SendProgress();
     void SendFinishedSuccess();
index 4f800bb..450de41 100644 (file)
@@ -49,6 +49,7 @@ TaskDatabase::TaskDatabase(InstallerContext& context) :
     AddStep(&TaskDatabase::StepRegisterExternalFiles);
     AddStep(&TaskDatabase::StepWrtDBInsert);
     AddStep(&TaskDatabase::StepAceDBInsert);
+    AddStep(&TaskDatabase::StepRemoveExternalFiles);
 
     AddAbortStep(&TaskDatabase::StepAbortDBInsert);
 }
@@ -134,28 +135,11 @@ void TaskDatabase::StepRegisterExternalFiles()
     {
         WidgetDAO dao(m_context.locations->getPkgname());
         WrtDB::ExternalLocationList externalLocationsDB = dao.getWidgetExternalLocations();
-        LogDebug("Removing external files:");
         FOREACH(file, externalLocationsDB)
         {
             if(std::find(externalLocationsUpdate.begin(), externalLocationsUpdate.end(), *file) == externalLocationsUpdate.end())
             {
-                if(WrtUtilFileExists(*file))
-                {
-                    LogDebug("  -> " << *file);
-                    remove(file->c_str());
-                }
-                else if(WrtUtilDirExists(*file))
-                {
-                    LogDebug("  -> " << *file);
-                    if(!WrtUtilRemove(*file)){
-                        ThrowMsg(Exceptions::RemovingFolderFailure,
-                                "Failed to remove external directory");
-                    }
-                }
-                else
-                {
-                    LogWarning("  -> " << *file << "(no such a path)");
-                }
+                m_externalLocationsToRemove.push_back(*file);
             }
         }
     }
@@ -165,10 +149,39 @@ void TaskDatabase::StepRegisterExternalFiles()
         LogDebug("  -> " << *file);
     }
 
-    //set external lcoations to be registered
+    //set external locations to be registered
     m_context.widgetConfig.externalLocations = externalLocationsUpdate;
 }
 
+void TaskDatabase::StepRemoveExternalFiles()
+{
+    if(!m_externalLocationsToRemove.empty())
+    {
+        LogDebug("Removing external files:");
+    }
+
+    FOREACH(file, m_externalLocationsToRemove)
+    {
+        if(WrtUtilFileExists(*file))
+        {
+            LogDebug("  -> " << *file);
+            remove(file->c_str());
+        }
+        else if(WrtUtilDirExists(*file))
+        {
+            LogDebug("  -> " << *file);
+            if(!WrtUtilRemove(*file)){
+                ThrowMsg(Exceptions::RemovingFolderFailure,
+                        "Failed to remove external directory");
+            }
+        }
+        else
+        {
+            LogWarning("  -> " << *file << "(no such a path)");
+        }
+    }
+}
+
 void TaskDatabase::StepAbortDBInsert()
 {
     LogWarning("[DB Update Task] Aborting... (DB Clean)");
index 4e23a55..2d411b4 100644 (file)
@@ -26,6 +26,8 @@
 #include <dpl/task.h>
 #include <dpl/wrt-dao-ro/common_dao_types.h>
 
+#include <dpl/wrt-dao-ro/widget_dao_read_only.h>
+
 class InstallerContext;
 
 namespace Jobs {
@@ -35,6 +37,7 @@ class TaskDatabase:
 {
   private:
     InstallerContext& m_context;
+    WrtDB::ExternalLocationList m_externalLocationsToRemove;
 
     //TODO: temporary needed until security-server start to use pkgName instead
     //of widget handle
@@ -44,6 +47,7 @@ class TaskDatabase:
     void StepRegisterExternalFiles();
     void StepWrtDBInsert();
     void StepAceDBInsert();
+    void StepRemoveExternalFiles();
 
     void StepAbortDBInsert();