// Copyright (c) 2012 The Chromium OS 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 LOGIN_MANAGER_POLICY_STORE_H_
#define LOGIN_MANAGER_POLICY_STORE_H_

#include <string>

#include <base/files/file_path.h>
#include <base/macros.h>

#include "bindings/device_management_backend.pb.h"

namespace login_manager {
class PolicyKey;

// This class holds policy settings and takes care of reading from and writing
// it to a file on disk. The policy is represented as a PolicyFetchResponse
// protobuffer, which may contain per-device or per-user policy in its payload.
//
// If there is a policy on disk at creation time, we will load it along with its
// signature.  A new policy and its attendant signature can be set at any time
// and persisted to disk on-demand.
//
// THIS CLASS DOES NO SIGNATURE VALIDATION.
class PolicyStore {
 public:
  explicit PolicyStore(const base::FilePath& policy_path);
  virtual ~PolicyStore();

  virtual bool DefunctPrefsFilePresent();

  // Call LoadOrCreate() if it hasn't been called already. Returns the
  // (possibly cached) result from the LoadOrCreate() call.
  virtual bool EnsureLoadedOrCreated();

  virtual const enterprise_management::PolicyFetchResponse& Get() const;

  // Persist |policy_| to disk at |policy_file_|
  // Returns false if there's an error while writing data.
  virtual bool Persist();

  // Clobber the stored policy with new data.
  virtual void Set(const enterprise_management::PolicyFetchResponse& policy);

  const base::FilePath policy_path() const { return policy_path_; }

  virtual bool resilient_for_testing() const { return false; }

 protected:
  // Load the signed policy off of disk into |policy_|. Returns true unless
  // there is a policy on disk and loading it fails.
  virtual bool LoadOrCreate();

  // Load the signed policy off of disk into |policy_| from |policy_path|.
  // Returns true unless there is a policy on disk and loading it fails.
  bool LoadOrCreateFromPath(const base::FilePath& policy_path);

  // Persist |policy_| to disk at |policy_path|.
  // Returns false if there's an error while writing data.
  bool PersistToPath(const base::FilePath& policy_path);

  // The cached policy data from |policy_path_|. It is kept up to date whenever
  // the contents in the file are updated by this object.
  std::string cached_policy_data_;

  enterprise_management::PolicyFetchResponse policy_;
  const base::FilePath policy_path_;

  enum LoadResult { NOT_LOADED, LOAD_SUCCEEDED, LOAD_FAILED };
  LoadResult load_result_ = NOT_LOADED;

  DISALLOW_COPY_AND_ASSIGN(PolicyStore);
};
}  // namespace login_manager

#endif  // LOGIN_MANAGER_POLICY_STORE_H_
