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#ifndef BUFFET_BUFFET_CONFIG_H_
161175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka#define BUFFET_BUFFET_CONFIG_H_
171175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
18becd461462f428f136cd5368c664a951935222e9Vitaly Buka#include <map>
191175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka#include <set>
201175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka#include <string>
211175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka#include <vector>
221175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
231175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka#include <base/callback.h>
241175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka#include <base/files/file_path.h>
254170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko#include <brillo/errors/error.h>
264170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko#include <brillo/key_value_store.h>
27e32375bdf73d6e79a003a194e4c6931f38348520Alex Vakulenko#include <weave/provider/config_store.h>
281175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
29df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko#include "buffet/encryptor.h"
30df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko
311175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukanamespace buffet {
321175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
331175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Bukaclass StorageInterface;
341175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
351175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka// Handles reading buffet config and state files.
36e32375bdf73d6e79a003a194e4c6931f38348520Alex Vakulenkoclass BuffetConfig final : public weave::provider::ConfigStore {
371175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka public:
380022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko  struct Options {
392915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko    std::string client_id;
402915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko    std::string client_secret;
412915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko    std::string api_key;
422915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko    std::string oauth_url;
432915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko    std::string service_url;
442915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko
450022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko    base::FilePath defaults;
460022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko    base::FilePath settings;
470022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko
480022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko    base::FilePath definitions;
490022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko    base::FilePath test_definitions;
500022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko
510022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko    std::string test_privet_ssid;
520022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko  };
530022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko
54df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  // An IO abstraction to enable testing without using real files.
55df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  class FileIO {
56df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko   public:
57df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko    virtual bool ReadFile(const base::FilePath& path, std::string* content) = 0;
58df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko    virtual bool WriteFile(const base::FilePath& path,
59df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko                           const std::string& content) = 0;
60df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  };
61df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko
621175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  ~BuffetConfig() override = default;
631175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
640022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko  explicit BuffetConfig(const Options& options);
651175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
661175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  // Config overrides.
671175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  bool LoadDefaults(weave::Settings* settings) override;
68e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka  std::string LoadSettings(const std::string& name) override;
691175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  std::string LoadSettings() override;
70e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka  void SaveSettings(const std::string& name,
71e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka                    const std::string& settings,
72e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka                    const weave::DoneCallback& callback) override;
731175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
744170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko  bool LoadDefaults(const brillo::KeyValueStore& store,
751175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka                    weave::Settings* settings);
761175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
77df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  // Allows injection of a non-default |encryptor| for testing. The caller
78df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  // retains ownership of the pointer.
79df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  void SetEncryptor(Encryptor* encryptor) {
80df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko    encryptor_ = encryptor;
81df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  }
82df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko
83df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  // Allows injection of non-default |file_io| for testing. The caller retains
84df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  // ownership of the pointer.
85df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  void SetFileIO(FileIO* file_io) {
86df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko    file_io_ = file_io;
87df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  }
88df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko
891175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka private:
90e709fa7586dfd3fb8fd41cede0cd5dbc39b31acbVitaly Buka  base::FilePath CreatePath(const std::string& name) const;
91df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  bool LoadFile(const base::FilePath& file_path,
92df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko                std::string* data,
934170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko                brillo::ErrorPtr* error);
94df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko
950022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko  Options options_;
96df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  std::unique_ptr<Encryptor> default_encryptor_;
97df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  Encryptor* encryptor_{nullptr};
98df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  std::unique_ptr<FileIO> default_file_io_;
99df38164c0c7bfef18b68d3ba5be9a516bf6198deAlex Vakulenko  FileIO* file_io_{nullptr};
1001175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
1011175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka  DISALLOW_COPY_AND_ASSIGN(BuffetConfig);
1021175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka};
1031175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
1041175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka}  // namespace buffet
1051175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka
1061175a9bd12d1c52adfaa908d7e65a93ba8c6225eVitaly Buka#endif  // BUFFET_BUFFET_CONFIG_H_
107