1cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// Copyright 2015 The Android Open Source Project
2cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka//
3cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// Licensed under the Apache License, Version 2.0 (the "License");
4cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// you may not use this file except in compliance with the License.
5cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// You may obtain a copy of the License at
6cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka//
7cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka//      http://www.apache.org/licenses/LICENSE-2.0
8cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka//
9cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// Unless required by applicable law or agreed to in writing, software
10cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// distributed under the License is distributed on an "AS IS" BASIS,
11cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// See the License for the specific language governing permissions and
13cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// limitations under the License.
141175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
151175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka#include "buffet/buffet_config.h"
161175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
17becd461462f428f136cd5368c664a951935222e9Vitaly Buka#include <map>
181175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka#include <set>
191175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
201175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka#include <base/files/file_util.h>
211175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka#include <base/files/important_file_writer.h>
221175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka#include <base/logging.h>
23e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka#include <base/message_loop/message_loop.h>
241175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka#include <base/strings/string_number_conversions.h>
254170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko#include <brillo/errors/error.h>
264170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko#include <brillo/errors/error_codes.h>
279d44802b928ea31c58d18ded0d155bb72c0e436cAlex Vakulenko#include <brillo/osrelease_reader.h>
284170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko#include <brillo/strings/string_utils.h>
291175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka#include <weave/enum_to_string.h>
301175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
311175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukanamespace buffet {
321175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
33df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenkonamespace {
34df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko
35df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenkoconst char kErrorDomain[] = "buffet";
36df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenkoconst char kFileReadError[] = "file_read_error";
379d44802b928ea31c58d18ded0d155bb72c0e436cAlex Vakulenkoconst char kProductVersionKey[] = "product_version";
38df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko
39df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenkoclass DefaultFileIO : public BuffetConfig::FileIO {
40df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko public:
41df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  bool ReadFile(const base::FilePath& path, std::string* content) override {
42df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko    return base::ReadFileToString(path, content);
43df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  }
44df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  bool WriteFile(const base::FilePath& path,
45df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko                 const std::string& content) override {
46df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko    return base::ImportantFileWriter::WriteFileAtomically(path, content);
47df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  }
48df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko};
49df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko
50df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko}  // namespace
51df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko
521175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukanamespace config_keys {
531175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
541175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukaconst char kClientId[] = "client_id";
551175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukaconst char kClientSecret[] = "client_secret";
561175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukaconst char kApiKey[] = "api_key";
571175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukaconst char kOAuthURL[] = "oauth_url";
581175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukaconst char kServiceURL[] = "service_url";
591175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukaconst char kName[] = "name";
601175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukaconst char kDescription[] = "description";
611175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukaconst char kLocation[] = "location";
621175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukaconst char kLocalAnonymousAccessRole[] = "local_anonymous_access_role";
631175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukaconst char kLocalDiscoveryEnabled[] = "local_discovery_enabled";
641175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukaconst char kLocalPairingEnabled[] = "local_pairing_enabled";
651175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukaconst char kOemName[] = "oem_name";
661175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukaconst char kModelName[] = "model_name";
671175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukaconst char kModelId[] = "model_id";
681175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukaconst char kWifiAutoSetupEnabled[] = "wifi_auto_setup_enabled";
691175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukaconst char kEmbeddedCode[] = "embedded_code";
701175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukaconst char kPairingModes[] = "pairing_modes";
711175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
721175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka}  // namespace config_keys
731175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
74df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex VakulenkoBuffetConfig::BuffetConfig(const Options& options)
75df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko    : options_(options),
76df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko      default_encryptor_(Encryptor::CreateDefaultEncryptor()),
77df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko      encryptor_(default_encryptor_.get()),
78df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko      default_file_io_(new DefaultFileIO),
79df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko      file_io_(default_file_io_.get()) {}
801175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
811175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukabool BuffetConfig::LoadDefaults(weave::Settings* settings) {
822915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko  // Keep this hardcoded default for sometime. This previously was set by
832915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko  // libweave. It should be set by overlay's buffet.conf.
8474a0c32e422005757e4294d25d6098493cbd79afVitaly Buka  // Keys owners: avakulenko, gene, vitalybuka.
854de62fa88b245130a7d25aa88fb4d0c8205df4aaVitaly Buka  settings->client_id =
864de62fa88b245130a7d25aa88fb4d0c8205df4aaVitaly Buka      "338428340000-vkb4p6h40c7kja1k3l70kke8t615cjit.apps.googleusercontent."
874de62fa88b245130a7d25aa88fb4d0c8205df4aaVitaly Buka      "com";
884de62fa88b245130a7d25aa88fb4d0c8205df4aaVitaly Buka  settings->client_secret = "LS_iPYo_WIOE0m2VnLdduhnx";
894de62fa88b245130a7d25aa88fb4d0c8205df4aaVitaly Buka  settings->api_key = "AIzaSyACK3oZtmIylUKXiTMqkZqfuRiCgQmQSAQ";
904de62fa88b245130a7d25aa88fb4d0c8205df4aaVitaly Buka
910022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko  settings->name = "Developer device";
920022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko  settings->oem_name = "Chromium";
930022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko  settings->model_name = "Brillo";
940022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko  settings->model_id = "AAAAA";
950022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko
960022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko  if (!base::PathExists(options_.defaults))
971175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka    return true;  // Nothing to load.
981175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
994170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko  brillo::KeyValueStore store;
1000022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko  if (!store.Load(options_.defaults))
1011175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka    return false;
1020022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko  bool result = LoadDefaults(store, settings);
1030022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko  settings->test_privet_ssid = options_.test_privet_ssid;
104becd461462f428f136cd5368c664a951935222e9Vitaly Buka
1052915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko  if (!options_.client_id.empty())
1062915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko    settings->client_id = options_.client_id;
1072915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko  if (!options_.client_secret.empty())
1082915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko    settings->client_secret = options_.client_secret;
1092915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko  if (!options_.api_key.empty())
1102915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko    settings->api_key = options_.api_key;
1112915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko  if (!options_.oauth_url.empty())
1122915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko    settings->oauth_url = options_.oauth_url;
1132915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko  if (!options_.service_url.empty())
1142915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko    settings->service_url = options_.service_url;
115becd461462f428f136cd5368c664a951935222e9Vitaly Buka
116becd461462f428f136cd5368c664a951935222e9Vitaly Buka  return result;
117becd461462f428f136cd5368c664a951935222e9Vitaly Buka}
118becd461462f428f136cd5368c664a951935222e9Vitaly Buka
1194170585fe75d99036883229081420f2972dd4ec1Alex Vakulenkobool BuffetConfig::LoadDefaults(const brillo::KeyValueStore& store,
1201175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka                                weave::Settings* settings) {
1211175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  store.GetString(config_keys::kClientId, &settings->client_id);
1221175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  store.GetString(config_keys::kClientSecret, &settings->client_secret);
1231175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  store.GetString(config_keys::kApiKey, &settings->api_key);
1241175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  store.GetString(config_keys::kOAuthURL, &settings->oauth_url);
1251175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  store.GetString(config_keys::kServiceURL, &settings->service_url);
1261175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  store.GetString(config_keys::kOemName, &settings->oem_name);
1271175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  store.GetString(config_keys::kModelName, &settings->model_name);
1281175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  store.GetString(config_keys::kModelId, &settings->model_id);
1297b9ebeea8658473ec823ff5ff6521e7e641bc2ebVitaly Buka
1309d44802b928ea31c58d18ded0d155bb72c0e436cAlex Vakulenko  brillo::OsReleaseReader reader;
1319d44802b928ea31c58d18ded0d155bb72c0e436cAlex Vakulenko  reader.Load();
1329d44802b928ea31c58d18ded0d155bb72c0e436cAlex Vakulenko  if (!reader.GetString(kProductVersionKey, &settings->firmware_version)) {
1339d44802b928ea31c58d18ded0d155bb72c0e436cAlex Vakulenko    LOG(ERROR) << "Could not read '" << kProductVersionKey << "' from OS";
1347b9ebeea8658473ec823ff5ff6521e7e641bc2ebVitaly Buka  }
1357b9ebeea8658473ec823ff5ff6521e7e641bc2ebVitaly Buka
1361175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  store.GetBoolean(config_keys::kWifiAutoSetupEnabled,
1371175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka                   &settings->wifi_auto_setup_enabled);
1381175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  store.GetString(config_keys::kEmbeddedCode, &settings->embedded_code);
1391175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
1401175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  std::string modes_str;
1411175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  if (store.GetString(config_keys::kPairingModes, &modes_str)) {
1421175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka    std::set<weave::PairingType> pairing_modes;
1431175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka    for (const std::string& mode :
1444170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko         brillo::string_utils::Split(modes_str, ",", true, true)) {
1451175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka      weave::PairingType pairing_mode;
1461175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka      if (!StringToEnum(mode, &pairing_mode))
1471175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka        return false;
1481175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka      pairing_modes.insert(pairing_mode);
1491175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka    }
1501175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka    settings->pairing_modes = std::move(pairing_modes);
1511175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  }
1521175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
1531175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  store.GetString(config_keys::kName, &settings->name);
1541175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  store.GetString(config_keys::kDescription, &settings->description);
1551175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  store.GetString(config_keys::kLocation, &settings->location);
1560022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko
1570022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko  std::string role_str;
1580022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko  if (store.GetString(config_keys::kLocalAnonymousAccessRole, &role_str)) {
1590022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko    if (!StringToEnum(role_str, &settings->local_anonymous_access_role))
1600022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko      return false;
1610022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko  }
1621175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  store.GetBoolean(config_keys::kLocalDiscoveryEnabled,
1631175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka                   &settings->local_discovery_enabled);
1641175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  store.GetBoolean(config_keys::kLocalPairingEnabled,
1651175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka                   &settings->local_pairing_enabled);
1661175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  return true;
1671175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka}
1681175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
169e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Bukastd::string BuffetConfig::LoadSettings(const std::string& name) {
170df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  std::string settings_blob;
171e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka  base::FilePath path = CreatePath(name);
172e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka  if (!file_io_->ReadFile(path, &settings_blob)) {
173e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka    LOG(WARNING) << "Failed to read \'" + path.value() +
174e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka                        "\', proceeding with empty settings.";
175df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko    return std::string();
176df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  }
1771175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  std::string json_string;
178df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  if (!encryptor_->DecryptWithAuthentication(settings_blob, &json_string)) {
179df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko    LOG(WARNING)
180df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko        << "Failed to decrypt settings, proceeding with empty settings.";
181e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka    SaveSettings(std::string(), name, {});
182df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko    return std::string();
183df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  }
1841175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  return json_string;
1851175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka}
1861175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
187e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Bukastd::string BuffetConfig::LoadSettings() {
188e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka  return LoadSettings("");
189e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka}
190e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka
191e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Bukavoid BuffetConfig::SaveSettings(const std::string& name,
192e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka                                const std::string& settings,
193e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka                                const weave::DoneCallback& callback) {
194df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  std::string encrypted_settings;
195e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka  weave::ErrorPtr error;
196e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka  base::FilePath path = CreatePath(name);
197df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  if (!encryptor_->EncryptWithAuthentication(settings, &encrypted_settings)) {
198e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka    weave::Error::AddTo(&error, FROM_HERE, "file_write_error",
199e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka                        "Failed to encrypt settings.");
200df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko    encrypted_settings.clear();
201df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  }
202e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka  if (!file_io_->WriteFile(path, encrypted_settings)) {
203e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka    weave::Error::AddTo(&error, FROM_HERE, "file_write_error",
204e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka                        "Failed to write \'" + path.value() +
205e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka                            "\', proceeding with empty settings.");
206df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  }
207e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka  if (!callback.is_null()) {
208e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka    base::MessageLoop::current()->PostTask(
209e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka        FROM_HERE, base::Bind(callback, base::Passed(&error)));
210e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka  }
211e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka}
212e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka
213e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Bukabase::FilePath BuffetConfig::CreatePath(const std::string& name) const {
214e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka  return name.empty() ? options_.settings
215e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka                      : options_.settings.InsertBeforeExtension(
216e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka                            base::FilePath::kExtensionSeparator + name);
217df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko}
218df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko
219df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenkobool BuffetConfig::LoadFile(const base::FilePath& file_path,
220df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko                            std::string* data,
2214170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko                            brillo::ErrorPtr* error) {
222df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  if (!file_io_->ReadFile(file_path, data)) {
2234170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko    brillo::errors::system::AddSystemError(error, FROM_HERE, errno);
2244170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko    brillo::Error::AddToPrintf(error, FROM_HERE, kErrorDomain, kFileReadError,
225df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko                                 "Failed to read file '%s'",
226df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko                                 file_path.value().c_str());
227df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko    return false;
228df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  }
229df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  return true;
2301175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka}
2311175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
2321175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka}  // namespace buffet
233