blob: f5a8a77c86598a7a57d9c1692635d005cd7fc86f [file] [log] [blame]
Vitaly Buka4615e0d2015-10-14 15:35:12 -07001// Copyright 2015 The Weave Authors. All rights reserved.
Vitaly Bukad322a3c2015-08-16 01:03:02 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef LIBWEAVE_SRC_CONFIG_H_
6#define LIBWEAVE_SRC_CONFIG_H_
7
8#include <set>
9#include <string>
10#include <vector>
11
12#include <base/callback.h>
Johan Euphrosine0b7bb9f2015-09-29 01:11:21 -070013#include <base/gtest_prod_util.h>
Vitaly Bukad322a3c2015-08-16 01:03:02 -070014#include <weave/error.h>
Vitaly Buka1e363672015-09-25 14:01:16 -070015#include <weave/provider/config_store.h>
Vitaly Bukad322a3c2015-08-16 01:03:02 -070016
Vitaly Buka63c98622015-12-11 11:06:04 -080017#include "src/privet/privet_types.h"
Vitaly Bukad322a3c2015-08-16 01:03:02 -070018
19namespace weave {
20
21class StorageInterface;
22
Vitaly Buka63c98622015-12-11 11:06:04 -080023enum class RootClientTokenOwner {
Vitaly Bukac3bc82a2015-12-14 23:24:13 -080024 // Keep order as it's used with order comparison operators.
Vitaly Buka63c98622015-12-11 11:06:04 -080025 kNone,
26 kClient,
27 kCloud,
28};
29
Vitaly Bukad322a3c2015-08-16 01:03:02 -070030// Handles reading buffet config and state files.
Vitaly Bukac11a17d2015-08-15 10:36:10 -070031class Config final {
Vitaly Bukad322a3c2015-08-16 01:03:02 -070032 public:
Vitaly Buka238db692015-09-29 16:58:39 -070033 struct Settings : public weave::Settings {
34 std::string refresh_token;
35 std::string robot_account;
36 std::string last_configured_ssid;
Vitaly Bukaf08caeb2015-12-02 13:47:48 -080037 std::vector<uint8_t> secret;
Vitaly Buka63c98622015-12-11 11:06:04 -080038 RootClientTokenOwner root_client_token_owner{RootClientTokenOwner::kNone};
Vitaly Buka238db692015-09-29 16:58:39 -070039 };
40
41 using OnChangedCallback = base::Callback<void(const weave::Settings&)>;
Vitaly Bukac11a17d2015-08-15 10:36:10 -070042 ~Config() = default;
Vitaly Bukad322a3c2015-08-16 01:03:02 -070043
Vitaly Buka1e363672015-09-25 14:01:16 -070044 explicit Config(provider::ConfigStore* config_store);
Vitaly Bukad322a3c2015-08-16 01:03:02 -070045
Vitaly Bukac11a17d2015-08-15 10:36:10 -070046 void AddOnChangedCallback(const OnChangedCallback& callback);
Vitaly Buka238db692015-09-29 16:58:39 -070047 const Config::Settings& GetSettings() const;
Vitaly Bukad322a3c2015-08-16 01:03:02 -070048
Vitaly Bukac11a17d2015-08-15 10:36:10 -070049 void Load();
Vitaly Bukad322a3c2015-08-16 01:03:02 -070050
51 // Allows editing of config. Makes sure that callbacks were called and changes
52 // were saved.
53 // User can commit changes by calling Commit method or by destroying the
54 // object.
55 class Transaction final {
56 public:
57 explicit Transaction(Config* config)
58 : config_(config), settings_(&config->settings_) {
59 CHECK(config_);
60 }
61
62 ~Transaction();
63
64 void set_client_id(const std::string& id) { settings_->client_id = id; }
65 void set_client_secret(const std::string& secret) {
66 settings_->client_secret = secret;
67 }
68 void set_api_key(const std::string& key) { settings_->api_key = key; }
69 void set_oauth_url(const std::string& url) { settings_->oauth_url = url; }
70 void set_service_url(const std::string& url) {
71 settings_->service_url = url;
72 }
73 void set_name(const std::string& name) { settings_->name = name; }
74 void set_description(const std::string& description) {
75 settings_->description = description;
76 }
77 void set_location(const std::string& location) {
78 settings_->location = location;
79 }
Vitaly Bukab624bc42015-09-29 19:13:55 -070080 void set_local_anonymous_access_role(AuthScope role) {
81 settings_->local_anonymous_access_role = role;
82 }
Vitaly Bukad322a3c2015-08-16 01:03:02 -070083 void set_local_discovery_enabled(bool enabled) {
84 settings_->local_discovery_enabled = enabled;
85 }
86 void set_local_pairing_enabled(bool enabled) {
87 settings_->local_pairing_enabled = enabled;
88 }
Johan Euphrosine312c2f52015-09-29 00:04:29 -070089 void set_cloud_id(const std::string& id) { settings_->cloud_id = id; }
Vitaly Bukad322a3c2015-08-16 01:03:02 -070090 void set_refresh_token(const std::string& token) {
91 settings_->refresh_token = token;
92 }
93 void set_robot_account(const std::string& account) {
94 settings_->robot_account = account;
95 }
96 void set_last_configured_ssid(const std::string& ssid) {
97 settings_->last_configured_ssid = ssid;
98 }
Vitaly Bukaf08caeb2015-12-02 13:47:48 -080099 void set_secret(const std::vector<uint8_t>& secret) {
100 settings_->secret = secret;
101 }
Vitaly Buka63c98622015-12-11 11:06:04 -0800102 void set_root_client_token_owner(
103 RootClientTokenOwner root_client_token_owner) {
104 settings_->root_client_token_owner = root_client_token_owner;
Vitaly Bukaa5803282015-12-06 20:11:55 -0800105 }
Vitaly Bukad322a3c2015-08-16 01:03:02 -0700106
107 void Commit();
108
109 private:
Johan Euphrosine0b7bb9f2015-09-29 01:11:21 -0700110 FRIEND_TEST_ALL_PREFIXES(ConfigTest, Setters);
111 void set_device_id(const std::string& id) {
112 config_->settings_.device_id = id;
113 }
114
Vitaly Bukad322a3c2015-08-16 01:03:02 -0700115 friend class Config;
116 void LoadState();
117 Config* config_;
118 Settings* settings_;
119 bool save_{true};
120 };
121
Vitaly Bukad322a3c2015-08-16 01:03:02 -0700122 private:
Vitaly Bukac11a17d2015-08-15 10:36:10 -0700123 void Save();
Vitaly Bukad322a3c2015-08-16 01:03:02 -0700124
Vitaly Bukac11a17d2015-08-15 10:36:10 -0700125 Settings settings_;
Vitaly Buka1e363672015-09-25 14:01:16 -0700126 provider::ConfigStore* config_store_{nullptr};
Vitaly Bukad322a3c2015-08-16 01:03:02 -0700127 std::vector<OnChangedCallback> on_changed_;
128
129 DISALLOW_COPY_AND_ASSIGN(Config);
130};
131
132} // namespace weave
133
134#endif // LIBWEAVE_SRC_CONFIG_H_