blob: bf8891e0b817db3792de738ff9fce04030f38088 [file] [log] [blame]
Christopher Wiley583d64b2015-03-24 14:30: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
Alex Vakulenkof0281742015-05-18 14:31:10 -07007#include <base/files/file_util.h>
Christopher Wiley34eae042015-03-18 10:25:08 -07008#include <base/logging.h>
9#include <base/strings/string_number_conversions.h>
10
Vitaly Bukaee7a3af2015-05-14 16:57:23 -070011#include "buffet/storage_impls.h"
12#include "buffet/storage_interface.h"
13
Vitaly Buka867b0882015-04-16 10:03:26 -070014namespace {
15
16// TODO(vitalybuka): Remove this when deviceKind is gone from server.
17std::string GetDeviceKind(const std::string& manifest_id) {
18 CHECK_EQ(5u, manifest_id.size());
19 std::string kind = manifest_id.substr(0, 2);
20 if (kind == "AC")
21 return "accessPoint";
22 if (kind == "AK")
23 return "aggregator";
24 if (kind == "AM")
25 return "camera";
26 if (kind == "AB")
27 return "developmentBoard";
28 if (kind == "AE")
29 return "printer";
30 if (kind == "AF")
31 return "scanner";
32 if (kind == "AD")
33 return "speaker";
34 if (kind == "AL")
35 return "storage";
36 if (kind == "AJ")
37 return "toy";
38 if (kind == "AA")
39 return "vendor";
40 if (kind == "AN")
41 return "video";
42 LOG(FATAL) << "Invalid model id: " << manifest_id;
43 return std::string();
44}
45
Vitaly Buka2c1029f2015-04-30 22:47:18 -070046bool IsValidAccessRole(const std::string& role) {
Vitaly Buka94675202015-05-13 11:48:54 -070047 return role == "none" || role == "viewer" || role == "user";
Vitaly Buka2c1029f2015-04-30 22:47:18 -070048}
49
Vitaly Buka867b0882015-04-16 10:03:26 -070050} // namespace
51
Christopher Wiley583d64b2015-03-24 14:30:17 -070052namespace buffet {
Vitaly Buka867b0882015-04-16 10:03:26 -070053
Christopher Wiley583d64b2015-03-24 14:30:17 -070054namespace config_keys {
55
Vitaly Buka867b0882015-04-16 10:03:26 -070056const char kClientId[] = "client_id";
57const char kClientSecret[] = "client_secret";
58const char kApiKey[] = "api_key";
59const char kOAuthURL[] = "oauth_url";
60const char kServiceURL[] = "service_url";
61const char kName[] = "name";
62const char kDescription[] = "description";
63const char kLocation[] = "location";
Vitaly Buka4a3a9a22015-05-13 16:06:01 -070064const char kLocalAnonymousAccessRole[] = "local_anonymous_access_role";
65const char kLocalDiscoveryEnabled[] = "local_discovery_enabled";
66const char kLocalPairingEnabled[] = "local_pairing_enabled";
Vitaly Buka867b0882015-04-16 10:03:26 -070067const char kOemName[] = "oem_name";
68const char kModelName[] = "model_name";
69const char kModelId[] = "model_id";
Vitaly Buka2c1029f2015-04-30 22:47:18 -070070const char kPollingPeriodMs[] = "polling_period_ms";
Alex Vakulenkod05725f2015-05-27 15:48:19 -070071const char kBackupPollingPeriodMs[] = "backup_polling_period_ms";
Vitaly Bukaee7a3af2015-05-14 16:57:23 -070072const char kRefreshToken[] = "refresh_token";
73const char kDeviceId[] = "device_id";
74const char kRobotAccount[] = "robot_account";
Christopher Wiley583d64b2015-03-24 14:30:17 -070075
76} // namespace config_keys
77
Vitaly Bukaee7a3af2015-05-14 16:57:23 -070078BuffetConfig::BuffetConfig(std::unique_ptr<StorageInterface> storage)
79 : storage_{std::move(storage)} {
80}
81
82BuffetConfig::BuffetConfig(const base::FilePath& state_path)
83 : BuffetConfig{
84 std::unique_ptr<StorageInterface>{new FileStorage{state_path}}} {
85}
86
Christopher Wiley583d64b2015-03-24 14:30:17 -070087void BuffetConfig::Load(const base::FilePath& config_path) {
88 chromeos::KeyValueStore store;
Alex Vakulenkof0281742015-05-18 14:31:10 -070089 if (base::PathExists(config_path)) {
90 CHECK(store.Load(config_path)) << "Unable to read or parse config file at"
91 << config_path.value();
Christopher Wiley583d64b2015-03-24 14:30:17 -070092 }
Alex Vakulenkof0281742015-05-18 14:31:10 -070093 Load(store);
Christopher Wiley583d64b2015-03-24 14:30:17 -070094}
95
96void BuffetConfig::Load(const chromeos::KeyValueStore& store) {
Vitaly Bukaee7a3af2015-05-14 16:57:23 -070097 Transaction change{this};
98 change.save_ = false;
99
Christopher Wiley583d64b2015-03-24 14:30:17 -0700100 store.GetString(config_keys::kClientId, &client_id_);
Vitaly Buka867b0882015-04-16 10:03:26 -0700101 CHECK(!client_id_.empty());
102
Christopher Wiley583d64b2015-03-24 14:30:17 -0700103 store.GetString(config_keys::kClientSecret, &client_secret_);
Vitaly Buka867b0882015-04-16 10:03:26 -0700104 CHECK(!client_secret_.empty());
105
Christopher Wiley583d64b2015-03-24 14:30:17 -0700106 store.GetString(config_keys::kApiKey, &api_key_);
Vitaly Buka867b0882015-04-16 10:03:26 -0700107 CHECK(!api_key_.empty());
108
Christopher Wiley583d64b2015-03-24 14:30:17 -0700109 store.GetString(config_keys::kOAuthURL, &oauth_url_);
Vitaly Buka867b0882015-04-16 10:03:26 -0700110 CHECK(!oauth_url_.empty());
111
Christopher Wiley583d64b2015-03-24 14:30:17 -0700112 store.GetString(config_keys::kServiceURL, &service_url_);
Vitaly Buka867b0882015-04-16 10:03:26 -0700113 CHECK(!service_url_.empty());
114
115 store.GetString(config_keys::kOemName, &oem_name_);
116 CHECK(!oem_name_.empty());
117
118 store.GetString(config_keys::kModelName, &model_name_);
119 CHECK(!model_name_.empty());
120
Christopher Wiley583d64b2015-03-24 14:30:17 -0700121 store.GetString(config_keys::kModelId, &model_id_);
Vitaly Buka867b0882015-04-16 10:03:26 -0700122 device_kind_ = GetDeviceKind(model_id_);
123
Christopher Wiley34eae042015-03-18 10:25:08 -0700124 std::string polling_period_str;
Vitaly Buka867b0882015-04-16 10:03:26 -0700125 if (store.GetString(config_keys::kPollingPeriodMs, &polling_period_str))
126 CHECK(base::StringToUint64(polling_period_str, &polling_period_ms_));
127
Alex Vakulenkod05725f2015-05-27 15:48:19 -0700128 if (store.GetString(config_keys::kBackupPollingPeriodMs, &polling_period_str))
129 CHECK(base::StringToUint64(polling_period_str, &backup_polling_period_ms_));
130
Vitaly Buka867b0882015-04-16 10:03:26 -0700131 store.GetString(config_keys::kName, &name_);
132 CHECK(!name_.empty());
133
134 store.GetString(config_keys::kDescription, &description_);
135 store.GetString(config_keys::kLocation, &location_);
Vitaly Buka2c1029f2015-04-30 22:47:18 -0700136
Vitaly Buka4a3a9a22015-05-13 16:06:01 -0700137 store.GetString(config_keys::kLocalAnonymousAccessRole,
138 &local_anonymous_access_role_);
139 CHECK(IsValidAccessRole(local_anonymous_access_role_))
140 << "Invalid role: " << local_anonymous_access_role_;
141
142 store.GetBoolean(config_keys::kLocalDiscoveryEnabled,
143 &local_discovery_enabled_);
144 store.GetBoolean(config_keys::kLocalPairingEnabled, &local_pairing_enabled_);
Vitaly Bukaee7a3af2015-05-14 16:57:23 -0700145
146 change.LoadState();
Vitaly Buka867b0882015-04-16 10:03:26 -0700147}
148
Vitaly Bukaee7a3af2015-05-14 16:57:23 -0700149void BuffetConfig::Transaction::LoadState() {
150 if (!config_->storage_)
151 return;
152 auto value = config_->storage_->Load();
153 const base::DictionaryValue* dict = nullptr;
154 if (!value || !value->GetAsDictionary(&dict))
155 return;
156
Vitaly Bukaff81db62015-05-14 21:25:45 -0700157 std::string tmp;
158 bool tmp_bool{false};
Vitaly Bukaee7a3af2015-05-14 16:57:23 -0700159
Vitaly Bukaff81db62015-05-14 21:25:45 -0700160 if (dict->GetString(config_keys::kClientId, &tmp))
161 set_client_id(tmp);
Vitaly Bukaee7a3af2015-05-14 16:57:23 -0700162
Vitaly Bukaff81db62015-05-14 21:25:45 -0700163 if (dict->GetString(config_keys::kClientSecret, &tmp))
164 set_client_secret(tmp);
Vitaly Bukaee7a3af2015-05-14 16:57:23 -0700165
Vitaly Bukaff81db62015-05-14 21:25:45 -0700166 if (dict->GetString(config_keys::kApiKey, &tmp))
167 set_api_key(tmp);
Vitaly Bukaee7a3af2015-05-14 16:57:23 -0700168
Vitaly Bukaff81db62015-05-14 21:25:45 -0700169 if (dict->GetString(config_keys::kOAuthURL, &tmp))
170 set_oauth_url(tmp);
Vitaly Bukaee7a3af2015-05-14 16:57:23 -0700171
Vitaly Bukaff81db62015-05-14 21:25:45 -0700172 if (dict->GetString(config_keys::kServiceURL, &tmp))
173 set_service_url(tmp);
Vitaly Bukaee7a3af2015-05-14 16:57:23 -0700174
Vitaly Bukaff81db62015-05-14 21:25:45 -0700175 if (dict->GetString(config_keys::kName, &tmp))
176 set_name(tmp);
Vitaly Bukaee7a3af2015-05-14 16:57:23 -0700177
Vitaly Bukaff81db62015-05-14 21:25:45 -0700178 if (dict->GetString(config_keys::kDescription, &tmp))
179 set_description(tmp);
Vitaly Bukaee7a3af2015-05-14 16:57:23 -0700180
Vitaly Bukaff81db62015-05-14 21:25:45 -0700181 if (dict->GetString(config_keys::kLocation, &tmp))
182 set_location(tmp);
183
184 if (dict->GetString(config_keys::kLocalAnonymousAccessRole, &tmp))
185 set_local_anonymous_access_role(tmp);
186
187 if (dict->GetBoolean(config_keys::kLocalDiscoveryEnabled, &tmp_bool))
188 set_local_discovery_enabled(tmp_bool);
189
190 if (dict->GetBoolean(config_keys::kLocalPairingEnabled, &tmp_bool))
191 set_local_pairing_enabled(tmp_bool);
192
193 if (dict->GetString(config_keys::kRefreshToken, &tmp))
194 set_refresh_token(tmp);
195
196 if (dict->GetString(config_keys::kRobotAccount, &tmp))
197 set_robot_account(tmp);
198
199 if (dict->GetString(config_keys::kDeviceId, &tmp))
200 set_device_id(tmp);
Vitaly Bukaee7a3af2015-05-14 16:57:23 -0700201}
202
203bool BuffetConfig::Save() {
204 if (!storage_)
205 return false;
206 base::DictionaryValue dict;
Vitaly Bukaff81db62015-05-14 21:25:45 -0700207 dict.SetString(config_keys::kClientId, client_id_);
208 dict.SetString(config_keys::kClientSecret, client_secret_);
209 dict.SetString(config_keys::kApiKey, api_key_);
210 dict.SetString(config_keys::kOAuthURL, oauth_url_);
211 dict.SetString(config_keys::kServiceURL, service_url_);
Vitaly Bukaee7a3af2015-05-14 16:57:23 -0700212 dict.SetString(config_keys::kRefreshToken, refresh_token_);
213 dict.SetString(config_keys::kDeviceId, device_id_);
214 dict.SetString(config_keys::kRobotAccount, robot_account_);
215 dict.SetString(config_keys::kName, name_);
216 dict.SetString(config_keys::kDescription, description_);
217 dict.SetString(config_keys::kLocation, location_);
218 dict.SetString(config_keys::kLocalAnonymousAccessRole,
219 local_anonymous_access_role_);
220 dict.SetBoolean(config_keys::kLocalDiscoveryEnabled,
221 local_discovery_enabled_);
222 dict.SetBoolean(config_keys::kLocalPairingEnabled, local_pairing_enabled_);
223
224 return storage_->Save(dict);
225}
226
227BuffetConfig::Transaction::~Transaction() {
228 Commit();
229}
230
231bool BuffetConfig::Transaction::set_name(const std::string& name) {
Vitaly Buka4a3a9a22015-05-13 16:06:01 -0700232 if (name.empty()) {
233 LOG(ERROR) << "Invalid name: " << name;
234 return false;
Vitaly Buka2c1029f2015-04-30 22:47:18 -0700235 }
Vitaly Bukaee7a3af2015-05-14 16:57:23 -0700236 config_->name_ = name;
Vitaly Buka4a3a9a22015-05-13 16:06:01 -0700237 return true;
238}
239
Vitaly Bukaee7a3af2015-05-14 16:57:23 -0700240bool BuffetConfig::Transaction::set_local_anonymous_access_role(
241 const std::string& role) {
Vitaly Buka4a3a9a22015-05-13 16:06:01 -0700242 if (!IsValidAccessRole(role)) {
243 LOG(ERROR) << "Invalid role: " << role;
244 return false;
245 }
Vitaly Bukaee7a3af2015-05-14 16:57:23 -0700246 config_->local_anonymous_access_role_ = role;
Vitaly Buka4a3a9a22015-05-13 16:06:01 -0700247 return true;
Vitaly Buka2c1029f2015-04-30 22:47:18 -0700248}
249
Vitaly Bukaee7a3af2015-05-14 16:57:23 -0700250void BuffetConfig::Transaction::Commit() {
251 if (!config_)
252 return;
253 if (save_)
254 config_->Save();
255 for (const auto& cb : config_->on_changed_)
256 cb.Run(*config_);
257 config_ = nullptr;
258}
259
Christopher Wiley583d64b2015-03-24 14:30:17 -0700260} // namespace buffet