namespace common_installer {
namespace security {
-bool StepRecoverSecurity::Check() {
- if (context_->pkg_path.get().empty())
+bool StepRecoverSecurity::Check(bool is_update) {
+ if (context_->GetPkgPath().empty())
return false;
- if (!boost::filesystem::exists(context_->pkg_path.get()))
+ if (!boost::filesystem::exists(context_->GetPkgPath()) && is_update)
return false;
if (context_->pkgid.get().empty())
return false;
- if (!context_->manifest_data.get())
- return false;
return true;
}
Step::Status StepRecoverSecurity::RecoveryNew() {
- if (!Check())
+ if (!Check(false))
+ return Status::OK;
+ recovery::RecoveryFile* recovery_file =
+ context_->recovery_info.get().recovery_file.get();
+ if (!recovery_file->security_operation_done()) {
+ LOG(DEBUG) << "security_operation_done false skip recover security";
return Status::OK;
+ }
std::string error_message;
- if (!UnregisterSecurityContextForManifest(
- context_->pkgid.get(), context_->uid.get(),
+ if (!context_->manifest_data.get()) {
+ if (!UnregisterSecurityContextForPkgId(context_->pkgid.get(),
+ context_->pkg_type.get(), context_->uid.get(), &error_message, true)) {
+ LOG(ERROR) << "Unsuccessful install";
+ if (!error_message.empty()) {
+ LOG(ERROR) << "error_message: " << error_message;
+ on_error(Status::RECOVERY_ERROR, error_message);
+ }
+ return Status::RECOVERY_ERROR;
+ }
+ } else if (!UnregisterSecurityContextForManifest(
+ context_->pkgid.get(), context_->pkg_type.get(), context_->uid.get(),
context_->manifest_data.get(), &error_message)) {
LOG(ERROR) << "Unsuccessful install";
if (!error_message.empty()) {
}
Step::Status StepRecoverSecurity::RecoveryUpdate() {
- if (!Check()) {
+ if (!Check(true)) {
LOG(ERROR) << "Invalid parameters";
return Status::INVALID_VALUE;
}
+ recovery::RecoveryFile* recovery_file =
+ context_->recovery_info.get().recovery_file.get();
+ if (!recovery_file->security_operation_done()) {
+ LOG(DEBUG) << "security_operation_done false skip recover security";
+ return Status::OK;
+ }
std::string error_message;
- if (!RegisterSecurityContextForManifest(
- context_->pkgid.get(), context_->pkg_path.get(), context_->uid.get(),
- &context_->certificate_info.get(), context_->manifest_data.get(),
- &error_message)) {
+ if (!RegisterSecurityContextForManifest(context_, &error_message)) {
LOG(ERROR) << "Unsuccessful update";
if (!error_message.empty()) {
LOG(ERROR) << "error_message: " << error_message;
return Status::RECOVERY_ERROR;
}
if (!RegisterSecurityContextForPath(
- context_->pkgid.get(), context_->pkg_path.get(), context_->uid.get(),
- &error_message)) {
+ context_->pkgid.get(), context_->GetPkgPath(), context_->uid.get(),
+ context_->is_readonly_package.get(), &error_message)) {
+ if (!error_message.empty()) {
+ LOG(ERROR) << "error_message: " << error_message;
+ on_error(Status::RECOVERY_ERROR, error_message);
+ }
+ return Status::RECOVERY_ERROR;
+ }
+ return Status::OK;
+}
+
+Step::Status StepRecoverSecurity::RecoveryReadonlyUpdateInstall() {
+ if (!Check(false)) {
+ LOG(ERROR) << "Invalid parameters";
+ return Status::INVALID_VALUE;
+ }
+ recovery::RecoveryFile* recovery_file =
+ context_->recovery_info.get().recovery_file.get();
+ if (!recovery_file->security_operation_done()) {
+ LOG(DEBUG) << "security_operation_done false skip recover security";
+ return Status::OK;
+ }
+ std::string error_message;
+ if (!RegisterSecurityContextForManifest(context_, &error_message)) {
+ LOG(ERROR) << "Unsuccessful update";
if (!error_message.empty()) {
LOG(ERROR) << "error_message: " << error_message;
- on_error(Status::SECURITY_ERROR, error_message);
+ on_error(Status::RECOVERY_ERROR, error_message);
}
return Status::RECOVERY_ERROR;
}
return Status::OK;
}
+
} // namespace security
} // namespace common_installer