1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_POLICY_CLOUD_POLICY_SUBSYSTEM_H_ 6 #define CHROME_BROWSER_POLICY_CLOUD_POLICY_SUBSYSTEM_H_ 7 #pragma once 8 9 #include "base/memory/scoped_ptr.h" 10 #include "chrome/browser/prefs/pref_member.h" 11 #include "content/common/notification_observer.h" 12 #include "net/base/network_change_notifier.h" 13 14 class PrefService; 15 16 namespace net { 17 class URLRequestContextGetter; 18 } 19 20 namespace policy { 21 22 class CloudPolicyCacheBase; 23 class CloudPolicyController; 24 class CloudPolicyIdentityStrategy; 25 class ConfigurationPolicyProvider; 26 class DeviceManagementService; 27 class DeviceTokenFetcher; 28 class PolicyNotifier; 29 30 // This class is a container for the infrastructure required to support cloud 31 // policy. It glues together the backend, the policy controller and manages the 32 // life cycle of the policy providers. 33 class CloudPolicySubsystem 34 : public NotificationObserver, 35 public net::NetworkChangeNotifier::IPAddressObserver { 36 public: 37 enum PolicySubsystemState { 38 UNENROLLED, // No enrollment attempt has been performed yet. 39 BAD_GAIA_TOKEN, // The server rejected the GAIA auth token. 40 UNMANAGED, // This device is unmanaged. 41 NETWORK_ERROR, // A network error occurred, retrying makes sense. 42 LOCAL_ERROR, // Retrying is futile. 43 TOKEN_FETCHED, // Device has been successfully registered. 44 SUCCESS // Policy has been fetched successfully and is in effect. 45 }; 46 47 enum ErrorDetails { 48 NO_DETAILS, // No error, so no error details either. 49 DMTOKEN_NETWORK_ERROR, // DeviceTokenFetcher encountered a network error. 50 POLICY_NETWORK_ERROR, // CloudPolicyController encountered a network error. 51 BAD_DMTOKEN, // The server rejected the DMToken. 52 POLICY_LOCAL_ERROR, // The policy cache encountered a local error. 53 SIGNATURE_MISMATCH, // The policy cache detected a signature mismatch. 54 }; 55 56 class Observer { 57 public: ~Observer()58 virtual ~Observer() {} 59 virtual void OnPolicyStateChanged(PolicySubsystemState state, 60 ErrorDetails error_details) = 0; 61 }; 62 63 class ObserverRegistrar { 64 public: 65 ObserverRegistrar(CloudPolicySubsystem* cloud_policy_subsystem, 66 CloudPolicySubsystem::Observer* observer); 67 ~ObserverRegistrar(); 68 69 private: 70 PolicyNotifier* policy_notifier_; 71 CloudPolicySubsystem::Observer* observer_; 72 DISALLOW_COPY_AND_ASSIGN(ObserverRegistrar); 73 }; 74 75 CloudPolicySubsystem(CloudPolicyIdentityStrategy* identity_strategy, 76 CloudPolicyCacheBase* policy_cache); 77 virtual ~CloudPolicySubsystem(); 78 79 // net::NetworkChangeNotifier::IPAddressObserver: 80 virtual void OnIPAddressChanged() OVERRIDE; 81 82 // Initializes the subsystem. 83 void Initialize(PrefService* prefs, 84 net::URLRequestContextGetter* request_context); 85 86 // Shuts the subsystem down. This must be called before threading and network 87 // infrastructure goes away. 88 void Shutdown(); 89 90 // Returns the externally visible state and corresponding error details. 91 PolicySubsystemState state(); 92 ErrorDetails error_details(); 93 94 // Stops all auto-retrying error handling behavior inside the policy 95 // subsystem. 96 void StopAutoRetry(); 97 98 ConfigurationPolicyProvider* GetManagedPolicyProvider(); 99 ConfigurationPolicyProvider* GetRecommendedPolicyProvider(); 100 101 // Registers cloud policy related prefs. 102 static void RegisterPrefs(PrefService* pref_service); 103 104 private: 105 // Updates the policy controller with a new refresh rate value. 106 void UpdatePolicyRefreshRate(); 107 108 // Returns a weak pointer to this subsystem's PolicyNotifier. notifier()109 PolicyNotifier* notifier() { 110 return notifier_.get(); 111 } 112 113 // NotificationObserver overrides. 114 virtual void Observe(NotificationType type, 115 const NotificationSource& source, 116 const NotificationDetails& details); 117 118 // The pref service that controls the refresh rate. 119 PrefService* prefs_; 120 121 // Tracks the pref value for the policy refresh rate. 122 IntegerPrefMember policy_refresh_rate_; 123 124 // Cloud policy infrastructure stuff. 125 scoped_ptr<PolicyNotifier> notifier_; 126 scoped_ptr<DeviceManagementService> device_management_service_; 127 scoped_ptr<DeviceTokenFetcher> device_token_fetcher_; 128 scoped_ptr<CloudPolicyCacheBase> cloud_policy_cache_; 129 scoped_ptr<CloudPolicyController> cloud_policy_controller_; 130 131 DISALLOW_COPY_AND_ASSIGN(CloudPolicySubsystem); 132 }; 133 134 } // namespace policy 135 136 #endif // CHROME_BROWSER_POLICY_CLOUD_POLICY_SUBSYSTEM_H_ 137