| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "mojo/edk/system/node_channel.h" | 5 #include "mojo/edk/system/node_channel.h" |
| 6 | 6 |
| 7 #include <cstring> | 7 #include <cstring> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <sstream> | 9 #include <sstream> |
| 10 | 10 |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 } | 187 } |
| 188 #endif | 188 #endif |
| 189 return ScopedPlatformHandle(); | 189 return ScopedPlatformHandle(); |
| 190 } | 190 } |
| 191 | 191 |
| 192 void NodeChannel::SetRemoteNodeName(const ports::NodeName& name) { | 192 void NodeChannel::SetRemoteNodeName(const ports::NodeName& name) { |
| 193 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 193 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
| 194 remote_node_name_ = name; | 194 remote_node_name_ = name; |
| 195 } | 195 } |
| 196 | 196 |
| 197 void NodeChannel::SetExpectedSecret(const std::string& secret) { |
| 198 #if !defined(OS_WIN) |
| 199 // Ensure we aren't expecting a secret on non-Windows. |
| 200 CHECK(secret.empty()); |
| 201 #endif |
| 202 expected_secret_ = secret; |
| 203 } |
| 204 |
| 205 void NodeChannel::SendSecret(const std::string& secret) { |
| 206 Channel::MessagePtr message(new Channel::Message(secret.size(), 0)); |
| 207 memcpy(message->mutable_payload(), secret.data(), secret.size()); |
| 208 WriteChannelMessage(std::move(message)); |
| 209 } |
| 210 |
| 197 void NodeChannel::AcceptChild(const ports::NodeName& parent_name, | 211 void NodeChannel::AcceptChild(const ports::NodeName& parent_name, |
| 198 const ports::NodeName& token) { | 212 const ports::NodeName& token) { |
| 199 AcceptChildData* data; | 213 AcceptChildData* data; |
| 200 Channel::MessagePtr message = CreateMessage( | 214 Channel::MessagePtr message = CreateMessage( |
| 201 MessageType::ACCEPT_CHILD, sizeof(AcceptChildData), 0, &data); | 215 MessageType::ACCEPT_CHILD, sizeof(AcceptChildData), 0, &data); |
| 202 data->parent_name = parent_name; | 216 data->parent_name = parent_name; |
| 203 data->token = token; | 217 data->token = token; |
| 204 WriteChannelMessage(std::move(message)); | 218 WriteChannelMessage(std::move(message)); |
| 205 } | 219 } |
| 206 | 220 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 | 344 |
| 331 NodeChannel::~NodeChannel() { | 345 NodeChannel::~NodeChannel() { |
| 332 ShutDown(); | 346 ShutDown(); |
| 333 } | 347 } |
| 334 | 348 |
| 335 void NodeChannel::OnChannelMessage(const void* payload, | 349 void NodeChannel::OnChannelMessage(const void* payload, |
| 336 size_t payload_size, | 350 size_t payload_size, |
| 337 ScopedPlatformHandleVectorPtr handles) { | 351 ScopedPlatformHandleVectorPtr handles) { |
| 338 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 352 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
| 339 | 353 |
| 354 if (!expected_secret_.empty()) { |
| 355 // If we're expecting a secret string, that takes precedence over everything |
| 356 // else. |
| 357 if (std::string(static_cast<const char*>(payload), payload_size) != |
| 358 expected_secret_) { |
| 359 LOG(ERROR) << "Received invalid secret from peer. Dropping channel."; |
| 360 delegate_->OnChannelError(remote_node_name_); |
| 361 } |
| 362 expected_secret_.clear(); |
| 363 return; |
| 364 } |
| 365 |
| 340 #if defined(OS_WIN) | 366 #if defined(OS_WIN) |
| 341 // If we receive handles from a known process, rewrite them to our own | 367 // If we receive handles from a known process, rewrite them to our own |
| 342 // process. This can occur when a privileged node receives handles directly | 368 // process. This can occur when a privileged node receives handles directly |
| 343 // from a privileged descendant. | 369 // from a privileged descendant. |
| 344 { | 370 { |
| 345 base::AutoLock lock(remote_process_handle_lock_); | 371 base::AutoLock lock(remote_process_handle_lock_); |
| 346 if (handles && remote_process_handle_ != base::kNullProcessHandle) { | 372 if (handles && remote_process_handle_ != base::kNullProcessHandle) { |
| 347 if (!Channel::Message::RewriteHandles(remote_process_handle_, | 373 if (!Channel::Message::RewriteHandles(remote_process_handle_, |
| 348 base::GetCurrentProcessHandle(), | 374 base::GetCurrentProcessHandle(), |
| 349 handles->data(), handles->size())) { | 375 handles->data(), handles->size())) { |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 | 568 |
| 543 base::AutoLock lock(channel_lock_); | 569 base::AutoLock lock(channel_lock_); |
| 544 if (!channel_) | 570 if (!channel_) |
| 545 DLOG(ERROR) << "Dropping message on closed channel."; | 571 DLOG(ERROR) << "Dropping message on closed channel."; |
| 546 else | 572 else |
| 547 channel_->Write(std::move(message)); | 573 channel_->Write(std::move(message)); |
| 548 } | 574 } |
| 549 | 575 |
| 550 } // namespace edk | 576 } // namespace edk |
| 551 } // namespace mojo | 577 } // namespace mojo |
| OLD | NEW |