blob: c375e1fdebda1562db1711ab1156266972755625 [file] [log] [blame]
Vitaly Buka1175a9b2015-08-15 10:42:17 -07001// Copyright 2015 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 "buffet/buffet_config.h"
6
Vitaly Bukabecd4612015-08-16 23:31:55 -07007#include <map>
Vitaly Buka1175a9b2015-08-15 10:42:17 -07008#include <set>
9
10#include <base/files/file_util.h>
11#include <base/files/important_file_writer.h>
12#include <base/logging.h>
13#include <base/strings/string_number_conversions.h>
Vitaly Bukabecd4612015-08-16 23:31:55 -070014#include <chromeos/errors/error.h>
15#include <chromeos/errors/error_codes.h>
Vitaly Buka1175a9b2015-08-15 10:42:17 -070016#include <chromeos/strings/string_utils.h>
17#include <weave/enum_to_string.h>
18
19namespace buffet {
20
Alex Vakulenkodf381642015-10-08 07:34:23 -070021namespace {
22
23const char kErrorDomain[] = "buffet";
24const char kFileReadError[] = "file_read_error";
25
26class DefaultFileIO : public BuffetConfig::FileIO {
27 public:
28 bool ReadFile(const base::FilePath& path, std::string* content) override {
29 return base::ReadFileToString(path, content);
30 }
31 bool WriteFile(const base::FilePath& path,
32 const std::string& content) override {
33 return base::ImportantFileWriter::WriteFileAtomically(path, content);
34 }
35};
36
37} // namespace
38
Vitaly Buka1175a9b2015-08-15 10:42:17 -070039namespace config_keys {
40
41const char kClientId[] = "client_id";
42const char kClientSecret[] = "client_secret";
43const char kApiKey[] = "api_key";
44const char kOAuthURL[] = "oauth_url";
45const char kServiceURL[] = "service_url";
46const char kName[] = "name";
47const char kDescription[] = "description";
48const char kLocation[] = "location";
49const char kLocalAnonymousAccessRole[] = "local_anonymous_access_role";
50const char kLocalDiscoveryEnabled[] = "local_discovery_enabled";
51const char kLocalPairingEnabled[] = "local_pairing_enabled";
52const char kOemName[] = "oem_name";
53const char kModelName[] = "model_name";
54const char kModelId[] = "model_id";
Vitaly Buka1175a9b2015-08-15 10:42:17 -070055const char kWifiAutoSetupEnabled[] = "wifi_auto_setup_enabled";
Vitaly Buka1175a9b2015-08-15 10:42:17 -070056const char kEmbeddedCode[] = "embedded_code";
57const char kPairingModes[] = "pairing_modes";
58
59} // namespace config_keys
60
Alex Vakulenkodf381642015-10-08 07:34:23 -070061BuffetConfig::BuffetConfig(const Options& options)
62 : options_(options),
63 default_encryptor_(Encryptor::CreateDefaultEncryptor()),
64 encryptor_(default_encryptor_.get()),
65 default_file_io_(new DefaultFileIO),
66 file_io_(default_file_io_.get()) {}
Vitaly Buka1175a9b2015-08-15 10:42:17 -070067
68bool BuffetConfig::LoadDefaults(weave::Settings* settings) {
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070069 // Keep this hardcoded default for sometime. This previously was set by
70 // libweave. It should be set by overlay's buffet.conf.
Alex Vakulenko0022b752015-10-02 11:09:59 -070071 settings->client_id = "58855907228.apps.googleusercontent.com";
72 settings->client_secret = "eHSAREAHrIqPsHBxCE9zPPBi";
73 settings->api_key = "AIzaSyDSq46gG-AxUnC3zoqD9COIPrjolFsMfMA";
74 settings->name = "Developer device";
75 settings->oem_name = "Chromium";
76 settings->model_name = "Brillo";
77 settings->model_id = "AAAAA";
78
79 if (!base::PathExists(options_.defaults))
Vitaly Buka1175a9b2015-08-15 10:42:17 -070080 return true; // Nothing to load.
81
82 chromeos::KeyValueStore store;
Alex Vakulenko0022b752015-10-02 11:09:59 -070083 if (!store.Load(options_.defaults))
Vitaly Buka1175a9b2015-08-15 10:42:17 -070084 return false;
Alex Vakulenko0022b752015-10-02 11:09:59 -070085 bool result = LoadDefaults(store, settings);
86 settings->disable_security = options_.disable_security;
87 settings->test_privet_ssid = options_.test_privet_ssid;
Vitaly Bukabecd4612015-08-16 23:31:55 -070088
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070089 if (!options_.client_id.empty())
90 settings->client_id = options_.client_id;
91 if (!options_.client_secret.empty())
92 settings->client_secret = options_.client_secret;
93 if (!options_.api_key.empty())
94 settings->api_key = options_.api_key;
95 if (!options_.oauth_url.empty())
96 settings->oauth_url = options_.oauth_url;
97 if (!options_.service_url.empty())
98 settings->service_url = options_.service_url;
Vitaly Bukabecd4612015-08-16 23:31:55 -070099
Vitaly Bukabecd4612015-08-16 23:31:55 -0700100 return result;
101}
102
Vitaly Buka1175a9b2015-08-15 10:42:17 -0700103bool BuffetConfig::LoadDefaults(const chromeos::KeyValueStore& store,
104 weave::Settings* settings) {
105 store.GetString(config_keys::kClientId, &settings->client_id);
106 store.GetString(config_keys::kClientSecret, &settings->client_secret);
107 store.GetString(config_keys::kApiKey, &settings->api_key);
108 store.GetString(config_keys::kOAuthURL, &settings->oauth_url);
109 store.GetString(config_keys::kServiceURL, &settings->service_url);
110 store.GetString(config_keys::kOemName, &settings->oem_name);
111 store.GetString(config_keys::kModelName, &settings->model_name);
112 store.GetString(config_keys::kModelId, &settings->model_id);
Vitaly Buka7b9ebee2015-08-16 01:55:41 -0700113
114 base::FilePath lsb_release_path("/etc/lsb-release");
115 chromeos::KeyValueStore lsb_release_store;
116 if (lsb_release_store.Load(lsb_release_path) &&
117 lsb_release_store.GetString("CHROMEOS_RELEASE_VERSION",
118 &settings->firmware_version)) {
119 } else {
120 LOG(ERROR) << "Failed to get CHROMEOS_RELEASE_VERSION from "
121 << lsb_release_path.value();
122 }
123
Vitaly Buka1175a9b2015-08-15 10:42:17 -0700124 store.GetBoolean(config_keys::kWifiAutoSetupEnabled,
125 &settings->wifi_auto_setup_enabled);
Vitaly Buka1175a9b2015-08-15 10:42:17 -0700126 store.GetString(config_keys::kEmbeddedCode, &settings->embedded_code);
127
128 std::string modes_str;
129 if (store.GetString(config_keys::kPairingModes, &modes_str)) {
130 std::set<weave::PairingType> pairing_modes;
131 for (const std::string& mode :
132 chromeos::string_utils::Split(modes_str, ",", true, true)) {
133 weave::PairingType pairing_mode;
134 if (!StringToEnum(mode, &pairing_mode))
135 return false;
136 pairing_modes.insert(pairing_mode);
137 }
138 settings->pairing_modes = std::move(pairing_modes);
139 }
140
141 store.GetString(config_keys::kName, &settings->name);
142 store.GetString(config_keys::kDescription, &settings->description);
143 store.GetString(config_keys::kLocation, &settings->location);
Alex Vakulenko0022b752015-10-02 11:09:59 -0700144
145 std::string role_str;
146 if (store.GetString(config_keys::kLocalAnonymousAccessRole, &role_str)) {
147 if (!StringToEnum(role_str, &settings->local_anonymous_access_role))
148 return false;
149 }
Vitaly Buka1175a9b2015-08-15 10:42:17 -0700150 store.GetBoolean(config_keys::kLocalDiscoveryEnabled,
151 &settings->local_discovery_enabled);
152 store.GetBoolean(config_keys::kLocalPairingEnabled,
153 &settings->local_pairing_enabled);
154 return true;
155}
156
157std::string BuffetConfig::LoadSettings() {
Alex Vakulenkodf381642015-10-08 07:34:23 -0700158 std::string settings_blob;
159 if (!file_io_->ReadFile(options_.settings, &settings_blob)) {
160 LOG(WARNING) << "Failed to read settings, proceeding with empty settings.";
161 return std::string();
162 }
Vitaly Buka1175a9b2015-08-15 10:42:17 -0700163 std::string json_string;
Alex Vakulenkodf381642015-10-08 07:34:23 -0700164 if (!encryptor_->DecryptWithAuthentication(settings_blob, &json_string)) {
165 LOG(WARNING)
166 << "Failed to decrypt settings, proceeding with empty settings.";
167 SaveSettings(std::string());
168 return std::string();
169 }
Vitaly Buka1175a9b2015-08-15 10:42:17 -0700170 return json_string;
171}
172
173void BuffetConfig::SaveSettings(const std::string& settings) {
Alex Vakulenkodf381642015-10-08 07:34:23 -0700174 std::string encrypted_settings;
175 if (!encryptor_->EncryptWithAuthentication(settings, &encrypted_settings)) {
176 LOG(ERROR) << "Failed to encrypt settings, writing empty settings.";
177 encrypted_settings.clear();
178 }
179 if (!file_io_->WriteFile(options_.settings, encrypted_settings)) {
180 LOG(ERROR) << "Failed to write settings.";
181 }
182}
183
184bool BuffetConfig::LoadFile(const base::FilePath& file_path,
185 std::string* data,
186 chromeos::ErrorPtr* error) {
187 if (!file_io_->ReadFile(file_path, data)) {
188 chromeos::errors::system::AddSystemError(error, FROM_HERE, errno);
189 chromeos::Error::AddToPrintf(error, FROM_HERE, kErrorDomain, kFileReadError,
190 "Failed to read file '%s'",
191 file_path.value().c_str());
192 return false;
193 }
194 return true;
Vitaly Buka1175a9b2015-08-15 10:42:17 -0700195}
196
197} // namespace buffet