| 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
|
| index 540c4df0c4990b6f10ab310ede62771db2d624b4..95942b68a048b961bdad8004968dfa9895c3ec06 100644
|
| --- a/chrome/browser/policy/device_token_fetcher.cc
|
| +++ b/chrome/browser/policy/device_token_fetcher.cc
|
| @@ -1,4 +1,4 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| +// 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.
|
|
|
| @@ -10,12 +10,12 @@
|
| #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_constants.h"
|
| #include "chrome/browser/policy/proto/device_management_local.pb.h"
|
|
|
| namespace {
|
| @@ -63,27 +63,6 @@ void DeviceTokenFetcher::FetchToken() {
|
| FetchTokenInternal();
|
| }
|
|
|
| -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;
|
| - }
|
| - // Construct a new backend, which will discard any previous requests.
|
| - backend_.reset(service_->CreateBackend());
|
| - em::DeviceRegisterRequest 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());
|
| - backend_->ProcessRegisterRequest(data_store_->gaia_token(),
|
| - data_store_->oauth_token(),
|
| - data_store_->device_id(),
|
| - request, this);
|
| -}
|
| -
|
| 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
|
| @@ -100,45 +79,95 @@ void DeviceTokenFetcher::Reset() {
|
| SetState(STATE_INACTIVE);
|
| }
|
|
|
| -void DeviceTokenFetcher::HandleRegisterResponse(
|
| - const em::DeviceRegisterResponse& response) {
|
| - if (response.has_device_management_token()) {
|
| - UMA_HISTOGRAM_ENUMERATION(kMetricToken, kMetricTokenFetchOK,
|
| - kMetricTokenSize);
|
| - data_store_->SetDeviceToken(response.device_management_token(), false);
|
| - SetState(STATE_TOKEN_AVAILABLE);
|
| - } else {
|
| - NOTREACHED();
|
| - UMA_HISTOGRAM_ENUMERATION(kMetricToken, kMetricTokenFetchBadResponse,
|
| - kMetricTokenSize);
|
| - SetState(STATE_ERROR);
|
| +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());
|
| + request_job_->Start(base::Bind(&DeviceTokenFetcher::OnTokenFetchCompleted,
|
| + base::Unretained(this)));
|
| }
|
|
|
| -void DeviceTokenFetcher::OnError(DeviceManagementBackend::ErrorCode code) {
|
| - switch (code) {
|
| - case DeviceManagementBackend::kErrorServiceManagementNotSupported:
|
| +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;
|
| + }
|
| +
|
| + 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);
|
| + 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 DeviceManagementBackend::kErrorRequestFailed:
|
| - case DeviceManagementBackend::kErrorTemporaryUnavailable:
|
| - case DeviceManagementBackend::kErrorServiceDeviceNotFound:
|
| - case DeviceManagementBackend::kErrorServiceDeviceIdConflict:
|
| + 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 DeviceManagementBackend::kErrorServiceManagementTokenInvalid:
|
| + 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 DeviceManagementBackend::kErrorServiceInvalidSerialNumber:
|
| + case DM_STATUS_SERVICE_INVALID_SERIAL_NUMBER:
|
| SetSerialNumberInvalidState();
|
| return;
|
| - case DeviceManagementBackend::kErrorRequestInvalid:
|
| - case DeviceManagementBackend::kErrorHttpStatus:
|
| - case DeviceManagementBackend::kErrorResponseDecoding:
|
| - case DeviceManagementBackend::kErrorServiceActivationPending:
|
| - case DeviceManagementBackend::kErrorServicePolicyNotFound:
|
| + 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;
|
| }
|
| @@ -146,29 +175,12 @@ void DeviceTokenFetcher::OnError(DeviceManagementBackend::ErrorCode code) {
|
| SetState(STATE_ERROR);
|
| }
|
|
|
| -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::SetState(FetcherState state) {
|
| state_ = state;
|
| if (state_ != STATE_TEMPORARY_ERROR)
|
| effective_token_fetch_error_delay_ms_ = kTokenFetchErrorDelayMilliseconds;
|
|
|
| - backend_.reset(); // Stop any pending requests.
|
| + request_job_.reset(); // Stop any pending requests.
|
|
|
| base::Time delayed_work_at;
|
| switch (state_) {
|
|
|