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