19085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// Copyright (c) 2012 The Chromium Authors. All rights reserved. 29085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// Use of this source code is governed by a BSD-style license that can be 39085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// found in the LICENSE file. 45ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org 55ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#ifndef CHROME_BROWSER_CHROMEOS_POLICY_AUTO_ENROLLMENT_CLIENT_H_ 65ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#define CHROME_BROWSER_CHROMEOS_POLICY_AUTO_ENROLLMENT_CLIENT_H_ 75ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org 89085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include <string> 99085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 109085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include "base/basictypes.h" 119085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include "base/callback.h" 129085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include "base/compiler_specific.h" 139085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include "base/memory/scoped_ptr.h" 149085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include "base/time/time.h" 159085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include "components/policy/core/common/cloud/cloud_policy_constants.h" 169085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include "net/base/network_change_notifier.h" 179085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include "third_party/protobuf/src/google/protobuf/repeated_field.h" 189085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 199085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgclass PrefRegistrySimple; 209085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgclass PrefService; 219085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 229085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgnamespace enterprise_management { 239085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgclass DeviceManagementResponse; 249085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org} 259085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 269085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgnamespace net { 279085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgclass URLRequestContextGetter; 289085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org} 299085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 309085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgnamespace policy { 319085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 329085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgclass DeviceManagementRequestJob; 339085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgclass DeviceManagementService; 349085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 359085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// Indicates the current state of the auto-enrollment check. 369085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgenum AutoEnrollmentState { 379085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Not yet started. 389085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org AUTO_ENROLLMENT_STATE_IDLE, 399085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Working, another event will be fired eventually. 4071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org AUTO_ENROLLMENT_STATE_PENDING, 4171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Failed to connect to DMServer. 429085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org AUTO_ENROLLMENT_STATE_CONNECTION_ERROR, 43e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // Connection successful, but the server failed to generate a valid reply. 44e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org AUTO_ENROLLMENT_STATE_SERVER_ERROR, 45e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // Check completed successfully, enrollment should be triggered. 46e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org AUTO_ENROLLMENT_STATE_TRIGGER_ENROLLMENT, 47b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org // Check completed successfully, enrollment not applicable. 485aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org AUTO_ENROLLMENT_STATE_NO_ENROLLMENT, 49e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org}; 50e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 51e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org// Interacts with the device management service and determines whether this 52b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org// machine should automatically enter the Enterprise Enrollment screen during 53e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org// OOBE. 54b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.orgclass AutoEnrollmentClient 55b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org : public net::NetworkChangeNotifier::NetworkChangeObserver { 56b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org public: 57b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org // The modulus value is sent in an int64 field in the protobuf, whose maximum 58b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org // value is 2^63-1. So 2^64 and 2^63 can't be represented as moduli and the 59b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org // max is 2^62 (when the moduli are restricted to powers-of-2). 60b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org static const int kMaximumPower = 62; 61b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org 62b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org // Used for signaling progress to a consumer. 63b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org typedef base::Callback<void(AutoEnrollmentState)> ProgressCallback; 64e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 65e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // |progress_callback| will be invoked whenever some significant event happens 669085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // as part of the protocol, after Start() is invoked. 679085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // The result of the protocol will be cached in |local_state|. 689085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // |power_initial| and |power_limit| are exponents of power-of-2 values which 699085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // will be the initial modulus and the maximum modulus used by this client. 709085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org AutoEnrollmentClient( 719085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org const ProgressCallback& progress_callback, 729085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org DeviceManagementService* device_management_service, 739085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org PrefService* local_state, 749085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org scoped_refptr<net::URLRequestContextGetter> system_request_context, 759085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org const std::string& server_backed_state_key, 769085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org bool retrieve_device_state, 779085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org int power_initial, 789085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org int power_limit); 799085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org virtual ~AutoEnrollmentClient(); 809085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 819085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Registers preferences in local state. 829085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org static void RegisterPrefs(PrefRegistrySimple* registry); 839085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 849085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Cancels auto-enrollment. 859085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // This function does not interrupt a running auto-enrollment check. It only 869085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // stores a pref in |local_state| that prevents the client from entering 879085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // auto-enrollment mode for the future. 889085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org static void CancelAutoEnrollment(); 89755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 90eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // Starts the auto-enrollment check protocol with the device management 91755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // service. Subsequent calls drop any previous requests. Notice that this 92755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // call can invoke the |progress_callback_| if errors occur. 93755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org void Start(); 949085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 959085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Triggers a retry of the currently pending step. This is intended to be 969085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // called by consumers when they become aware of environment changes (such as 979085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // captive portal setup being complete). 989085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org void Retry(); 999085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 100eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // Cancels any pending requests. |progress_callback_| will not be invoked. 1019085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // |this| will delete itself. 1029085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org void CancelAndDeleteSoon(); 1035aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 1045aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Returns the device_id randomly generated for the auto-enrollment requests. 1055aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // It can be reused for subsequent requests to the device management service. 1065aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org std::string device_id() const { return device_id_; } 1075aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 1085aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Current state. 1095aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org AutoEnrollmentState state() const { return state_; } 1105aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 1115aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Implementation of net::NetworkChangeNotifier::NetworkChangeObserver: 1125aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org virtual void OnNetworkChanged( 1135aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org net::NetworkChangeNotifier::ConnectionType type) OVERRIDE; 114eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 115eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org private: 1169085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org typedef bool (AutoEnrollmentClient::*RequestCompletionHandler)( 1179085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org DeviceManagementStatus, 1189085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org int, 1199085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org const enterprise_management::DeviceManagementResponse&); 1209085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 1219085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Tries to load the result of a previous execution of the protocol from 1229085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // local state. Returns true if that decision has been made and is valid. 1239085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org bool GetCachedDecision(); 1249085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 1259085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Kicks protocol processing, restarting the current step if applicable. 1269085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Returns true if progress has been made, false if the protocol is done. 1279085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org bool RetryStep(); 1289085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 1299085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Cleans up and invokes |progress_callback_|. 1309085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org void ReportProgress(AutoEnrollmentState state); 1319085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 1329085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Calls RetryStep() to make progress or determine that all is done. In the 1339085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // latter case, calls ReportProgress(). 1349085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org void NextStep(); 1359085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 1369085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Sends an auto-enrollment check request to the device management service. 1375aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org bool SendBucketDownloadRequest(); 1385aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 1395aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Sends a device state download request to the device management service. 1405aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org bool SendDeviceStateRequest(); 1415aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 1425aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Runs the response handler for device management requests and calls 1435aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // NextStep(). 1445aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org void HandleRequestCompletion( 1455aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org RequestCompletionHandler handler, 1465aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org DeviceManagementStatus status, 1475aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org int net_error, 1485aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org const enterprise_management::DeviceManagementResponse& response); 1495aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 1505aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Parses the server response to a bucket download request. 1515aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org bool OnBucketDownloadRequestCompletion( 1525aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org DeviceManagementStatus status, 1535aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org int net_error, 1545aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org const enterprise_management::DeviceManagementResponse& response); 1555aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 1565aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Parses the server response to a device state request. 1575aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org bool OnDeviceStateRequestCompletion( 1585aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org DeviceManagementStatus status, 1595aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org int net_error, 1605aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org const enterprise_management::DeviceManagementResponse& response); 1615aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 1625aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Returns true if |server_backed_state_key_hash_| is contained in |hashes|. 1635aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org bool IsIdHashInProtobuf( 1645aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org const google::protobuf::RepeatedPtrField<std::string>& hashes); 1655aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 1669085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Updates UMA histograms for bucket download timings. 1673e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org void UpdateBucketDownloadTimingHistograms(); 1689085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 1699085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Callback to invoke when the protocol generates a relevant event. This can 1709085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // be either successful completion or an error that requires external action. 1719085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org ProgressCallback progress_callback_; 1729085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 17386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // Current state. 17486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org AutoEnrollmentState state_; 17586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 17686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // Whether the hash bucket check succeeded, indicating that the server knows 17786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // this device and might have keep state for it. 17886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org bool has_server_state_; 17986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 18086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // Whether the download of server-kept device state completed successfully. 18186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org bool device_state_available_; 18286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 18386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // Randomly generated device id for the auto-enrollment requests. 1849085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org std::string device_id_; 1859085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 1869085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Stable state key and its SHA-256 digest. 1879085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org std::string server_backed_state_key_; 1889085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org std::string server_backed_state_key_hash_; 1899085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 1909085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Whether device state should be retrieved from the server. 1919085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org bool retrieve_device_state_; 1929085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 1939085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Power-of-2 modulus to try next. 1949085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org int current_power_; 195755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 196755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // Power of the maximum power-of-2 modulus that this client will accept from 197755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // a retry response from the server. 198755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int power_limit_; 199755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 200755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // Number of requests for a different modulus received from the server. 201755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // Used to determine if the server keeps asking for different moduli. 202755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int modulus_updates_received_; 2039085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 2049085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Used to communicate with the device management service. 2059085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org DeviceManagementService* device_management_service_; 2069085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org scoped_ptr<DeviceManagementRequestJob> request_job_; 2079085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 2089085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // PrefService where the protocol's results are cached. 2099085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org PrefService* local_state_; 2109085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 2119085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // The request context to use to perform the auto enrollment request. 2129085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org scoped_refptr<net::URLRequestContextGetter> request_context_; 2139085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 2149085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Times used to determine the duration of the protocol, and the extra time 2159085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // needed to complete after the signin was complete. 2169085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // If |time_start_| is not null, the protocol is still running. 2179085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // If |time_extra_start_| is not null, the protocol is still running but our 2189085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // owner has relinquished ownership. 2199085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org base::Time time_start_; 2209085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org base::Time time_extra_start_; 2219085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 2229085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org DISALLOW_COPY_AND_ASSIGN(AutoEnrollmentClient); 2239085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org}; 2249085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 2259d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com} // namespace policy 2269d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 2279d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com#endif // CHROME_BROWSER_CHROMEOS_POLICY_AUTO_ENROLLMENT_CLIENT_H_ 2289d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com