Home | History | Annotate | Download | only in install_attributes
      1 // Copyright 2016 The Chromium OS Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "libinstallattributes.h"
      6 
      7 #include <base/files/file_util.h>
      8 #include <base/logging.h>
      9 
     10 #include "bindings/install_attributes.pb.h"
     11 
     12 namespace {
     13 
     14 // Written by cryptohome or by lockbox-cache after signature verification and
     15 // thus guaranteed to be unadulterated.
     16 const char kInstallAttributesPath[] = "/run/lockbox/install_attributes.pb";
     17 
     18 }  // namespace
     19 
     20 // The source of truth for these constants is Chromium
     21 // //chrome/browser/chromeos/settings/install_attributes.cc.
     22 const char InstallAttributesReader::kAttrMode[] = "enterprise.mode";
     23 const char InstallAttributesReader::kDeviceModeConsumer[] = "consumer";
     24 const char InstallAttributesReader::kDeviceModeEnterprise[] = "enterprise";
     25 const char InstallAttributesReader::kDeviceModeEnterpriseAD[] = "enterprise_ad";
     26 const char InstallAttributesReader::kDeviceModeLegacyRetail[] = "kiosk";
     27 const char InstallAttributesReader::kDeviceModeConsumerKiosk[] =
     28     "consumer_kiosk";
     29 
     30 InstallAttributesReader::InstallAttributesReader()
     31     : install_attributes_path_(kInstallAttributesPath) {
     32 }
     33 
     34 InstallAttributesReader::~InstallAttributesReader() {
     35 }
     36 
     37 const std::string& InstallAttributesReader::GetAttribute(
     38     const std::string& key) {
     39   // By its very nature of immutable attributes, once read successfully the
     40   // attributes can never change and thus never need reloading.
     41   if (!initialized_) {
     42     TryToLoad();
     43   }
     44 
     45   const auto entry = attributes_.find(key);
     46   if (entry == attributes_.end()) {
     47     return empty_string_;
     48   }
     49   return entry->second;
     50 }
     51 
     52 bool InstallAttributesReader::IsLocked() {
     53   if (!initialized_) {
     54     TryToLoad();
     55   }
     56   return initialized_;
     57 }
     58 
     59 void InstallAttributesReader::TryToLoad() {
     60   std::string contents;
     61   if (!base::ReadFileToString(install_attributes_path_, &contents)) {
     62     // May fail during OOBE or early in the boot process.
     63     return;
     64   }
     65 
     66   // Parse errors are unrecoverable (lockbox does atomic write), thus mark as
     67   // inititialized already before checking for parse errors.
     68   initialized_ = true;
     69 
     70   cryptohome::SerializedInstallAttributes install_attributes;
     71   if (!install_attributes.ParseFromString(contents)) {
     72     LOG(ERROR) << "Can't parse install attributes.";
     73     return;
     74   }
     75 
     76   for (int i = 0; i < install_attributes.attributes_size(); ++i) {
     77     const cryptohome::SerializedInstallAttributes_Attribute& attribute =
     78         install_attributes.attributes(i);
     79     // Cast value to C string and back to remove trailing zero.
     80     attributes_[attribute.name()] = std::string(attribute.value().c_str());
     81   }
     82 }
     83