From e55441cad576dfcb1c0ae4749f2e9d9cf92975b7 Mon Sep 17 00:00:00 2001 From: Tomasz Iwanek Date: Wed, 31 Oct 2012 11:25:11 +0100 Subject: [PATCH] External file removal fix [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 | 63 ++++++++++---------------- src/jobs/widget_install/job_widget_install.h | 3 -- src/jobs/widget_install/task_database.cpp | 51 +++++++++++++-------- src/jobs/widget_install/task_database.h | 4 ++ 4 files changed, 59 insertions(+), 62 deletions(-) diff --git a/src/jobs/widget_install/job_widget_install.cpp b/src/jobs/widget_install/job_widget_install.cpp index 5fd9f80..d0c2aba 100644 --- a/src/jobs/widget_install/job_widget_install.cpp +++ b/src/jobs/widget_install/job_widget_install.cpp @@ -21,6 +21,12 @@ * @brief Implementation file for main installer task */ #include +#include +#include +#include +#include +#include +#include #include #include @@ -30,9 +36,20 @@ #include #include #include -#include #include #include +#include +#include +#include +#include // TODO remove +#include + +#include +#include +#include +#include +#include //temporary code + #include "root_parser.h" #include "widget_parser.h" #include "parser_runner.h" @@ -58,21 +75,6 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include // TODO remove -#include -#include -#include -#include -#include -#include //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"); diff --git a/src/jobs/widget_install/job_widget_install.h b/src/jobs/widget_install/job_widget_install.h index fa39392..29ea4b2 100644 --- a/src/jobs/widget_install/job_widget_install.h +++ b/src/jobs/widget_install/job_widget_install.h @@ -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(); diff --git a/src/jobs/widget_install/task_database.cpp b/src/jobs/widget_install/task_database.cpp index 4f800bb..450de41 100644 --- a/src/jobs/widget_install/task_database.cpp +++ b/src/jobs/widget_install/task_database.cpp @@ -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)"); diff --git a/src/jobs/widget_install/task_database.h b/src/jobs/widget_install/task_database.h index 4e23a55..2d411b4 100644 --- a/src/jobs/widget_install/task_database.h +++ b/src/jobs/widget_install/task_database.h @@ -26,6 +26,8 @@ #include #include +#include + 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(); -- 2.7.4