// Copyright (c) 2012 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 CHROMEOS_CRYPTOHOME_SYSTEM_SALT_GETTER_H_
#define CHROMEOS_CRYPTOHOME_SYSTEM_SALT_GETTER_H_

#include <stdint.h>

#include <string>
#include <vector>

#include "base/callback_forward.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
#include "chromeos/chromeos_export.h"

namespace chromeos {

// This class is used to get the system salt from cryptohome and cache it.
class CHROMEOS_EXPORT SystemSaltGetter {
 public:
  typedef base::Callback<void(const std::string& system_salt)>
      GetSystemSaltCallback;

  using RawSalt = std::vector<uint8_t>;

  // Manage an explicitly initialized global instance.
  static void Initialize();
  static bool IsInitialized();
  static void Shutdown();
  static SystemSaltGetter* Get();

  // Converts |salt| to a hex encoded string.
  static std::string ConvertRawSaltToHexString(const RawSalt& salt);

  // Returns system hash in hex encoded ascii format. Note: this may return
  // an empty string (e.g. errors in D-Bus layer)
  void GetSystemSalt(const GetSystemSaltCallback& callback);

  // Adds another callback to be called when system salt is received.
  // (If system salt is available, closure will be called immediately).
  void AddOnSystemSaltReady(const base::Closure& closure);

  // Returns pointer to binary system salt if it is already known.
  // Returns nullptr if system salt is not known.
  const RawSalt* GetRawSalt() const;

  // This is for browser tests API.
  void SetRawSaltForTesting(const RawSalt& raw_salt);

 protected:
  SystemSaltGetter();
  ~SystemSaltGetter();

 private:
  // Used to implement GetSystemSalt().
  void DidWaitForServiceToBeAvailable(const GetSystemSaltCallback& callback,
                                      bool service_is_available);
  void DidGetSystemSalt(const GetSystemSaltCallback& callback,
                        base::Optional<std::vector<uint8_t>> system_salt);

  RawSalt raw_salt_;
  std::string system_salt_;

  // List of callbacks waiting for system salt ready event.
  std::vector<base::Closure> on_system_salt_ready_;

  base::WeakPtrFactory<SystemSaltGetter> weak_ptr_factory_;

  DISALLOW_COPY_AND_ASSIGN(SystemSaltGetter);
};

}  // namespace chromeos

#endif  // CHROMEOS_CRYPTOHOME_SYSTEM_SALT_GETTER_H_
