// Copyright 2013 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 REMOTING_HOST_SETUP_ME2ME_NATIVE_MESSAGING_HOST_H_ #define REMOTING_HOST_SETUP_ME2ME_NATIVE_MESSAGING_HOST_H_ #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread_checker.h" #include "base/timer/timer.h" #include "extensions/browser/api/messaging/native_messaging_channel.h" #include "remoting/host/setup/daemon_controller.h" #include "remoting/host/setup/oauth_client.h" namespace base { class DictionaryValue; class ListValue; } // namespace base namespace gaia { class GaiaOAuthClient; } // namespace gaia namespace remoting { const char kElevatingSwitchName[] = "elevate"; const char kInputSwitchName[] = "input"; const char kOutputSwitchName[] = "output"; namespace protocol { class PairingRegistry; } // namespace protocol // Implementation of the me2me native messaging host. class Me2MeNativeMessagingHost : public extensions::NativeMessagingChannel::EventHandler { public: Me2MeNativeMessagingHost( bool needs_elevation, intptr_t parent_window_handle, scoped_ptr channel, scoped_refptr daemon_controller, scoped_refptr pairing_registry, scoped_ptr oauth_client); ~Me2MeNativeMessagingHost() override; void Start(const base::Closure& quit_closure); // extensions::NativeMessagingChannel::EventHandler implementation void OnMessage(scoped_ptr message) override; void OnDisconnect() override; private: // These "Process.." methods handle specific request types. The |response| // dictionary is pre-filled by ProcessMessage() with the parts of the // response already known ("id" and "type" fields). void ProcessHello( scoped_ptr message, scoped_ptr response); void ProcessClearPairedClients( scoped_ptr message, scoped_ptr response); void ProcessDeletePairedClient( scoped_ptr message, scoped_ptr response); void ProcessGetHostName( scoped_ptr message, scoped_ptr response); void ProcessGetPinHash( scoped_ptr message, scoped_ptr response); void ProcessGenerateKeyPair( scoped_ptr message, scoped_ptr response); void ProcessUpdateDaemonConfig( scoped_ptr message, scoped_ptr response); void ProcessGetDaemonConfig( scoped_ptr message, scoped_ptr response); void ProcessGetPairedClients( scoped_ptr message, scoped_ptr response); void ProcessGetUsageStatsConsent( scoped_ptr message, scoped_ptr response); void ProcessStartDaemon( scoped_ptr message, scoped_ptr response); void ProcessStopDaemon( scoped_ptr message, scoped_ptr response); void ProcessGetDaemonState( scoped_ptr message, scoped_ptr response); void ProcessGetHostClientId( scoped_ptr message, scoped_ptr response); void ProcessGetCredentialsFromAuthCode( scoped_ptr message, scoped_ptr response, bool need_user_email); // These Send... methods get called on the DaemonController's internal thread, // or on the calling thread if called by the PairingRegistry. // These methods fill in the |response| dictionary from the other parameters, // and pass it to SendResponse(). void SendConfigResponse(scoped_ptr response, scoped_ptr config); void SendPairedClientsResponse(scoped_ptr response, scoped_ptr pairings); void SendUsageStatsConsentResponse( scoped_ptr response, const DaemonController::UsageStatsConsent& consent); void SendAsyncResult(scoped_ptr response, DaemonController::AsyncResult result); void SendBooleanResult(scoped_ptr response, bool result); void SendCredentialsResponse(scoped_ptr response, const std::string& user_email, const std::string& refresh_token); void OnError(); void Stop(); // Returns true if the request was successfully delegated to the elevated // host and false otherwise. bool DelegateToElevatedHost(scoped_ptr message); #if defined(OS_WIN) class ElevatedChannelEventHandler : public extensions::NativeMessagingChannel::EventHandler { public: ElevatedChannelEventHandler(Me2MeNativeMessagingHost* host); void OnMessage(scoped_ptr message) override; void OnDisconnect() override; private: Me2MeNativeMessagingHost* parent_; }; // Create and connect to an elevated host process if necessary. // |elevated_channel_| will contain the native messaging channel to the // elevated host if the function succeeds. void Me2MeNativeMessagingHost::EnsureElevatedHostCreated(); // Disconnect and shut down the elevated host. void DisconnectElevatedHost(); // Native messaging channel used to communicate with the elevated host. scoped_ptr elevated_channel_; // Native messaging event handler used to process responses from the elevated // host. scoped_ptr elevated_channel_event_handler_; // Timer to control the lifetime of the elevated host. base::OneShotTimer elevated_host_timer_; #endif // defined(OS_WIN) bool needs_elevation_; #if defined(OS_WIN) // Handle of the parent window. intptr_t parent_window_handle_; #endif // defined(OS_WIN) base::Closure quit_closure_; // Native messaging channel used to communicate with the native message // client. scoped_ptr channel_; scoped_refptr daemon_controller_; // Used to load and update the paired clients for this host. scoped_refptr pairing_registry_; // Used to exchange the service account authorization code for credentials. scoped_ptr oauth_client_; base::ThreadChecker thread_checker_; base::WeakPtr weak_ptr_; base::WeakPtrFactory weak_factory_; DISALLOW_COPY_AND_ASSIGN(Me2MeNativeMessagingHost); }; } // namespace remoting #endif // REMOTING_HOST_SETUP_ME2ME_NATIVE_MESSAGING_HOST_H_