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

Unified Diff: chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc

Issue 12538009: Public Sessions: fetch device robot api token during enterprise enrollment. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: rebase Created 7 years, 8 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/chromeos/policy/enrollment_handler_chromeos.cc
diff --git a/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc b/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc
index 41aee2b77220b4e6d2d3b9509fcb14aff94db94e..d7fbbe3cb897aec0507396a67d0e5f373bf75015 100644
--- a/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc
+++ b/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc
@@ -7,10 +7,14 @@
#include "base/bind.h"
#include "base/logging.h"
#include "base/message_loop.h"
+#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.h"
+#include "chrome/browser/chromeos/settings/device_oauth2_token_service.h"
+#include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h"
#include "chrome/browser/policy/cloud/cloud_policy_constants.h"
#include "chrome/browser/policy/proto/chromeos/chrome_device_policy.pb.h"
#include "chrome/browser/policy/proto/cloud/device_management_backend.pb.h"
+#include "google_apis/gaia/gaia_urls.h"
namespace em = enterprise_management;
@@ -129,18 +133,37 @@ void EnrollmentHandlerChromeOS::OnRegistrationStateChanged(
void EnrollmentHandlerChromeOS::OnClientError(CloudPolicyClient* client) {
DCHECK_EQ(client_.get(), client);
- if (enrollment_step_ < STEP_POLICY_FETCH)
+ if (enrollment_step_ == STEP_ROBOT_AUTH_FETCH) {
+ LOG(WARNING) << "API authentication code fetch failed: "
+ << client_->status();
+ // Robot auth tokens are currently optional. Skip fetching the refresh
+ // token and jump directly to the lock device step.
+ robot_refresh_token_.clear();
+ DoLockDeviceStep();
+ } else if (enrollment_step_ < STEP_POLICY_FETCH) {
ReportResult(EnrollmentStatus::ForRegistrationError(client_->status()));
- else
+ } else {
ReportResult(EnrollmentStatus::ForFetchError(client_->status()));
+ }
}
void EnrollmentHandlerChromeOS::OnStoreLoaded(CloudPolicyStore* store) {
DCHECK_EQ(store_, store);
if (enrollment_step_ == STEP_LOADING_STORE) {
+ // If the |store_| wasn't initialized when StartEnrollment() was
+ // called, then AttemptRegistration() bails silently. This gets
+ // registration rolling again after the store finishes loading.
AttemptRegistration();
} else if (enrollment_step_ == STEP_STORE_POLICY) {
+ // Store the robot API auth refresh token.
+ // Currently optional, so always return success.
+ chromeos::DeviceOAuth2TokenService* token_service =
+ chromeos::DeviceOAuth2TokenServiceFactory::Get();
+ if (token_service && !robot_refresh_token_.empty()) {
+ token_service->SetAndSaveRefreshToken(robot_refresh_token_);
+
+ }
ReportResult(EnrollmentStatus::ForStatus(EnrollmentStatus::STATUS_SUCCESS));
}
}
@@ -165,15 +188,78 @@ void EnrollmentHandlerChromeOS::PolicyValidated(
CHECK_EQ(STEP_VALIDATION, enrollment_step_);
if (validator->success()) {
policy_ = validator->policy().Pass();
- enrollment_step_ = STEP_LOCK_DEVICE;
- WriteInstallAttributes(validator->policy_data()->username(), device_mode_,
- validator->policy_data()->device_id());
+ username_ = validator->policy_data()->username();
+ device_id_ = validator->policy_data()->device_id();
+
+ enrollment_step_ = STEP_ROBOT_AUTH_FETCH;
+ client_->FetchRobotAuthCodes(auth_token_);
} else {
ReportResult(EnrollmentStatus::ForValidationError(validator->status()));
}
}
-void EnrollmentHandlerChromeOS::WriteInstallAttributes(
+void EnrollmentHandlerChromeOS::OnRobotAuthCodesFetched(
+ CloudPolicyClient* client) {
+ DCHECK_EQ(client_.get(), client);
+ CHECK_EQ(STEP_ROBOT_AUTH_FETCH, enrollment_step_);
+
+ enrollment_step_ = STEP_ROBOT_AUTH_REFRESH;
+
+ gaia::OAuthClientInfo client_info;
+ client_info.client_id = GaiaUrls::GetInstance()->oauth2_chrome_client_id();
+ client_info.client_secret =
+ GaiaUrls::GetInstance()->oauth2_chrome_client_secret();
+
+ // Use the system request context to avoid sending user cookies.
+ gaia_oauth_client_.reset(new gaia::GaiaOAuthClient(
+ GaiaUrls::GetInstance()->oauth2_token_url(),
+ g_browser_process->system_request_context()));
+ gaia_oauth_client_->GetTokensFromAuthCode(client_info,
+ client->robot_api_auth_code(),
+ 0 /* max_retries */,
+ this);
+}
+
+// GaiaOAuthClient::Delegate callback for OAuth2 refresh token fetched.
+void EnrollmentHandlerChromeOS::OnGetTokensResponse(
+ const std::string& refresh_token,
+ const std::string& access_token,
+ int expires_in_seconds) {
+ CHECK_EQ(STEP_ROBOT_AUTH_REFRESH, enrollment_step_);
+
+ robot_refresh_token_ = refresh_token;
+
+ DoLockDeviceStep();
+}
+
+void EnrollmentHandlerChromeOS::DoLockDeviceStep() {
+ enrollment_step_ = STEP_LOCK_DEVICE,
+ StartLockDevice(username_, device_mode_, device_id_);
+}
+
+// GaiaOAuthClient::Delegate
+void EnrollmentHandlerChromeOS::OnRefreshTokenResponse(
+ const std::string& access_token,
+ int expires_in_seconds) {
+ // We never use the code that should trigger this callback.
+ LOG(FATAL) << "Unexpected callback invoked";
+}
+
+// GaiaOAuthClient::Delegate OAuth2 error when fetching refresh token request.
+void EnrollmentHandlerChromeOS::OnOAuthError() {
+ CHECK_EQ(STEP_ROBOT_AUTH_REFRESH, enrollment_step_);
+ DoLockDeviceStep();
+}
+
+// GaiaOAuthClient::Delegate network error when fetching refresh token.
+void EnrollmentHandlerChromeOS::OnNetworkError(int response_code) {
+ LOG(ERROR) << "Network error while fetching API refresh token: "
+ << response_code;
+ CHECK_EQ(STEP_ROBOT_AUTH_REFRESH, enrollment_step_);
+ DoLockDeviceStep();
+}
+
+void EnrollmentHandlerChromeOS::StartLockDevice(
const std::string& user,
DeviceMode device_mode,
const std::string& device_id) {
@@ -195,6 +281,7 @@ void EnrollmentHandlerChromeOS::HandleLockDeviceResult(
DeviceMode device_mode,
const std::string& device_id,
EnterpriseInstallAttributes::LockResult lock_result) {
+ CHECK_EQ(STEP_LOCK_DEVICE, enrollment_step_);
switch (lock_result) {
case EnterpriseInstallAttributes::LOCK_SUCCESS:
enrollment_step_ = STEP_STORE_POLICY;
@@ -209,7 +296,7 @@ void EnrollmentHandlerChromeOS::HandleLockDeviceResult(
<< kLockRetryIntervalMs << "ms.";
MessageLoop::current()->PostDelayedTask(
FROM_HERE,
- base::Bind(&EnrollmentHandlerChromeOS::WriteInstallAttributes,
+ base::Bind(&EnrollmentHandlerChromeOS::StartLockDevice,
weak_factory_.GetWeakPtr(),
user, device_mode, device_id),
base::TimeDelta::FromMilliseconds(kLockRetryIntervalMs));

Powered by Google App Engine
This is Rietveld 408576698