Minor refactor
[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::LogHistory(bool success) {
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 = "pkgid:" + context_->pkgid.get() + "|mode:" +
227       GetRequestTypeString(context_->request_type.get());
228   if (success)
229     history += "|SUCCESS";
230   else
231     history += "|FAIL";
232   history_logger->WriteLog(::utils::LogLevel::LOG_INFO, "", history);
233   history_logger->WriteLogToFile();
234 }
235
236 AppInstaller::Result AppInstaller::Process() {
237   Init();
238
239   failure_logger_ =
240       std::shared_ptr<utils::FileLogBackend>(new utils::FileLogBackend(
241             kLogFileName, kLogRotationSize, kLogMaximumRotation));
242   ::utils::LogCore::GetCore().AddLogBackend(failure_logger_);
243
244   unsigned total_steps = steps_.size();
245   unsigned current_step = 1;
246
247   for (it_ = steps_.begin(); it_ != steps_.end(); ++it_, ++current_step) {
248     status_ = SafeExecute(*it_, &Step::precheck, "precheck");
249     if (status_ == Step::Status::OK)
250       status_ = SafeExecute(*it_, &Step::process, "process");
251
252     if (status_ != Step::Status::OK) {
253       if (status_ != Step::Status::RECOVERY_DONE) {
254         LOG(ERROR) << "Error during processing";
255         result_ = Result::ERROR;
256       }
257       break;
258     }
259     SendProgress(current_step * kProgressRange / total_steps);
260   }
261
262   return result_;
263 }
264
265 AppInstaller::Result AppInstaller::Undo() {
266   do {
267     if (it_ == steps_.end())
268       --it_;
269     if (SafeExecute(*it_, &Step::undo, "undo") != Step::Status::OK) {
270       LOG(ERROR) << "Error during undo operation(" << (*it_)->name()
271                  << "), but continuing...";
272       result_ = Result::UNDO_ERROR;
273     }
274   } while (it_-- != steps_.begin());
275   sync();
276   failure_logger_->WriteLogToFile();
277
278   // Undo will be invoked when other installer fails when multi-install, but the
279   // status of current installer can be ok. We need to change this to proper
280   // error code to notify that entire installation was failed to listener.
281   // TODO(jeremy.jang): Need some other error for multi-install failure?
282   if (status_ == Step::Status::OK)
283     status_ = Step::Status::ERROR;
284   SendFinished(status_);
285
286   LogHistory(false);
287
288   return result_;
289 }
290
291 AppInstaller::Result AppInstaller::Clean() {
292   const auto& recovery_file =
293     context_->recovery_info.get().recovery_file;
294   if (recovery_file) {
295     recovery_file->set_cleanup(true);
296     recovery_file->WriteAndCommitFileContent();
297   }
298   SendFinished(status_);
299
300   do {
301     if (it_ == steps_.end())
302       --it_;
303     if (SafeExecute(*it_, &Step::clean, "clean") != Step::Status::OK) {
304       LOG(ERROR) << "Error during clean operation(" << (*it_)->name() << ")";
305       result_ = Result::CLEANUP_ERROR;
306       break;
307     }
308   } while (it_-- != steps_.begin());
309   sync();
310
311   LogHistory(true);
312
313   return result_;
314 }
315
316 void AppInstaller::InstallSteps() {
317   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
318   AddStep<ci::recovery::StepCreateRecoveryFile>();
319   AddStep<ci::filesystem::StepUnzip>();
320   AddStep<ci::configuration::StepParseManifest>(
321       ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
322       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
323   AddStep<ci::configuration::StepCheckInstallLocation>();
324   AddStep<ci::pkgmgr::StepCheckInstallable>();
325   AddStep<ci::configuration::StepParsePreload>();
326   AddStep<ci::pkgmgr::StepCheckRestriction>();
327   AddStep<ci::configuration::StepCheckTizenVersion>();
328   AddStep<ci::security::StepSignature>(true);
329   AddStep<ci::security::StepRollbackInstallationSecurity>();
330   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
331   AddStep<ci::filesystem::StepAcquireExternalStorage>(false);
332   AddStep<ci::filesystem::StepCopy>();
333   AddStep<ci::filesystem::StepCopyTep>();
334   AddStep<ci::filesystem::StepCreateIcons>();
335   AddStep<ci::pkgmgr::StepRegisterApplication>();
336   AddStep<ci::security::StepRegisterTrustAnchor>(
337       ci::security::StepRegisterTrustAnchor::RegisterType::INSTALL);
338   AddStep<ci::security::StepPrivacyPrivilege>(
339       ci::security::StepPrivacyPrivilege::ActionType::Install);
340   AddStep<ci::security::StepRegisterSecurity>();
341   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Install);
342   AddStep<ci::filesystem::StepCreateStorageDirectories>();
343   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
344   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
345 }
346
347 void AppInstaller::UpdateSteps() {
348   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
349   AddStep<ci::recovery::StepCreateRecoveryFile>();
350   AddStep<ci::filesystem::StepUnzip>();
351   AddStep<ci::configuration::StepParseManifest>(
352       ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
353       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
354   AddStep<ci::configuration::StepParseManifest>(
355       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
356       ci::configuration::StepParseManifest::StoreLocation::BACKUP);
357   AddStep<ci::configuration::StepCheckInstallLocation>();
358   AddStep<ci::pkgmgr::StepCheckUpgradable>();
359   AddStep<ci::configuration::StepParsePreload>();
360   AddStep<ci::configuration::StepCheckTizenVersion>();
361   AddStep<ci::security::StepSignature>(true);
362   AddStep<ci::security::StepCheckOldCertificate>();
363   AddStep<ci::configuration::StepBlockCrossUpdate>();
364   AddStep<ci::pkgmgr::StepKillApps>();
365   AddStep<ci::backup::StepBackupManifest>();
366   AddStep<ci::backup::StepBackupIcons>();
367   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
368   AddStep<ci::filesystem::StepAcquireExternalStorage>(true);
369   AddStep<ci::security::StepRevokeTrustAnchor>();
370   AddStep<ci::backup::StepCopyBackup>();
371   AddStep<ci::filesystem::StepUpdateTep>();
372   AddStep<ci::filesystem::StepCopyStorageDirectories>();
373   AddStep<ci::filesystem::StepCreateIcons>();
374   AddStep<ci::pkgmgr::StepUpdateApplication>();
375   AddStep<ci::security::StepRegisterTrustAnchor>(
376       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
377   AddStep<ci::security::StepPrivacyPrivilege>(
378       ci::security::StepPrivacyPrivilege::ActionType::Update);
379   AddStep<ci::security::StepUpdateSecurity>();
380   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
381   AddStep<ci::filesystem::StepUpdateStorageDirectories>();
382   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
383   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
384 }
385
386 void AppInstaller::UninstallSteps() {
387   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
388   AddStep<ci::recovery::StepCreateRecoveryFile>();
389   AddStep<ci::pkgmgr::StepCheckRestriction>();
390   AddStep<ci::pkgmgr::StepCheckRemovable>();
391   AddStep<ci::pkgmgr::StepCheckForceClean>();
392   AddStep<ci::configuration::StepParseManifest>(
393       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
394       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
395   AddStep<ci::configuration::StepCheckInstallLocation>();
396   AddStep<ci::pkgmgr::StepKillApps>();
397   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Uninstall);
398   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
399   AddStep<ci::filesystem::StepOptionalAcquireExternalStorage>();
400   AddStep<ci::filesystem::StepRemovePerUserStorageDirectories>();
401   AddStep<ci::pkgmgr::StepUnregisterApplication>();
402   AddStep<ci::security::StepUnregisterTrustAnchor>();
403   AddStep<ci::security::StepPrivacyPrivilege>(
404       ci::security::StepPrivacyPrivilege::ActionType::Uninstall);
405   AddStep<ci::filesystem::StepRemoveFiles>();
406   AddStep<ci::filesystem::StepRemoveZipImage>();
407   AddStep<ci::filesystem::StepRemoveIcons>();
408   AddStep<ci::filesystem::StepRemoveTep>();
409   AddStep<ci::security::StepRevokeSecurity>();
410   AddStep<ci::pkgmgr::StepRemoveManifest>();
411   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
412 }
413
414 void AppInstaller::ReinstallSteps() {
415   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
416   AddStep<ci::configuration::StepParseManifest>(
417       ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
418       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
419   AddStep<ci::configuration::StepParseManifest>(
420       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
421       ci::configuration::StepParseManifest::StoreLocation::BACKUP);
422   AddStep<ci::configuration::StepCheckInstallLocation>();
423   AddStep<ci::pkgmgr::StepCheckUpgradable>();
424   AddStep<ci::configuration::StepParsePreload>();
425   AddStep<ci::configuration::StepCheckTizenVersion>();
426   AddStep<ci::security::StepSignature>(true);
427   AddStep<ci::security::StepCheckOldCertificate>();
428   AddStep<ci::configuration::StepBlockCrossUpdate>();
429   AddStep<ci::pkgmgr::StepKillApps>();
430   AddStep<ci::backup::StepBackupManifest>();
431   AddStep<ci::backup::StepBackupIcons>();
432   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
433   AddStep<ci::security::StepRevokeTrustAnchor>();
434   AddStep<ci::rds::StepRDSParse>();
435   AddStep<ci::rds::StepRDSModify>();
436   AddStep<ci::filesystem::StepUpdateTep>();
437   AddStep<ci::filesystem::StepCreateIcons>();
438   AddStep<ci::pkgmgr::StepUpdateApplication>();
439   AddStep<ci::security::StepRegisterTrustAnchor>(
440       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
441   AddStep<ci::security::StepPrivacyPrivilege>(
442       ci::security::StepPrivacyPrivilege::ActionType::Update);
443   AddStep<ci::security::StepUpdateSecurity>();
444   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
445   AddStep<ci::filesystem::StepUpdateStorageDirectories>();
446   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
447   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
448 }
449
450 void AppInstaller::DeltaSteps() {
451   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
452   AddStep<ci::recovery::StepCreateRecoveryFile>();
453   AddStep<ci::filesystem::StepUnzip>();
454   AddStep<ci::configuration::StepParseManifest>(
455       ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
456       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
457   AddStep<ci::configuration::StepParseManifest>(
458       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
459       ci::configuration::StepParseManifest::StoreLocation::BACKUP);
460   AddStep<ci::configuration::StepCheckInstallLocation>();
461   AddStep<ci::pkgmgr::StepCheckUpgradable>();
462   AddStep<ci::configuration::StepParsePreload>();
463   AddStep<ci::configuration::StepCheckTizenVersion>();
464   AddStep<ci::filesystem::StepEnableExternalMount>();
465   AddStep<ci::filesystem::StepDeltaPatch>();
466   AddStep<ci::filesystem::StepDisableExternalMount>();
467   AddStep<ci::security::StepSignature>(true);
468   AddStep<ci::security::StepCheckOldCertificate>();
469   AddStep<ci::configuration::StepBlockCrossUpdate>();
470   AddStep<ci::pkgmgr::StepKillApps>();
471   AddStep<ci::backup::StepBackupManifest>();
472   AddStep<ci::backup::StepBackupIcons>();
473   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
474   AddStep<ci::filesystem::StepAcquireExternalStorage>(true);
475   AddStep<ci::security::StepRevokeTrustAnchor>();
476   AddStep<ci::backup::StepCopyBackup>();
477   AddStep<ci::filesystem::StepUpdateTep>();
478   AddStep<ci::filesystem::StepCopyStorageDirectories>();
479   AddStep<ci::filesystem::StepCreateIcons>();
480   AddStep<ci::pkgmgr::StepUpdateApplication>();
481   AddStep<ci::security::StepRegisterTrustAnchor>(
482       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
483   AddStep<ci::security::StepPrivacyPrivilege>(
484       ci::security::StepPrivacyPrivilege::ActionType::Update);
485   AddStep<ci::security::StepUpdateSecurity>();
486   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
487   AddStep<ci::filesystem::StepUpdateStorageDirectories>();
488   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
489   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
490 }
491
492 void AppInstaller::MoveSteps() {
493   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
494   AddStep<ci::pkgmgr::StepCheckRestriction>();
495   AddStep<ci::configuration::StepParseManifest>(
496       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
497       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
498   AddStep<ci::configuration::StepCheckInstallLocation>();
499   AddStep<ci::pkgmgr::StepKillApps>();
500   AddStep<ci::filesystem::StepMoveInstalledStorage>();
501   AddStep<ci::security::StepRegisterSecurity>();
502 }
503
504 void AppInstaller::RecoverySteps() {
505   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
506   AddStep<ci::recovery::StepOpenRecoveryFile>();
507   AddStep<ci::filesystem::StepRemoveTemporaryDirectory>();
508   AddStep<ci::configuration::StepParseManifest>(
509       ci::configuration::StepParseManifest::ManifestLocation::RECOVERY,
510       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
511   AddStep<ci::filesystem::StepRecoverIcons>();
512   AddStep<ci::pkgmgr::StepRecoverParserPlugin>();
513   AddStep<ci::filesystem::StepRecoverManifest>();
514   AddStep<ci::filesystem::StepRecoverExternalStorage>();
515   AddStep<ci::filesystem::StepRecoverStorageDirectories>();
516   AddStep<ci::filesystem::StepRecoverGlobalAppSymlinks>();
517   AddStep<ci::filesystem::StepRecoverFiles>();
518   AddStep<ci::mount::StepMountRecover>();
519   AddStep<ci::filesystem::StepRecoverChangeOwner>();
520   AddStep<ci::pkgmgr::StepRecoverApplication>();
521   AddStep<ci::security::StepRecoverTrustAnchor>();
522   AddStep<ci::security::StepRecoverSecurity>();
523 }
524
525 void AppInstaller::MountInstallSteps() {
526   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
527   AddStep<ci::recovery::StepCreateRecoveryFile>();
528   AddStep<ci::mount::StepMountUnpacked>();
529   AddStep<ci::configuration::StepParseManifest>(
530       ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
531       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
532   AddStep<ci::configuration::StepCheckInstallLocation>();
533   AddStep<ci::pkgmgr::StepCheckInstallable>();
534   AddStep<ci::configuration::StepParsePreload>();
535   AddStep<ci::pkgmgr::StepCheckRestriction>();
536   AddStep<ci::configuration::StepCheckTizenVersion>();
537   AddStep<ci::security::StepSignature>(true);
538   AddStep<ci::security::StepRollbackInstallationSecurity>();
539   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
540   AddStep<ci::mount::StepMountInstall>();
541   AddStep<ci::filesystem::StepCopyTep>();
542   AddStep<ci::filesystem::StepCreateIcons>();
543   AddStep<ci::pkgmgr::StepRegisterApplication>();
544   AddStep<ci::security::StepRegisterTrustAnchor>(
545       ci::security::StepRegisterTrustAnchor::RegisterType::INSTALL);
546   AddStep<ci::security::StepPrivacyPrivilege>(
547       ci::security::StepPrivacyPrivilege::ActionType::Install);
548   AddStep<ci::security::StepRegisterSecurity>();
549   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Install);
550   AddStep<ci::mount::StepUnmount>();
551   AddStep<ci::filesystem::StepCreateStorageDirectories>();
552   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>(true);
553   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
554 }
555
556 void AppInstaller::MountUpdateSteps() {
557   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
558   AddStep<ci::recovery::StepCreateRecoveryFile>();
559   AddStep<ci::mount::StepMountUnpacked>();
560   AddStep<ci::configuration::StepParseManifest>(
561       ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
562       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
563   AddStep<ci::configuration::StepParseManifest>(
564       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
565       ci::configuration::StepParseManifest::StoreLocation::BACKUP);
566   AddStep<ci::configuration::StepCheckInstallLocation>();
567   AddStep<ci::pkgmgr::StepCheckUpgradable>();
568   AddStep<ci::configuration::StepParsePreload>();
569   AddStep<ci::configuration::StepCheckTizenVersion>();
570   AddStep<ci::security::StepSignature>(true);
571   AddStep<ci::security::StepCheckOldCertificate>();
572   AddStep<ci::configuration::StepBlockCrossUpdate>();
573   AddStep<ci::security::StepRevokeTrustAnchor>();
574   AddStep<ci::pkgmgr::StepKillApps>();
575   AddStep<ci::backup::StepBackupManifest>();
576   AddStep<ci::backup::StepBackupIcons>();
577   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
578   AddStep<ci::mount::StepMountUpdate>();
579   AddStep<ci::filesystem::StepUpdateTep>();
580   AddStep<ci::filesystem::StepCreateIcons>();
581   AddStep<ci::pkgmgr::StepUpdateApplication>();
582   AddStep<ci::security::StepRegisterTrustAnchor>(
583       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
584   AddStep<ci::security::StepPrivacyPrivilege>(
585       ci::security::StepPrivacyPrivilege::ActionType::Update);
586   AddStep<ci::security::StepUpdateSecurity>();
587   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
588   AddStep<ci::mount::StepUnmount>();
589   AddStep<ci::filesystem::StepUpdateStorageDirectories>();
590   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>(true);
591   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
592 }
593
594 void AppInstaller::ManifestDirectInstallSteps() {
595   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
596   AddStep<ci::configuration::StepParseManifest>(
597       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
598       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
599   AddStep<ci::pkgmgr::StepCheckInstallable>();
600   AddStep<ci::mount::StepCheckMountPath>();
601   AddStep<ci::configuration::StepParsePreload>();
602   AddStep<ci::configuration::StepCheckTizenVersion>();
603   AddStep<ci::security::StepSignature>(true);
604   AddStep<ci::security::StepRollbackInstallationSecurity>();
605   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
606   AddStep<ci::pkgmgr::StepRegisterApplication>();
607   AddStep<ci::security::StepRegisterTrustAnchor>(
608       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
609   AddStep<ci::security::StepPrivacyPrivilege>(
610       ci::security::StepPrivacyPrivilege::ActionType::Install);
611   AddStep<ci::security::StepRegisterSecurity>();
612   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Install);
613   AddStep<ci::filesystem::StepCreateStorageDirectories>();
614   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
615   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
616 }
617
618 void AppInstaller::ManifestDirectUpdateSteps() {
619   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
620   AddStep<ci::configuration::StepParseManifest>(
621       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
622       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
623   AddStep<ci::pkgmgr::StepCheckUpgradable>();
624   AddStep<ci::mount::StepCheckMountPath>();
625   AddStep<ci::configuration::StepParsePreload>();
626   AddStep<ci::configuration::StepCheckTizenVersion>();
627   AddStep<ci::security::StepSignature>(true);
628   AddStep<ci::security::StepCheckOldCertificate>();
629   AddStep<ci::pkgmgr::StepKillApps>();
630   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
631   AddStep<ci::pkgmgr::StepUpdateApplication>();
632   AddStep<ci::security::StepRegisterTrustAnchor>(
633       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
634   AddStep<ci::security::StepPrivacyPrivilege>(
635       ci::security::StepPrivacyPrivilege::ActionType::Update);
636   AddStep<ci::security::StepRegisterSecurity>();
637   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
638   AddStep<ci::filesystem::StepUpdateStorageDirectories>();
639   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
640   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
641 }
642
643 void AppInstaller::ManifestPartialInstallSteps() {
644   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
645   AddStep<ci::configuration::StepParseManifest>(
646       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
647       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
648   AddStep<ci::configuration::StepParsePreload>();
649   AddStep<ci::security::StepSignature>(false);
650   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
651   AddStep<ci::pkgmgr::StepRegisterApplication>();
652   AddStep<ci::security::StepRegisterTrustAnchor>(
653       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
654   AddStep<ci::security::StepPrivacyPrivilege>(
655       ci::security::StepPrivacyPrivilege::ActionType::Install);
656   AddStep<ci::security::StepRegisterSecurity>();
657   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Install);
658   AddStep<ci::filesystem::StepCreateStorageDirectories>();
659   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
660 }
661
662 void AppInstaller::ManifestPartialUpdateSteps() {
663   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
664   AddStep<ci::configuration::StepParseManifest>(
665       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
666       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
667   AddStep<ci::configuration::StepParsePreload>();
668   AddStep<ci::security::StepSignature>(false);
669   AddStep<ci::security::StepCheckOldCertificate>();
670   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
671   AddStep<ci::pkgmgr::StepKillApps>();
672   AddStep<ci::pkgmgr::StepUpdateApplication>();
673   AddStep<ci::security::StepRegisterTrustAnchor>(
674       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
675   AddStep<ci::security::StepPrivacyPrivilege>(
676       ci::security::StepPrivacyPrivilege::ActionType::Update);
677   AddStep<ci::security::StepRegisterSecurity>();
678   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
679   AddStep<ci::filesystem::StepUpdateStorageDirectories>();
680   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
681 }
682
683 void AppInstaller::PartialUninstallSteps() {
684   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
685   AddStep<ci::pkgmgr::StepCheckRemovable>();
686   AddStep<ci::pkgmgr::StepCheckForceClean>();
687   AddStep<ci::configuration::StepParseManifest>(
688       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
689       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
690   AddStep<ci::configuration::StepCheckInstallLocation>();
691   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
692   AddStep<ci::filesystem::StepOptionalAcquireExternalStorage>();
693   AddStep<ci::filesystem::StepRemovePerUserStorageDirectories>();
694   AddStep<ci::pkgmgr::StepUnregisterApplication>();
695   AddStep<ci::security::StepUnregisterTrustAnchor>();
696   AddStep<ci::security::StepPrivacyPrivilege>(
697       ci::security::StepPrivacyPrivilege::ActionType::Uninstall);
698   AddStep<ci::security::StepRevokeSecurity>();
699   AddStep<ci::pkgmgr::StepRunParserPlugin>(
700       ci::Plugin::ActionType::Uninstall);
701 }
702
703 void AppInstaller::ReadonlyUpdateInstallSteps() {
704   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
705   AddStep<ci::recovery::StepCreateRecoveryFile>();
706   AddStep<ci::filesystem::StepUnzip>();
707   AddStep<ci::configuration::StepParseManifest>(
708       ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
709       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
710   AddStep<ci::configuration::StepSwitchReadonlyMode>();
711   AddStep<ci::configuration::StepParseManifest>(
712       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
713       ci::configuration::StepParseManifest::StoreLocation::BACKUP);
714   AddStep<ci::configuration::StepSwitchReadonlyMode>();
715   AddStep<ci::configuration::StepCheckInstallLocation>();
716   AddStep<ci::pkgmgr::StepCheckUpgradable>();
717   AddStep<ci::configuration::StepParsePreload>();
718   AddStep<ci::configuration::StepCheckTizenVersion>();
719   AddStep<ci::security::StepSignature>(true);
720   AddStep<ci::security::StepCheckOldCertificate>();
721   AddStep<ci::configuration::StepBlockCrossUpdate>();
722   AddStep<ci::pkgmgr::StepKillApps>();
723   AddStep<ci::security::StepRevokeTrustAnchor>();
724   AddStep<ci::filesystem::StepCopy>();
725   AddStep<ci::filesystem::StepCopyTep>();
726   AddStep<ci::filesystem::StepCreateIcons>();
727   AddStep<ci::pkgmgr::StepUpdateApplication>();
728   AddStep<ci::security::StepRegisterTrustAnchor>(
729       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
730   AddStep<ci::security::StepPrivacyPrivilege>(
731       ci::security::StepPrivacyPrivilege::ActionType::Update);
732   AddStep<ci::security::StepUpdateSecurity>();
733   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
734   AddStep<ci::filesystem::StepUpdateStorageDirectories>();
735   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
736   AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
737 }
738
739 void AppInstaller::ReadonlyUpdateUninstallSteps() {
740   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
741   AddStep<ci::configuration::StepParseManifest>(
742       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
743       ci::configuration::StepParseManifest::StoreLocation::BACKUP);
744   AddStep<ci::configuration::StepSwitchReadonlyMode>();
745   AddStep<ci::configuration::StepParseManifest>(
746       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
747       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
748   AddStep<ci::pkgmgr::StepCheckUpgradable>();
749   AddStep<ci::configuration::StepParsePreload>();
750   AddStep<ci::security::StepSignature>(false);
751   AddStep<ci::configuration::StepSwitchReadonlyMode>();
752   AddStep<ci::pkgmgr::StepKillApps>();
753   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
754   AddStep<ci::security::StepRevokeTrustAnchor>();
755   AddStep<ci::pkgmgr::StepUpdateApplication>();
756   AddStep<ci::security::StepRegisterTrustAnchor>(
757       ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
758   AddStep<ci::security::StepPrivacyPrivilege>(
759       ci::security::StepPrivacyPrivilege::ActionType::Update);
760   AddStep<ci::filesystem::StepRemoveFiles>();
761   AddStep<ci::filesystem::StepRemoveZipImage>();
762   AddStep<ci::filesystem::StepRemoveIcons>();
763   AddStep<ci::filesystem::StepRemoveTep>();
764   AddStep<ci::filesystem::StepRemoveUserData>();
765   AddStep<ci::configuration::StepSwitchReadonlyMode>();
766   AddStep<ci::security::StepUpdateSecurity>();
767   AddStep<ci::pkgmgr::StepRemoveManifest>();
768   AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
769   AddStep<ci::filesystem::StepUpdateStorageDirectories>();
770 }
771
772 void AppInstaller::DisablePkgSteps() {
773   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
774   AddStep<ci::configuration::StepParseManifest>(
775       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
776       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
777   AddStep<ci::pkgmgr::StepKillApps>();
778   AddStep<ci::pkgmgr::StepUpdatePkgDisableInfo>(
779     ci::pkgmgr::StepUpdatePkgDisableInfo::ActionType::Disable);
780   AddStep<ci::pkgmgr::StepRunParserPlugin>(
781     ci::Plugin::ActionType::Uninstall);
782 }
783
784 void AppInstaller::EnablePkgSteps() {
785   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
786   AddStep<ci::configuration::StepParseManifest>(
787       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
788       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
789   AddStep<ci::pkgmgr::StepUpdatePkgDisableInfo>(
790     ci::pkgmgr::StepUpdatePkgDisableInfo::ActionType::Enable);
791   AddStep<ci::pkgmgr::StepRunParserPlugin>(
792     ci::Plugin::ActionType::Install);
793 }
794
795 void AppInstaller::MigrateExtImgSteps() {
796   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
797   AddStep<ci::security::StepMigrateLegacyExtImage>();
798   AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
799 }
800
801 void AppInstaller::RecoverDBSteps() {
802   AddStep<ci::configuration::StepConfigure>(pkgmgr_);
803   AddStep<ci::configuration::StepParseManifest>(
804       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
805       ci::configuration::StepParseManifest::StoreLocation::NORMAL);
806   AddStep<ci::pkgmgr::StepCheckInstallable>();
807   AddStep<ci::mount::StepCheckMountPath>();
808   AddStep<ci::configuration::StepParsePreload>();
809   AddStep<ci::security::StepGetPrivilegeLevel>();
810   AddStep<ci::pkgmgr::StepRegisterApplication>();
811 }
812
813 void AppInstaller::UnknownSteps() {
814   AddStep<configuration::StepFail>();
815 }
816
817 void AppInstaller::HandleStepError(Step::Status result,
818                                    const std::string& error) {
819   if (!pi_)
820     return;
821
822   pi_->SendError(result, error, context_->pkg_type.get(),
823                  context_->pkgid.get());
824 }
825
826 bool AppInstaller::SendStartIfNotSent() {
827   if (!pi_)
828     return false;
829
830   if (pi_->state() != PkgmgrSignal::State::NOT_SENT ||
831       context_->pkgid.get().empty())
832     return true;
833
834   // set request type before sending start signal
835   pi_->SetRequestType(context_->request_type.get());
836   pi_->SendStarted(context_->pkg_type.get(), context_->pkgid.get());
837
838   return true;
839 }
840
841 void AppInstaller::SendProgress(int progress) {
842   // send START signal as soon as possible if not sent
843   if (!SendStartIfNotSent())
844     return;
845
846   // send installation progress
847   pi_->SendProgress(progress,
848       context_->pkg_type.get(), context_->pkgid.get());
849 }
850
851 void AppInstaller::SendFinished(Step::Status process_status) {
852   if (!SendStartIfNotSent())
853     return;
854
855   pi_->SendFinished(process_status,
856                     context_->pkg_type.get(),
857                     context_->pkgid.get());
858 }
859
860 Step::Status AppInstaller::SafeExecute(std::unique_ptr<Step> const& step_ptr,
861                                        Step::Status (Step::*method)(),
862                                        std::string name) {
863   Step::Status process_status = Step::Status::OK;
864   try {
865     TTRACE(TTRACE_TAG_APP, "%s_%s", step_ptr->name(), name.c_str());
866     process_status = ((*step_ptr).*method)();
867   } catch (const std::exception& err) {
868     LOG(ERROR) << "Exception occurred in " << name.c_str() << "(): "
869                << err.what() << " in step: " << step_ptr->name();
870     process_status = Step::Status::ERROR;
871   }
872   return process_status;
873 }
874
875 }  // namespace common_installer