| Index: chrome/browser/policy/device_token_fetcher.cc
|
| diff --git a/chrome/browser/policy/device_token_fetcher.cc b/chrome/browser/policy/device_token_fetcher.cc
|
| deleted file mode 100644
|
| index 2427df64f76220d6d720cb0934a7d075a71ebd35..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/policy/device_token_fetcher.cc
|
| +++ /dev/null
|
| @@ -1,374 +0,0 @@
|
| -// 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.
|
| -
|
| -#include "chrome/browser/policy/device_token_fetcher.h"
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/metrics/histogram.h"
|
| -#include "base/time.h"
|
| -#include "chrome/browser/policy/cloud_policy_cache_base.h"
|
| -#include "chrome/browser/policy/cloud_policy_constants.h"
|
| -#include "chrome/browser/policy/cloud_policy_data_store.h"
|
| -#include "chrome/browser/policy/delayed_work_scheduler.h"
|
| -#include "chrome/browser/policy/device_management_service.h"
|
| -#include "chrome/browser/policy/enterprise_metrics.h"
|
| -#include "chrome/browser/policy/policy_notifier.h"
|
| -#include "chrome/browser/policy/proto/device_management_local.pb.h"
|
| -
|
| -namespace em = enterprise_management;
|
| -
|
| -namespace policy {
|
| -
|
| -namespace {
|
| -
|
| -// Retry after 5 minutes (with exponential backoff) after token fetch errors.
|
| -const int64 kTokenFetchErrorDelayMilliseconds = 5 * 60 * 1000;
|
| -// Retry after max 3 hours after token fetch errors.
|
| -const int64 kTokenFetchErrorMaxDelayMilliseconds = 3 * 60 * 60 * 1000;
|
| -// For unmanaged devices, check once per day whether they're still unmanaged.
|
| -const int64 kUnmanagedDeviceRefreshRateMilliseconds = 24 * 60 * 60 * 1000;
|
| -
|
| -// Records the UMA metric corresponding to |status|, if it represents an error.
|
| -// Also records that a fetch response was received.
|
| -void SampleErrorStatus(DeviceManagementStatus status) {
|
| - UMA_HISTOGRAM_ENUMERATION(kMetricToken, kMetricTokenFetchResponseReceived,
|
| - kMetricTokenSize);
|
| - int sample = -1;
|
| - switch (status) {
|
| - case DM_STATUS_SUCCESS:
|
| - return;
|
| - case DM_STATUS_REQUEST_FAILED:
|
| - case DM_STATUS_REQUEST_INVALID:
|
| - case DM_STATUS_SERVICE_MANAGEMENT_TOKEN_INVALID:
|
| - sample = kMetricTokenFetchRequestFailed;
|
| - break;
|
| - case DM_STATUS_SERVICE_MANAGEMENT_NOT_SUPPORTED:
|
| - sample = kMetricTokenFetchManagementNotSupported;
|
| - break;
|
| - case DM_STATUS_SERVICE_DEVICE_NOT_FOUND:
|
| - sample = kMetricTokenFetchDeviceNotFound;
|
| - break;
|
| - case DM_STATUS_SERVICE_DEVICE_ID_CONFLICT:
|
| - sample = kMetricTokenFetchDeviceIdConflict;
|
| - break;
|
| - case DM_STATUS_SERVICE_INVALID_SERIAL_NUMBER:
|
| - sample = kMetricTokenFetchInvalidSerialNumber;
|
| - break;
|
| - case DM_STATUS_RESPONSE_DECODING_ERROR:
|
| - sample = kMetricTokenFetchBadResponse;
|
| - break;
|
| - case DM_STATUS_SERVICE_MISSING_LICENSES:
|
| - sample = kMetricMissingLicenses;
|
| - break;
|
| - case DM_STATUS_TEMPORARY_UNAVAILABLE:
|
| - case DM_STATUS_SERVICE_ACTIVATION_PENDING:
|
| - case DM_STATUS_SERVICE_POLICY_NOT_FOUND:
|
| - case DM_STATUS_HTTP_STATUS_ERROR:
|
| - sample = kMetricTokenFetchServerFailed;
|
| - break;
|
| - }
|
| - if (sample != -1)
|
| - UMA_HISTOGRAM_ENUMERATION(kMetricToken, sample, kMetricTokenSize);
|
| - else
|
| - NOTREACHED();
|
| -}
|
| -
|
| -// Translates the DeviceRegisterResponse::DeviceMode |mode| to the enum used
|
| -// internally to represent different device modes.
|
| -DeviceMode TranslateProtobufDeviceMode(
|
| - em::DeviceRegisterResponse::DeviceMode mode) {
|
| - switch (mode) {
|
| - case em::DeviceRegisterResponse::ENTERPRISE:
|
| - return DEVICE_MODE_ENTERPRISE;
|
| - case em::DeviceRegisterResponse::RETAIL:
|
| - return DEVICE_MODE_KIOSK;
|
| - }
|
| - LOG(ERROR) << "Unknown enrollment mode in registration response: " << mode;
|
| - return DEVICE_MODE_PENDING;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -DeviceTokenFetcher::DeviceTokenFetcher(
|
| - DeviceManagementService* service,
|
| - CloudPolicyCacheBase* cache,
|
| - CloudPolicyDataStore* data_store,
|
| - PolicyNotifier* notifier)
|
| - : effective_token_fetch_error_delay_ms_(
|
| - kTokenFetchErrorDelayMilliseconds) {
|
| - Initialize(service,
|
| - cache,
|
| - data_store,
|
| - notifier,
|
| - new DelayedWorkScheduler);
|
| -}
|
| -
|
| -DeviceTokenFetcher::DeviceTokenFetcher(
|
| - DeviceManagementService* service,
|
| - CloudPolicyCacheBase* cache,
|
| - CloudPolicyDataStore* data_store,
|
| - PolicyNotifier* notifier,
|
| - DelayedWorkScheduler* scheduler)
|
| - : effective_token_fetch_error_delay_ms_(
|
| - kTokenFetchErrorDelayMilliseconds) {
|
| - Initialize(service, cache, data_store, notifier, scheduler);
|
| -}
|
| -
|
| -DeviceTokenFetcher::~DeviceTokenFetcher() {
|
| - scheduler_->CancelDelayedWork();
|
| -}
|
| -
|
| -void DeviceTokenFetcher::FetchToken() {
|
| - SetState(STATE_INACTIVE);
|
| - FetchTokenInternal();
|
| -}
|
| -
|
| -void DeviceTokenFetcher::SetUnmanagedState() {
|
| - // The call to |cache_->SetUnmanaged()| has to happen first because it sets
|
| - // the timestamp that |SetState()| needs to determine the correct refresh
|
| - // time.
|
| - cache_->SetUnmanaged();
|
| - SetState(STATE_UNMANAGED);
|
| -}
|
| -
|
| -void DeviceTokenFetcher::SetSerialNumberInvalidState() {
|
| - SetState(STATE_BAD_SERIAL);
|
| -}
|
| -
|
| -void DeviceTokenFetcher::SetMissingLicensesState() {
|
| - SetState(STATE_MISSING_LICENSES);
|
| -}
|
| -
|
| -void DeviceTokenFetcher::Reset() {
|
| - SetState(STATE_INACTIVE);
|
| -}
|
| -
|
| -void DeviceTokenFetcher::Initialize(DeviceManagementService* service,
|
| - CloudPolicyCacheBase* cache,
|
| - CloudPolicyDataStore* data_store,
|
| - PolicyNotifier* notifier,
|
| - DelayedWorkScheduler* scheduler) {
|
| - service_ = service;
|
| - cache_ = cache;
|
| - notifier_ = notifier;
|
| - data_store_ = data_store;
|
| - effective_token_fetch_error_delay_ms_ = kTokenFetchErrorDelayMilliseconds;
|
| - state_ = STATE_INACTIVE;
|
| - scheduler_.reset(scheduler);
|
| -
|
| - if (cache_->is_unmanaged())
|
| - SetState(STATE_UNMANAGED);
|
| -}
|
| -
|
| -void DeviceTokenFetcher::FetchTokenInternal() {
|
| - DCHECK(state_ != STATE_TOKEN_AVAILABLE);
|
| - if (!data_store_->has_auth_token() || data_store_->device_id().empty()) {
|
| - // Maybe this device is unmanaged, just exit. The CloudPolicyController
|
| - // will call FetchToken() again if something changes.
|
| - return;
|
| - }
|
| - // Reinitialize |request_job_|, discarding any previous requests.
|
| - request_job_.reset(
|
| - service_->CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION));
|
| - request_job_->SetGaiaToken(data_store_->gaia_token());
|
| - request_job_->SetOAuthToken(data_store_->oauth_token());
|
| - request_job_->SetClientID(data_store_->device_id());
|
| - em::DeviceRegisterRequest* request =
|
| - request_job_->GetRequest()->mutable_register_request();
|
| - request->set_type(data_store_->policy_register_type());
|
| - if (!data_store_->machine_id().empty())
|
| - request->set_machine_id(data_store_->machine_id());
|
| - if (!data_store_->machine_model().empty())
|
| - request->set_machine_model(data_store_->machine_model());
|
| - if (data_store_->known_machine_id())
|
| - request->set_auto_enrolled(true);
|
| - if (data_store_->reregister())
|
| - request->set_reregister(true);
|
| - request_job_->Start(base::Bind(&DeviceTokenFetcher::OnTokenFetchCompleted,
|
| - base::Unretained(this)));
|
| - UMA_HISTOGRAM_ENUMERATION(kMetricToken, kMetricTokenFetchRequested,
|
| - kMetricTokenSize);
|
| -}
|
| -
|
| -void DeviceTokenFetcher::OnTokenFetchCompleted(
|
| - DeviceManagementStatus status,
|
| - const em::DeviceManagementResponse& response) {
|
| - if (status == DM_STATUS_SUCCESS && !response.has_register_response()) {
|
| - // Handled below.
|
| - status = DM_STATUS_RESPONSE_DECODING_ERROR;
|
| - }
|
| -
|
| - LOG_IF(ERROR, status != DM_STATUS_SUCCESS) << "DMServer returned error code: "
|
| - << status;
|
| - SampleErrorStatus(status);
|
| -
|
| - switch (status) {
|
| - case DM_STATUS_SUCCESS: {
|
| - const em::DeviceRegisterResponse& register_response =
|
| - response.register_response();
|
| - if (register_response.has_device_management_token()) {
|
| - UMA_HISTOGRAM_ENUMERATION(kMetricToken, kMetricTokenFetchOK,
|
| - kMetricTokenSize);
|
| -
|
| - if (data_store_->policy_register_type() ==
|
| - em::DeviceRegisterRequest::DEVICE) {
|
| - DeviceMode mode = DEVICE_MODE_ENTERPRISE;
|
| - if (register_response.has_enrollment_type()) {
|
| - mode = TranslateProtobufDeviceMode(
|
| - register_response.enrollment_type());
|
| - }
|
| - if (mode == DEVICE_MODE_PENDING) {
|
| - LOG(ERROR) << "Enrollment mode missing or unknown!";
|
| - SetState(STATE_BAD_ENROLLMENT_MODE);
|
| - return;
|
| - }
|
| - data_store_->set_device_mode(mode);
|
| - }
|
| - data_store_->SetDeviceToken(register_response.device_management_token(),
|
| - false);
|
| - SetState(STATE_TOKEN_AVAILABLE);
|
| - } else {
|
| - NOTREACHED();
|
| - UMA_HISTOGRAM_ENUMERATION(kMetricToken, kMetricTokenFetchBadResponse,
|
| - kMetricTokenSize);
|
| - SetState(STATE_ERROR);
|
| - }
|
| - return;
|
| - }
|
| - case DM_STATUS_SERVICE_MANAGEMENT_NOT_SUPPORTED:
|
| - SetUnmanagedState();
|
| - return;
|
| - case DM_STATUS_REQUEST_FAILED:
|
| - case DM_STATUS_TEMPORARY_UNAVAILABLE:
|
| - case DM_STATUS_SERVICE_DEVICE_NOT_FOUND:
|
| - case DM_STATUS_SERVICE_DEVICE_ID_CONFLICT:
|
| - SetState(STATE_TEMPORARY_ERROR);
|
| - return;
|
| - case DM_STATUS_SERVICE_MANAGEMENT_TOKEN_INVALID:
|
| - // Most probably the GAIA auth cookie has expired. We can not do anything
|
| - // until the user logs-in again.
|
| - SetState(STATE_BAD_AUTH);
|
| - return;
|
| - case DM_STATUS_SERVICE_INVALID_SERIAL_NUMBER:
|
| - SetSerialNumberInvalidState();
|
| - return;
|
| - case DM_STATUS_SERVICE_MISSING_LICENSES:
|
| - SetMissingLicensesState();
|
| - return;
|
| - case DM_STATUS_REQUEST_INVALID:
|
| - case DM_STATUS_HTTP_STATUS_ERROR:
|
| - case DM_STATUS_RESPONSE_DECODING_ERROR:
|
| - case DM_STATUS_SERVICE_ACTIVATION_PENDING:
|
| - case DM_STATUS_SERVICE_POLICY_NOT_FOUND:
|
| - SetState(STATE_ERROR);
|
| - return;
|
| - }
|
| - NOTREACHED();
|
| - SetState(STATE_ERROR);
|
| -}
|
| -
|
| -void DeviceTokenFetcher::SetState(FetcherState state) {
|
| - state_ = state;
|
| - if (state_ != STATE_TEMPORARY_ERROR)
|
| - effective_token_fetch_error_delay_ms_ = kTokenFetchErrorDelayMilliseconds;
|
| -
|
| - request_job_.reset(); // Stop any pending requests.
|
| -
|
| - base::Time delayed_work_at;
|
| - switch (state_) {
|
| - case STATE_INACTIVE:
|
| - notifier_->Inform(CloudPolicySubsystem::UNENROLLED,
|
| - CloudPolicySubsystem::NO_DETAILS,
|
| - PolicyNotifier::TOKEN_FETCHER);
|
| - break;
|
| - case STATE_TOKEN_AVAILABLE:
|
| - notifier_->Inform(CloudPolicySubsystem::SUCCESS,
|
| - CloudPolicySubsystem::NO_DETAILS,
|
| - PolicyNotifier::TOKEN_FETCHER);
|
| - break;
|
| - case STATE_BAD_SERIAL:
|
| - notifier_->Inform(CloudPolicySubsystem::UNENROLLED,
|
| - CloudPolicySubsystem::BAD_SERIAL_NUMBER,
|
| - PolicyNotifier::TOKEN_FETCHER);
|
| - break;
|
| - case STATE_BAD_ENROLLMENT_MODE:
|
| - notifier_->Inform(CloudPolicySubsystem::UNENROLLED,
|
| - CloudPolicySubsystem::BAD_ENROLLMENT_MODE,
|
| - PolicyNotifier::TOKEN_FETCHER);
|
| - break;
|
| - case STATE_MISSING_LICENSES:
|
| - notifier_->Inform(CloudPolicySubsystem::UNENROLLED,
|
| - CloudPolicySubsystem::MISSING_LICENSES,
|
| - PolicyNotifier::TOKEN_FETCHER);
|
| - break;
|
| - case STATE_UNMANAGED:
|
| - delayed_work_at = cache_->last_policy_refresh_time() +
|
| - base::TimeDelta::FromMilliseconds(
|
| - kUnmanagedDeviceRefreshRateMilliseconds);
|
| - notifier_->Inform(CloudPolicySubsystem::UNMANAGED,
|
| - CloudPolicySubsystem::NO_DETAILS,
|
| - PolicyNotifier::TOKEN_FETCHER);
|
| - break;
|
| - case STATE_TEMPORARY_ERROR:
|
| - delayed_work_at = base::Time::Now() +
|
| - base::TimeDelta::FromMilliseconds(
|
| - effective_token_fetch_error_delay_ms_);
|
| - effective_token_fetch_error_delay_ms_ =
|
| - std::min(effective_token_fetch_error_delay_ms_ * 2,
|
| - kTokenFetchErrorMaxDelayMilliseconds);
|
| - notifier_->Inform(CloudPolicySubsystem::NETWORK_ERROR,
|
| - CloudPolicySubsystem::DMTOKEN_NETWORK_ERROR,
|
| - PolicyNotifier::TOKEN_FETCHER);
|
| - break;
|
| - case STATE_ERROR:
|
| - effective_token_fetch_error_delay_ms_ =
|
| - kTokenFetchErrorMaxDelayMilliseconds;
|
| - delayed_work_at = base::Time::Now() +
|
| - base::TimeDelta::FromMilliseconds(
|
| - effective_token_fetch_error_delay_ms_);
|
| - notifier_->Inform(CloudPolicySubsystem::NETWORK_ERROR,
|
| - CloudPolicySubsystem::DMTOKEN_NETWORK_ERROR,
|
| - PolicyNotifier::TOKEN_FETCHER);
|
| - break;
|
| - case STATE_BAD_AUTH:
|
| - // Can't do anything, need to wait for new credentials.
|
| - notifier_->Inform(CloudPolicySubsystem::BAD_GAIA_TOKEN,
|
| - CloudPolicySubsystem::NO_DETAILS,
|
| - PolicyNotifier::TOKEN_FETCHER);
|
| - break;
|
| - }
|
| -
|
| - scheduler_->CancelDelayedWork();
|
| - if (!delayed_work_at.is_null()) {
|
| - base::Time now(base::Time::Now());
|
| - int64 delay = std::max<int64>((delayed_work_at - now).InMilliseconds(), 0);
|
| - scheduler_->PostDelayedWork(
|
| - base::Bind(&DeviceTokenFetcher::DoWork, base::Unretained(this)), delay);
|
| - }
|
| -
|
| - // Inform the cache if a token fetch attempt has failed.
|
| - if (state_ != STATE_INACTIVE && state_ != STATE_TOKEN_AVAILABLE)
|
| - cache_->SetFetchingDone();
|
| -}
|
| -
|
| -void DeviceTokenFetcher::DoWork() {
|
| - switch (state_) {
|
| - case STATE_INACTIVE:
|
| - case STATE_TOKEN_AVAILABLE:
|
| - case STATE_BAD_SERIAL:
|
| - case STATE_BAD_ENROLLMENT_MODE:
|
| - case STATE_MISSING_LICENSES:
|
| - break;
|
| - case STATE_UNMANAGED:
|
| - case STATE_ERROR:
|
| - case STATE_TEMPORARY_ERROR:
|
| - case STATE_BAD_AUTH:
|
| - FetchTokenInternal();
|
| - break;
|
| - }
|
| -}
|
| -
|
| -} // namespace policy
|
|
|