| 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 // This file implements a standalone host process for Me2Me. | 5 // This file implements a standalone host process for Me2Me. |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <string> | 10 #include <string> |
| 11 #include <utility> |
| 11 | 12 |
| 12 #include "base/bind.h" | 13 #include "base/bind.h" |
| 13 #include "base/callback.h" | 14 #include "base/callback.h" |
| 14 #include "base/command_line.h" | 15 #include "base/command_line.h" |
| 15 #include "base/debug/alias.h" | 16 #include "base/debug/alias.h" |
| 16 #include "base/files/file_path.h" | 17 #include "base/files/file_path.h" |
| 17 #include "base/files/file_util.h" | 18 #include "base/files/file_util.h" |
| 18 #include "base/macros.h" | 19 #include "base/macros.h" |
| 19 #include "base/memory/scoped_ptr.h" | 20 #include "base/memory/scoped_ptr.h" |
| 20 #include "base/message_loop/message_loop.h" | 21 #include "base/message_loop/message_loop.h" |
| (...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 scoped_refptr<PairingRegistry> pairing_registry_; | 465 scoped_refptr<PairingRegistry> pairing_registry_; |
| 465 | 466 |
| 466 ShutdownWatchdog* shutdown_watchdog_; | 467 ShutdownWatchdog* shutdown_watchdog_; |
| 467 | 468 |
| 468 DISALLOW_COPY_AND_ASSIGN(HostProcess); | 469 DISALLOW_COPY_AND_ASSIGN(HostProcess); |
| 469 }; | 470 }; |
| 470 | 471 |
| 471 HostProcess::HostProcess(scoped_ptr<ChromotingHostContext> context, | 472 HostProcess::HostProcess(scoped_ptr<ChromotingHostContext> context, |
| 472 int* exit_code_out, | 473 int* exit_code_out, |
| 473 ShutdownWatchdog* shutdown_watchdog) | 474 ShutdownWatchdog* shutdown_watchdog) |
| 474 : context_(context.Pass()), | 475 : context_(std::move(context)), |
| 475 state_(HOST_STARTING), | 476 state_(HOST_STARTING), |
| 476 use_service_account_(false), | 477 use_service_account_(false), |
| 477 enable_vp9_(false), | 478 enable_vp9_(false), |
| 478 frame_recorder_buffer_size_(0), | 479 frame_recorder_buffer_size_(0), |
| 479 policy_state_(POLICY_INITIALIZING), | 480 policy_state_(POLICY_INITIALIZING), |
| 480 host_username_match_required_(false), | 481 host_username_match_required_(false), |
| 481 allow_nat_traversal_(true), | 482 allow_nat_traversal_(true), |
| 482 allow_relay_(true), | 483 allow_relay_(true), |
| 483 allow_pairing_(true), | 484 allow_pairing_(true), |
| 484 curtain_required_(false), | 485 curtain_required_(false), |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 773 if (allow_pairing_) { | 774 if (allow_pairing_) { |
| 774 // On Windows |pairing_registry_| is initialized in | 775 // On Windows |pairing_registry_| is initialized in |
| 775 // InitializePairingRegistry(). | 776 // InitializePairingRegistry(). |
| 776 #if !defined(OS_WIN) | 777 #if !defined(OS_WIN) |
| 777 if (!pairing_registry_) { | 778 if (!pairing_registry_) { |
| 778 scoped_ptr<PairingRegistry::Delegate> delegate = | 779 scoped_ptr<PairingRegistry::Delegate> delegate = |
| 779 CreatePairingRegistryDelegate(); | 780 CreatePairingRegistryDelegate(); |
| 780 | 781 |
| 781 if (delegate) | 782 if (delegate) |
| 782 pairing_registry_ = new PairingRegistry(context_->file_task_runner(), | 783 pairing_registry_ = new PairingRegistry(context_->file_task_runner(), |
| 783 delegate.Pass()); | 784 std::move(delegate)); |
| 784 } | 785 } |
| 785 #endif // defined(OS_WIN) | 786 #endif // defined(OS_WIN) |
| 786 | 787 |
| 787 pairing_registry = pairing_registry_; | 788 pairing_registry = pairing_registry_; |
| 788 } | 789 } |
| 789 | 790 |
| 790 factory = protocol::Me2MeHostAuthenticatorFactory::CreateWithSharedSecret( | 791 factory = protocol::Me2MeHostAuthenticatorFactory::CreateWithSharedSecret( |
| 791 use_service_account_, host_owner_, local_certificate, key_pair_, | 792 use_service_account_, host_owner_, local_certificate, key_pair_, |
| 792 host_secret_hash_, pairing_registry); | 793 host_secret_hash_, pairing_registry); |
| 793 | 794 |
| 794 host_->set_pairing_registry(pairing_registry); | 795 host_->set_pairing_registry(pairing_registry); |
| 795 } else { | 796 } else { |
| 796 DCHECK(third_party_auth_config_.token_url.is_valid()); | 797 DCHECK(third_party_auth_config_.token_url.is_valid()); |
| 797 DCHECK(third_party_auth_config_.token_validation_url.is_valid()); | 798 DCHECK(third_party_auth_config_.token_validation_url.is_valid()); |
| 798 | 799 |
| 799 scoped_ptr<protocol::TokenValidatorFactory> token_validator_factory( | 800 scoped_ptr<protocol::TokenValidatorFactory> token_validator_factory( |
| 800 new TokenValidatorFactoryImpl( | 801 new TokenValidatorFactoryImpl( |
| 801 third_party_auth_config_, | 802 third_party_auth_config_, |
| 802 key_pair_, context_->url_request_context_getter())); | 803 key_pair_, context_->url_request_context_getter())); |
| 803 factory = protocol::Me2MeHostAuthenticatorFactory::CreateWithThirdPartyAuth( | 804 factory = protocol::Me2MeHostAuthenticatorFactory::CreateWithThirdPartyAuth( |
| 804 use_service_account_, host_owner_, local_certificate, key_pair_, | 805 use_service_account_, host_owner_, local_certificate, key_pair_, |
| 805 token_validator_factory.Pass()); | 806 std::move(token_validator_factory)); |
| 806 } | 807 } |
| 807 | 808 |
| 808 #if defined(OS_POSIX) | 809 #if defined(OS_POSIX) |
| 809 // On Linux and Mac, perform a PAM authorization step after authentication. | 810 // On Linux and Mac, perform a PAM authorization step after authentication. |
| 810 factory.reset(new PamAuthorizationFactory(factory.Pass())); | 811 factory.reset(new PamAuthorizationFactory(std::move(factory))); |
| 811 #endif | 812 #endif |
| 812 host_->SetAuthenticatorFactory(factory.Pass()); | 813 host_->SetAuthenticatorFactory(std::move(factory)); |
| 813 } | 814 } |
| 814 | 815 |
| 815 // IPC::Listener implementation. | 816 // IPC::Listener implementation. |
| 816 bool HostProcess::OnMessageReceived(const IPC::Message& message) { | 817 bool HostProcess::OnMessageReceived(const IPC::Message& message) { |
| 817 DCHECK(context_->ui_task_runner()->BelongsToCurrentThread()); | 818 DCHECK(context_->ui_task_runner()->BelongsToCurrentThread()); |
| 818 | 819 |
| 819 #if defined(REMOTING_MULTI_PROCESS) | 820 #if defined(REMOTING_MULTI_PROCESS) |
| 820 bool handled = true; | 821 bool handled = true; |
| 821 IPC_BEGIN_MESSAGE_MAP(HostProcess, message) | 822 IPC_BEGIN_MESSAGE_MAP(HostProcess, message) |
| 822 IPC_MESSAGE_HANDLER(ChromotingDaemonMsg_Crash, OnCrash) | 823 IPC_MESSAGE_HANDLER(ChromotingDaemonMsg_Crash, OnCrash) |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 990 HKEY privileged_hkey = reinterpret_cast<HKEY>( | 991 HKEY privileged_hkey = reinterpret_cast<HKEY>( |
| 991 IPC::PlatformFileForTransitToPlatformFile(privileged_key)); | 992 IPC::PlatformFileForTransitToPlatformFile(privileged_key)); |
| 992 HKEY unprivileged_hkey = reinterpret_cast<HKEY>( | 993 HKEY unprivileged_hkey = reinterpret_cast<HKEY>( |
| 993 IPC::PlatformFileForTransitToPlatformFile(unprivileged_key)); | 994 IPC::PlatformFileForTransitToPlatformFile(unprivileged_key)); |
| 994 | 995 |
| 995 scoped_ptr<PairingRegistryDelegateWin> delegate( | 996 scoped_ptr<PairingRegistryDelegateWin> delegate( |
| 996 new PairingRegistryDelegateWin()); | 997 new PairingRegistryDelegateWin()); |
| 997 delegate->SetRootKeys(privileged_hkey, unprivileged_hkey); | 998 delegate->SetRootKeys(privileged_hkey, unprivileged_hkey); |
| 998 | 999 |
| 999 pairing_registry_ = new PairingRegistry(context_->file_task_runner(), | 1000 pairing_registry_ = new PairingRegistry(context_->file_task_runner(), |
| 1000 delegate.Pass()); | 1001 std::move(delegate)); |
| 1001 | 1002 |
| 1002 // (Re)Create the authenticator factory now that |pairing_registry_| has been | 1003 // (Re)Create the authenticator factory now that |pairing_registry_| has been |
| 1003 // initialized. | 1004 // initialized. |
| 1004 CreateAuthenticatorFactory(); | 1005 CreateAuthenticatorFactory(); |
| 1005 } | 1006 } |
| 1006 #endif // !defined(OS_WIN) | 1007 #endif // !defined(OS_WIN) |
| 1007 | 1008 |
| 1008 // Applies the host config, returning true if successful. | 1009 // Applies the host config, returning true if successful. |
| 1009 bool HostProcess::ApplyConfig(const base::DictionaryValue& config) { | 1010 bool HostProcess::ApplyConfig(const base::DictionaryValue& config) { |
| 1010 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 1011 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| (...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1418 context_->url_request_context_getter(), xmpp_server_config_); | 1419 context_->url_request_context_getter(), xmpp_server_config_); |
| 1419 signal_strategy_.reset(xmpp_signal_strategy); | 1420 signal_strategy_.reset(xmpp_signal_strategy); |
| 1420 | 1421 |
| 1421 // Create SignalingConnector. | 1422 // Create SignalingConnector. |
| 1422 scoped_ptr<DnsBlackholeChecker> dns_blackhole_checker(new DnsBlackholeChecker( | 1423 scoped_ptr<DnsBlackholeChecker> dns_blackhole_checker(new DnsBlackholeChecker( |
| 1423 context_->url_request_context_getter(), talkgadget_prefix_)); | 1424 context_->url_request_context_getter(), talkgadget_prefix_)); |
| 1424 scoped_ptr<OAuthTokenGetter::OAuthCredentials> oauth_credentials( | 1425 scoped_ptr<OAuthTokenGetter::OAuthCredentials> oauth_credentials( |
| 1425 new OAuthTokenGetter::OAuthCredentials(xmpp_server_config_.username, | 1426 new OAuthTokenGetter::OAuthCredentials(xmpp_server_config_.username, |
| 1426 oauth_refresh_token_, | 1427 oauth_refresh_token_, |
| 1427 use_service_account_)); | 1428 use_service_account_)); |
| 1428 oauth_token_getter_.reset(new OAuthTokenGetterImpl( | 1429 oauth_token_getter_.reset( |
| 1429 oauth_credentials.Pass(), context_->url_request_context_getter(), false)); | 1430 new OAuthTokenGetterImpl(std::move(oauth_credentials), |
| 1431 context_->url_request_context_getter(), false)); |
| 1430 signaling_connector_.reset(new SignalingConnector( | 1432 signaling_connector_.reset(new SignalingConnector( |
| 1431 xmpp_signal_strategy, dns_blackhole_checker.Pass(), | 1433 xmpp_signal_strategy, std::move(dns_blackhole_checker), |
| 1432 oauth_token_getter_.get(), | 1434 oauth_token_getter_.get(), |
| 1433 base::Bind(&HostProcess::OnAuthFailed, base::Unretained(this)))); | 1435 base::Bind(&HostProcess::OnAuthFailed, base::Unretained(this)))); |
| 1434 | 1436 |
| 1435 #if defined(USE_GCD) | 1437 #if defined(USE_GCD) |
| 1436 // Create objects to manage GCD state. | 1438 // Create objects to manage GCD state. |
| 1437 ServiceUrls* service_urls = ServiceUrls::GetInstance(); | 1439 ServiceUrls* service_urls = ServiceUrls::GetInstance(); |
| 1438 scoped_ptr<GcdRestClient> gcd_rest_client(new GcdRestClient( | 1440 scoped_ptr<GcdRestClient> gcd_rest_client(new GcdRestClient( |
| 1439 service_urls->gcd_base_url(), host_id_, | 1441 service_urls->gcd_base_url(), host_id_, |
| 1440 context_->url_request_context_getter(), oauth_token_getter_.get())); | 1442 context_->url_request_context_getter(), oauth_token_getter_.get())); |
| 1441 gcd_state_updater_.reset( | 1443 gcd_state_updater_.reset(new GcdStateUpdater( |
| 1442 new GcdStateUpdater(base::Bind(&HostProcess::OnHeartbeatSuccessful, | 1444 base::Bind(&HostProcess::OnHeartbeatSuccessful, base::Unretained(this)), |
| 1443 base::Unretained(this)), | 1445 base::Bind(&HostProcess::OnUnknownHostIdError, base::Unretained(this)), |
| 1444 base::Bind(&HostProcess::OnUnknownHostIdError, | 1446 signal_strategy_.get(), std::move(gcd_rest_client))); |
| 1445 base::Unretained(this)), | |
| 1446 signal_strategy_.get(), gcd_rest_client.Pass())); | |
| 1447 PushNotificationSubscriber::Subscription sub; | 1447 PushNotificationSubscriber::Subscription sub; |
| 1448 sub.channel = "cloud_devices"; | 1448 sub.channel = "cloud_devices"; |
| 1449 PushNotificationSubscriber::SubscriptionList subs; | 1449 PushNotificationSubscriber::SubscriptionList subs; |
| 1450 subs.push_back(sub); | 1450 subs.push_back(sub); |
| 1451 gcd_subscriber_.reset( | 1451 gcd_subscriber_.reset( |
| 1452 new PushNotificationSubscriber(signal_strategy_.get(), subs)); | 1452 new PushNotificationSubscriber(signal_strategy_.get(), subs)); |
| 1453 #endif // defined(USE_GCD) | 1453 #endif // defined(USE_GCD) |
| 1454 | 1454 |
| 1455 // Create HeartbeatSender. | 1455 // Create HeartbeatSender. |
| 1456 heartbeat_sender_.reset(new HeartbeatSender( | 1456 heartbeat_sender_.reset(new HeartbeatSender( |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1521 #else // !defined(NDEBUG) | 1521 #else // !defined(NDEBUG) |
| 1522 LOG(ERROR) << "WebRTC is enabled only in debug builds."; | 1522 LOG(ERROR) << "WebRTC is enabled only in debug builds."; |
| 1523 ShutdownHost(kUsageExitCode); | 1523 ShutdownHost(kUsageExitCode); |
| 1524 return; | 1524 return; |
| 1525 #endif // defined(NDEBUG) | 1525 #endif // defined(NDEBUG) |
| 1526 } else { | 1526 } else { |
| 1527 transport_factory.reset( | 1527 transport_factory.reset( |
| 1528 new protocol::IceTransportFactory(transport_context)); | 1528 new protocol::IceTransportFactory(transport_context)); |
| 1529 } | 1529 } |
| 1530 scoped_ptr<protocol::SessionManager> session_manager( | 1530 scoped_ptr<protocol::SessionManager> session_manager( |
| 1531 new protocol::JingleSessionManager(transport_factory.Pass(), | 1531 new protocol::JingleSessionManager(std::move(transport_factory), |
| 1532 signal_strategy_.get())); | 1532 signal_strategy_.get())); |
| 1533 | 1533 |
| 1534 scoped_ptr<protocol::CandidateSessionConfig> protocol_config = | 1534 scoped_ptr<protocol::CandidateSessionConfig> protocol_config = |
| 1535 protocol::CandidateSessionConfig::CreateDefault(); | 1535 protocol::CandidateSessionConfig::CreateDefault(); |
| 1536 if (!desktop_environment_factory_->SupportsAudioCapture()) | 1536 if (!desktop_environment_factory_->SupportsAudioCapture()) |
| 1537 protocol_config->DisableAudioChannel(); | 1537 protocol_config->DisableAudioChannel(); |
| 1538 if (enable_vp9_) | 1538 if (enable_vp9_) |
| 1539 protocol_config->set_vp9_experiment_enabled(true); | 1539 protocol_config->set_vp9_experiment_enabled(true); |
| 1540 #if !defined(NDEBUG) | 1540 #if !defined(NDEBUG) |
| 1541 if (base::CommandLine::ForCurrentProcess()->HasSwitch(kEnableWebrtc)) { | 1541 if (base::CommandLine::ForCurrentProcess()->HasSwitch(kEnableWebrtc)) { |
| 1542 protocol_config->set_webrtc_supported(true); | 1542 protocol_config->set_webrtc_supported(true); |
| 1543 } | 1543 } |
| 1544 #endif // !defined(NDEBUG) | 1544 #endif // !defined(NDEBUG) |
| 1545 session_manager->set_protocol_config(protocol_config.Pass()); | 1545 session_manager->set_protocol_config(std::move(protocol_config)); |
| 1546 | 1546 |
| 1547 host_.reset(new ChromotingHost( | 1547 host_.reset(new ChromotingHost( |
| 1548 desktop_environment_factory_.get(), | 1548 desktop_environment_factory_.get(), std::move(session_manager), |
| 1549 session_manager.Pass(), context_->audio_task_runner(), | 1549 context_->audio_task_runner(), context_->input_task_runner(), |
| 1550 context_->input_task_runner(), context_->video_capture_task_runner(), | 1550 context_->video_capture_task_runner(), |
| 1551 context_->video_encode_task_runner(), context_->network_task_runner(), | 1551 context_->video_encode_task_runner(), context_->network_task_runner(), |
| 1552 context_->ui_task_runner())); | 1552 context_->ui_task_runner())); |
| 1553 | 1553 |
| 1554 if (frame_recorder_buffer_size_ > 0) { | 1554 if (frame_recorder_buffer_size_ > 0) { |
| 1555 scoped_ptr<VideoFrameRecorderHostExtension> frame_recorder_extension( | 1555 scoped_ptr<VideoFrameRecorderHostExtension> frame_recorder_extension( |
| 1556 new VideoFrameRecorderHostExtension()); | 1556 new VideoFrameRecorderHostExtension()); |
| 1557 frame_recorder_extension->SetMaxContentBytes(frame_recorder_buffer_size_); | 1557 frame_recorder_extension->SetMaxContentBytes(frame_recorder_buffer_size_); |
| 1558 host_->AddExtension(frame_recorder_extension.Pass()); | 1558 host_->AddExtension(std::move(frame_recorder_extension)); |
| 1559 } | 1559 } |
| 1560 | 1560 |
| 1561 // TODO(simonmorris): Get the maximum session duration from a policy. | 1561 // TODO(simonmorris): Get the maximum session duration from a policy. |
| 1562 #if defined(OS_LINUX) | 1562 #if defined(OS_LINUX) |
| 1563 host_->SetMaximumSessionDuration(base::TimeDelta::FromHours(20)); | 1563 host_->SetMaximumSessionDuration(base::TimeDelta::FromHours(20)); |
| 1564 #endif | 1564 #endif |
| 1565 | 1565 |
| 1566 host_change_notification_listener_.reset(new HostChangeNotificationListener( | 1566 host_change_notification_listener_.reset(new HostChangeNotificationListener( |
| 1567 this, host_id_, signal_strategy_.get(), directory_bot_jid_)); | 1567 this, host_id_, signal_strategy_.get(), directory_bot_jid_)); |
| 1568 | 1568 |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1743 // NetworkChangeNotifier must be initialized after MessageLoop. | 1743 // NetworkChangeNotifier must be initialized after MessageLoop. |
| 1744 scoped_ptr<net::NetworkChangeNotifier> network_change_notifier( | 1744 scoped_ptr<net::NetworkChangeNotifier> network_change_notifier( |
| 1745 net::NetworkChangeNotifier::Create()); | 1745 net::NetworkChangeNotifier::Create()); |
| 1746 | 1746 |
| 1747 // Create & start the HostProcess using these threads. | 1747 // Create & start the HostProcess using these threads. |
| 1748 // TODO(wez): The HostProcess holds a reference to itself until Shutdown(). | 1748 // TODO(wez): The HostProcess holds a reference to itself until Shutdown(). |
| 1749 // Remove this hack as part of the multi-process refactoring. | 1749 // Remove this hack as part of the multi-process refactoring. |
| 1750 int exit_code = kSuccessExitCode; | 1750 int exit_code = kSuccessExitCode; |
| 1751 ShutdownWatchdog shutdown_watchdog( | 1751 ShutdownWatchdog shutdown_watchdog( |
| 1752 base::TimeDelta::FromSeconds(kShutdownTimeoutSeconds)); | 1752 base::TimeDelta::FromSeconds(kShutdownTimeoutSeconds)); |
| 1753 new HostProcess(context.Pass(), &exit_code, &shutdown_watchdog); | 1753 new HostProcess(std::move(context), &exit_code, &shutdown_watchdog); |
| 1754 | 1754 |
| 1755 // Run the main (also UI) message loop until the host no longer needs it. | 1755 // Run the main (also UI) message loop until the host no longer needs it. |
| 1756 message_loop.Run(); | 1756 message_loop.Run(); |
| 1757 | 1757 |
| 1758 return exit_code; | 1758 return exit_code; |
| 1759 } | 1759 } |
| 1760 | 1760 |
| 1761 } // namespace remoting | 1761 } // namespace remoting |
| OLD | NEW |