#include "common/step/backup/step_backup_icons.h"
#include "common/step/backup/step_backup_manifest.h"
+#include "common/step/backup/step_backup_plugin_info.h"
#include "common/step/backup/step_copy_backup.h"
#include "common/step/configuration/step_block_cross_update.h"
#include "common/step/configuration/step_check_install_location.h"
AddStep<ci::security::StepPrivacyPrivilege>(
ci::security::StepPrivacyPrivilege::ActionType::Update);
AddStep<ci::security::StepUpdateSecurity>();
+ AddStep<ci::backup::StepBackupPluginInfo>();
AddStep<ci::pkgmgr::StepUpdateApplication>();
AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
AddStep<ci::filesystem::StepUpdateStorageDirectories>();
ci::configuration::StepParseManifest::StoreLocation::NORMAL);
AddStep<ci::configuration::StepCheckInstallLocation>();
AddStep<ci::pkgmgr::StepKillApps>();
+ AddStep<ci::backup::StepBackupPluginInfo>();
AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Uninstall);
AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
AddStep<ci::filesystem::StepOptionalAcquireExternalStorage>();
AddStep<ci::security::StepPrivacyPrivilege>(
ci::security::StepPrivacyPrivilege::ActionType::Update);
AddStep<ci::security::StepUpdateSecurity>();
+ AddStep<ci::backup::StepBackupPluginInfo>();
AddStep<ci::pkgmgr::StepUpdateApplication>();
AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
AddStep<ci::filesystem::StepUpdateStorageDirectories>();
AddStep<ci::security::StepPrivacyPrivilege>(
ci::security::StepPrivacyPrivilege::ActionType::Update);
AddStep<ci::security::StepUpdateSecurity>();
+ AddStep<ci::backup::StepBackupPluginInfo>();
AddStep<ci::pkgmgr::StepUpdateApplication>();
AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
AddStep<ci::filesystem::StepUpdateStorageDirectories>();
AddStep<ci::security::StepPrivacyPrivilege>(
ci::security::StepPrivacyPrivilege::ActionType::Update);
AddStep<ci::security::StepUpdateSecurity>();
+ AddStep<ci::backup::StepBackupPluginInfo>();
AddStep<ci::pkgmgr::StepUpdateApplication>();
AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
AddStep<ci::mount::StepUnmount>();
AddStep<ci::pkgmgr::StepKillApps>();
AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
AddStep<ci::filesystem::StepCreateResControlDirectories>();
+ AddStep<ci::backup::StepBackupPluginInfo>();
AddStep<ci::pkgmgr::StepUpdateApplication>();
AddStep<ci::security::StepRegisterTrustAnchor>(
ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
AddStep<ci::security::StepCheckOldCertificate>();
AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
AddStep<ci::pkgmgr::StepKillApps>();
+ AddStep<ci::backup::StepBackupPluginInfo>();
AddStep<ci::pkgmgr::StepUpdateApplication>();
AddStep<ci::security::StepRegisterTrustAnchor>(
ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
AddStep<ci::filesystem::StepOptionalAcquireExternalStorage>();
AddStep<ci::filesystem::StepRemovePerUserStorageDirectories>();
AddStep<ci::pkgmgr::StepRemovePrivSharedres>();
+ AddStep<ci::backup::StepBackupPluginInfo>();
AddStep<ci::pkgmgr::StepUnregisterApplication>();
AddStep<ci::security::StepUnregisterTrustAnchor>();
AddStep<ci::security::StepPrivacyPrivilege>(
AddStep<ci::security::StepPrivacyPrivilege>(
ci::security::StepPrivacyPrivilege::ActionType::Update);
AddStep<ci::security::StepUpdateSecurity>();
+ AddStep<ci::backup::StepBackupPluginInfo>();
AddStep<ci::pkgmgr::StepUpdateApplication>();
AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
AddStep<ci::filesystem::StepUpdateStorageDirectories>();
AddStep<ci::filesystem::StepRemoveUserData>();
AddStep<ci::configuration::StepSwitchReadonlyMode>();
AddStep<ci::security::StepUpdateSecurity>();
+ AddStep<ci::backup::StepBackupPluginInfo>();
AddStep<ci::pkgmgr::StepUpdateApplication>();
AddStep<ci::pkgmgr::StepRemoveManifest>();
AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
#include "common/external_storage.h"
#include "common/pkgmgr_interface.h"
#include "common/recovery_file.h"
+#include "common/utils/pkgmgr_query.h"
#include "common/utils/property.h"
#include "common/utils/request.h"
* @brief Index of current request
*/
Property<int> index;
+
+ /**
+ * @brief Property of vector of plugin execution information
+ * (needed for rollback operations)
+ */
+ Property<std::vector<PkgQueryInterface::PluginInfo>> backup_plugin_info;
};
} // namespace common_installer
--- /dev/null
+// Copyright (c) 2024 Samsung Electronics Co., Ltd All Rights Reserved
+// Use of this source code is governed by a apache 2.0 license that can be
+// found in the LICENSE file.
+
+#include "common/step/backup/step_backup_plugin_info.h"
+
+namespace common_installer {
+namespace backup {
+
+Step::Status StepBackupPluginInfo::precheck() {
+ if (context_->pkgid.get().empty()) {
+ LOG(ERROR) << "pkgid attribute is empty";
+ return Step::Status::INVALID_VALUE;
+ }
+
+ return Step::Status::OK;
+}
+
+Step::Status StepBackupPluginInfo::process() {
+ PkgQueryInterface pkg_query(context_->pkgid.get(), context_->uid.get());
+ if (!pkg_query.PluginExecutionInfo(&context_->backup_plugin_info.get()))
+ return Step::Status::PACKAGE_NOT_FOUND;
+
+ return Step::Status::OK;
+}
+
+} // namespace backup
+} // namespace common_installer
--- /dev/null
+// Copyright (c) 2024 Samsung Electronics Co., Ltd All Rights Reserved
+// Use of this source code is governed by a apache 2.0 license that can be
+// found in the LICENSE file.
+
+#ifndef COMMON_STEP_BACKUP_STEP_BACKUP_PLUGIN_INFO_H_
+#define COMMON_STEP_BACKUP_STEP_BACKUP_PLUGIN_INFO_H_
+
+#include <manifest_parser/utils/logging.h>
+
+#include <vector>
+
+#include "common/installer_context.h"
+#include "common/step/step.h"
+#include "common/utils/pkgmgr_query.h"
+
+namespace common_installer {
+namespace backup {
+
+class StepBackupPluginInfo : public Step {
+ public:
+ using Step::Step;
+
+ Status process() override;
+ Status clean() override { return Status::OK; };
+ Status undo() override { return Status::OK; };
+ Status precheck() override;
+
+ private:
+ std::vector<PkgQueryInterface::PluginInfo> backup_plugin_info_;
+
+ STEP_NAME(BackupPluginInfo)
+};
+
+} // namespace backup
+} // namespace common_installer
+
+#endif // COMMON_STEP_BACKUP_STEP_BACKUP_PLUGIN_INFO_H_
}
}
- // retrieve and set plugin execution info if exists
- if (store_location_ == StoreLocation::BACKUP && (
- manifest_location_ == ManifestLocation::INSTALLED ||
- manifest_location_ == ManifestLocation::RECOVERY)) {
- std::vector<PkgQueryInterface::PluginInfo> plugin_list;
- pkg_query.PluginExecutionInfo(&plugin_list);
-
- for (const auto& plugin_info : plugin_list) {
- plugin_x* plugin =
- reinterpret_cast<plugin_x*>(calloc(1, sizeof(plugin_x)));
- if (!plugin) {
- LOG(ERROR) << "Out of memory";
- return false;
- }
-
- plugin->pkgid = strdup(manifest->package);
- plugin->appid = strdup(std::get<1>(plugin_info).c_str());
- plugin->plugin_type = strdup(std::get<2>(plugin_info).c_str());
- plugin->plugin_name = strdup(std::get<3>(plugin_info).c_str());
- manifest->plugin = g_list_append(manifest->plugin, plugin);
- }
- }
return true;
}
#include "common/pkgmgr_registration.h"
#include "common/plugins/plugin_manager.h"
+namespace {
+
+void FreePluginX(plugin_x* plugin) {
+ if (!plugin)
+ return;
+ if (plugin->pkgid)
+ free(plugin->pkgid);
+ if (plugin->appid)
+ free(plugin->appid);
+ if (plugin->plugin_type)
+ free(plugin->plugin_type);
+ if (plugin->plugin_name)
+ free(plugin->plugin_name);
+ free(plugin);
+}
+
+} //namespace
+
namespace common_installer {
namespace pkgmgr {
return Step::Status::OK;
}
+bool StepRunParserPlugin::ReplacePluginInfo() {
+ manifest_x* manifest = context_->manifest_data.get();
+ if (manifest == nullptr || manifest->package == nullptr) {
+ LOG(ERROR) << "Invalid manifest";
+ return false;
+ }
+
+ g_list_free_full(
+ manifest->plugin,
+ [](gpointer data) {
+ FreePluginX(reinterpret_cast<plugin_x*>(data));
+ }
+ );
+ manifest->plugin = nullptr;
+
+ for (const auto& plugin_info : context_->backup_plugin_info.get()) {
+ plugin_x* plugin =
+ reinterpret_cast<plugin_x*>(calloc(1, sizeof(plugin_x)));
+ if (!plugin) {
+ LOG(ERROR) << "Out of memory";
+ return false;
+ }
+
+ plugin->pkgid = strdup(manifest->package);
+ plugin->appid = strdup(std::get<1>(plugin_info).c_str());
+ plugin->plugin_type = strdup(std::get<2>(plugin_info).c_str());
+ plugin->plugin_name = strdup(std::get<3>(plugin_info).c_str());
+ if (!plugin->pkgid || !plugin->appid ||
+ !plugin->plugin_type || !plugin->plugin_name) {
+ FreePluginX(plugin);
+ return false;
+ }
+ manifest->plugin = g_list_append(manifest->plugin, plugin);
+ }
+
+ return true;
+}
+
Step::Status StepRunParserPlugin::undo() {
Step::Status ret = Status::OK;
switch (action_type_) {
LOG(ERROR) << "Failed to revert plugin execution info";
ret = Step::Status::REGISTER_ERROR;
}
-
- if (!RegisterPluginInfo(context_->old_manifest_data.get(),
+ if (!ReplacePluginInfo() ||
+ !RegisterPluginInfo(context_->manifest_data.get(),
context_->uid.get(),
context_->request_mode.get())) {
LOG(ERROR) << "Failed to revert plugin execution info";
}
break;
case Plugin::ActionType::Uninstall:
- if (!RegisterPluginInfo(context_->manifest_data.get(),
+ if (!ReplacePluginInfo() ||
+ !RegisterPluginInfo(context_->manifest_data.get(),
context_->uid.get(),
context_->request_mode.get())) {
LOG(ERROR) << "Failed to remove plugin execution info";
bool InitPluginManager(const std::filesystem::path& xml_path,
manifest_x* manifest, uid_t uid);
+ bool ReplacePluginInfo();
+
Plugin::ActionType action_type_;
std::unique_ptr<PluginManager> plugin_manager_;