Index: remoting/host/setup/me2me_native_messaging_host.cc |
diff --git a/remoting/host/setup/me2me_native_messaging_host.cc b/remoting/host/setup/me2me_native_messaging_host.cc |
index 1c56f63e039c18bd776bd7fa9b03d818326d7f04..a2a2707890659ade02813a34c44bcfdd35389829 100644 |
--- a/remoting/host/setup/me2me_native_messaging_host.cc |
+++ b/remoting/host/setup/me2me_native_messaging_host.cc |
@@ -174,7 +174,8 @@ void Me2MeNativeMessagingHost::ProcessClearPairedClients( |
DCHECK(thread_checker_.CalledOnValidThread()); |
if (needs_elevation_) { |
- DelegateToElevatedHost(message.Pass(), response.Pass()); |
+ if (!DelegateToElevatedHost(message.Pass())) |
+ SendBooleanResult(response.Pass(), false); |
return; |
} |
@@ -193,7 +194,8 @@ void Me2MeNativeMessagingHost::ProcessDeletePairedClient( |
DCHECK(thread_checker_.CalledOnValidThread()); |
if (needs_elevation_) { |
- DelegateToElevatedHost(message.Pass(), response.Pass()); |
+ if (!DelegateToElevatedHost(message.Pass())) |
+ SendBooleanResult(response.Pass(), false); |
return; |
} |
@@ -501,15 +503,17 @@ void Me2MeNativeMessagingHost::Stop() { |
#if defined(OS_WIN) |
-void Me2MeNativeMessagingHost::DelegateToElevatedHost( |
- scoped_ptr<base::DictionaryValue> message, |
- scoped_ptr<base::DictionaryValue> response) { |
+bool Me2MeNativeMessagingHost::DelegateToElevatedHost( |
+ scoped_ptr<base::DictionaryValue> message) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
EnsureElevatedHostCreated(); |
- DCHECK(elevated_channel_); |
- elevated_channel_->SendMessage(message.Pass()); |
+ // elevated_channel_ will be null if user rejects the UAC request. |
+ if (elevated_channel_) |
+ elevated_channel_->SendMessage(message.Pass()); |
+ |
+ return elevated_channel_ != NULL; |
} |
void Me2MeNativeMessagingHost::EnsureElevatedHostCreated() { |
@@ -549,7 +553,7 @@ void Me2MeNativeMessagingHost::EnsureElevatedHostCreated() { |
std::string input_pipe_name(kChromePipeNamePrefix); |
input_pipe_name.append(IPC::Channel::GenerateUniqueRandomChannelID()); |
- delegate_write_handle_.Set(CreateNamedPipe( |
+ base::win::ScopedHandle delegate_write_handle(::CreateNamedPipe( |
base::ASCIIToUTF16(input_pipe_name).c_str(), |
PIPE_ACCESS_OUTBOUND, |
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_REJECT_REMOTE_CLIENTS, |
@@ -559,7 +563,7 @@ void Me2MeNativeMessagingHost::EnsureElevatedHostCreated() { |
kTimeOutMilliseconds, |
&security_attributes)); |
- if (!delegate_write_handle_.IsValid()) { |
+ if (!delegate_write_handle.IsValid()) { |
LOG_GETLASTERROR(ERROR) << |
"Failed to create named pipe '" << input_pipe_name << "'"; |
OnError(); |
@@ -570,7 +574,7 @@ void Me2MeNativeMessagingHost::EnsureElevatedHostCreated() { |
std::string output_pipe_name(kChromePipeNamePrefix); |
output_pipe_name.append(IPC::Channel::GenerateUniqueRandomChannelID()); |
- delegate_read_handle_.Set(CreateNamedPipe( |
+ base::win::ScopedHandle delegate_read_handle(::CreateNamedPipe( |
base::ASCIIToUTF16(output_pipe_name).c_str(), |
PIPE_ACCESS_INBOUND, |
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_REJECT_REMOTE_CLIENTS, |
@@ -580,7 +584,7 @@ void Me2MeNativeMessagingHost::EnsureElevatedHostCreated() { |
kTimeOutMilliseconds, |
&security_attributes)); |
- if (!delegate_read_handle_.IsValid()) { |
+ if (!delegate_read_handle.IsValid()) { |
LOG_GETLASTERROR(ERROR) << |
"Failed to create named pipe '" << output_pipe_name << "'"; |
OnError(); |
@@ -622,33 +626,38 @@ void Me2MeNativeMessagingHost::EnsureElevatedHostCreated() { |
info.nShow = SW_SHOWNORMAL; |
if (!ShellExecuteEx(&info)) { |
+ DWORD error = ::GetLastError(); |
LOG_GETLASTERROR(ERROR) << "Unable to launch '" << binary.value() << "'"; |
- OnError(); |
+ if (error != ERROR_CANCELLED) { |
+ OnError(); |
+ } |
return; |
} |
- if (!ConnectNamedPipe(delegate_write_handle_.Get(), NULL)) { |
+ if (!::ConnectNamedPipe(delegate_write_handle.Get(), NULL)) { |
DWORD error = ::GetLastError(); |
if (error != ERROR_PIPE_CONNECTED) { |
- LOG(ERROR) << "Unable to connect '" << input_pipe_name << "': " << error; |
+ LOG_GETLASTERROR(ERROR) << "Unable to connect '" |
+ << input_pipe_name << "'"; |
OnError(); |
- return; |
+ return; |
} |
} |
- if (!ConnectNamedPipe(delegate_read_handle_.Get(), NULL)) { |
+ if (!::ConnectNamedPipe(delegate_read_handle.Get(), NULL)) { |
DWORD error = ::GetLastError(); |
if (error != ERROR_PIPE_CONNECTED) { |
- LOG(ERROR) << "Unable to connect '" << output_pipe_name << "': " << error; |
+ LOG_GETLASTERROR(ERROR) << "Unable to connect '" |
+ << output_pipe_name << "'"; |
OnError(); |
- return; |
+ return; |
} |
} |
// Set up the native messaging channel to talk to the elevated host. |
// Note that input for the elevate channel is output forthe elevated host. |
elevated_channel_.reset(new NativeMessagingChannel( |
- delegate_read_handle_.Get(), delegate_write_handle_.Get())); |
+ delegate_read_handle.Take(), delegate_write_handle.Take())); |
elevated_channel_->Start( |
base::Bind(&Me2MeNativeMessagingHost::ProcessDelegateResponse, weak_ptr_), |
@@ -665,10 +674,10 @@ void Me2MeNativeMessagingHost::ProcessDelegateResponse( |
#else // defined(OS_WIN) |
-void Me2MeNativeMessagingHost::DelegateToElevatedHost( |
- scoped_ptr<base::DictionaryValue> message, |
- scoped_ptr<base::DictionaryValue> response) { |
+bool Me2MeNativeMessagingHost::DelegateToElevatedHost( |
+ scoped_ptr<base::DictionaryValue> message) { |
NOTREACHED(); |
+ return false; |
} |
#endif // !defined(OS_WIN) |