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