Implement undo of RemovePerUserStorageDirectories 57/277157/1
authorIlho Kim <ilho159.kim@samsung.com>
Thu, 30 Jun 2022 06:16:28 +0000 (15:16 +0900)
committerIlho Kim <ilho159.kim@samsung.com>
Fri, 1 Jul 2022 06:19:12 +0000 (15:19 +0900)
If the uninstallation is failed after this step,
there is a problem that the user directory remains erased
so recreate the user directories removed by this step

Change-Id: Ic346217ab1cb971645bff44653027e545a430923
Signed-off-by: Ilho Kim <ilho159.kim@samsung.com>
src/common/step/filesystem/step_remove_per_user_storage_directories.cc
src/common/step/filesystem/step_remove_per_user_storage_directories.h

index ec400820de7d199a5b0c2f45739ecdb238ffe52e..1ac506742a489f1f761e123368a5d279c04d38d2 100644 (file)
@@ -4,11 +4,16 @@
 
 #include "common/step/filesystem/step_remove_per_user_storage_directories.h"
 
+#include <memory>
 #include <string>
 #include <vector>
 
+#include "common/step/step.h"
+#include "common/step/filesystem/step_create_globalapp_symlinks.h"
+#include "common/step/filesystem/step_create_per_user_storage_directories.h"
 #include "common/installer_context.h"
 #include "common/shared_dirs.h"
+#include "common/pkgmgr_query.h"
 
 namespace common_installer {
 namespace filesystem {
@@ -33,6 +38,37 @@ Step::Status StepRemovePerUserStorageDirectories::process() {
   return Step::Status::OK;
 }
 
+Step::Status StepRemovePerUserStorageDirectories::undo() {
+  std::string author_id =
+      QueryCertificateAuthorCertificate(
+          context_->pkgid.get(), context_->uid.get());
+  context_->certificate_info.get().author_id.set(author_id);
+  RequestType request_type_bck = context_->request_type.get();
+  context_->request_type.set(RequestType::Install);
+  std::vector<std::unique_ptr<Step>> steps;
+  steps.emplace_back(new StepCreatePerUserStorageDirectories(context_));
+  steps.emplace_back(new StepCreateGlobalAppSymlinks(context_));
+
+  for (auto& it : steps) {
+    Step::Status result;
+    result = it->precheck();
+    if (result != Step::Status::OK) {
+      LOG(ERROR) << it->name() << " precheck fail";
+      context_->request_type.set(request_type_bck);
+      return result;
+    }
+
+    result = it->process();
+    if (result != Step::Status::OK) {
+      LOG(ERROR) << it->name() << " process fail";
+      context_->request_type.set(request_type_bck);
+      return result;
+    }
+  }
+  context_->request_type.set(request_type_bck);
+  return Step::Status::OK;
+}
+
 }  // namespace filesystem
 }  // namespace common_installer
 
index 5dcae943959b36332e8f4fbe32fea9d0e08883e6..2669d4afeacec2015bd149d773671632cbedb2e3 100644 (file)
@@ -30,7 +30,7 @@ class StepRemovePerUserStorageDirectories : public common_installer::Step {
 
   Status process() override;
   Status clean() override { return Status::OK; }
-  Status undo() override { return Status::OK; }
+  Status undo() override;
   Status precheck() override { return Status::OK; }
 
   STEP_NAME(RemovePerUserStorageDirectories)