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.
10 #include <TTraceWrapper.h>
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"
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"
99 namespace ci = common_installer;
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;
111 namespace common_installer {
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());
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();
126 AppInstaller::~AppInstaller() {
129 void AppInstaller::Init() {
130 // for multi installer
131 context_->index.set(index_);
132 pkgmgr_->SetAppQueryInterface(index_);
134 switch (pkgmgr_->GetRequestType(index_)) {
135 case RequestType::Install:
138 case RequestType::Update:
141 case RequestType::Uninstall:
144 case RequestType::Reinstall:
147 case RequestType::Delta:
150 case RequestType::Move:
153 case RequestType::Recovery:
156 case RequestType::MountInstall:
159 case RequestType::MountUpdate:
162 case RequestType::ManifestDirectInstall:
163 ManifestDirectInstallSteps();
165 case RequestType::ManifestDirectUpdate:
166 ManifestDirectUpdateSteps();
168 case RequestType::ManifestPartialInstall:
169 ManifestPartialInstallSteps();
171 case RequestType::ManifestPartialUpdate:
172 ManifestPartialUpdateSteps();
174 case RequestType::PartialUninstall:
175 PartialUninstallSteps();
177 case RequestType::ReadonlyUpdateInstall:
178 ReadonlyUpdateInstallSteps();
180 case RequestType::ReadonlyUpdateUninstall:
181 ReadonlyUpdateUninstallSteps();
183 case RequestType::EnablePkg:
186 case RequestType::DisablePkg:
189 case RequestType::MigrateExtImg:
190 MigrateExtImgSteps();
192 case RequestType::RecoverDB:
201 AppInstaller::Result AppInstaller::Run() {
203 if (it_ != steps_.end() && result_ == Result::ERROR) {
204 LOG(ERROR) << "Failure occurs in step: " << (*it_)->name();
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;
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());
229 history += "|SUCCESS";
232 history_logger->WriteLog(::utils::LogLevel::LOG_INFO, "", history);
233 history_logger->WriteLogToFile();
236 AppInstaller::Result AppInstaller::Process() {
240 std::shared_ptr<utils::FileLogBackend>(new utils::FileLogBackend(
241 kLogFileName, kLogRotationSize, kLogMaximumRotation));
242 ::utils::LogCore::GetCore().AddLogBackend(failure_logger_);
244 unsigned total_steps = steps_.size();
245 unsigned current_step = 1;
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");
252 if (status_ != Step::Status::OK) {
253 if (status_ != Step::Status::RECOVERY_DONE) {
254 LOG(ERROR) << "Error during processing";
255 result_ = Result::ERROR;
259 SendProgress(current_step * kProgressRange / total_steps);
265 AppInstaller::Result AppInstaller::Undo() {
267 if (it_ == steps_.end())
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;
274 } while (it_-- != steps_.begin());
276 failure_logger_->WriteLogToFile();
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_);
291 AppInstaller::Result AppInstaller::Clean() {
292 const auto& recovery_file =
293 context_->recovery_info.get().recovery_file;
295 recovery_file->set_cleanup(true);
296 recovery_file->WriteAndCommitFileContent();
298 SendFinished(status_);
301 if (it_ == steps_.end())
303 if (SafeExecute(*it_, &Step::clean, "clean") != Step::Status::OK) {
304 LOG(ERROR) << "Error during clean operation(" << (*it_)->name() << ")";
305 result_ = Result::CLEANUP_ERROR;
308 } while (it_-- != steps_.begin());
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>();
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>();
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>();
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>();
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>();
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>();
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>();
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>();
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>();
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>();
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>();
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>();
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>();
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);
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>();
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>();
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);
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);
795 void AppInstaller::MigrateExtImgSteps() {
796 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
797 AddStep<ci::security::StepMigrateLegacyExtImage>();
798 AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
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>();
813 void AppInstaller::UnknownSteps() {
814 AddStep<configuration::StepFail>();
817 void AppInstaller::HandleStepError(Step::Status result,
818 const std::string& error) {
822 pi_->SendError(result, error, context_->pkg_type.get(),
823 context_->pkgid.get());
826 bool AppInstaller::SendStartIfNotSent() {
830 if (pi_->state() != PkgmgrSignal::State::NOT_SENT ||
831 context_->pkgid.get().empty())
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());
841 void AppInstaller::SendProgress(int progress) {
842 // send START signal as soon as possible if not sent
843 if (!SendStartIfNotSent())
846 // send installation progress
847 pi_->SendProgress(progress,
848 context_->pkg_type.get(), context_->pkgid.get());
851 void AppInstaller::SendFinished(Step::Status process_status) {
852 if (!SendStartIfNotSent())
855 pi_->SendFinished(process_status,
856 context_->pkg_type.get(),
857 context_->pkgid.get());
860 Step::Status AppInstaller::SafeExecute(std::unique_ptr<Step> const& step_ptr,
861 Step::Status (Step::*method)(),
863 Step::Status process_status = Step::Status::OK;
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;
872 return process_status;
875 } // namespace common_installer