| // Copyright 2018 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. |
| |
| #ifndef CHROMEOS_SERVICES_MULTIDEVICE_SETUP_DEVICE_REENROLLER_H_ |
| #define CHROMEOS_SERVICES_MULTIDEVICE_SETUP_DEVICE_REENROLLER_H_ |
| |
| #include <memory> |
| |
| #include "base/macros.h" |
| #include "chromeos/services/device_sync/proto/cryptauth_api.pb.h" |
| #include "chromeos/services/device_sync/public/cpp/device_sync_client.h" |
| |
| namespace base { |
| class OneShotTimer; |
| } // namespace base |
| |
| |
| namespace chromeos { |
| |
| namespace device_sync { |
| class GcmDeviceInfoProvider; |
| } // namespace device_sync |
| |
| namespace multidevice_setup { |
| |
| // This class re-enrolls the device if the set of supported SoftwareFeatures in |
| // the GCM device info differs from that of the local device metadata. This |
| // condition is checked in the constructor and any time the |
| // DeviceSyncClient::Observer callbacks--OnEnrollmentFinished() and |
| // OnNewDevicesSync()--are called. |
| // |
| // The supported software features listed in GCM device info should be |
| // considered the new source of truth. Enrollment updates a device's list of |
| // supported software features (among other things) on the backend to conform |
| // with the GCM device info. Then, a device sync is necessary to update the |
| // cache of device information with the latest backend data. The local device |
| // metadata is part of this cache. |
| // |
| // The flow of the class is as follows: |
| // |
| // +-------------------------------------------------------------------------+ |
| // | | |
| // | (From external enrollment) (From external device sync)| |
| // | | | | |
| // V V V | |
| // Start-->Enrollment-->OnEnrollmentFinished-->DeviceSync-->OnNewDevicesSynced-+ |
| // | | |
| // | | |
| // V V |
| // If features agree, then done |
| // |
| // A five-minute retry timer is started at the beginning of the flow. Should any |
| // step fail, the process will be re-started when the timer fires. |
| class DeviceReenroller : public device_sync::DeviceSyncClient::Observer { |
| public: |
| class Factory { |
| public: |
| static Factory* Get(); |
| static void SetFactoryForTesting(Factory* test_factory); |
| virtual ~Factory(); |
| virtual std::unique_ptr<DeviceReenroller> BuildInstance( |
| device_sync::DeviceSyncClient* device_sync_client, |
| const device_sync::GcmDeviceInfoProvider* gcm_device_info_provider, |
| std::unique_ptr<base::OneShotTimer> timer = |
| std::make_unique<base::OneShotTimer>()); |
| |
| private: |
| static Factory* test_factory_; |
| }; |
| |
| ~DeviceReenroller() override; |
| |
| private: |
| DeviceReenroller( |
| device_sync::DeviceSyncClient* device_sync_client, |
| const device_sync::GcmDeviceInfoProvider* gcm_device_info_provider, |
| std::unique_ptr<base::OneShotTimer> timer); |
| |
| void AttemptReenrollmentIfNecessary(); |
| // Returns a sorted and deduped list of the supported or enabled software |
| // features from DeviceSyncClient::GetLocalDeviceMetadata(). |
| std::vector<cryptauth::SoftwareFeature> GetSupportedFeaturesForLocalDevice(); |
| |
| // device_sync::DeviceSyncClient::Observer: |
| void OnEnrollmentFinished() override; |
| void OnNewDevicesSynced() override; |
| |
| device_sync::DeviceSyncClient* device_sync_client_; |
| const std::vector<cryptauth::SoftwareFeature> |
| gcm_supported_software_features_; |
| std::unique_ptr<base::OneShotTimer> timer_; |
| |
| DISALLOW_COPY_AND_ASSIGN(DeviceReenroller); |
| }; |
| |
| } // namespace multidevice_setup |
| |
| } // namespace chromeos |
| |
| #endif // CHROMEOS_SERVICES_MULTIDEVICE_SETUP_DEVICE_REENROLLER_H_ |