Index: remoting/host/security_key/security_key_ipc_client.cc |
diff --git a/remoting/host/security_key/security_key_ipc_client.cc b/remoting/host/security_key/security_key_ipc_client.cc |
index 98dcaf1fcf5c6fa900a1d65a91b463a0d863cca1..43ad72f17b8e735bbd61efd24a502e1f3e6c7e6d 100644 |
--- a/remoting/host/security_key/security_key_ipc_client.cc |
+++ b/remoting/host/security_key/security_key_ipc_client.cc |
@@ -14,6 +14,8 @@ |
#include "ipc/ipc_listener.h" |
#include "ipc/ipc_message.h" |
#include "ipc/ipc_message_macros.h" |
+#include "mojo/edk/embedder/embedder.h" |
+#include "mojo/edk/embedder/named_platform_handle_utils.h" |
#include "remoting/host/chromoting_messages.h" |
#include "remoting/host/ipc_constants.h" |
#include "remoting/host/security_key/security_key_ipc_constants.h" |
@@ -21,34 +23,18 @@ |
namespace remoting { |
SecurityKeyIpcClient::SecurityKeyIpcClient() |
- : initial_ipc_channel_name_(remoting::GetSecurityKeyIpcChannelName()), |
+ : named_channel_handle_(remoting::GetSecurityKeyIpcChannel()), |
weak_factory_(this) {} |
SecurityKeyIpcClient::~SecurityKeyIpcClient() {} |
-bool SecurityKeyIpcClient::WaitForSecurityKeyIpcServerChannel() { |
+bool SecurityKeyIpcClient::CheckForSecurityKeyIpcServerChannel() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- // The retry loop is needed as the IPC Servers we connect to are reset (torn |
- // down and recreated) and we should be resilient in that case. We need to |
- // strike a balance between resilience and speed as we do not want to add |
- // un-necessary delay to the local scenario when no session is active. |
- // 500ms was chosen as a reasonable balance between reliability of remote |
- // session detection and overhead added to the local security key operation |
- // when no remote session is present. |
- const base::TimeDelta kTotalWaitTime = base::TimeDelta::FromMilliseconds(500); |
- const base::TimeDelta kPerIterationWaitTime = |
- base::TimeDelta::FromMilliseconds(10); |
- const int kLoopIterations = kTotalWaitTime / kPerIterationWaitTime; |
- for (int i = 0; i < kLoopIterations; i++) { |
- if (IPC::Channel::IsNamedServerInitialized(initial_ipc_channel_name_)) { |
- return true; |
- } |
- |
- base::PlatformThread::Sleep(kPerIterationWaitTime); |
+ if (!channel_handle_.is_valid()) { |
+ channel_handle_ = mojo::edk::CreateClientHandle(named_channel_handle_); |
} |
- |
- return false; |
+ return channel_handle_.is_valid(); |
} |
void SecurityKeyIpcClient::EstablishIpcConnection( |
@@ -62,7 +48,7 @@ void SecurityKeyIpcClient::EstablishIpcConnection( |
connection_ready_callback_ = connection_ready_callback; |
connection_error_callback_ = connection_error_callback; |
- ConnectToIpcChannel(initial_ipc_channel_name_); |
+ ConnectToIpcChannel(); |
} |
bool SecurityKeyIpcClient::SendSecurityKeyRequest( |
@@ -93,9 +79,9 @@ void SecurityKeyIpcClient::CloseIpcConnection() { |
ipc_channel_.reset(); |
} |
-void SecurityKeyIpcClient::SetInitialIpcChannelNameForTest( |
- const std::string& initial_ipc_channel_name) { |
- initial_ipc_channel_name_ = initial_ipc_channel_name; |
+void SecurityKeyIpcClient::SetIpcChannelHandleForTest( |
+ const mojo::edk::NamedPlatformHandle& channel_handle) { |
+ named_channel_handle_ = channel_handle; |
} |
void SecurityKeyIpcClient::SetExpectedIpcServerSessionIdForTest( |
@@ -108,9 +94,6 @@ bool SecurityKeyIpcClient::OnMessageReceived(const IPC::Message& message) { |
bool handled = true; |
IPC_BEGIN_MESSAGE_MAP(SecurityKeyIpcClient, message) |
- IPC_MESSAGE_HANDLER( |
- ChromotingNetworkToRemoteSecurityKeyMsg_ConnectionDetails, |
- OnConnectionDetails) |
IPC_MESSAGE_HANDLER(ChromotingNetworkToRemoteSecurityKeyMsg_Response, |
OnSecurityKeyResponse) |
IPC_MESSAGE_UNHANDLED(handled = false) |
@@ -126,8 +109,7 @@ void SecurityKeyIpcClient::OnChannelConnected(int32_t peer_pid) { |
#if defined(OS_WIN) |
DWORD peer_session_id; |
if (!ProcessIdToSessionId(peer_pid, &peer_session_id)) { |
- uint32_t last_error = GetLastError(); |
- LOG(ERROR) << "ProcessIdToSessionId failed with error code: " << last_error; |
+ PLOG(ERROR) << "ProcessIdToSessionId failed"; |
base::ResetAndReturn(&connection_error_callback_).Run(); |
return; |
} |
@@ -141,13 +123,7 @@ void SecurityKeyIpcClient::OnChannelConnected(int32_t peer_pid) { |
} |
#endif // defined(OS_WIN) |
- // If we have received the connection details already (i.e. |
- // |ipc_channel_name_| is populated) then we signal that the connection is |
- // ready for use. Otherwise this is the initial connection and we will wait |
- // to receive the ConnectionDetails message before proceeding. |
- if (!ipc_channel_name_.empty()) { |
- base::ResetAndReturn(&connection_ready_callback_).Run(); |
- } |
+ base::ResetAndReturn(&connection_ready_callback_).Run(); |
} |
void SecurityKeyIpcClient::OnChannelError() { |
@@ -158,23 +134,6 @@ void SecurityKeyIpcClient::OnChannelError() { |
} |
} |
-void SecurityKeyIpcClient::OnConnectionDetails( |
- const std::string& channel_name) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- ipc_channel_name_ = channel_name; |
- |
- // Now that we have received the name for the IPC channel we will use for our |
- // security key request, we want to disconnect from the intial IPC channel |
- // and then connect to the new one. |
- // NOTE: We do not want to perform these tasks now as we are in the middle of |
- // existing IPC message handler, thus we post the tasks so they will be |
- // handled after this method completes. |
- base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, base::Bind(&SecurityKeyIpcClient::ConnectToIpcChannel, |
- weak_factory_.GetWeakPtr(), |
- base::ConstRef(ipc_channel_name_))); |
-} |
- |
void SecurityKeyIpcClient::OnSecurityKeyResponse( |
const std::string& response_data) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
@@ -188,30 +147,26 @@ void SecurityKeyIpcClient::OnSecurityKeyResponse( |
} |
} |
-void SecurityKeyIpcClient::ConnectToIpcChannel( |
- const std::string& channel_name) { |
+void SecurityKeyIpcClient::ConnectToIpcChannel() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
// Verify that any existing IPC connection has been closed. |
CloseIpcConnection(); |
- // The retry loop is needed as the IPC Servers we connect to are reset (torn |
- // down and recreated) and we should be resilient in that case. |
- const base::TimeDelta kTotalWaitTime = |
- base::TimeDelta::FromMilliseconds(1000); |
- const base::TimeDelta kPerIterationWaitTime = |
- base::TimeDelta::FromMilliseconds(25); |
- const int kLoopIterations = kTotalWaitTime / kPerIterationWaitTime; |
- IPC::ChannelHandle channel_handle(channel_name); |
- for (int i = 0; i < kLoopIterations; i++) { |
- ipc_channel_ = IPC::Channel::CreateNamedClient(channel_handle, this); |
- if (ipc_channel_->Connect()) { |
- return; |
+ if (!channel_handle_.is_valid() && !CheckForSecurityKeyIpcServerChannel()) { |
+ if (!connection_error_callback_.is_null()) { |
+ base::ResetAndReturn(&connection_error_callback_).Run(); |
} |
+ return; |
+ } |
- ipc_channel_.reset(); |
- base::PlatformThread::Sleep(kPerIterationWaitTime); |
+ ipc_channel_ = IPC::Channel::CreateClient( |
+ mojo::edk::ConnectToPeerProcess(std::move(channel_handle_)).release(), |
+ this); |
+ if (ipc_channel_->Connect()) { |
+ return; |
} |
+ ipc_channel_.reset(); |
if (!connection_error_callback_.is_null()) { |
base::ResetAndReturn(&connection_error_callback_).Run(); |