// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_OS_CRYPT_KEY_STORAGE_LINUX_H_
#define COMPONENTS_OS_CRYPT_KEY_STORAGE_LINUX_H_

#include <memory>
#include <string>

#include "base/component_export.h"
#include "base/macros.h"

namespace base {
class SequencedTaskRunner;
class WaitableEvent;
}

namespace os_crypt {
struct Config;
}

// An API for retrieving OSCrypt's password from the system's password storage
// service.
class COMPONENT_EXPORT(OS_CRYPT) KeyStorageLinux {
 public:
  KeyStorageLinux() = default;
  virtual ~KeyStorageLinux() = default;

  // Tries to load the appropriate key storage. Returns null if none succeed.
  static COMPONENT_EXPORT(OS_CRYPT)
      std::unique_ptr<KeyStorageLinux> CreateService(
          const os_crypt::Config& config);

  // Gets the encryption key from the OS password-managing library. If a key is
  // not found, a new key will be generated, stored and returned.
  std::string GetKey();

 protected:
  // Get the backend's favourite task runner, or nullptr for no preference.
  virtual base::SequencedTaskRunner* GetTaskRunner();

  // Loads the key storage. Returns false if the service is not available.
  // This iwill be called on the backend's preferred thread.
  virtual bool Init() = 0;

  // The implementation of GetKey() for a specific backend. This will be called
  // on the backend's preferred thread.
  virtual std::string GetKeyImpl() = 0;

  // The name of the group, if any, containing the key.
  static const char kFolderName[];
  // The name of the entry with the encryption key.
  static const char kKey[];

 private:
  // Performs Init() on the backend's preferred thread.
  bool WaitForInitOnTaskRunner();

  // Perform the blocking calls to the backend to get the Key. Store it in
  // |password| and signal completion on |on_password_received|.
  void BlockOnGetKeyImplThenSignal(base::WaitableEvent* on_password_received,
                                   std::string* password);

  // Perform the blocking calls to the backend to initialise. Store the
  // initialisation result in |success| and signal completion on |on_inited|.
  void BlockOnInitThenSignal(base::WaitableEvent* on_inited, bool* success);

  DISALLOW_COPY_AND_ASSIGN(KeyStorageLinux);
};

#endif  // COMPONENTS_OS_CRYPT_KEY_STORAGE_LINUX_H_
