blob: d998bdf87c3536b6c90207f75773a2516de45a0e [file] [log] [blame]
// Copyright (c) 2012 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_BROWSER_POLICY_CONNECTOR_H_
#define CHROME_BROWSER_POLICY_BROWSER_POLICY_CONNECTOR_H_
#include <string>
#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/policy/cloud_policy_constants.h"
#include "chrome/browser/policy/configuration_policy_handler_list.h"
#include "chrome/browser/policy/enterprise_install_attributes.h"
#include "chrome/browser/policy/proxy_policy_provider.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
class Profile;
class TokenService;
namespace policy {
class AppPackUpdater;
class CloudPolicyDataStore;
class CloudPolicyProvider;
class CloudPolicySubsystem;
class ConfigurationPolicyProvider;
class DeviceManagementService;
class NetworkConfigurationUpdater;
class PolicyService;
class PolicyStatisticsCollector;
class UserCloudPolicyManager;
class UserPolicyTokenCache;
// Manages the lifecycle of browser-global policy infrastructure, such as the
// platform policy providers, device- and the user-cloud policy infrastructure.
// TODO(gfeher,mnissler): Factor out device and user specific methods into their
// respective classes.
class BrowserPolicyConnector : public content::NotificationObserver {
public:
// Builds an uninitialized BrowserPolicyConnector, suitable for testing.
// Init() should be called to create and start the policy machinery.
BrowserPolicyConnector();
virtual ~BrowserPolicyConnector();
// Creates the policy providers and finalizes the initialization of the
// connector. This call can be skipped on tests that don't require the full
// policy system running.
void Init();
// Creates a UserCloudPolicyManager for the given profile, or returns NULL if
// it is not supported on this platform. Ownership is transferred to the
// caller.
scoped_ptr<UserCloudPolicyManager> CreateCloudPolicyManager(Profile* profile);
// Creates a new policy service for the given profile, or a global one if
// it is NULL. Ownership is transferred to the caller.
scoped_ptr<PolicyService> CreatePolicyService(Profile* profile);
// Returns a weak pointer to the CloudPolicySubsystem corresponding to the
// device policy managed by this policy connector, or NULL if no such
// subsystem exists (i.e. when running outside ChromeOS).
CloudPolicySubsystem* device_cloud_policy_subsystem() {
#if defined(OS_CHROMEOS)
return device_cloud_policy_subsystem_.get();
#else
return NULL;
#endif
}
// Returns a weak pointer to the CloudPolicySubsystem corresponding to the
// user policy managed by this policy connector, or NULL if no such
// subsystem exists (i.e. when user cloud policy is not active due to
// unmanaged or not logged in).
CloudPolicySubsystem* user_cloud_policy_subsystem() {
return user_cloud_policy_subsystem_.get();
}
// Triggers registration for device policy, using the |owner_email| account.
// |token| is an oauth token to authenticate the registration request, and
// |known_machine_id| is true if the server should do additional checks based
// on the machine_id used for the request.
void RegisterForDevicePolicy(const std::string& owner_email,
const std::string& token,
bool known_machine_id,
bool reregister);
// Returns true if this device is managed by an enterprise (as opposed to
// a local owner).
bool IsEnterpriseManaged();
// Locks the device to an enterprise domain.
EnterpriseInstallAttributes::LockResult LockDevice(const std::string& user);
// Returns the device serial number, or an empty string if not available.
static std::string GetSerialNumber();
// Returns the enterprise domain if device is managed.
std::string GetEnterpriseDomain();
// Returns the device mode. For ChromeOS this function will return the mode
// stored in the lockbox, or DEVICE_MODE_CONSUMER if the lockbox has been
// locked empty, or DEVICE_MODE_UNKNOWN if the device has not been owned yet.
// For other OSes the function will always return DEVICE_MODE_CONSUMER.
DeviceMode GetDeviceMode();
// Reset the device policy machinery. This stops any automatic retry behavior
// and clears the error flags, so potential retries have a chance to succeed.
void ResetDevicePolicy();
// Initiates device and user policy fetches, if possible. Pending fetches
// will be cancelled.
void FetchCloudPolicy();
// Schedules initialization of the cloud policy backend services, if the
// services are already constructed.
void ScheduleServiceInitialization(int64 delay_milliseconds);
// Initializes the user cloud policy infrastructure.
// If |wait_for_policy_fetch| is true, the user policy will only become fully
// initialized after a policy fetch is attempted. Note that Profile creation
// is blocked until this initialization is complete.
void InitializeUserPolicy(const std::string& user_name,
bool wait_for_policy_fetch);
// Installs a token service for user policy.
void SetUserPolicyTokenService(TokenService* token_service);
// Registers for user policy (if not already registered), using the passed
// OAuth V2 token for authentication. |oauth_token| can be empty to signal
// that an attempt to fetch the token was made but failed, or that oauth
// isn't being used.
void RegisterForUserPolicy(const std::string& oauth_token);
// The data stores should be considered read-only for everyone except for
// tests.
CloudPolicyDataStore* GetDeviceCloudPolicyDataStore();
CloudPolicyDataStore* GetUserCloudPolicyDataStore();
const ConfigurationPolicyHandlerList* GetHandlerList() const;
// Works out the user affiliation by checking the given |user_name| against
// the installation attributes.
UserAffiliation GetUserAffiliation(const std::string& user_name);
AppPackUpdater* GetAppPackUpdater();
NetworkConfigurationUpdater* GetNetworkConfigurationUpdater();
DeviceManagementService* device_management_service() {
return device_management_service_.get();
}
// Sets a |provider| that will be included in PolicyServices returned by
// CreatePolicyService. This is a static method because local state is
// created immediately after the connector, and tests don't have a chance to
// inject the provider otherwise. |provider| must outlive the connector, and
// its ownership is not taken.
static void SetPolicyProviderForTesting(
ConfigurationPolicyProvider* provider);
// Gets the URL of the DM server (either the default or a URL provided via the
// command line).
static std::string GetDeviceManagementUrl();
private:
// content::NotificationObserver method overrides:
virtual void Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) OVERRIDE;
// Initializes the device cloud policy infrasturcture.
void InitializeDevicePolicy();
// Complete initialization once the message loops are running and the
// local_state is initialized.
void CompleteInitialization();
// Set the timezone as soon as the policies are available.
void SetTimezoneIfPolicyAvailable();
static ConfigurationPolicyProvider* CreatePlatformProvider();
// Used to convert policies to preferences. The providers declared below
// trigger policy updates during destruction via OnProviderGoingAway(), which
// will result in |handler_list_| being consulted for policy translation.
// Therefore, it's important to destroy |handler_list_| after the providers.
ConfigurationPolicyHandlerList handler_list_;
scoped_ptr<ConfigurationPolicyProvider> platform_provider_;
scoped_ptr<CloudPolicyProvider> managed_cloud_provider_;
scoped_ptr<CloudPolicyProvider> recommended_cloud_provider_;
#if defined(OS_CHROMEOS)
scoped_ptr<CloudPolicyDataStore> device_data_store_;
scoped_ptr<CloudPolicySubsystem> device_cloud_policy_subsystem_;
scoped_ptr<EnterpriseInstallAttributes> install_attributes_;
#endif
scoped_ptr<UserPolicyTokenCache> user_policy_token_cache_;
scoped_ptr<CloudPolicyDataStore> user_data_store_;
scoped_ptr<CloudPolicySubsystem> user_cloud_policy_subsystem_;
scoped_ptr<PolicyStatisticsCollector> policy_statistics_collector_;
// Components of the new-style cloud policy implementation.
// TODO(mnissler): Remove the old-style components above once we have
// completed the switch to the new cloud policy implementation.
scoped_ptr<DeviceManagementService> device_management_service_;
ProxyPolicyProvider user_cloud_policy_provider_;
// Used to initialize the device policy subsystem once the message loops
// are spinning.
base::WeakPtrFactory<BrowserPolicyConnector> weak_ptr_factory_;
// Registers the provider for notification of successful Gaia logins.
content::NotificationRegistrar registrar_;
// Weak reference to the TokenService we are listening to for user cloud
// policy authentication tokens.
TokenService* token_service_;
#if defined(OS_CHROMEOS)
scoped_ptr<AppPackUpdater> app_pack_updater_;
scoped_ptr<NetworkConfigurationUpdater> network_configuration_updater_;
#endif
DISALLOW_COPY_AND_ASSIGN(BrowserPolicyConnector);
};
} // namespace policy
#endif // CHROME_BROWSER_POLICY_BROWSER_POLICY_CONNECTOR_H_