blob: fd18bc30f858e4f521986e0c1f146fd24e0f01d2 [file] [log] [blame]
// Copyright (c) 2011 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 CHROME_BROWSER_POLICY_DEVICE_MANAGEMENT_POLICY_PROVIDER_H_
#define CHROME_BROWSER_POLICY_DEVICE_MANAGEMENT_POLICY_PROVIDER_H_
#pragma once
#include <string>
#include "base/file_path.h"
#include "base/observer_list.h"
#include "base/scoped_ptr.h"
#include "base/time.h"
#include "base/weak_ptr.h"
#include "chrome/browser/policy/configuration_policy_provider.h"
#include "chrome/browser/policy/device_management_backend.h"
#include "chrome/browser/policy/device_token_fetcher.h"
class Profile;
class TokenService;
namespace policy {
class DeviceManagementBackend;
class DeviceManagementPolicyCache;
// Provides policy fetched from the device management server. With the exception
// of the Provide method, which can be called on the FILE thread, all public
// methods must be called on the UI thread.
class DeviceManagementPolicyProvider
: public ConfigurationPolicyProvider,
public DeviceManagementBackend::DevicePolicyResponseDelegate,
public base::SupportsWeakPtr<DeviceManagementPolicyProvider>,
public DeviceTokenFetcher::Observer {
public:
DeviceManagementPolicyProvider(const PolicyDefinitionList* policy_list,
DeviceManagementBackend* backend,
Profile* profile);
virtual ~DeviceManagementPolicyProvider();
// ConfigurationPolicyProvider implementation:
virtual bool Provide(ConfigurationPolicyStoreInterface* store);
virtual bool IsInitializationComplete() const;
// DevicePolicyResponseDelegate implementation:
virtual void HandlePolicyResponse(
const em::DevicePolicyResponse& response);
virtual void OnError(DeviceManagementBackend::ErrorCode code);
// DeviceTokenFetcher::Observer implementation:
virtual void OnTokenSuccess();
virtual void OnTokenError();
virtual void OnNotManaged();
private:
class InitializeAfterIOThreadExistsTask;
class RefreshTask;
friend class DeviceManagementPolicyProviderTest;
// More configurable constructor for use by test cases.
DeviceManagementPolicyProvider(const PolicyDefinitionList* policy_list,
DeviceManagementBackend* backend,
Profile* profile,
int64 policy_refresh_rate_ms,
int64 policy_refresh_max_earlier_ms,
int64 policy_refresh_error_delay_ms,
int64 token_fetch_error_delay_ms,
int64 unmanaged_device_refresh_rate_ms);
// Called by constructors to perform shared initialization. Initialization
// requiring the IOThread must not be performed directly in this method,
// rather must be deferred until the IOThread is fully initialized. This is
// the case in InitializeAfterIOThreadExists.
void Initialize(DeviceManagementBackend* backend,
Profile* profile,
int64 policy_refresh_rate_ms,
int64 policy_refresh_max_earlier_ms,
int64 policy_refresh_error_delay_ms,
int64 token_fetch_error_delay_ms,
int64 unmanaged_device_refresh_rate_ms);
// Called by a deferred task posted to the UI thread to complete the portion
// of initialization that requires the IOThread.
void InitializeAfterIOThreadExists();
// ConfigurationPolicyProvider overrides:
virtual void AddObserver(ConfigurationPolicyProvider::Observer* observer);
virtual void RemoveObserver(ConfigurationPolicyProvider::Observer* observer);
// Sends a request to the device manager backend to fetch policy if one isn't
// already outstanding.
void SendPolicyRequest();
// Triggers policy refresh, re-requesting device token and policy information
// as necessary.
void RefreshTaskExecute();
// Schedules a new RefreshTask.
void ScheduleRefreshTask(int64 delay_in_milliseconds);
// Calculates when the next RefreshTask shall be executed.
int64 GetRefreshTaskDelay();
void StopWaitingForInitialPolicies();
// Notify observers about a policy update.
void NotifyCloudPolicyUpdate();
// The path of the device token file.
FilePath GetTokenPath();
// Used only by tests.
void SetDeviceTokenFetcher(DeviceTokenFetcher* token_fetcher);
// Provides the URL at which requests are sent to from the device management
// backend.
static std::string GetDeviceManagementURL();
// Returns the path to the sub-directory in the user data directory
// in which device management persistent state is stored.
static FilePath GetOrCreateDeviceManagementDir(
const FilePath& user_data_dir);
scoped_ptr<DeviceManagementBackend> backend_;
Profile* profile_; // weak
scoped_ptr<DeviceManagementPolicyCache> cache_;
scoped_refptr<DeviceTokenFetcher> token_fetcher_;
DeviceTokenFetcher::ObserverRegistrar registrar_;
ObserverList<ConfigurationPolicyProvider::Observer, true> observer_list_;
FilePath storage_dir_;
bool policy_request_pending_;
bool refresh_task_pending_;
bool waiting_for_initial_policies_;
int64 policy_refresh_rate_ms_;
int64 policy_refresh_max_earlier_ms_;
int64 policy_refresh_error_delay_ms_;
int64 token_fetch_error_delay_ms_;
int64 unmanaged_device_refresh_rate_ms_;
DISALLOW_COPY_AND_ASSIGN(DeviceManagementPolicyProvider);
};
} // namespace policy
#endif // CHROME_BROWSER_POLICY_DEVICE_MANAGEMENT_POLICY_PROVIDER_H_