* @author Lukasz Wrzosek(l.wrzosek@samsung.com)
* @author Soyoung kim(sy037.kim@samsung.com)
* @version 1.0
- * @brief Implementation file for installer task database updating for widget update
+ * @brief Implementation file for installer task database updating for widget
+ * update
*/
+#include <unistd.h>
#include <time.h>
#include <sys/stat.h>
#include <widget_install/task_database.h>
#include <widget_install/job_widget_install.h>
#include <widget_install/widget_install_errors.h>
#include <widget_install/widget_install_context.h>
+#include <web-provider-info.h>
#include <dpl/wrt-dao-rw/widget_dao.h>
+#include <dpl/wrt-dao-ro/vconf_config.h>
#include <dpl/foreach.h>
#include <dpl/utils/wrt_utility.h>
#include <dpl/log/log.h>
#include <dpl/assert.h>
+#include <wrt-commons/security-origin-dao/security_origin_dao.h>
#include <string>
#include <sstream>
#include <ace_api_install.h>
#include <ace_registration.h>
#include <errno.h>
#include <string.h>
+#include <vconf.h>
+#include <map>
using namespace WrtDB;
AddStep(&TaskDatabase::StepRegisterExternalFiles);
AddStep(&TaskDatabase::StepWrtDBInsert);
AddStep(&TaskDatabase::StepAceDBInsert);
+ AddStep(&TaskDatabase::StepSecurityOriginDBInsert);
AddStep(&TaskDatabase::StepRemoveExternalFiles);
+ AddStep(&TaskDatabase::StepCreateVconf);
+ AddStep(&TaskDatabase::StepLiveboxDBInsert);
AddAbortStep(&TaskDatabase::StepAbortDBInsert);
}
/* Set install Time */
time(&m_context.widgetConfig.installedTime);
- if (m_context.existingWidgetInfo.isExist) //update
- {
- m_handleToRemove = WidgetDAOReadOnly::getHandle(
- m_context.locations->getPkgname());
+ if (m_context.existingWidgetInfo.isExist) { //update
LogInfo("Registering widget... (update)");
+ Try
+ {
+ m_handleToRemove = WidgetDAOReadOnly::getHandle(
+ m_context.widgetConfig.tzAppid);
+ }
+ Catch(WidgetDAOReadOnly::Exception::WidgetNotExist)
+ {
+ LogError(
+ "Given tizenId not found for update installation (Same GUID?)");
+ ThrowMsg(Exceptions::InvalidPackage,
+ "Given tizenId not found for update installation");
+ }
WidgetDAO::registerOrUpdateWidget(
- m_context.locations->getPkgname(),
- m_context.widgetConfig,
- m_context.wacSecurity);
+ m_context.widgetConfig.tzAppid,
+ m_context.widgetConfig,
+ m_context.wacSecurity);
m_handle = WidgetDAOReadOnly::getHandle(
- m_context.locations->getPkgname());
- }
- else //new installation
- {
+ m_context.widgetConfig.tzAppid);
+ } else { //new installation
LogInfo("Registering widget...");
WidgetDAO::registerWidget(
- m_context.locations->getPkgname(),
- m_context.widgetConfig,
- m_context.wacSecurity);
+ m_context.widgetConfig.tzAppid,
+ m_context.widgetConfig,
+ m_context.wacSecurity);
m_handle = WidgetDAOReadOnly::getHandle(
- m_context.locations->getPkgname());
+ m_context.widgetConfig.tzAppid);
}
- FOREACH (cap, m_context.staticPermittedDevCaps) {
- LogInfo("staticPermittedDevCaps : " << cap->first
- << " smack status: " << cap->second);
+ FOREACH(cap, m_context.staticPermittedDevCaps) {
+ LogInfo(
+ "staticPermittedDevCaps : " << cap->first
+ << " smack status: " <<
+ cap->second);
}
LogInfo("Widget registered");
if (ACE_OK != ace_unregister_widget(
static_cast<ace_widget_handle_t>(m_handleToRemove)))
{
- LogWarning("Error while removing ace entry for previous insallation");
- };
+ LogWarning(
+ "Error while removing ace entry for previous insallation");
+ }
}
- if(!AceApi::registerAceWidget(m_handle, m_context.widgetConfig,
- m_context.wacSecurity.getCertificateList()))
+ if (!AceApi::registerAceWidget(m_handle, m_context.widgetConfig,
+ m_context.wacSecurity.getCertificateList()))
{
LogError("ace database insert failed");
- ThrowMsg(Exceptions::NotAllowed, "Update failure. ace_register_widget failed");
+ ThrowMsg(Exceptions::UpdateFailed,
+ "Update failure. ace_register_widget failed");
}
LogDebug("Ace data inserted");
+}
+
+void TaskDatabase::StepSecurityOriginDBInsert()
+{
+ LogDebug("Create Security origin database");
+ // automatically create security origin database
+ using namespace SecurityOriginDB;
+ SecurityOriginDAO dao(m_context.locations->getPkgId());
+
+ // Checking privilege list for setting security origin exception data
+ FOREACH(it, m_context.widgetConfig.configInfo.privilegeList) {
+ std::map<std::string, Feature>::const_iterator result =
+ g_W3CPrivilegeTextMap.find(DPL::ToUTF8String(it->name));
+ if (result != g_W3CPrivilegeTextMap.end()) {
+ dao.setPrivilegeSecurityOriginData(result->second);
+ }
+ }
m_context.job->UpdateProgress(
InstallerContext::INSTALL_NEW_DB_INSERT,
void TaskDatabase::StepRegisterExternalFiles()
{
- WrtDB::ExternalLocationList externalLocationsUpdate = m_context.locations->listExternalLocations();
- if (m_context.existingWidgetInfo.isExist) //update
- {
- WidgetDAO dao(m_context.locations->getPkgname());
- WrtDB::ExternalLocationList externalLocationsDB = dao.getWidgetExternalLocations();
- FOREACH(file, externalLocationsDB)
+ WrtDB::ExternalLocationList externalLocationsUpdate =
+ m_context.locations->listExternalLocations();
+ if (m_context.existingWidgetInfo.isExist) { //update
+ Try
{
- if(std::find(externalLocationsUpdate.begin(), externalLocationsUpdate.end(), *file) == externalLocationsUpdate.end())
+ WidgetDAO dao(m_context.widgetConfig.tzAppid);
+ WrtDB::ExternalLocationList externalLocationsDB =
+ dao.getWidgetExternalLocations();
+ FOREACH(file, externalLocationsDB)
{
- m_externalLocationsToRemove.push_back(*file);
+ if (std::find(externalLocationsUpdate.begin(),
+ externalLocationsUpdate.end(),
+ *file) == externalLocationsUpdate.end())
+ {
+ m_externalLocationsToRemove.push_back(*file);
+ }
}
}
+ Catch(WidgetDAOReadOnly::Exception::WidgetNotExist)
+ {
+ LogError(
+ "Given tizenId not found for update installation (Same GUID?)");
+ ThrowMsg(Exceptions::UpdateFailed,
+ "Given tizenId not found for update installation");
+ }
}
LogDebug("Registering external files:");
FOREACH(file, externalLocationsUpdate)
void TaskDatabase::StepRemoveExternalFiles()
{
- if(!m_externalLocationsToRemove.empty())
- {
+ if (!m_externalLocationsToRemove.empty()) {
LogDebug("Removing external files:");
}
FOREACH(file, m_externalLocationsToRemove)
{
- if(WrtUtilFileExists(*file))
- {
+ if (WrtUtilFileExists(*file)) {
LogDebug(" -> " << *file);
- remove(file->c_str());
- }
- else if(WrtUtilDirExists(*file))
- {
+ if (-1 == TEMP_FAILURE_RETRY(remove(file->c_str()))) {
+ ThrowMsg(Exceptions::RemovingFileFailure,
+ "Failed to remove external file");
+ }
+ } else if (WrtUtilDirExists(*file)) {
LogDebug(" -> " << *file);
- if(!WrtUtilRemove(*file)){
+ if (!WrtUtilRemove(*file)) {
ThrowMsg(Exceptions::RemovingFolderFailure,
- "Failed to remove external directory");
+ "Failed to remove external directory");
}
- }
- else
- {
+ } else {
LogWarning(" -> " << *file << "(no such a path)");
}
}
}
+void TaskDatabase::StepCreateVconf()
+{
+ LogDebug("StepCreateVconf");
+ std::map<std::string, WrtDB::SettingsType> vconfData;
+ vconfData[
+ WrtDB::VconfConfig::GetVconfKeyPopupUsage(
+ m_context.widgetConfig.tzAppid)] = WrtDB::SETTINGS_TYPE_ON;
+ vconfData[
+ WrtDB::VconfConfig::GetVconfKeyGeolocationUsage(
+ m_context.widgetConfig.tzAppid)] = WrtDB::SETTINGS_TYPE_ON;
+ vconfData[
+ WrtDB::VconfConfig::GetVconfKeyWebNotificationUsage(
+ m_context.widgetConfig.tzAppid)] = WrtDB::SETTINGS_TYPE_ON;
+ vconfData[
+ WrtDB::VconfConfig::GetVconfKeyWebDatabaseUsage(
+ m_context.widgetConfig.tzAppid)] = WrtDB::SETTINGS_TYPE_ON;
+ vconfData[
+ WrtDB::VconfConfig::GetVconfKeyFilesystemUsage(
+ m_context.widgetConfig.tzAppid)] = WrtDB::SETTINGS_TYPE_ON;
+ vconfData[
+ WrtDB::VconfConfig::GetVconfKeyMemorySavingMode(
+ m_context.widgetConfig.tzAppid)] = WrtDB::SETTINGS_TYPE_OFF;
+
+ // vconftool -g 5000 set -t int <path> initialize value
+ // Current installer should use vconftool for setting group ID
+ // In case of install application by pkgcmd, permission for others
+ // set to read-only
+ FOREACH(it, vconfData) {
+ std::ostringstream command;
+ command << "vconftool -g 5000 set -t int ";
+ command << (*it).first;
+ command << " \"" << static_cast<int>((*it).second) << "\"";
+ int ret = system(command.str().c_str());
+ if (-1 == ret) {
+ ThrowMsg(Exceptions::CreateVconfFailure,
+ "Failed to create vconf files");
+ }
+ }
+}
+
void TaskDatabase::StepAbortDBInsert()
{
LogWarning("[DB Update Task] Aborting... (DB Clean)");
Try
{
- WidgetDAO::unregisterWidget(m_context.locations->getPkgname());
+ WidgetDAO::unregisterWidget(m_context.widgetConfig.tzAppid);
LogDebug("Cleaning DB successful!");
}
Catch(DPL::DB::SqlConnection::Exception::Base)
ace_unregister_widget(static_cast<ace_widget_handle_t>(m_handle));
// Remove also old one. If it was already updated nothing wrong will happen,
// but if not old widget will be removed.
- if (INVALID_WIDGET_HANDLE != m_handleToRemove)
+ if (INVALID_WIDGET_HANDLE != m_handleToRemove) {
ace_unregister_widget(static_cast<ace_widget_handle_t>(m_handle));
+ }
}
+void TaskDatabase::StepLiveboxDBInsert()
+{
+ if (m_context.widgetConfig.configInfo.m_livebox.size() <= 0) {
+ return;
+ }
+
+ std::string tizenId = DPL::ToUTF8String(m_context.widgetConfig.tzAppid);
+
+ for (auto it = m_context.widgetConfig.configInfo.m_livebox.begin();
+ it != m_context.widgetConfig.configInfo.m_livebox.end(); ++it)
+ {
+ std::string boxId = DPL::ToUTF8String((**it).m_liveboxId);
+ std::string boxType;
+ if ((**it).m_type == L"") {
+ boxType = web_provider_info_get_default_type();
+ } else {
+ boxType = DPL::ToUTF8String((**it).m_type);
+ }
+ LogInfo("livebox id: " << boxId);
+ LogInfo("livebox type: " << boxType);
+
+ int ret =
+ web_provider_info_insert_box_type(
+ boxId.c_str(), tizenId.c_str(), boxType.c_str());
+
+ if (ret < 0) {
+ LogDebug("failed to set type of livebox: " << boxId);
+ }
+ }
+}
} //namespace WidgetInstall
} //namespace Jobs