Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2492)

Unified Diff: chrome/browser/policy/device_management_policy_provider.cc

Issue 6312121: Add initial device policy infrastructure. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix race condition and tests. Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/policy/device_management_policy_provider.cc
diff --git a/chrome/browser/policy/device_management_policy_provider.cc b/chrome/browser/policy/device_management_policy_provider.cc
deleted file mode 100644
index 315a6d286887c4b5f454a7c107954e641bf383cb..0000000000000000000000000000000000000000
--- a/chrome/browser/policy/device_management_policy_provider.cc
+++ /dev/null
@@ -1,384 +0,0 @@
-// 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.
-
-#include "chrome/browser/policy/device_management_policy_provider.h"
-
-#include "base/command_line.h"
-#include "base/file_util.h"
-#include "base/path_service.h"
-#include "base/rand_util.h"
-#include "base/task.h"
-#include "chrome/browser/browser_thread.h"
-#include "chrome/browser/policy/device_management_backend.h"
-#include "chrome/browser/policy/device_management_policy_cache.h"
-#include "chrome/browser/policy/profile_policy_context.h"
-#include "chrome/browser/policy/proto/device_management_constants.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/common/chrome_paths.h"
-#include "chrome/common/chrome_switches.h"
-#include "chrome/common/notification_service.h"
-#include "chrome/common/notification_type.h"
-
-namespace policy {
-
-namespace em = enterprise_management;
-
-// The maximum ratio in percent of the policy refresh rate we use for adjusting
-// the policy refresh time instant. The rationale is to avoid load spikes from
-// many devices that were set up in sync for some reason.
-const int kPolicyRefreshDeviationFactorPercent = 10;
-// Maximum deviation we are willing to accept.
-const int64 kPolicyRefreshDeviationMaxInMilliseconds = 30 * 60 * 1000;
-
-// These are the base values for delays before retrying after an error. They
-// will be doubled each time they are used.
-const int64 kPolicyRefreshErrorDelayInMilliseconds = 3 * 1000; // 3 seconds
-const int64 kDeviceTokenRefreshErrorDelayInMilliseconds = 3 * 1000;
-// For unmanaged devices, check once per day whether they're still unmanaged.
-const int64 kPolicyRefreshUnmanagedDeviceInMilliseconds = 24 * 60 * 60 * 1000;
-
-const FilePath::StringType kDeviceTokenFilename = FILE_PATH_LITERAL("Token");
-const FilePath::StringType kPolicyFilename = FILE_PATH_LITERAL("Policy");
-
-// Calls back into the provider to refresh policy.
-class DeviceManagementPolicyProvider::RefreshTask : public CancelableTask {
- public:
- explicit RefreshTask(DeviceManagementPolicyProvider* provider)
- : provider_(provider) {}
-
- // Task implementation:
- virtual void Run() {
- if (provider_)
- provider_->RefreshTaskExecute();
- }
-
- // CancelableTask implementation:
- virtual void Cancel() {
- provider_ = NULL;
- }
-
- private:
- DeviceManagementPolicyProvider* provider_;
-};
-
-DeviceManagementPolicyProvider::DeviceManagementPolicyProvider(
- const ConfigurationPolicyProvider::PolicyDefinitionList* policy_list,
- DeviceManagementBackend* backend,
- Profile* profile)
- : ConfigurationPolicyProvider(policy_list) {
- Initialize(backend,
- profile,
- ProfilePolicyContext::kDefaultPolicyRefreshRateInMilliseconds,
- kPolicyRefreshDeviationFactorPercent,
- kPolicyRefreshDeviationMaxInMilliseconds,
- kPolicyRefreshErrorDelayInMilliseconds,
- kDeviceTokenRefreshErrorDelayInMilliseconds,
- kPolicyRefreshUnmanagedDeviceInMilliseconds);
-}
-
-DeviceManagementPolicyProvider::~DeviceManagementPolicyProvider() {
- FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
- observer_list_,
- OnProviderGoingAway());
- CancelRefreshTask();
-}
-
-bool DeviceManagementPolicyProvider::Provide(
- ConfigurationPolicyStoreInterface* policy_store) {
- scoped_ptr<DictionaryValue> policies(cache_->GetPolicy());
- DecodePolicyValueTree(policies.get(), policy_store);
- return true;
-}
-
-bool DeviceManagementPolicyProvider::IsInitializationComplete() const {
- return !cache_->last_policy_refresh_time().is_null();
-}
-
-void DeviceManagementPolicyProvider::HandlePolicyResponse(
- const em::DevicePolicyResponse& response) {
- DCHECK(TokenAvailable());
- if (cache_->SetPolicy(response)) {
- initial_fetch_done_ = true;
- NotifyCloudPolicyUpdate();
- }
- SetState(STATE_POLICY_VALID);
-}
-
-void DeviceManagementPolicyProvider::OnError(
- DeviceManagementBackend::ErrorCode code) {
- DCHECK(TokenAvailable());
- if (code == DeviceManagementBackend::kErrorServiceDeviceNotFound ||
- code == DeviceManagementBackend::kErrorServiceManagementTokenInvalid) {
- LOG(WARNING) << "The device token was either invalid or unknown to the "
- << "device manager, re-registering device.";
- SetState(STATE_TOKEN_RESET);
- } else if (code ==
- DeviceManagementBackend::kErrorServiceManagementNotSupported) {
- VLOG(1) << "The device is no longer managed, resetting device token.";
- SetState(STATE_TOKEN_RESET);
- } else {
- LOG(WARNING) << "Could not provide policy from the device manager (error = "
- << code << "), will retry in "
- << (effective_policy_refresh_error_delay_ms_ / 1000)
- << " seconds.";
- SetState(STATE_POLICY_ERROR);
- }
-}
-
-void DeviceManagementPolicyProvider::OnTokenSuccess() {
- DCHECK(!TokenAvailable());
- SetState(STATE_TOKEN_VALID);
-}
-
-void DeviceManagementPolicyProvider::OnTokenError() {
- DCHECK(!TokenAvailable());
- LOG(WARNING) << "Could not retrieve device token.";
- SetState(STATE_TOKEN_ERROR);
-}
-
-void DeviceManagementPolicyProvider::OnNotManaged() {
- DCHECK(!TokenAvailable());
- VLOG(1) << "This device is not managed.";
- cache_->SetDeviceUnmanaged();
- SetState(STATE_UNMANAGED);
-}
-
-void DeviceManagementPolicyProvider::SetRefreshRate(
- int64 refresh_rate_milliseconds) {
- policy_refresh_rate_ms_ = refresh_rate_milliseconds;
-
- // Reschedule the refresh task if necessary.
- if (state_ == STATE_POLICY_VALID)
- SetState(STATE_POLICY_VALID);
-}
-
-DeviceManagementPolicyProvider::DeviceManagementPolicyProvider(
- const PolicyDefinitionList* policy_list,
- DeviceManagementBackend* backend,
- Profile* profile,
- int64 policy_refresh_rate_ms,
- int policy_refresh_deviation_factor_percent,
- int64 policy_refresh_deviation_max_ms,
- int64 policy_refresh_error_delay_ms,
- int64 token_fetch_error_delay_ms,
- int64 unmanaged_device_refresh_rate_ms)
- : ConfigurationPolicyProvider(policy_list) {
- Initialize(backend,
- profile,
- policy_refresh_rate_ms,
- policy_refresh_deviation_factor_percent,
- policy_refresh_deviation_max_ms,
- policy_refresh_error_delay_ms,
- token_fetch_error_delay_ms,
- unmanaged_device_refresh_rate_ms);
-}
-
-void DeviceManagementPolicyProvider::Initialize(
- DeviceManagementBackend* backend,
- Profile* profile,
- int64 policy_refresh_rate_ms,
- int policy_refresh_deviation_factor_percent,
- int64 policy_refresh_deviation_max_ms,
- int64 policy_refresh_error_delay_ms,
- int64 token_fetch_error_delay_ms,
- int64 unmanaged_device_refresh_rate_ms) {
- DCHECK(profile);
- backend_.reset(backend);
- profile_ = profile;
- storage_dir_ = GetOrCreateDeviceManagementDir(profile_->GetPath());
- state_ = STATE_INITIALIZING;
- initial_fetch_done_ = false;
- refresh_task_ = NULL;
- policy_refresh_rate_ms_ = policy_refresh_rate_ms;
- policy_refresh_deviation_factor_percent_ =
- policy_refresh_deviation_factor_percent;
- policy_refresh_deviation_max_ms_ = policy_refresh_deviation_max_ms;
- policy_refresh_error_delay_ms_ = policy_refresh_error_delay_ms;
- effective_policy_refresh_error_delay_ms_ = policy_refresh_error_delay_ms;
- token_fetch_error_delay_ms_ = token_fetch_error_delay_ms;
- effective_token_fetch_error_delay_ms_ = token_fetch_error_delay_ms;
- unmanaged_device_refresh_rate_ms_ = unmanaged_device_refresh_rate_ms;
-
- const FilePath policy_path = storage_dir_.Append(kPolicyFilename);
- cache_.reset(new DeviceManagementPolicyCache(policy_path));
- cache_->LoadPolicyFromFile();
-
- SetDeviceTokenFetcher(new DeviceTokenFetcher(backend_.get(), profile,
- GetTokenPath()));
-
- if (cache_->is_device_unmanaged()) {
- // This is a non-first login on an unmanaged device.
- SetState(STATE_UNMANAGED);
- } else {
- SetState(STATE_INITIALIZING);
- }
-}
-
-void DeviceManagementPolicyProvider::AddObserver(
- ConfigurationPolicyProvider::Observer* observer) {
- observer_list_.AddObserver(observer);
-}
-
-void DeviceManagementPolicyProvider::RemoveObserver(
- ConfigurationPolicyProvider::Observer* observer) {
- observer_list_.RemoveObserver(observer);
-}
-
-void DeviceManagementPolicyProvider::SendPolicyRequest() {
- em::DevicePolicyRequest policy_request;
- policy_request.set_policy_scope(kChromePolicyScope);
- em::DevicePolicySettingRequest* setting =
- policy_request.add_setting_request();
- setting->set_key(kChromeDevicePolicySettingKey);
- setting->set_watermark("");
- backend_->ProcessPolicyRequest(token_fetcher_->GetDeviceToken(),
- token_fetcher_->GetDeviceID(),
- policy_request, this);
-}
-
-void DeviceManagementPolicyProvider::RefreshTaskExecute() {
- DCHECK(refresh_task_);
- refresh_task_ = NULL;
-
- switch (state_) {
- case STATE_INITIALIZING:
- token_fetcher_->StartFetching();
- return;
- case STATE_TOKEN_VALID:
- case STATE_POLICY_VALID:
- case STATE_POLICY_ERROR:
- SendPolicyRequest();
- return;
- case STATE_UNMANAGED:
- case STATE_TOKEN_ERROR:
- case STATE_TOKEN_RESET:
- token_fetcher_->Restart();
- return;
- }
-
- NOTREACHED() << "Unhandled state";
-}
-
-void DeviceManagementPolicyProvider::CancelRefreshTask() {
- if (refresh_task_) {
- refresh_task_->Cancel();
- refresh_task_ = NULL;
- }
-}
-
-void DeviceManagementPolicyProvider::NotifyCloudPolicyUpdate() {
- FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
- observer_list_,
- OnUpdatePolicy());
-}
-
-FilePath DeviceManagementPolicyProvider::GetTokenPath() {
- return storage_dir_.Append(kDeviceTokenFilename);
-}
-
-void DeviceManagementPolicyProvider::SetDeviceTokenFetcher(
- DeviceTokenFetcher* token_fetcher) {
- registrar_.Init(token_fetcher);
- registrar_.AddObserver(this);
- token_fetcher_ = token_fetcher;
-}
-
-void DeviceManagementPolicyProvider::SetState(
- DeviceManagementPolicyProvider::ProviderState new_state) {
- state_ = new_state;
-
- // If this state transition completes the initial policy fetch, let the
- // observers now.
- if (!initial_fetch_done_ &&
- new_state != STATE_INITIALIZING &&
- new_state != STATE_TOKEN_VALID) {
- initial_fetch_done_ = true;
- NotifyCloudPolicyUpdate();
- }
-
- base::Time now(base::Time::NowFromSystemTime());
- base::Time refresh_at;
- base::Time last_refresh(cache_->last_policy_refresh_time());
- if (last_refresh.is_null())
- last_refresh = now;
-
- // Determine when to take the next step.
- switch (state_) {
- case STATE_INITIALIZING:
- refresh_at = now;
- break;
- case STATE_TOKEN_VALID:
- effective_token_fetch_error_delay_ms_ = token_fetch_error_delay_ms_;
- refresh_at = now;
- break;
- case STATE_TOKEN_RESET:
- refresh_at = now;
- break;
- case STATE_UNMANAGED:
- refresh_at = last_refresh +
- base::TimeDelta::FromMilliseconds(unmanaged_device_refresh_rate_ms_);
- break;
- case STATE_POLICY_VALID:
- effective_policy_refresh_error_delay_ms_ = policy_refresh_error_delay_ms_;
- refresh_at =
- last_refresh + base::TimeDelta::FromMilliseconds(GetRefreshDelay());
- break;
- case STATE_TOKEN_ERROR:
- refresh_at = now + base::TimeDelta::FromMilliseconds(
- effective_token_fetch_error_delay_ms_);
- effective_token_fetch_error_delay_ms_ *= 2;
- if (effective_token_fetch_error_delay_ms_ > policy_refresh_rate_ms_)
- effective_token_fetch_error_delay_ms_ = policy_refresh_rate_ms_;
- break;
- case STATE_POLICY_ERROR:
- refresh_at = now + base::TimeDelta::FromMilliseconds(
- effective_policy_refresh_error_delay_ms_);
- effective_policy_refresh_error_delay_ms_ *= 2;
- if (effective_policy_refresh_error_delay_ms_ > policy_refresh_rate_ms_)
- effective_policy_refresh_error_delay_ms_ = policy_refresh_rate_ms_;
- break;
- }
-
- // Update the refresh task.
- CancelRefreshTask();
- if (!refresh_at.is_null()) {
- refresh_task_ = new RefreshTask(this);
- int64 delay = std::max<int64>((refresh_at - now).InMilliseconds(), 0);
- BrowserThread::PostDelayedTask(BrowserThread::UI, FROM_HERE, refresh_task_,
- delay);
- }
-}
-
-int64 DeviceManagementPolicyProvider::GetRefreshDelay() {
- int64 deviation = (policy_refresh_deviation_factor_percent_ *
- policy_refresh_rate_ms_) / 100;
- deviation = std::min(deviation, policy_refresh_deviation_max_ms_);
- return policy_refresh_rate_ms_ - base::RandGenerator(deviation + 1);
-}
-
-bool DeviceManagementPolicyProvider::TokenAvailable() const {
- return state_ == STATE_TOKEN_VALID ||
- state_ == STATE_POLICY_VALID ||
- state_ == STATE_POLICY_ERROR;
-}
-
-// static
-std::string DeviceManagementPolicyProvider::GetDeviceManagementURL() {
- return CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
- switches::kDeviceManagementUrl);
-}
-
-// static
-FilePath DeviceManagementPolicyProvider::GetOrCreateDeviceManagementDir(
- const FilePath& user_data_dir) {
- const FilePath device_management_dir = user_data_dir.Append(
- FILE_PATH_LITERAL("Device Management"));
- if (!file_util::DirectoryExists(device_management_dir)) {
- if (!file_util::CreateDirectory(device_management_dir))
- NOTREACHED();
- }
- return device_management_dir;
-}
-
-} // namespace policy
« no previous file with comments | « chrome/browser/policy/device_management_policy_provider.h ('k') | chrome/browser/policy/device_policy_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698