| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "remoting/host/plugin/host_script_object.h" | 5 #include "remoting/host/plugin/host_script_object.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/json/json_reader.h" | 8 #include "base/json/json_reader.h" |
| 9 #include "base/json/json_writer.h" | 9 #include "base/json/json_writer.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| 11 #include "base/message_loop_proxy.h" | 11 #include "base/message_loop_proxy.h" |
| 12 #include "base/string_util.h" | 12 #include "base/string_util.h" |
| 13 #include "base/sys_string_conversions.h" | 13 #include "base/sys_string_conversions.h" |
| 14 #include "base/threading/platform_thread.h" | 14 #include "base/threading/platform_thread.h" |
| 15 #include "base/utf_string_conversions.h" | 15 #include "base/utf_string_conversions.h" |
| 16 #include "base/values.h" | 16 #include "base/values.h" |
| 17 #include "net/base/net_util.h" | 17 #include "net/base/net_util.h" |
| 18 #include "remoting/base/auto_thread_task_runner.h" | 18 #include "remoting/base/auto_thread_task_runner.h" |
| 19 #include "remoting/base/auth_token_util.h" | 19 #include "remoting/base/auth_token_util.h" |
| 20 #include "remoting/host/chromoting_host.h" | 20 #include "remoting/host/chromoting_host.h" |
| 21 #include "remoting/host/chromoting_host_context.h" | 21 #include "remoting/host/chromoting_host_context.h" |
| 22 #include "remoting/host/desktop_environment.h" | 22 #include "remoting/host/desktop_environment_factory.h" |
| 23 #include "remoting/host/host_config.h" | 23 #include "remoting/host/host_config.h" |
| 24 #include "remoting/host/host_event_logger.h" | 24 #include "remoting/host/host_event_logger.h" |
| 25 #include "remoting/host/host_key_pair.h" | 25 #include "remoting/host/host_key_pair.h" |
| 26 #include "remoting/host/host_secret.h" | 26 #include "remoting/host/host_secret.h" |
| 27 #include "remoting/host/it2me_host_user_interface.h" | 27 #include "remoting/host/it2me_host_user_interface.h" |
| 28 #include "remoting/host/network_settings.h" | 28 #include "remoting/host/network_settings.h" |
| 29 #include "remoting/host/pin_hash.h" | 29 #include "remoting/host/pin_hash.h" |
| 30 #include "remoting/host/plugin/daemon_controller.h" | 30 #include "remoting/host/plugin/daemon_controller.h" |
| 31 #include "remoting/host/plugin/host_log_handler.h" | 31 #include "remoting/host/plugin/host_log_handler.h" |
| 32 #include "remoting/host/policy_hack/policy_watcher.h" | 32 #include "remoting/host/policy_hack/policy_watcher.h" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 NPP plugin, | 86 NPP plugin, |
| 87 NPObject* parent, | 87 NPObject* parent, |
| 88 PluginThreadTaskRunner::Delegate* plugin_thread_delegate) | 88 PluginThreadTaskRunner::Delegate* plugin_thread_delegate) |
| 89 : plugin_(plugin), | 89 : plugin_(plugin), |
| 90 parent_(parent), | 90 parent_(parent), |
| 91 am_currently_logging_(false), | 91 am_currently_logging_(false), |
| 92 state_(kDisconnected), | 92 state_(kDisconnected), |
| 93 np_thread_id_(base::PlatformThread::CurrentId()), | 93 np_thread_id_(base::PlatformThread::CurrentId()), |
| 94 plugin_task_runner_( | 94 plugin_task_runner_( |
| 95 new PluginThreadTaskRunner(plugin_thread_delegate)), | 95 new PluginThreadTaskRunner(plugin_thread_delegate)), |
| 96 desktop_environment_factory_(new DesktopEnvironmentFactory()), |
| 96 failed_login_attempts_(0), | 97 failed_login_attempts_(0), |
| 97 disconnected_event_(true, false), | 98 disconnected_event_(true, false), |
| 98 nat_traversal_enabled_(false), | 99 nat_traversal_enabled_(false), |
| 99 policy_received_(false), | 100 policy_received_(false), |
| 100 daemon_controller_(DaemonController::Create()), | 101 daemon_controller_(DaemonController::Create()), |
| 101 worker_thread_("RemotingHostPlugin") { | 102 worker_thread_("RemotingHostPlugin") { |
| 102 worker_thread_.Start(); | 103 worker_thread_.Start(); |
| 103 } | 104 } |
| 104 | 105 |
| 105 HostNPScriptObject::~HostNPScriptObject() { | 106 HostNPScriptObject::~HostNPScriptObject() { |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 496 &HostNPScriptObject::ReadPolicyAndConnect, base::Unretained(this), | 497 &HostNPScriptObject::ReadPolicyAndConnect, base::Unretained(this), |
| 497 uid, auth_token, auth_service)); | 498 uid, auth_token, auth_service)); |
| 498 return; | 499 return; |
| 499 } | 500 } |
| 500 | 501 |
| 501 SetState(kStarting); | 502 SetState(kStarting); |
| 502 | 503 |
| 503 // Only proceed to FinishConnect() if at least one policy update has been | 504 // Only proceed to FinishConnect() if at least one policy update has been |
| 504 // received. | 505 // received. |
| 505 if (policy_received_) { | 506 if (policy_received_) { |
| 506 FinishConnectMainThread(uid, auth_token, auth_service); | 507 FinishConnect(uid, auth_token, auth_service); |
| 507 } else { | 508 } else { |
| 508 // Otherwise, create the policy watcher, and thunk the connect. | 509 // Otherwise, create the policy watcher, and thunk the connect. |
| 509 pending_connect_ = | 510 pending_connect_ = |
| 510 base::Bind(&HostNPScriptObject::FinishConnectMainThread, | 511 base::Bind(&HostNPScriptObject::FinishConnect, |
| 511 base::Unretained(this), uid, auth_token, auth_service); | 512 base::Unretained(this), uid, auth_token, auth_service); |
| 512 } | 513 } |
| 513 } | 514 } |
| 514 | 515 |
| 515 void HostNPScriptObject::FinishConnectMainThread( | 516 void HostNPScriptObject::FinishConnect( |
| 516 const std::string& uid, | |
| 517 const std::string& auth_token, | |
| 518 const std::string& auth_service) { | |
| 519 if (!host_context_->capture_task_runner()->BelongsToCurrentThread()) { | |
| 520 host_context_->capture_task_runner()->PostTask(FROM_HERE, base::Bind( | |
| 521 &HostNPScriptObject::FinishConnectMainThread, base::Unretained(this), | |
| 522 uid, auth_token, auth_service)); | |
| 523 return; | |
| 524 } | |
| 525 | |
| 526 // DesktopEnvironment must be initialized on the capture thread. | |
| 527 // | |
| 528 // TODO(sergeyu): Fix DesktopEnvironment so that it can be created | |
| 529 // on either the UI or the network thread so that we can avoid | |
| 530 // jumping to the main thread here. | |
| 531 desktop_environment_ = DesktopEnvironment::Create(host_context_.get()); | |
| 532 | |
| 533 FinishConnectNetworkThread(uid, auth_token, auth_service); | |
| 534 } | |
| 535 | |
| 536 void HostNPScriptObject::FinishConnectNetworkThread( | |
| 537 const std::string& uid, | 517 const std::string& uid, |
| 538 const std::string& auth_token, | 518 const std::string& auth_token, |
| 539 const std::string& auth_service) { | 519 const std::string& auth_service) { |
| 540 if (!host_context_->network_task_runner()->BelongsToCurrentThread()) { | 520 if (!host_context_->network_task_runner()->BelongsToCurrentThread()) { |
| 541 host_context_->network_task_runner()->PostTask(FROM_HERE, base::Bind( | 521 host_context_->network_task_runner()->PostTask(FROM_HERE, base::Bind( |
| 542 &HostNPScriptObject::FinishConnectNetworkThread, base::Unretained(this), | 522 &HostNPScriptObject::FinishConnect, base::Unretained(this), |
| 543 uid, auth_token, auth_service)); | 523 uid, auth_token, auth_service)); |
| 544 return; | 524 return; |
| 545 } | 525 } |
| 546 | 526 |
| 547 if (state_ != kStarting) { | 527 if (state_ != kStarting) { |
| 548 // Host has been stopped while we were fetching policy. | 528 // Host has been stopped while we were fetching policy. |
| 549 return; | 529 return; |
| 550 } | 530 } |
| 551 | 531 |
| 552 // Check the host domain policy. | 532 // Check the host domain policy. |
| 553 if (!required_host_domain_.empty() && | 533 if (!required_host_domain_.empty() && |
| 554 !EndsWith(uid, std::string("@") + required_host_domain_, false)) { | 534 !EndsWith(uid, std::string("@") + required_host_domain_, false)) { |
| 555 SetState(kError); | 535 SetState(kError); |
| 556 return; | 536 return; |
| 557 } | 537 } |
| 558 | 538 |
| 559 // Verify that DesktopEnvironment has been created. | |
| 560 if (desktop_environment_.get() == NULL) { | |
| 561 SetState(kError); | |
| 562 return; | |
| 563 } | |
| 564 | |
| 565 // Generate a key pair for the Host to use. | 539 // Generate a key pair for the Host to use. |
| 566 // TODO(wez): Move this to the worker thread. | 540 // TODO(wez): Move this to the worker thread. |
| 567 host_key_pair_.Generate(); | 541 host_key_pair_.Generate(); |
| 568 | 542 |
| 569 // Create XMPP connection. | 543 // Create XMPP connection. |
| 570 scoped_ptr<SignalStrategy> signal_strategy( | 544 scoped_ptr<SignalStrategy> signal_strategy( |
| 571 new XmppSignalStrategy(host_context_->url_request_context_getter(), | 545 new XmppSignalStrategy(host_context_->url_request_context_getter(), |
| 572 uid, auth_token, auth_service)); | 546 uid, auth_token, auth_service)); |
| 573 | 547 |
| 574 // Request registration of the host for support. | 548 // Request registration of the host for support. |
| 575 scoped_ptr<RegisterSupportHostRequest> register_request( | 549 scoped_ptr<RegisterSupportHostRequest> register_request( |
| 576 new RegisterSupportHostRequest( | 550 new RegisterSupportHostRequest( |
| 577 signal_strategy.get(), &host_key_pair_, | 551 signal_strategy.get(), &host_key_pair_, |
| 578 base::Bind(&HostNPScriptObject::OnReceivedSupportID, | 552 base::Bind(&HostNPScriptObject::OnReceivedSupportID, |
| 579 base::Unretained(this)))); | 553 base::Unretained(this)))); |
| 580 | 554 |
| 581 // Beyond this point nothing can fail, so save the config and request. | 555 // Beyond this point nothing can fail, so save the config and request. |
| 582 signal_strategy_.reset(signal_strategy.release()); | 556 signal_strategy_.reset(signal_strategy.release()); |
| 583 register_request_.reset(register_request.release()); | 557 register_request_.reset(register_request.release()); |
| 584 | 558 |
| 585 // Create the Host. | 559 // Create the Host. |
| 586 LOG(INFO) << "NAT state: " << nat_traversal_enabled_; | 560 LOG(INFO) << "NAT state: " << nat_traversal_enabled_; |
| 587 host_ = new ChromotingHost( | 561 host_ = new ChromotingHost( |
| 588 host_context_.get(), signal_strategy_.get(), desktop_environment_.get(), | 562 host_context_.get(), signal_strategy_.get(), |
| 563 desktop_environment_factory_.get(), |
| 589 CreateHostSessionManager( | 564 CreateHostSessionManager( |
| 590 NetworkSettings(nat_traversal_enabled_ ? | 565 NetworkSettings(nat_traversal_enabled_ ? |
| 591 NetworkSettings::NAT_TRAVERSAL_ENABLED : | 566 NetworkSettings::NAT_TRAVERSAL_ENABLED : |
| 592 NetworkSettings::NAT_TRAVERSAL_DISABLED), | 567 NetworkSettings::NAT_TRAVERSAL_DISABLED), |
| 593 host_context_->url_request_context_getter())); | 568 host_context_->url_request_context_getter())); |
| 594 host_->AddStatusObserver(this); | 569 host_->AddStatusObserver(this); |
| 595 log_to_server_.reset( | 570 log_to_server_.reset( |
| 596 new LogToServer(host_, ServerLogEntry::IT2ME, signal_strategy_.get())); | 571 new LogToServer(host_, ServerLogEntry::IT2ME, signal_strategy_.get())); |
| 597 base::Closure disconnect_callback = base::Bind( | 572 base::Closure disconnect_callback = base::Bind( |
| 598 &ChromotingHost::Shutdown, base::Unretained(host_.get()), | 573 &ChromotingHost::Shutdown, base::Unretained(host_.get()), |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 873 FROM_HERE, base::Bind(&HostNPScriptObject::DisconnectInternal, | 848 FROM_HERE, base::Bind(&HostNPScriptObject::DisconnectInternal, |
| 874 base::Unretained(this))); | 849 base::Unretained(this))); |
| 875 return; | 850 return; |
| 876 } | 851 } |
| 877 | 852 |
| 878 switch (state_) { | 853 switch (state_) { |
| 879 case kDisconnected: | 854 case kDisconnected: |
| 880 return; | 855 return; |
| 881 | 856 |
| 882 case kStarting: | 857 case kStarting: |
| 883 desktop_environment_.reset(); | |
| 884 SetState(kDisconnecting); | 858 SetState(kDisconnecting); |
| 885 SetState(kDisconnected); | 859 SetState(kDisconnected); |
| 886 return; | 860 return; |
| 887 | 861 |
| 888 case kDisconnecting: | 862 case kDisconnecting: |
| 889 return; | 863 return; |
| 890 | 864 |
| 891 default: | 865 default: |
| 892 SetState(kDisconnecting); | 866 SetState(kDisconnecting); |
| 893 | 867 |
| 894 if (!host_) { | 868 if (!host_) { |
| 895 OnShutdownFinished(); | 869 OnShutdownFinished(); |
| 896 return; | 870 return; |
| 897 } | 871 } |
| 898 // ChromotingHost::Shutdown() may destroy SignalStrategy | 872 // ChromotingHost::Shutdown() may destroy SignalStrategy |
| 899 // synchronously, but SignalStrategy::Listener handlers are not | 873 // synchronously, but SignalStrategy::Listener handlers are not |
| 900 // allowed to destroy SignalStrategy, so post task to call | 874 // allowed to destroy SignalStrategy, so post task to call |
| 901 // Shutdown() later. | 875 // Shutdown() later. |
| 902 host_context_->network_task_runner()->PostTask( | 876 host_context_->network_task_runner()->PostTask( |
| 903 FROM_HERE, base::Bind( | 877 FROM_HERE, base::Bind( |
| 904 &ChromotingHost::Shutdown, host_, | 878 &ChromotingHost::Shutdown, host_, |
| 905 base::Bind(&HostNPScriptObject::OnShutdownFinished, | 879 base::Bind(&HostNPScriptObject::OnShutdownFinished, |
| 906 base::Unretained(this)))); | 880 base::Unretained(this)))); |
| 907 return; | 881 return; |
| 908 } | 882 } |
| 909 } | 883 } |
| 910 | 884 |
| 911 void HostNPScriptObject::OnShutdownFinished() { | 885 void HostNPScriptObject::OnShutdownFinished() { |
| 912 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); | 886 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); |
| 913 | |
| 914 desktop_environment_.reset(); | |
| 915 } | 887 } |
| 916 | 888 |
| 917 void HostNPScriptObject::OnPolicyUpdate( | 889 void HostNPScriptObject::OnPolicyUpdate( |
| 918 scoped_ptr<base::DictionaryValue> policies) { | 890 scoped_ptr<base::DictionaryValue> policies) { |
| 919 if (!host_context_->network_task_runner()->BelongsToCurrentThread()) { | 891 if (!host_context_->network_task_runner()->BelongsToCurrentThread()) { |
| 920 host_context_->network_task_runner()->PostTask( | 892 host_context_->network_task_runner()->PostTask( |
| 921 FROM_HERE, | 893 FROM_HERE, |
| 922 base::Bind(&HostNPScriptObject::OnPolicyUpdate, | 894 base::Bind(&HostNPScriptObject::OnPolicyUpdate, |
| 923 base::Unretained(this), base::Passed(&policies))); | 895 base::Unretained(this), base::Passed(&policies))); |
| 924 return; | 896 return; |
| (...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1296 return is_good; | 1268 return is_good; |
| 1297 } | 1269 } |
| 1298 | 1270 |
| 1299 void HostNPScriptObject::SetException(const std::string& exception_string) { | 1271 void HostNPScriptObject::SetException(const std::string& exception_string) { |
| 1300 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); | 1272 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
| 1301 g_npnetscape_funcs->setexception(parent_, exception_string.c_str()); | 1273 g_npnetscape_funcs->setexception(parent_, exception_string.c_str()); |
| 1302 LOG(INFO) << exception_string; | 1274 LOG(INFO) << exception_string; |
| 1303 } | 1275 } |
| 1304 | 1276 |
| 1305 } // namespace remoting | 1277 } // namespace remoting |
| OLD | NEW |