// 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_CLOUD_POLICY_CONTROLLER_H_ #define CHROME_BROWSER_POLICY_CLOUD_POLICY_CONTROLLER_H_ #pragma once #include <string> #include "base/file_path.h" #include "base/memory/scoped_ptr.h" #include "base/observer_list.h" #include "base/task.h" #include "base/time.h" #include "chrome/browser/policy/cloud_policy_identity_strategy.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 CloudPolicyCacheBase; class DeviceManagementBackend; // Coordinates the actions of DeviceTokenFetcher, CloudPolicyIdentityStrategy, // DeviceManagementBackend, and CloudPolicyCache: calls their methods and // listens to their callbacks/notifications. class CloudPolicyController : public DeviceManagementBackend::DevicePolicyResponseDelegate, public DeviceTokenFetcher::Observer, public CloudPolicyIdentityStrategy::Observer { public: // Takes ownership of |backend|; the other parameters are weak pointers. CloudPolicyController(DeviceManagementService* service, CloudPolicyCacheBase* cache, DeviceTokenFetcher* token_fetcher, CloudPolicyIdentityStrategy* identity_strategy, PolicyNotifier* notifier); virtual ~CloudPolicyController(); // Sets the refresh rate at which to re-fetch policy information. void SetRefreshRate(int64 refresh_rate_milliseconds); // Triggers an immediate retry of of the current operation. void Retry(); // Stops all auto-retrying error handling behavior inside the policy // subsystem. void StopAutoRetry(); // DevicePolicyResponseDelegate implementation: virtual void HandlePolicyResponse( const em::DevicePolicyResponse& response); virtual void OnError(DeviceManagementBackend::ErrorCode code); // DeviceTokenFetcher::Observer implementation: virtual void OnDeviceTokenAvailable(); // CloudPolicyIdentityStrategy::Observer implementation: virtual void OnDeviceTokenChanged(); virtual void OnCredentialsChanged(); private: // Indicates the current state the controller is in. enum ControllerState { // The controller is initializing, policy information not yet available. STATE_TOKEN_UNAVAILABLE, // The device is not managed. Should retry fetching the token after delay. STATE_TOKEN_UNMANAGED, // The token is not valid and should be refetched with exponential back-off. STATE_TOKEN_ERROR, // The token is valid, but policy is yet to be fetched. STATE_TOKEN_VALID, // Policy information is available and valid. STATE_POLICY_VALID, // The service returned an error when requesting policy, will retry. STATE_POLICY_ERROR, // The service returned an error that is not going to go away soon. STATE_POLICY_UNAVAILABLE }; friend class CloudPolicyControllerTest; // More configurable constructor for use by test cases. CloudPolicyController(DeviceManagementService* service, CloudPolicyCacheBase* cache, DeviceTokenFetcher* token_fetcher, CloudPolicyIdentityStrategy* identity_strategy, PolicyNotifier* notifier, int64 policy_refresh_rate_ms, int policy_refresh_deviation_factor_percent, int64 policy_refresh_deviation_max_ms, int64 policy_refresh_error_delay_ms); // Called by constructors to perform shared initialization. void Initialize(DeviceManagementService* service, CloudPolicyCacheBase* cache, DeviceTokenFetcher* token_fetcher, CloudPolicyIdentityStrategy* identity_strategy, PolicyNotifier* notifier, int64 policy_refresh_rate_ms, int policy_refresh_deviation_factor_percent, int64 policy_refresh_deviation_max_ms, int64 policy_refresh_error_delay_ms); // Asks the token fetcher to fetch a new token. void FetchToken(); // Sends a request to the device management backend to fetch policy if one // isn't already outstanding. void SendPolicyRequest(); // Called back from the delayed work task. Calls |DoWork()|. void DoDelayedWork(); // Performs whatever action is required in the current state, // e.g. refreshing policy. void DoWork(); // Cancels the delayed work task. void CancelDelayedWork(); // Switches to a new state and triggers any appropriate actions. void SetState(ControllerState new_state); // Computes the policy refresh delay to use. int64 GetRefreshDelay(); DeviceManagementService* service_; CloudPolicyCacheBase* cache_; CloudPolicyIdentityStrategy* identity_strategy_; DeviceTokenFetcher* token_fetcher_; scoped_ptr<DeviceManagementBackend> backend_; ControllerState state_; PolicyNotifier* notifier_; int64 policy_refresh_rate_ms_; int policy_refresh_deviation_factor_percent_; int64 policy_refresh_deviation_max_ms_; int64 policy_refresh_error_delay_ms_; int64 effective_policy_refresh_error_delay_ms_; CancelableTask* delayed_work_task_; ScopedRunnableMethodFactory<CloudPolicyController> method_factory_; DISALLOW_COPY_AND_ASSIGN(CloudPolicyController); }; } // namespace policy #endif // CHROME_BROWSER_POLICY_CLOUD_POLICY_CONTROLLER_H_