// 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_USER_POLICY_SERVICE_H_
#define LOGIN_MANAGER_USER_POLICY_SERVICE_H_

#include <stdint.h>

#include <base/files/file_path.h>
#include <base/memory/scoped_ptr.h>

#include "login_manager/policy_service.h"

namespace login_manager {

class PolicyKey;
class PolicyStore;
class SystemUtils;

// Policy service implementation for user policy.
class UserPolicyService : public PolicyService {
 public:
  UserPolicyService(scoped_ptr<PolicyStore> policy_store,
                    scoped_ptr<PolicyKey> policy_key,
                    const base::FilePath& key_copy_path,
                    const scoped_refptr<base::MessageLoopProxy>& main_loop,
                    SystemUtils* system_utils);
  virtual ~UserPolicyService();

  // Persists a copy of |scoped_policy_key_| at |key_copy_path_|, if both the
  // key and the copy path are present.
  void PersistKeyCopy();

  // Store a new policy. The only difference from the base PolicyService is that
  // this override allows storage of policy blobs that indiciate the user is
  // unmanaged even if they are unsigned. If an non-signed blob gets installed,
  // we also clear the signing key.
  virtual bool Store(const uint8_t* policy_blob,
                     uint32_t len,
                     Completion* completion,
                     int flags);

  // Invoked after a new key has been persisted. This creates a copy of the key
  // at |key_copy_path_| that is readable by chronos, and notifies the delegate.
  virtual void OnKeyPersisted(bool status);

 private:
  // UserPolicyService owns its PolicyKey, note that PolicyService just keeps a
  // plain pointer.
  scoped_ptr<PolicyKey> scoped_policy_key_;

  // If non-empty then a copy of |scoped_policy_key_| will be stored at this
  // path, readable by chronos.
  base::FilePath key_copy_path_;

  // Owned by our owner.
  SystemUtils* system_utils_;

  DISALLOW_COPY_AND_ASSIGN(UserPolicyService);
};

}  // namespace login_manager

#endif  // LOGIN_MANAGER_USER_POLICY_SERVICE_H_
