| Index: chrome/browser/policy/cloud_policy_controller.cc
|
| diff --git a/chrome/browser/policy/cloud_policy_controller.cc b/chrome/browser/policy/cloud_policy_controller.cc
|
| index 3d3d8ccdd15022b393e1604521ec417a88984165..6f58a6d4ebb0f3794d5720d40925de102851dae6 100644
|
| --- a/chrome/browser/policy/cloud_policy_controller.cc
|
| +++ b/chrome/browser/policy/cloud_policy_controller.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.
|
|
|
| @@ -14,13 +14,13 @@
|
| #include "base/string_util.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_subsystem.h"
|
| #include "chrome/browser/policy/delayed_work_scheduler.h"
|
| #include "chrome/browser/policy/device_management_service.h"
|
| #include "chrome/browser/policy/device_token_fetcher.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/common/guid.h"
|
|
|
| namespace {
|
| @@ -123,71 +123,76 @@ void CloudPolicyController::RefreshPolicies() {
|
| }
|
| }
|
|
|
| -void CloudPolicyController::HandlePolicyResponse(
|
| - const em::DevicePolicyResponse& response) {
|
| - if (response.response_size() > 0) {
|
| - if (response.response_size() > 1) {
|
| - LOG(WARNING) << "More than one policy in the response of the device "
|
| - << "management server, discarding.";
|
| - }
|
| - if (!response.response(0).has_error_code() ||
|
| - response.response(0).error_code() ==
|
| - DeviceManagementBackend::kPolicyFetchSuccess) {
|
| - cache_->SetPolicy(response.response(0));
|
| - SetState(STATE_POLICY_VALID);
|
| - } else {
|
| - UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyFetchBadResponse,
|
| - kMetricPolicySize);
|
| - SetState(STATE_POLICY_UNAVAILABLE);
|
| - }
|
| - } else {
|
| - UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyFetchBadResponse,
|
| - kMetricPolicySize);
|
| - SetState(STATE_POLICY_UNAVAILABLE);
|
| +void CloudPolicyController::OnPolicyFetchCompleted(
|
| + DeviceManagementStatus status,
|
| + const em::DeviceManagementResponse& response) {
|
| + if (status == DM_STATUS_SUCCESS && !response.has_policy_response()) {
|
| + // Handled below.
|
| + status = DM_STATUS_RESPONSE_DECODING_ERROR;
|
| }
|
| -}
|
|
|
| -void CloudPolicyController::OnError(DeviceManagementBackend::ErrorCode code) {
|
| - switch (code) {
|
| - case DeviceManagementBackend::kErrorServiceDeviceNotFound:
|
| - case DeviceManagementBackend::kErrorServiceDeviceIdConflict:
|
| - case DeviceManagementBackend::kErrorServiceManagementTokenInvalid: {
|
| + switch (status) {
|
| + case DM_STATUS_SUCCESS: {
|
| + const em::DevicePolicyResponse& policy_response(
|
| + response.policy_response());
|
| + if (policy_response.response_size() > 0) {
|
| + if (policy_response.response_size() > 1) {
|
| + LOG(WARNING) << "More than one policy in the response of the device "
|
| + << "management server, discarding.";
|
| + }
|
| + const em::PolicyFetchResponse& fetch_response(
|
| + policy_response.response(0));
|
| + if (!fetch_response.has_error_code() ||
|
| + fetch_response.error_code() == dm_protocol::POLICY_FETCH_SUCCESS) {
|
| + cache_->SetPolicy(fetch_response);
|
| + SetState(STATE_POLICY_VALID);
|
| + } else {
|
| + UMA_HISTOGRAM_ENUMERATION(kMetricPolicy,
|
| + kMetricPolicyFetchBadResponse,
|
| + kMetricPolicySize);
|
| + SetState(STATE_POLICY_UNAVAILABLE);
|
| + }
|
| + } else {
|
| + UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyFetchBadResponse,
|
| + kMetricPolicySize);
|
| + SetState(STATE_POLICY_UNAVAILABLE);
|
| + }
|
| + return;
|
| + }
|
| + case DM_STATUS_SERVICE_DEVICE_NOT_FOUND:
|
| + case DM_STATUS_SERVICE_DEVICE_ID_CONFLICT:
|
| + case DM_STATUS_SERVICE_MANAGEMENT_TOKEN_INVALID:
|
| LOG(WARNING) << "The device token was either invalid or unknown to the "
|
| << "device manager, re-registering device.";
|
| // Will retry fetching a token but gracefully backing off.
|
| SetState(STATE_TOKEN_ERROR);
|
| return;
|
| - }
|
| - case DeviceManagementBackend::kErrorServiceInvalidSerialNumber: {
|
| + case DM_STATUS_SERVICE_INVALID_SERIAL_NUMBER:
|
| VLOG(1) << "The device is no longer enlisted for the domain.";
|
| token_fetcher_->SetSerialNumberInvalidState();
|
| SetState(STATE_TOKEN_ERROR);
|
| return;
|
| - }
|
| - case DeviceManagementBackend::kErrorServiceManagementNotSupported: {
|
| + case DM_STATUS_SERVICE_MANAGEMENT_NOT_SUPPORTED:
|
| VLOG(1) << "The device is no longer managed.";
|
| token_fetcher_->SetUnmanagedState();
|
| SetState(STATE_TOKEN_UNMANAGED);
|
| return;
|
| - }
|
| - case DeviceManagementBackend::kErrorServicePolicyNotFound:
|
| - case DeviceManagementBackend::kErrorRequestInvalid:
|
| - case DeviceManagementBackend::kErrorServiceActivationPending:
|
| - case DeviceManagementBackend::kErrorResponseDecoding:
|
| - case DeviceManagementBackend::kErrorHttpStatus: {
|
| + case DM_STATUS_SERVICE_POLICY_NOT_FOUND:
|
| + case DM_STATUS_REQUEST_INVALID:
|
| + case DM_STATUS_SERVICE_ACTIVATION_PENDING:
|
| + case DM_STATUS_RESPONSE_DECODING_ERROR:
|
| + case DM_STATUS_HTTP_STATUS_ERROR:
|
| VLOG(1) << "An error in the communication with the policy server occurred"
|
| << ", will retry in a few hours.";
|
| SetState(STATE_POLICY_UNAVAILABLE);
|
| return;
|
| - }
|
| - case DeviceManagementBackend::kErrorRequestFailed:
|
| - case DeviceManagementBackend::kErrorTemporaryUnavailable: {
|
| + case DM_STATUS_REQUEST_FAILED:
|
| + case DM_STATUS_TEMPORARY_UNAVAILABLE:
|
| VLOG(1) << "A temporary error in the communication with the policy server"
|
| << " occurred.";
|
| // Will retry last operation but gracefully backing off.
|
| SetState(STATE_POLICY_ERROR);
|
| return;
|
| - }
|
| }
|
|
|
| NOTREACHED();
|
| @@ -279,10 +284,16 @@ void CloudPolicyController::FetchToken() {
|
| }
|
|
|
| void CloudPolicyController::SendPolicyRequest() {
|
| - backend_.reset(service_->CreateBackend());
|
| DCHECK(!data_store_->device_token().empty());
|
| - em::DevicePolicyRequest policy_request;
|
| - em::PolicyFetchRequest* fetch_request = policy_request.add_request();
|
| + request_job_.reset(
|
| + service_->CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH));
|
| + request_job_->SetDMToken(data_store_->device_token());
|
| + request_job_->SetClientID(data_store_->device_id());
|
| + request_job_->SetUserAffiliation(data_store_->user_affiliation());
|
| +
|
| + em::DeviceManagementRequest* request = request_job_->GetRequest();
|
| + em::PolicyFetchRequest* fetch_request =
|
| + request->mutable_policy_request()->add_request();
|
| em::DeviceStatusReportRequest device_status;
|
| fetch_request->set_signature_type(em::PolicyFetchRequest::SHA1_RSA);
|
| fetch_request->set_policy_type(data_store_->policy_type());
|
| @@ -299,14 +310,14 @@ void CloudPolicyController::SendPolicyRequest() {
|
| fetch_request->set_public_key_version(key_version);
|
|
|
| #if defined(OS_CHROMEOS)
|
| - if (data_store_->device_status_collector())
|
| - data_store_->device_status_collector()->GetStatus(&device_status);
|
| + if (data_store_->device_status_collector()) {
|
| + data_store_->device_status_collector()->GetStatus(
|
| + request->mutable_device_status_report_request());
|
| + }
|
| #endif
|
|
|
| - backend_->ProcessPolicyRequest(data_store_->device_token(),
|
| - data_store_->device_id(),
|
| - data_store_->user_affiliation(),
|
| - policy_request, &device_status, this);
|
| + request_job_->Start(base::Bind(&CloudPolicyController::OnPolicyFetchCompleted,
|
| + base::Unretained(this)));
|
| }
|
|
|
| void CloudPolicyController::DoWork() {
|
| @@ -332,7 +343,7 @@ void CloudPolicyController::SetState(
|
| CloudPolicyController::ControllerState new_state) {
|
| state_ = new_state;
|
|
|
| - backend_.reset(); // Stop any pending requests.
|
| + request_job_.reset(); // Stop any pending requests.
|
|
|
| base::Time now(base::Time::NowFromSystemTime());
|
| base::Time refresh_at;
|
|
|