// 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 "install_attributes/libinstallattributes.h"

#include <base/files/file_util.h>
#include <base/logging.h>

#include "bindings/install_attributes.pb.h"  // NOLINT(build/include_directory)

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
// //chromeos/tpm/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());
  }
}
