| // Copyright 2016 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "libinstallattributes.h" |
| |
| #include <base/files/file_util.h> |
| #include <base/logging.h> |
| |
| #include "bindings/install_attributes.pb.h" |
| |
| namespace { |
| |
| // Written by cryptohome or by lockbox-cache after signature verification and |
| // thus guaranteed to be unadulterated. |
| const char kInstallAttributesPath[] = "/run/lockbox/install_attributes.pb"; |
| |
| } // namespace |
| |
| // The source of truth for these constants is Chromium |
| // //chrome/browser/chromeos/settings/install_attributes.cc. |
| const char InstallAttributesReader::kAttrMode[] = "enterprise.mode"; |
| const char InstallAttributesReader::kDeviceModeConsumer[] = "consumer"; |
| const char InstallAttributesReader::kDeviceModeEnterprise[] = "enterprise"; |
| const char InstallAttributesReader::kDeviceModeEnterpriseAD[] = "enterprise_ad"; |
| const char InstallAttributesReader::kDeviceModeLegacyRetail[] = "kiosk"; |
| const char InstallAttributesReader::kDeviceModeConsumerKiosk[] = |
| "consumer_kiosk"; |
| |
| InstallAttributesReader::InstallAttributesReader() |
| : install_attributes_path_(kInstallAttributesPath) { |
| } |
| |
| InstallAttributesReader::~InstallAttributesReader() { |
| } |
| |
| const std::string& InstallAttributesReader::GetAttribute( |
| const std::string& key) { |
| // By its very nature of immutable attributes, once read successfully the |
| // attributes can never change and thus never need reloading. |
| if (!initialized_) { |
| TryToLoad(); |
| } |
| |
| const auto entry = attributes_.find(key); |
| if (entry == attributes_.end()) { |
| return empty_string_; |
| } |
| return entry->second; |
| } |
| |
| bool InstallAttributesReader::IsLocked() { |
| if (!initialized_) { |
| TryToLoad(); |
| } |
| return initialized_; |
| } |
| |
| void InstallAttributesReader::TryToLoad() { |
| std::string contents; |
| if (!base::ReadFileToString(install_attributes_path_, &contents)) { |
| // May fail during OOBE or early in the boot process. |
| return; |
| } |
| |
| // Parse errors are unrecoverable (lockbox does atomic write), thus mark as |
| // inititialized already before checking for parse errors. |
| initialized_ = true; |
| |
| cryptohome::SerializedInstallAttributes install_attributes; |
| if (!install_attributes.ParseFromString(contents)) { |
| LOG(ERROR) << "Can't parse install attributes."; |
| return; |
| } |
| |
| for (int i = 0; i < install_attributes.attributes_size(); ++i) { |
| const cryptohome::SerializedInstallAttributes_Attribute& attribute = |
| install_attributes.attributes(i); |
| // Cast value to C string and back to remove trailing zero. |
| attributes_[attribute.name()] = std::string(attribute.value().c_str()); |
| } |
| } |