Remove unused logic
[platform/core/appfw/app-installers.git] / src / common / installer / app_installer.cc
1 /* 2014, Copyright © Intel Coporation, license APACHE-2.0, see LICENSE file */
2 // Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
3 // Use of this source code is governed by a apache 2.0 license that can be
4 // found in the LICENSE file.
5
6 #include <unistd.h>
7
8 #include <cstdio>
9 #include <fstream>
10 #include <TTraceWrapper.h>
11
12 #include "common/installer/app_installer.h"
13 #include "common/installer_context.h"
14 #include "common/pkgmgr_interface.h"
15 #include "common/pkgmgr_signal.h"
16 #include "common/step/configuration/step_fail.h"
17 #include "common/utils/file_logbackend.h"
18
19 #include "common/step/backup/step_backup_icons.h"
20 #include "common/step/backup/step_backup_manifest.h"
21 #include "common/step/backup/step_copy_backup.h"
22 #include "common/step/configuration/step_block_cross_update.h"
23 #include "common/step/configuration/step_check_install_location.h"
24 #include "common/step/configuration/step_check_tizen_version.h"
25 #include "common/step/configuration/step_configure.h"
26 #include "common/step/configuration/step_parse_manifest.h"
27 #include "common/step/configuration/step_parse_preload.h"
28 #include "common/step/configuration/step_switch_readonly_mode.h"
29 #include "common/step/filesystem/step_acquire_external_storage.h"
30 #include "common/step/filesystem/step_change_ownership_and_permission.h"
31 #include "common/step/filesystem/step_copy.h"
32 #include "common/step/filesystem/step_copy_storage_directories.h"
33 #include "common/step/filesystem/step_copy_tep.h"
34 #include "common/step/filesystem/step_create_globalapp_symlinks.h"
35 #include "common/step/filesystem/step_create_icons.h"
36 #include "common/step/filesystem/step_create_storage_directories.h"
37 #include "common/step/filesystem/step_delta_patch.h"
38 #include "common/step/filesystem/step_disable_external_mount.h"
39 #include "common/step/filesystem/step_enable_external_mount.h"
40 #include "common/step/filesystem/step_migrate_legacy_external_image.h"
41 #include "common/step/filesystem/step_move_installed_storage.h"
42 #include "common/step/filesystem/step_optional_acquire_external_storage.h"
43 #include "common/step/filesystem/step_recover_change_owner.h"
44 #include "common/step/filesystem/step_recover_external_storage.h"
45 #include "common/step/filesystem/step_recover_files.h"
46 #include "common/step/filesystem/step_recover_globalapp_symlinks.h"
47 #include "common/step/filesystem/step_recover_icons.h"
48 #include "common/step/filesystem/step_recover_manifest.h"
49 #include "common/step/filesystem/step_recover_storage_directories.h"
50 #include "common/step/filesystem/step_remove_files.h"
51 #include "common/step/filesystem/step_remove_icons.h"
52 #include "common/step/filesystem/step_remove_globalapp_symlinks.h"
53 #include "common/step/filesystem/step_remove_per_user_storage_directories.h"
54 #include "common/step/filesystem/step_remove_temporary_directory.h"
55 #include "common/step/filesystem/step_remove_tep.h"
56 #include "common/step/filesystem/step_remove_user_data.h"
57 #include "common/step/filesystem/step_remove_zip_image.h"
58 #include "common/step/filesystem/step_unzip.h"
59 #include "common/step/filesystem/step_update_storage_directories.h"
60 #include "common/step/filesystem/step_update_tep.h"
61 #include "common/step/mount/step_check_mount_path.h"
62 #include "common/step/mount/step_mount_install.h"
63 #include "common/step/mount/step_mount_recover.h"
64 #include "common/step/mount/step_mount_unpacked.h"
65 #include "common/step/mount/step_mount_update.h"
66 #include "common/step/mount/step_unmount.h"
67 #include "common/step/pkgmgr/step_check_force_clean.h"
68 #include "common/step/pkgmgr/step_check_installable.h"
69 #include "common/step/pkgmgr/step_check_removable.h"
70 #include "common/step/pkgmgr/step_check_restriction.h"
71 #include "common/step/pkgmgr/step_check_upgradable.h"
72 #include "common/step/pkgmgr/step_kill_apps.h"
73 #include "common/step/pkgmgr/step_recover_application.h"
74 #include "common/step/pkgmgr/step_recover_parser_plugins.h"
75 #include "common/step/pkgmgr/step_register_app.h"
76 #include "common/step/pkgmgr/step_remove_manifest.h"
77 #include "common/step/pkgmgr/step_run_parser_plugins.h"
78 #include "common/step/pkgmgr/step_unregister_app.h"
79 #include "common/step/pkgmgr/step_update_app.h"
80 #include "common/step/pkgmgr/step_update_pkg_disable_info.h"
81 #include "common/step/rds/step_rds_modify.h"
82 #include "common/step/rds/step_rds_parse.h"
83 #include "common/step/recovery/step_create_recovery_file.h"
84 #include "common/step/recovery/step_open_recovery_file.h"
85 #include "common/step/security/step_check_old_certificate.h"
86 #include "common/step/security/step_get_privilege_level.h"
87 #include "common/step/security/step_privacy_privilege.h"
88 #include "common/step/security/step_recover_security.h"
89 #include "common/step/security/step_recover_trust_anchor.h"
90 #include "common/step/security/step_register_security.h"
91 #include "common/step/security/step_register_trust_anchor.h"
92 #include "common/step/security/step_revoke_security.h"
93 #include "common/step/security/step_revoke_trust_anchor.h"
94 #include "common/step/security/step_rollback_installation_security.h"
95 #include "common/step/security/step_signature.h"
96 #include "common/step/security/step_unregister_trust_anchor.h"
97 #include "common/step/security/step_update_security.h"
98
99 namespace ci = common_installer;
100
101 namespace {
102
103 const unsigned kProgressRange = 100;
104 const char kLogFileName[] = LOGDIR"/app-installers.log";
105 const char kHistoryFileName[] = LOGDIR"/installation-history.log";
106 const int kLogRotationSize = 1024 * 256;  // 256KB
107 const int kLogMaximumRotation = 3;
108
109 }
110
111 namespace common_installer {
112
113 AppInstaller::AppInstaller(const char* package_type, PkgMgrPtr pkgmgr)
114     : pkgmgr_(pkgmgr), context_(new InstallerContext()),
115       status_(Step::Status::OK), result_(Result::OK), index_(0) {
116   context_->pkg_type.set(package_type);
117   context_->installation_mode.set(pkgmgr->GetInstallationMode());
118
119   // pkgmgr signal should work only for online mode
120   // there is no one to receive it in offline mode
121   if (context_->installation_mode.get() == InstallationMode::ONLINE) {
122     pi_ = pkgmgr->CreatePkgmgrSignal();
123   }
124 }
125
126 AppInstaller::~AppInstaller() {
127 }
128
129 void AppInstaller::Init() {
130   // for multi installer
131   context_->index.set(index_);
132   pkgmgr_->SetAppQueryInterface(index_);
133
134   switch (pkgmgr_->GetRequestType(index_)) {
135     case RequestType::Install:
136       InstallSteps();
137       break;
138     case RequestType::Update:
139       UpdateSteps();
140       break;
141     case RequestType::Uninstall:
142       UninstallSteps();
143       break;
144     case RequestType::Reinstall:
145       ReinstallSteps();
146       break;
147     case RequestType::Delta:
148       DeltaSteps();
149       break;
150     case RequestType::Move:
151       MoveSteps();
152       break;
153     case RequestType::Recovery:
154       RecoverySteps();
155       break;
156     case RequestType::MountInstall:
157       MountInstallSteps();
158       break;
159     case RequestType::MountUpdate:
160       MountUpdateSteps();
161       break;
162     case RequestType::ManifestDirectInstall:
163       ManifestDirectInstallSteps();
164       break;
165     case RequestType::ManifestDirectUpdate:
166       ManifestDirectUpdateSteps();
167       break;
168     case RequestType::ManifestPartialInstall:
169       ManifestPartialInstallSteps();
170       break;
171     case RequestType::ManifestPartialUpdate:
172       ManifestPartialUpdateSteps();
173       break;
174     case RequestType::PartialUninstall:
175       PartialUninstallSteps();
176       break;
177     case RequestType::ReadonlyUpdateInstall:
178       ReadonlyUpdateInstallSteps();
179       break;
180     case RequestType::ReadonlyUpdateUninstall:
181       ReadonlyUpdateUninstallSteps();
182       break;
183     case RequestType::EnablePkg:
184       EnablePkgSteps();
185       break;
186     case RequestType::DisablePkg:
187       DisablePkgSteps();
188       break;
189     case RequestType::MigrateExtImg:
190       MigrateExtImgSteps();
191       break;
192     case RequestType::RecoverDB:
193       RecoverDBSteps();
194       break;
195     default:
196       UnknownSteps();
197       break;
198   }
199 }
200
201 AppInstaller::Result AppInstaller::Run() {
202   Process();
203   if (it_ != steps_.end() && result_ == Result::ERROR) {
204     LOG(ERROR) << "Failure occurs in step: " << (*it_)->name();
205     Undo();
206   } else {
207     Clean();
208   }
209   sync();
210
211   if ((context_->installation_mode.get() == InstallationMode::OFFLINE) &&
212       (result_ == Result::ERROR)) {
213     std::fstream info_file("/tmp/.preload_install_error",
214         std::ios::out | std::ios::app);
215     info_file << context_->pkgid.get() << std::endl;
216     info_file.close();
217   }
218
219   return result_;
220 }
221
222 void AppInstaller::LogHistoryStart() {
223   std::shared_ptr<utils::FileLogBackend> history_logger =
224       std::shared_ptr<utils::FileLogBackend>(new utils::FileLogBackend(
225           kHistoryFileName, kLogRotationSize, kLogMaximumRotation));
226   std::string history = context_->pkgid.get() + "|" +
227       GetRequestTypeString(context_->request_type.get()) + "|START";
228   history_logger->WriteLog(::utils::LogLevel::LOG_INFO, "", history);
229   history_logger->WriteLogToFile();
230 }
231
232 void AppInstaller::LogHistoryEnd(bool success) {
233   std::shared_ptr<utils::FileLogBackend> history_logger =
234       std::shared_ptr<utils::FileLogBackend>(new utils::FileLogBackend(
235           kHistoryFileName, kLogRotationSize, kLogMaximumRotation));
236   std::string history = context_->pkgid.get() + "|" +
237       GetRequestTypeString(context_->request_type.get());
238   if (success)
239     history += "|SUCCESS";
240   else
241     history += "|FAIL";
242   history_logger->WriteLog(::utils::LogLevel::LOG_INFO, "", history);
243   history_logger->WriteLogToFile();
244 }
245
246 AppInstaller::Result AppInstaller::Process() {
247   Init();
248
249   failure_logger_ =
250       std::shared_ptr<utils::FileLogBackend>(new utils::FileLogBackend(
251             kLogFileName, kLogRotationSize, kLogMaximumRotation));
252   ::utils::LogCore::GetCore().AddLogBackend(failure_logger_);
253
254   unsigned total_steps = steps_.size();
255   unsigned current_step = 1;
256
257   for (it_ = steps_.begin(); it_ != steps_.end(); ++it_, ++current_step) {
258     status_ = SafeExecute(*it_, &Step::precheck, "precheck");
259     if (status_ == Step::Status::OK)
260       status_ = SafeExecute(*it_, &Step::process, "process");
261
262     if (status_ != Step::Status::OK) {
263       if (status_ != Step::Status::RECOVERY_DONE) {
264         LOG(ERROR) << "Error during processing";
265         result_ = Result::ERROR;
266       }
267       break;
268     }
269     SendProgress(current_step * kProgressRange / total_steps);
270   }
271
272   return result_;
273 }
274
275 AppInstaller::Result AppInstaller::Undo() {
276   do {
277     if (it_ == steps_.end())
278       --it_;
279     if (SafeExecute(*it_, &Step::undo, "undo") != Step::Status::OK) {
280       LOG(ERROR) << "Error during undo operation(" << (*it_)->name()
281                  << "), but continuing...";
282       result_ = Result::UNDO_ERROR;
283     }
284   } while (it_-- != steps_.begin());
285   sync();
286   failure_logger_->WriteLogToFile();
287
288   // Undo will be invoked when other installer fails when multi-install, but the
289   // status of current installer can be ok. We need to change this to proper
290   // error code to notify that entire installation was failed to listener.
291   // TODO(jeremy.jang): Need some other error for multi-install failure?
292   if (status_ == Step::Status::OK)
293     status_ = Step::Status::ERROR;
294   SendFinished(status_);
295
296   LogHistoryEnd(false);
297
298   return result_;
299 }
300
301 AppInstaller::Result AppInstaller::Clean() {
302   const auto& recovery_file =
303     context_->recovery_info.get().recovery_file;
304   if (recovery_file) {
305     recovery_file->set_cleanup(true);
306     recovery_file->WriteAndCommitFileContent();
307   }
308
309   do {
310     if (it_ == steps_.end())
311       --it_;
312     if (SafeExecute(*it_, &Step::clean, "clean") != Step::Status::OK) {
313       LOG(ERROR) << "Error during clean operation(" << (*it_)->name() << ")";
314       result_ = Result::CLEANUP_ERROR;
315       break;
316     }
317   } while (it_-- != steps_.begin());
318   sync();
319   SendFinished(status_);
320
321   LogHistoryEnd(true);
322
323   return result_;
324 }
325
326 void AppInstaller::InstallSteps() {
327   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
328   AddStep<ci::recovery::StepCreateRecoveryFile>();
329   AddStep<ci::filesystem::StepUnzip>();
330   AddStep<ci::configuration::StepParseManifest>(
331       ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
332       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
333   AddStep<ci::configuration::StepCheckInstallLocation>();
334   AddStep<ci::pkgmgr::StepCheckInstallable>();
335   AddStep<ci::configuration::StepParsePreload>();
336   AddStep<ci::pkgmgr::StepCheckRestriction>();
337   AddStep<ci::configuration::StepCheckTizenVersion>();
338   AddStep<ci::security::StepSignature>(true);
339   AddStep<ci::security::StepRollbackInstallationSecurity>();
340   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
341   AddStep<ci::filesystem::StepAcquireExternalStorage>(false);
342   AddStep<ci::filesystem::StepCopy>();
343   AddStep<ci::filesystem::StepCopyTep>();
344   AddStep<ci::filesystem::StepCreateIcons>();
345   AddStep<ci::pkgmgr::StepRegisterApplication>();
346   AddStep<ci::security::StepRegisterTrustAnchor>(
347       ci::security::StepRegisterTrustAnchor::RegisterType::INSTALL);
348   AddStep<ci::security::StepPrivacyPrivilege>(
349       ci::security::StepPrivacyPrivilege::ActionType::Install);
350   AddStep<ci::security::StepRegisterSecurity>();
351   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Install);
352   AddStep<ci::filesystem::StepCreateStorageDirectories>();
353   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
354   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
355 }
356
357 void AppInstaller::UpdateSteps() {
358   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
359   AddStep<ci::recovery::StepCreateRecoveryFile>();
360   AddStep<ci::filesystem::StepUnzip>();
361   AddStep<ci::configuration::StepParseManifest>(
362       ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
363       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
364   AddStep<ci::configuration::StepParseManifest>(
365       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
366       ci::configuration::StepParseManifest::StoreLocation::BACKUP);
367   AddStep<ci::configuration::StepCheckInstallLocation>();
368   AddStep<ci::pkgmgr::StepCheckUpgradable>();
369   AddStep<ci::configuration::StepParsePreload>();
370   AddStep<ci::configuration::StepCheckTizenVersion>();
371   AddStep<ci::security::StepSignature>(true);
372   AddStep<ci::security::StepCheckOldCertificate>();
373   AddStep<ci::configuration::StepBlockCrossUpdate>();
374   AddStep<ci::pkgmgr::StepKillApps>();
375   AddStep<ci::backup::StepBackupManifest>();
376   AddStep<ci::backup::StepBackupIcons>();
377   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
378   AddStep<ci::filesystem::StepAcquireExternalStorage>(true);
379   AddStep<ci::security::StepRevokeTrustAnchor>();
380   AddStep<ci::backup::StepCopyBackup>();
381   AddStep<ci::filesystem::StepUpdateTep>();
382   AddStep<ci::filesystem::StepCopyStorageDirectories>();
383   AddStep<ci::filesystem::StepCreateIcons>();
384   AddStep<ci::pkgmgr::StepUpdateApplication>();
385   AddStep<ci::security::StepRegisterTrustAnchor>(
386       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
387   AddStep<ci::security::StepPrivacyPrivilege>(
388       ci::security::StepPrivacyPrivilege::ActionType::Update);
389   AddStep<ci::security::StepUpdateSecurity>();
390   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
391   AddStep<ci::filesystem::StepUpdateStorageDirectories>();
392   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
393   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
394 }
395
396 void AppInstaller::UninstallSteps() {
397   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
398   AddStep<ci::recovery::StepCreateRecoveryFile>();
399   AddStep<ci::pkgmgr::StepCheckRestriction>();
400   AddStep<ci::pkgmgr::StepCheckRemovable>();
401   AddStep<ci::pkgmgr::StepCheckForceClean>();
402   AddStep<ci::configuration::StepParseManifest>(
403       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
404       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
405   AddStep<ci::configuration::StepCheckInstallLocation>();
406   AddStep<ci::pkgmgr::StepKillApps>();
407   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Uninstall);
408   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
409   AddStep<ci::filesystem::StepOptionalAcquireExternalStorage>();
410   AddStep<ci::filesystem::StepRemovePerUserStorageDirectories>();
411   AddStep<ci::pkgmgr::StepUnregisterApplication>();
412   AddStep<ci::security::StepUnregisterTrustAnchor>();
413   AddStep<ci::security::StepPrivacyPrivilege>(
414       ci::security::StepPrivacyPrivilege::ActionType::Uninstall);
415   AddStep<ci::filesystem::StepRemoveFiles>();
416   AddStep<ci::filesystem::StepRemoveZipImage>();
417   AddStep<ci::filesystem::StepRemoveIcons>();
418   AddStep<ci::filesystem::StepRemoveTep>();
419   AddStep<ci::security::StepRevokeSecurity>();
420   AddStep<ci::pkgmgr::StepRemoveManifest>();
421 }
422
423 void AppInstaller::ReinstallSteps() {
424   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
425   AddStep<ci::configuration::StepParseManifest>(
426       ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
427       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
428   AddStep<ci::configuration::StepParseManifest>(
429       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
430       ci::configuration::StepParseManifest::StoreLocation::BACKUP);
431   AddStep<ci::configuration::StepCheckInstallLocation>();
432   AddStep<ci::pkgmgr::StepCheckUpgradable>();
433   AddStep<ci::configuration::StepParsePreload>();
434   AddStep<ci::configuration::StepCheckTizenVersion>();
435   AddStep<ci::security::StepSignature>(true);
436   AddStep<ci::security::StepCheckOldCertificate>();
437   AddStep<ci::configuration::StepBlockCrossUpdate>();
438   AddStep<ci::pkgmgr::StepKillApps>();
439   AddStep<ci::backup::StepBackupManifest>();
440   AddStep<ci::backup::StepBackupIcons>();
441   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
442   AddStep<ci::security::StepRevokeTrustAnchor>();
443   AddStep<ci::rds::StepRDSParse>();
444   AddStep<ci::rds::StepRDSModify>();
445   AddStep<ci::filesystem::StepUpdateTep>();
446   AddStep<ci::filesystem::StepCreateIcons>();
447   AddStep<ci::pkgmgr::StepUpdateApplication>();
448   AddStep<ci::security::StepRegisterTrustAnchor>(
449       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
450   AddStep<ci::security::StepPrivacyPrivilege>(
451       ci::security::StepPrivacyPrivilege::ActionType::Update);
452   AddStep<ci::security::StepUpdateSecurity>();
453   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
454   AddStep<ci::filesystem::StepUpdateStorageDirectories>();
455   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
456   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
457 }
458
459 void AppInstaller::DeltaSteps() {
460   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
461   AddStep<ci::recovery::StepCreateRecoveryFile>();
462   AddStep<ci::filesystem::StepUnzip>();
463   AddStep<ci::configuration::StepParseManifest>(
464       ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
465       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
466   AddStep<ci::configuration::StepParseManifest>(
467       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
468       ci::configuration::StepParseManifest::StoreLocation::BACKUP);
469   AddStep<ci::configuration::StepCheckInstallLocation>();
470   AddStep<ci::pkgmgr::StepCheckUpgradable>();
471   AddStep<ci::configuration::StepParsePreload>();
472   AddStep<ci::configuration::StepCheckTizenVersion>();
473   AddStep<ci::filesystem::StepEnableExternalMount>();
474   AddStep<ci::filesystem::StepDeltaPatch>();
475   AddStep<ci::filesystem::StepDisableExternalMount>();
476   AddStep<ci::security::StepSignature>(true);
477   AddStep<ci::security::StepCheckOldCertificate>();
478   AddStep<ci::configuration::StepBlockCrossUpdate>();
479   AddStep<ci::pkgmgr::StepKillApps>();
480   AddStep<ci::backup::StepBackupManifest>();
481   AddStep<ci::backup::StepBackupIcons>();
482   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
483   AddStep<ci::filesystem::StepAcquireExternalStorage>(true);
484   AddStep<ci::security::StepRevokeTrustAnchor>();
485   AddStep<ci::backup::StepCopyBackup>();
486   AddStep<ci::filesystem::StepUpdateTep>();
487   AddStep<ci::filesystem::StepCopyStorageDirectories>();
488   AddStep<ci::filesystem::StepCreateIcons>();
489   AddStep<ci::pkgmgr::StepUpdateApplication>();
490   AddStep<ci::security::StepRegisterTrustAnchor>(
491       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
492   AddStep<ci::security::StepPrivacyPrivilege>(
493       ci::security::StepPrivacyPrivilege::ActionType::Update);
494   AddStep<ci::security::StepUpdateSecurity>();
495   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
496   AddStep<ci::filesystem::StepUpdateStorageDirectories>();
497   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
498   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
499 }
500
501 void AppInstaller::MoveSteps() {
502   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
503   AddStep<ci::pkgmgr::StepCheckRestriction>();
504   AddStep<ci::configuration::StepParseManifest>(
505       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
506       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
507   AddStep<ci::configuration::StepCheckInstallLocation>();
508   AddStep<ci::pkgmgr::StepKillApps>();
509   AddStep<ci::filesystem::StepMoveInstalledStorage>();
510   AddStep<ci::security::StepRegisterSecurity>();
511 }
512
513 void AppInstaller::RecoverySteps() {
514   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
515   AddStep<ci::recovery::StepOpenRecoveryFile>();
516   AddStep<ci::filesystem::StepRemoveTemporaryDirectory>();
517   AddStep<ci::configuration::StepParseManifest>(
518       ci::configuration::StepParseManifest::ManifestLocation::RECOVERY,
519       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
520   AddStep<ci::filesystem::StepRecoverIcons>();
521   AddStep<ci::pkgmgr::StepRecoverParserPlugin>();
522   AddStep<ci::filesystem::StepRecoverManifest>();
523   AddStep<ci::filesystem::StepRecoverExternalStorage>();
524   AddStep<ci::filesystem::StepRecoverStorageDirectories>();
525   AddStep<ci::filesystem::StepRecoverGlobalAppSymlinks>();
526   AddStep<ci::filesystem::StepRecoverFiles>();
527   AddStep<ci::mount::StepMountRecover>();
528   AddStep<ci::filesystem::StepRecoverChangeOwner>();
529   AddStep<ci::pkgmgr::StepRecoverApplication>();
530   AddStep<ci::security::StepRecoverTrustAnchor>();
531   AddStep<ci::security::StepRecoverSecurity>();
532 }
533
534 void AppInstaller::MountInstallSteps() {
535   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
536   AddStep<ci::recovery::StepCreateRecoveryFile>();
537   AddStep<ci::mount::StepMountUnpacked>();
538   AddStep<ci::configuration::StepParseManifest>(
539       ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
540       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
541   AddStep<ci::configuration::StepCheckInstallLocation>();
542   AddStep<ci::pkgmgr::StepCheckInstallable>();
543   AddStep<ci::configuration::StepParsePreload>();
544   AddStep<ci::pkgmgr::StepCheckRestriction>();
545   AddStep<ci::configuration::StepCheckTizenVersion>();
546   AddStep<ci::security::StepSignature>(true);
547   AddStep<ci::security::StepRollbackInstallationSecurity>();
548   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
549   AddStep<ci::mount::StepMountInstall>();
550   AddStep<ci::filesystem::StepCopyTep>();
551   AddStep<ci::filesystem::StepCreateIcons>();
552   AddStep<ci::pkgmgr::StepRegisterApplication>();
553   AddStep<ci::security::StepRegisterTrustAnchor>(
554       ci::security::StepRegisterTrustAnchor::RegisterType::INSTALL);
555   AddStep<ci::security::StepPrivacyPrivilege>(
556       ci::security::StepPrivacyPrivilege::ActionType::Install);
557   AddStep<ci::security::StepRegisterSecurity>();
558   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Install);
559   AddStep<ci::mount::StepUnmount>();
560   AddStep<ci::filesystem::StepCreateStorageDirectories>();
561   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>(true);
562   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
563 }
564
565 void AppInstaller::MountUpdateSteps() {
566   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
567   AddStep<ci::recovery::StepCreateRecoveryFile>();
568   AddStep<ci::mount::StepMountUnpacked>();
569   AddStep<ci::configuration::StepParseManifest>(
570       ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
571       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
572   AddStep<ci::configuration::StepParseManifest>(
573       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
574       ci::configuration::StepParseManifest::StoreLocation::BACKUP);
575   AddStep<ci::configuration::StepCheckInstallLocation>();
576   AddStep<ci::pkgmgr::StepCheckUpgradable>();
577   AddStep<ci::configuration::StepParsePreload>();
578   AddStep<ci::configuration::StepCheckTizenVersion>();
579   AddStep<ci::security::StepSignature>(true);
580   AddStep<ci::security::StepCheckOldCertificate>();
581   AddStep<ci::configuration::StepBlockCrossUpdate>();
582   AddStep<ci::security::StepRevokeTrustAnchor>();
583   AddStep<ci::pkgmgr::StepKillApps>();
584   AddStep<ci::backup::StepBackupManifest>();
585   AddStep<ci::backup::StepBackupIcons>();
586   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
587   AddStep<ci::mount::StepMountUpdate>();
588   AddStep<ci::filesystem::StepUpdateTep>();
589   AddStep<ci::filesystem::StepCreateIcons>();
590   AddStep<ci::pkgmgr::StepUpdateApplication>();
591   AddStep<ci::security::StepRegisterTrustAnchor>(
592       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
593   AddStep<ci::security::StepPrivacyPrivilege>(
594       ci::security::StepPrivacyPrivilege::ActionType::Update);
595   AddStep<ci::security::StepUpdateSecurity>();
596   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
597   AddStep<ci::mount::StepUnmount>();
598   AddStep<ci::filesystem::StepUpdateStorageDirectories>();
599   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>(true);
600   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
601 }
602
603 void AppInstaller::ManifestDirectInstallSteps() {
604   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
605   AddStep<ci::configuration::StepParseManifest>(
606       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
607       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
608   AddStep<ci::pkgmgr::StepCheckInstallable>();
609   AddStep<ci::mount::StepCheckMountPath>();
610   AddStep<ci::configuration::StepParsePreload>();
611   AddStep<ci::configuration::StepCheckTizenVersion>();
612   AddStep<ci::security::StepSignature>(true);
613   AddStep<ci::security::StepRollbackInstallationSecurity>();
614   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
615   AddStep<ci::pkgmgr::StepRegisterApplication>();
616   AddStep<ci::security::StepRegisterTrustAnchor>(
617       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
618   AddStep<ci::security::StepPrivacyPrivilege>(
619       ci::security::StepPrivacyPrivilege::ActionType::Install);
620   AddStep<ci::security::StepRegisterSecurity>();
621   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Install);
622   AddStep<ci::filesystem::StepCreateStorageDirectories>();
623   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
624   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
625 }
626
627 void AppInstaller::ManifestDirectUpdateSteps() {
628   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
629   AddStep<ci::configuration::StepParseManifest>(
630       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
631       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
632   AddStep<ci::pkgmgr::StepCheckUpgradable>();
633   AddStep<ci::mount::StepCheckMountPath>();
634   AddStep<ci::configuration::StepParsePreload>();
635   AddStep<ci::configuration::StepCheckTizenVersion>();
636   AddStep<ci::security::StepSignature>(true);
637   AddStep<ci::security::StepCheckOldCertificate>();
638   AddStep<ci::pkgmgr::StepKillApps>();
639   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
640   AddStep<ci::pkgmgr::StepUpdateApplication>();
641   AddStep<ci::security::StepRegisterTrustAnchor>(
642       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
643   AddStep<ci::security::StepPrivacyPrivilege>(
644       ci::security::StepPrivacyPrivilege::ActionType::Update);
645   AddStep<ci::security::StepRegisterSecurity>();
646   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
647   AddStep<ci::filesystem::StepUpdateStorageDirectories>();
648   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
649   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
650 }
651
652 void AppInstaller::ManifestPartialInstallSteps() {
653   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
654   AddStep<ci::configuration::StepParseManifest>(
655       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
656       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
657   AddStep<ci::configuration::StepParsePreload>();
658   AddStep<ci::security::StepSignature>(false);
659   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
660   AddStep<ci::pkgmgr::StepRegisterApplication>();
661   AddStep<ci::security::StepRegisterTrustAnchor>(
662       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
663   AddStep<ci::security::StepPrivacyPrivilege>(
664       ci::security::StepPrivacyPrivilege::ActionType::Install);
665   AddStep<ci::security::StepRegisterSecurity>();
666   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Install);
667   AddStep<ci::filesystem::StepCreateStorageDirectories>();
668   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
669 }
670
671 void AppInstaller::ManifestPartialUpdateSteps() {
672   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
673   AddStep<ci::configuration::StepParseManifest>(
674       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
675       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
676   AddStep<ci::configuration::StepParsePreload>();
677   AddStep<ci::security::StepSignature>(false);
678   AddStep<ci::security::StepCheckOldCertificate>();
679   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
680   AddStep<ci::pkgmgr::StepKillApps>();
681   AddStep<ci::pkgmgr::StepUpdateApplication>();
682   AddStep<ci::security::StepRegisterTrustAnchor>(
683       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
684   AddStep<ci::security::StepPrivacyPrivilege>(
685       ci::security::StepPrivacyPrivilege::ActionType::Update);
686   AddStep<ci::security::StepRegisterSecurity>();
687   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
688   AddStep<ci::filesystem::StepUpdateStorageDirectories>();
689   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
690 }
691
692 void AppInstaller::PartialUninstallSteps() {
693   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
694   AddStep<ci::pkgmgr::StepCheckRemovable>();
695   AddStep<ci::pkgmgr::StepCheckForceClean>();
696   AddStep<ci::configuration::StepParseManifest>(
697       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
698       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
699   AddStep<ci::configuration::StepCheckInstallLocation>();
700   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
701   AddStep<ci::filesystem::StepOptionalAcquireExternalStorage>();
702   AddStep<ci::filesystem::StepRemovePerUserStorageDirectories>();
703   AddStep<ci::pkgmgr::StepUnregisterApplication>();
704   AddStep<ci::security::StepUnregisterTrustAnchor>();
705   AddStep<ci::security::StepPrivacyPrivilege>(
706       ci::security::StepPrivacyPrivilege::ActionType::Uninstall);
707   AddStep<ci::security::StepRevokeSecurity>();
708   AddStep<ci::pkgmgr::StepRunParserPlugin>(
709       ci::Plugin::ActionType::Uninstall);
710 }
711
712 void AppInstaller::ReadonlyUpdateInstallSteps() {
713   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
714   AddStep<ci::recovery::StepCreateRecoveryFile>();
715   AddStep<ci::filesystem::StepUnzip>();
716   AddStep<ci::configuration::StepParseManifest>(
717       ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
718       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
719   AddStep<ci::configuration::StepSwitchReadonlyMode>();
720   AddStep<ci::configuration::StepParseManifest>(
721       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
722       ci::configuration::StepParseManifest::StoreLocation::BACKUP);
723   AddStep<ci::configuration::StepSwitchReadonlyMode>();
724   AddStep<ci::configuration::StepCheckInstallLocation>();
725   AddStep<ci::pkgmgr::StepCheckUpgradable>();
726   AddStep<ci::configuration::StepParsePreload>();
727   AddStep<ci::configuration::StepCheckTizenVersion>();
728   AddStep<ci::security::StepSignature>(true);
729   AddStep<ci::security::StepCheckOldCertificate>();
730   AddStep<ci::configuration::StepBlockCrossUpdate>();
731   AddStep<ci::pkgmgr::StepKillApps>();
732   AddStep<ci::security::StepRevokeTrustAnchor>();
733   AddStep<ci::filesystem::StepCopy>();
734   AddStep<ci::filesystem::StepCopyTep>();
735   AddStep<ci::filesystem::StepCreateIcons>();
736   AddStep<ci::pkgmgr::StepUpdateApplication>();
737   AddStep<ci::security::StepRegisterTrustAnchor>(
738       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
739   AddStep<ci::security::StepPrivacyPrivilege>(
740       ci::security::StepPrivacyPrivilege::ActionType::Update);
741   AddStep<ci::security::StepUpdateSecurity>();
742   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
743   AddStep<ci::filesystem::StepUpdateStorageDirectories>();
744   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
745   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
746 }
747
748 void AppInstaller::ReadonlyUpdateUninstallSteps() {
749   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
750   AddStep<ci::configuration::StepParseManifest>(
751       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
752       ci::configuration::StepParseManifest::StoreLocation::BACKUP);
753   AddStep<ci::configuration::StepSwitchReadonlyMode>();
754   AddStep<ci::configuration::StepParseManifest>(
755       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
756       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
757   AddStep<ci::pkgmgr::StepCheckUpgradable>();
758   AddStep<ci::configuration::StepParsePreload>();
759   AddStep<ci::security::StepSignature>(false);
760   AddStep<ci::configuration::StepSwitchReadonlyMode>();
761   AddStep<ci::pkgmgr::StepKillApps>();
762   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
763   AddStep<ci::security::StepRevokeTrustAnchor>();
764   AddStep<ci::pkgmgr::StepUpdateApplication>();
765   AddStep<ci::security::StepRegisterTrustAnchor>(
766       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
767   AddStep<ci::security::StepPrivacyPrivilege>(
768       ci::security::StepPrivacyPrivilege::ActionType::Update);
769   AddStep<ci::filesystem::StepRemoveFiles>();
770   AddStep<ci::filesystem::StepRemoveZipImage>();
771   AddStep<ci::filesystem::StepRemoveIcons>();
772   AddStep<ci::filesystem::StepRemoveTep>();
773   AddStep<ci::filesystem::StepRemoveUserData>();
774   AddStep<ci::configuration::StepSwitchReadonlyMode>();
775   AddStep<ci::security::StepUpdateSecurity>();
776   AddStep<ci::pkgmgr::StepRemoveManifest>();
777   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
778   AddStep<ci::filesystem::StepUpdateStorageDirectories>();
779 }
780
781 void AppInstaller::DisablePkgSteps() {
782   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
783   AddStep<ci::configuration::StepParseManifest>(
784       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
785       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
786   AddStep<ci::pkgmgr::StepKillApps>();
787   AddStep<ci::pkgmgr::StepUpdatePkgDisableInfo>(
788     ci::pkgmgr::StepUpdatePkgDisableInfo::ActionType::Disable);
789   AddStep<ci::pkgmgr::StepRunParserPlugin>(
790     ci::Plugin::ActionType::Uninstall);
791 }
792
793 void AppInstaller::EnablePkgSteps() {
794   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
795   AddStep<ci::configuration::StepParseManifest>(
796       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
797       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
798   AddStep<ci::pkgmgr::StepUpdatePkgDisableInfo>(
799     ci::pkgmgr::StepUpdatePkgDisableInfo::ActionType::Enable);
800   AddStep<ci::pkgmgr::StepRunParserPlugin>(
801     ci::Plugin::ActionType::Install);
802 }
803
804 void AppInstaller::MigrateExtImgSteps() {
805   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
806   AddStep<ci::security::StepMigrateLegacyExtImage>();
807   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
808 }
809
810 void AppInstaller::RecoverDBSteps() {
811   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
812   AddStep<ci::configuration::StepParseManifest>(
813       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
814       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
815   AddStep<ci::pkgmgr::StepCheckInstallable>();
816   AddStep<ci::mount::StepCheckMountPath>();
817   AddStep<ci::configuration::StepParsePreload>();
818   AddStep<ci::security::StepGetPrivilegeLevel>();
819   AddStep<ci::pkgmgr::StepRegisterApplication>();
820 }
821
822 void AppInstaller::UnknownSteps() {
823   AddStep<configuration::StepFail>();
824 }
825
826 void AppInstaller::HandleStepError(Step::Status result,
827                                    const std::string& error) {
828   if (!pi_)
829     return;
830
831   pi_->SendError(result, error, context_->pkg_type.get(),
832                  context_->pkgid.get());
833 }
834
835 bool AppInstaller::SendStartIfNotSent(bool is_skippable) {
836   if (!pi_)
837     return false;
838
839   if (pi_->state() != PkgmgrSignal::State::NOT_SENT)
840     return true;
841
842   if (context_->pkgid.get().empty() && is_skippable)
843     return true;
844
845   // set request type before sending start signal
846   pi_->SetRequestType(context_->request_type.get());
847   pi_->SendStarted(context_->pkg_type.get(), context_->pkgid.get());
848
849   LogHistoryStart();
850
851   return true;
852 }
853
854 void AppInstaller::SendProgress(int progress) {
855   // send START signal as soon as possible if not sent
856   if (!SendStartIfNotSent(true))
857     return;
858
859   // send installation progress
860   pi_->SendProgress(progress,
861       context_->pkg_type.get(), context_->pkgid.get());
862 }
863
864 void AppInstaller::SendFinished(Step::Status process_status) {
865   if (!SendStartIfNotSent(false))
866     return;
867
868   pi_->SendFinished(process_status,
869                     context_->pkg_type.get(),
870                     context_->pkgid.get());
871 }
872
873 Step::Status AppInstaller::SafeExecute(std::unique_ptr<Step> const& step_ptr,
874                                        Step::Status (Step::*method)(),
875                                        std::string name) {
876   Step::Status process_status = Step::Status::OK;
877   try {
878     TTRACE(TTRACE_TAG_APP, "%s_%s", step_ptr->name(), name.c_str());
879     process_status = ((*step_ptr).*method)();
880   } catch (const std::exception& err) {
881     LOG(ERROR) << "Exception occurred in " << name.c_str() << "(): "
882                << err.what() << " in step: " << step_ptr->name();
883     process_status = Step::Status::ERROR;
884   }
885   return process_status;
886 }
887
888 }  // namespace common_installer