// Copyright 2015 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 COMPONENTS_PROXIMITY_AUTH_WEBUI_PROXIMITY_AUTH_WEBUI_HANDLER_H_ #define COMPONENTS_PROXIMITY_AUTH_WEBUI_PROXIMITY_AUTH_WEBUI_HANDLER_H_ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/values.h" #include "components/proximity_auth/authenticator.h" #include "components/proximity_auth/connection_observer.h" #include "components/proximity_auth/cryptauth/cryptauth_client.h" #include "components/proximity_auth/cryptauth/cryptauth_device_manager.h" #include "components/proximity_auth/cryptauth/cryptauth_enrollment_manager.h" #include "components/proximity_auth/cryptauth/cryptauth_gcm_manager.h" #include "components/proximity_auth/logging/log_buffer.h" #include "components/proximity_auth/messenger_observer.h" #include "components/proximity_auth/proximity_auth_client.h" #include "components/proximity_auth/remote_device_life_cycle.h" #include "content/public/browser/web_ui_message_handler.h" namespace base { class ListValue; } namespace cryptauth { class ExternalDeviceInfo; } namespace proximity_auth { class ReachablePhoneFlow; class RemoteDeviceLifeCycle; class RemoteDeviceLoader; struct RemoteStatusUpdate; // Handles messages from the chrome://proximity-auth page. class ProximityAuthWebUIHandler : public content::WebUIMessageHandler, public LogBuffer::Observer, public CryptAuthEnrollmentManager::Observer, public CryptAuthDeviceManager::Observer, public RemoteDeviceLifeCycle::Observer, public MessengerObserver { public: // |client_| is not owned and must outlive this instance. explicit ProximityAuthWebUIHandler( ProximityAuthClient* proximity_auth_client); ~ProximityAuthWebUIHandler() override; // content::WebUIMessageHandler: void RegisterMessages() override; private: // LogBuffer::Observer: void OnLogMessageAdded(const LogBuffer::LogMessage& log_message) override; void OnLogBufferCleared() override; // CryptAuthEnrollmentManager::Observer: void OnEnrollmentStarted() override; void OnEnrollmentFinished(bool success) override; // CryptAuthDeviceManager::Observer: void OnSyncStarted() override; void OnSyncFinished( CryptAuthDeviceManager::SyncResult sync_result, CryptAuthDeviceManager::DeviceChangeResult device_change_result) override; // Message handler callbacks. void OnWebContentsInitialized(const base::ListValue* args); void GetLogMessages(const base::ListValue* args); void ClearLogBuffer(const base::ListValue* args); void ToggleUnlockKey(const base::ListValue* args); void FindEligibleUnlockDevices(const base::ListValue* args); void FindReachableDevices(const base::ListValue* args); void GetLocalState(const base::ListValue* args); void ForceEnrollment(const base::ListValue* args); void ForceDeviceSync(const base::ListValue* args); void ToggleConnection(const base::ListValue* args); // Initializes CryptAuth managers, used for development purposes. void InitGCMManager(); void InitEnrollmentManager(); void InitDeviceManager(); // Called when a CryptAuth request fails. void OnCryptAuthClientError(const std::string& error_message); // Called when the toggleUnlock request succeeds. void OnEasyUnlockToggled(const cryptauth::ToggleEasyUnlockResponse& response); // Called when the findEligibleUnlockDevices request succeeds. void OnFoundEligibleUnlockDevices( const cryptauth::FindEligibleUnlockDevicesResponse& response); // Callback when |reachable_phone_flow_| completes. void OnReachablePhonesFound( const std::vector& reachable_phones); // Called when the RemoteDevice is loaded so we can create a connection. void OnRemoteDevicesLoaded(const std::vector& remote_devices); // Converts an ExternalDeviceInfo proto to a JSON dictionary used in // JavaScript. scoped_ptr ExternalDeviceInfoToDictionary( const cryptauth::ExternalDeviceInfo& device_info); // Converts an IneligibleDevice proto to a JSON dictionary used in JavaScript. scoped_ptr IneligibleDeviceToDictionary( const cryptauth::IneligibleDevice& ineligible_device); // Cleans up the connection to the selected remote device. void CleanUpRemoteDeviceLifeCycle(); // RemoteDeviceLifeCycle::Observer: void OnLifeCycleStateChanged(RemoteDeviceLifeCycle::State old_state, RemoteDeviceLifeCycle::State new_state) override; // MessengerObserver: void OnRemoteStatusUpdate(const RemoteStatusUpdate& status_update) override; // Returns the current enrollment state that can be used as a JSON object. scoped_ptr GetEnrollmentStateDictionary(); // Returns the current device sync state that can be used as a JSON object. scoped_ptr GetDeviceSyncStateDictionary(); // Returns the current unlock keys that can be used as a JSON object. scoped_ptr GetUnlockKeysList(); // The delegate used to fetch dependencies. Must outlive this instance. ProximityAuthClient* proximity_auth_client_; // Creates CryptAuth client instances to make API calls. scoped_ptr cryptauth_client_factory_; // We only support one concurrent API call. scoped_ptr cryptauth_client_; // The flow for getting a list of reachable phones. scoped_ptr reachable_phone_flow_; // True if we get a message from the loaded WebContents to know that it is // initialized, and we can inject JavaScript. bool web_contents_initialized_; // Member variables for connecting to and authenticating the remote device. // TODO(tengs): Support multiple simultaenous connections. scoped_ptr remote_device_loader_; RemoteDevice selected_remote_device_; scoped_ptr life_cycle_; scoped_ptr last_remote_status_update_; base::WeakPtrFactory weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(ProximityAuthWebUIHandler); }; } // namespace proximity_auth #endif // COMPONENTS_PROXIMITY_AUTH_WEBUI_PROXIMITY_AUTH_WEBUI_HANDLER_H_