Home | History | Annotate | Download | only in policy
      1 // Copyright (c) 2012 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_BROWSER_POLICY_CONNECTOR_H_
      6 #define CHROME_BROWSER_POLICY_BROWSER_POLICY_CONNECTOR_H_
      7 
      8 #include <string>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/memory/ref_counted.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "base/memory/weak_ptr.h"
     14 #include "components/policy/core/browser/configuration_policy_handler_list.h"
     15 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
     16 #include "components/policy/core/common/schema.h"
     17 #include "components/policy/core/common/schema_registry.h"
     18 
     19 #if defined(OS_CHROMEOS)
     20 #include "chrome/browser/chromeos/policy/proxy_policy_provider.h"
     21 #endif
     22 
     23 class PrefRegistrySimple;
     24 class PrefService;
     25 
     26 namespace net {
     27 class URLRequestContextGetter;
     28 }
     29 
     30 namespace policy {
     31 
     32 class ConfigurationPolicyProvider;
     33 class DeviceManagementService;
     34 class PolicyService;
     35 class PolicyStatisticsCollector;
     36 
     37 #if defined(OS_CHROMEOS)
     38 class AppPackUpdater;
     39 class DeviceCloudPolicyManagerChromeOS;
     40 class DeviceLocalAccountPolicyService;
     41 class EnterpriseInstallAttributes;
     42 class NetworkConfigurationUpdater;
     43 #endif
     44 
     45 // Manages the lifecycle of browser-global policy infrastructure, such as the
     46 // platform policy providers, device- and the user-cloud policy infrastructure.
     47 class BrowserPolicyConnector {
     48  public:
     49   // Builds an uninitialized BrowserPolicyConnector, suitable for testing.
     50   // Init() should be called to create and start the policy machinery.
     51   BrowserPolicyConnector();
     52 
     53   // Invoke Shutdown() before deleting, see below.
     54   virtual ~BrowserPolicyConnector();
     55 
     56   // Finalizes the initialization of the connector. This call can be skipped on
     57   // tests that don't require the full policy system running.
     58   void Init(PrefService* local_state,
     59             scoped_refptr<net::URLRequestContextGetter> request_context);
     60 
     61   // Stops the policy providers and cleans up the connector before it can be
     62   // safely deleted. This must be invoked before the destructor and while the
     63   // threads are still running. The policy providers are still valid but won't
     64   // update anymore after this call.
     65   void Shutdown();
     66 
     67   // Returns true if Init() has been called but Shutdown() hasn't been yet.
     68   bool is_initialized() const { return is_initialized_; }
     69 
     70   // Returns a handle to the Chrome schema.
     71   const Schema& GetChromeSchema() const;
     72 
     73   // Returns the global CombinedSchemaRegistry. SchemaRegistries from Profiles
     74   // should be tracked by the global registry, so that the global policy
     75   // providers also load policies for the components of each Profile.
     76   CombinedSchemaRegistry* GetSchemaRegistry();
     77 
     78   // Returns the platform policy provider.
     79   ConfigurationPolicyProvider* GetPlatformProvider();
     80 
     81   // Returns the browser-global PolicyService, that contains policies for the
     82   // whole browser.
     83   PolicyService* GetPolicyService();
     84 
     85 #if defined(OS_CHROMEOS)
     86   // Returns true if this device is managed by an enterprise (as opposed to
     87   // a local owner).
     88   bool IsEnterpriseManaged();
     89 
     90   // Returns the enterprise domain if device is managed.
     91   std::string GetEnterpriseDomain();
     92 
     93   // Returns the device mode. For ChromeOS this function will return the mode
     94   // stored in the lockbox, or DEVICE_MODE_CONSUMER if the lockbox has been
     95   // locked empty, or DEVICE_MODE_UNKNOWN if the device has not been owned yet.
     96   // For other OSes the function will always return DEVICE_MODE_CONSUMER.
     97   DeviceMode GetDeviceMode();
     98 #endif
     99 
    100   // Schedules initialization of the cloud policy backend services, if the
    101   // services are already constructed.
    102   void ScheduleServiceInitialization(int64 delay_milliseconds);
    103 
    104   const ConfigurationPolicyHandlerList* GetHandlerList() const;
    105 
    106   // Works out the user affiliation by checking the given |user_name| against
    107   // the installation attributes.
    108   UserAffiliation GetUserAffiliation(const std::string& user_name);
    109 
    110   DeviceManagementService* device_management_service() {
    111     return device_management_service_.get();
    112   }
    113 
    114 #if defined(OS_CHROMEOS)
    115   AppPackUpdater* GetAppPackUpdater();
    116 
    117   DeviceCloudPolicyManagerChromeOS* GetDeviceCloudPolicyManager() {
    118     return device_cloud_policy_manager_.get();
    119   }
    120   DeviceLocalAccountPolicyService* GetDeviceLocalAccountPolicyService() {
    121     return device_local_account_policy_service_.get();
    122   }
    123   EnterpriseInstallAttributes* GetInstallAttributes() {
    124     return install_attributes_.get();
    125   }
    126 
    127   // The browser-global PolicyService is created before Profiles are ready, to
    128   // provide managed values for the local state PrefService. It includes a
    129   // policy provider that forwards policies from a delegate policy provider.
    130   // This call can be used to set the user policy provider as that delegate
    131   // once the Profile is ready, so that user policies can also affect local
    132   // state preferences.
    133   // Only one user policy provider can be set as a delegate at a time, and any
    134   // previously set delegate is removed. Passing NULL removes the current
    135   // delegate, if there is one.
    136   void SetUserPolicyDelegate(ConfigurationPolicyProvider* user_policy_provider);
    137 
    138   // Sets the install attributes for testing. Must be called before the browser
    139   // is created. Takes ownership of |attributes|.
    140   static void SetInstallAttributesForTesting(
    141       EnterpriseInstallAttributes* attributes);
    142 #endif
    143 
    144   // Sets a |provider| that will be included in PolicyServices returned by
    145   // CreatePolicyService. This is a static method because local state is
    146   // created immediately after the connector, and tests don't have a chance to
    147   // inject the provider otherwise. |provider| must outlive the connector, and
    148   // its ownership is not taken though the connector will initialize and shut it
    149   // down.
    150   static void SetPolicyProviderForTesting(
    151       ConfigurationPolicyProvider* provider);
    152 
    153   // Check whether a user is known to be non-enterprise. Domains such as
    154   // gmail.com and googlemail.com are known to not be managed. Also returns
    155   // false if the username is empty.
    156   static bool IsNonEnterpriseUser(const std::string& username);
    157 
    158   // Registers refresh rate prefs.
    159   static void RegisterPrefs(PrefRegistrySimple* registry);
    160 
    161  private:
    162   // Set the timezone as soon as the policies are available.
    163   void SetTimezoneIfPolicyAvailable();
    164 
    165   ConfigurationPolicyProvider* CreatePlatformProvider();
    166 
    167   // Whether Init() but not Shutdown() has been invoked.
    168   bool is_initialized_;
    169 
    170   PrefService* local_state_;
    171   scoped_refptr<net::URLRequestContextGetter> request_context_;
    172 
    173   // Used to convert policies to preferences. The providers declared below
    174   // may trigger policy updates during shutdown, which will result in
    175   // |handler_list_| being consulted for policy translation.
    176   // Therefore, it's important to destroy |handler_list_| after the providers.
    177   scoped_ptr<ConfigurationPolicyHandlerList> handler_list_;
    178 
    179   // The Chrome schema. This wraps the structure generated by
    180   // generate_policy_source.py at compile time.
    181   Schema chrome_schema_;
    182 
    183   // The global SchemaRegistry, which will track all the other registries.
    184   CombinedSchemaRegistry schema_registry_;
    185 
    186   scoped_ptr<ConfigurationPolicyProvider> platform_provider_;
    187 
    188   // Components of the device cloud policy implementation.
    189 #if defined(OS_CHROMEOS)
    190   scoped_ptr<EnterpriseInstallAttributes> install_attributes_;
    191   scoped_ptr<DeviceCloudPolicyManagerChromeOS> device_cloud_policy_manager_;
    192   scoped_ptr<DeviceLocalAccountPolicyService>
    193       device_local_account_policy_service_;
    194 
    195   // This policy provider is used on Chrome OS to feed user policy into the
    196   // global PolicyService instance. This works by installing the cloud policy
    197   // provider of the primary profile as the delegate of the ProxyPolicyProvider,
    198   // after login.
    199   ProxyPolicyProvider global_user_cloud_policy_provider_;
    200 #endif
    201 
    202   // Must be deleted before all the policy providers.
    203   scoped_ptr<PolicyService> policy_service_;
    204 
    205   scoped_ptr<PolicyStatisticsCollector> policy_statistics_collector_;
    206 
    207   scoped_ptr<DeviceManagementService> device_management_service_;
    208 
    209   // Used to initialize the device policy subsystem once the message loops
    210   // are spinning.
    211   base::WeakPtrFactory<BrowserPolicyConnector> weak_ptr_factory_;
    212 
    213 #if defined(OS_CHROMEOS)
    214   scoped_ptr<AppPackUpdater> app_pack_updater_;
    215   scoped_ptr<NetworkConfigurationUpdater> network_configuration_updater_;
    216 #endif
    217 
    218   DISALLOW_COPY_AND_ASSIGN(BrowserPolicyConnector);
    219 };
    220 
    221 }  // namespace policy
    222 
    223 #endif  // CHROME_BROWSER_POLICY_BROWSER_POLICY_CONNECTOR_H_
    224