| 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 <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/at_exit.h" | 9 #include "base/at_exit.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/callback.h" | 11 #include "base/callback.h" |
| 12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
| 13 #include "base/debug/alias.h" | 13 #include "base/debug/alias.h" |
| 14 #include "base/file_util.h" | 14 #include "base/file_util.h" |
| 15 #include "base/files/file_path.h" | 15 #include "base/files/file_path.h" |
| 16 #include "base/logging.h" | |
| 17 #include "base/memory/scoped_ptr.h" | 16 #include "base/memory/scoped_ptr.h" |
| 18 #include "base/message_loop/message_loop.h" | 17 #include "base/message_loop/message_loop.h" |
| 19 #include "base/single_thread_task_runner.h" | 18 #include "base/single_thread_task_runner.h" |
| 20 #include "base/strings/string_number_conversions.h" | 19 #include "base/strings/string_number_conversions.h" |
| 21 #include "base/strings/string_util.h" | 20 #include "base/strings/string_util.h" |
| 22 #include "base/strings/utf_string_conversions.h" | 21 #include "base/strings/utf_string_conversions.h" |
| 23 #include "base/synchronization/waitable_event.h" | 22 #include "base/synchronization/waitable_event.h" |
| 24 #include "base/threading/thread.h" | 23 #include "base/threading/thread.h" |
| 25 #include "build/build_config.h" | 24 #include "build/build_config.h" |
| 26 #include "crypto/nss_util.h" | 25 #include "crypto/nss_util.h" |
| 27 #include "ipc/ipc_channel.h" | 26 #include "ipc/ipc_channel.h" |
| 28 #include "ipc/ipc_channel_proxy.h" | 27 #include "ipc/ipc_channel_proxy.h" |
| 29 #include "ipc/ipc_listener.h" | 28 #include "ipc/ipc_listener.h" |
| 30 #include "media/base/media.h" | 29 #include "media/base/media.h" |
| 31 #include "net/base/network_change_notifier.h" | 30 #include "net/base/network_change_notifier.h" |
| 32 #include "net/socket/client_socket_factory.h" | 31 #include "net/socket/client_socket_factory.h" |
| 33 #include "net/socket/ssl_server_socket.h" | 32 #include "net/socket/ssl_server_socket.h" |
| 34 #include "net/url_request/url_fetcher.h" | 33 #include "net/url_request/url_fetcher.h" |
| 35 #include "remoting/base/auto_thread_task_runner.h" | 34 #include "remoting/base/auto_thread_task_runner.h" |
| 36 #include "remoting/base/breakpad.h" | 35 #include "remoting/base/breakpad.h" |
| 37 #include "remoting/base/constants.h" | 36 #include "remoting/base/constants.h" |
| 37 #include "remoting/base/logging.h" |
| 38 #include "remoting/base/rsa_key_pair.h" | 38 #include "remoting/base/rsa_key_pair.h" |
| 39 #include "remoting/base/util.h" | 39 #include "remoting/base/util.h" |
| 40 #include "remoting/host/branding.h" | 40 #include "remoting/host/branding.h" |
| 41 #include "remoting/host/chromoting_host.h" | 41 #include "remoting/host/chromoting_host.h" |
| 42 #include "remoting/host/chromoting_host_context.h" | 42 #include "remoting/host/chromoting_host_context.h" |
| 43 #include "remoting/host/chromoting_messages.h" | 43 #include "remoting/host/chromoting_messages.h" |
| 44 #include "remoting/host/config_file_watcher.h" | 44 #include "remoting/host/config_file_watcher.h" |
| 45 #include "remoting/host/desktop_environment.h" | 45 #include "remoting/host/desktop_environment.h" |
| 46 #include "remoting/host/desktop_session_connector.h" | 46 #include "remoting/host/desktop_session_connector.h" |
| 47 #include "remoting/host/dns_blackhole_checker.h" | 47 #include "remoting/host/dns_blackhole_checker.h" |
| (...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 416 if (!context_->network_task_runner()->BelongsToCurrentThread()) { | 416 if (!context_->network_task_runner()->BelongsToCurrentThread()) { |
| 417 context_->network_task_runner()->PostTask(FROM_HERE, | 417 context_->network_task_runner()->PostTask(FROM_HERE, |
| 418 base::Bind(&HostProcess::OnConfigUpdated, this, serialized_config)); | 418 base::Bind(&HostProcess::OnConfigUpdated, this, serialized_config)); |
| 419 return; | 419 return; |
| 420 } | 420 } |
| 421 | 421 |
| 422 // Filter out duplicates. | 422 // Filter out duplicates. |
| 423 if (serialized_config_ == serialized_config) | 423 if (serialized_config_ == serialized_config) |
| 424 return; | 424 return; |
| 425 | 425 |
| 426 LOG(INFO) << "Processing new host configuration."; | 426 LOG_INFO << "Processing new host configuration."; |
| 427 | 427 |
| 428 serialized_config_ = serialized_config; | 428 serialized_config_ = serialized_config; |
| 429 scoped_ptr<JsonHostConfig> config(new JsonHostConfig(base::FilePath())); | 429 scoped_ptr<JsonHostConfig> config(new JsonHostConfig(base::FilePath())); |
| 430 if (!config->SetSerializedData(serialized_config)) { | 430 if (!config->SetSerializedData(serialized_config)) { |
| 431 LOG(ERROR) << "Invalid configuration."; | 431 LOG(ERROR) << "Invalid configuration."; |
| 432 ShutdownHost(kInvalidHostConfigurationExitCode); | 432 ShutdownHost(kInvalidHostConfigurationExitCode); |
| 433 return; | 433 return; |
| 434 } | 434 } |
| 435 | 435 |
| 436 if (!ApplyConfig(config.Pass())) { | 436 if (!ApplyConfig(config.Pass())) { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 481 remoting::RegisterSignalHandler( | 481 remoting::RegisterSignalHandler( |
| 482 SIGTERM, | 482 SIGTERM, |
| 483 base::Bind(&HostProcess::SigTermHandler, base::Unretained(this))); | 483 base::Bind(&HostProcess::SigTermHandler, base::Unretained(this))); |
| 484 #endif // defined(OS_POSIX) | 484 #endif // defined(OS_POSIX) |
| 485 } | 485 } |
| 486 | 486 |
| 487 #if defined(OS_POSIX) | 487 #if defined(OS_POSIX) |
| 488 void HostProcess::SigTermHandler(int signal_number) { | 488 void HostProcess::SigTermHandler(int signal_number) { |
| 489 DCHECK(signal_number == SIGTERM); | 489 DCHECK(signal_number == SIGTERM); |
| 490 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 490 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 491 LOG(INFO) << "Caught SIGTERM: Shutting down..."; | 491 LOG_INFO << "Caught SIGTERM: Shutting down..."; |
| 492 ShutdownHost(kSuccessExitCode); | 492 ShutdownHost(kSuccessExitCode); |
| 493 } | 493 } |
| 494 #endif // OS_POSIX | 494 #endif // OS_POSIX |
| 495 | 495 |
| 496 void HostProcess::CreateAuthenticatorFactory() { | 496 void HostProcess::CreateAuthenticatorFactory() { |
| 497 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 497 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 498 | 498 |
| 499 if (state_ != HOST_STARTED) | 499 if (state_ != HOST_STARTED) |
| 500 return; | 500 return; |
| 501 | 501 |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 652 #endif | 652 #endif |
| 653 } | 653 } |
| 654 | 654 |
| 655 // Overridden from HeartbeatSender::Listener | 655 // Overridden from HeartbeatSender::Listener |
| 656 void HostProcess::OnUnknownHostIdError() { | 656 void HostProcess::OnUnknownHostIdError() { |
| 657 LOG(ERROR) << "Host ID not found."; | 657 LOG(ERROR) << "Host ID not found."; |
| 658 ShutdownHost(kInvalidHostIdExitCode); | 658 ShutdownHost(kInvalidHostIdExitCode); |
| 659 } | 659 } |
| 660 | 660 |
| 661 void HostProcess::OnHeartbeatSuccessful() { | 661 void HostProcess::OnHeartbeatSuccessful() { |
| 662 LOG(INFO) << "Host ready to receive connections."; | 662 LOG_INFO << "Host ready to receive connections."; |
| 663 #if defined(OS_POSIX) | 663 #if defined(OS_POSIX) |
| 664 if (signal_parent_) { | 664 if (signal_parent_) { |
| 665 kill(getppid(), SIGUSR1); | 665 kill(getppid(), SIGUSR1); |
| 666 signal_parent_ = false; | 666 signal_parent_ = false; |
| 667 } | 667 } |
| 668 #endif | 668 #endif |
| 669 } | 669 } |
| 670 | 670 |
| 671 void HostProcess::OnHostDeleted() { | 671 void HostProcess::OnHostDeleted() { |
| 672 LOG(ERROR) << "Host was deleted from the directory."; | 672 LOG(ERROR) << "Host was deleted from the directory."; |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 797 StartHost(); | 797 StartHost(); |
| 798 } else if (state_ == HOST_STARTED && restart_required) { | 798 } else if (state_ == HOST_STARTED && restart_required) { |
| 799 RestartHost(); | 799 RestartHost(); |
| 800 } | 800 } |
| 801 } | 801 } |
| 802 | 802 |
| 803 bool HostProcess::OnHostDomainPolicyUpdate(const std::string& host_domain) { | 803 bool HostProcess::OnHostDomainPolicyUpdate(const std::string& host_domain) { |
| 804 // Returns true if the host has to be restarted after this policy update. | 804 // Returns true if the host has to be restarted after this policy update. |
| 805 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 805 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 806 | 806 |
| 807 LOG(INFO) << "Policy sets host domain: " << host_domain; | 807 LOG_INFO << "Policy sets host domain: " << host_domain; |
| 808 | 808 |
| 809 if (!host_domain.empty() && | 809 if (!host_domain.empty() && |
| 810 !EndsWith(host_owner_, std::string("@") + host_domain, false)) { | 810 !EndsWith(host_owner_, std::string("@") + host_domain, false)) { |
| 811 ShutdownHost(kInvalidHostDomainExitCode); | 811 ShutdownHost(kInvalidHostDomainExitCode); |
| 812 } | 812 } |
| 813 return false; | 813 return false; |
| 814 } | 814 } |
| 815 | 815 |
| 816 bool HostProcess::OnUsernamePolicyUpdate(bool curtain_required, | 816 bool HostProcess::OnUsernamePolicyUpdate(bool curtain_required, |
| 817 bool host_username_match_required) { | 817 bool host_username_match_required) { |
| 818 // Returns false: never restart the host after this policy update. | 818 // Returns false: never restart the host after this policy update. |
| 819 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 819 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 820 | 820 |
| 821 if (host_username_match_required) { | 821 if (host_username_match_required) { |
| 822 LOG(INFO) << "Policy requires host username match."; | 822 LOG_INFO << "Policy requires host username match."; |
| 823 std::string username = GetUsername(); | 823 std::string username = GetUsername(); |
| 824 bool shutdown = username.empty() || | 824 bool shutdown = username.empty() || |
| 825 !StartsWithASCII(host_owner_, username + std::string("@"), | 825 !StartsWithASCII(host_owner_, username + std::string("@"), |
| 826 false); | 826 false); |
| 827 | 827 |
| 828 #if defined(OS_MACOSX) | 828 #if defined(OS_MACOSX) |
| 829 // On Mac, we run as root at the login screen, so the username won't match. | 829 // On Mac, we run as root at the login screen, so the username won't match. |
| 830 // However, there's no need to enforce the policy at the login screen, as | 830 // However, there's no need to enforce the policy at the login screen, as |
| 831 // the client will have to reconnect if a login occurs. | 831 // the client will have to reconnect if a login occurs. |
| 832 if (shutdown && getuid() == 0) { | 832 if (shutdown && getuid() == 0) { |
| 833 shutdown = false; | 833 shutdown = false; |
| 834 } | 834 } |
| 835 #endif | 835 #endif |
| 836 | 836 |
| 837 // Curtain-mode on Windows presents the standard OS login prompt to the user | 837 // Curtain-mode on Windows presents the standard OS login prompt to the user |
| 838 // for each connection, removing the need for an explicit user-name matching | 838 // for each connection, removing the need for an explicit user-name matching |
| 839 // check. | 839 // check. |
| 840 #if defined(OS_WIN) && defined(REMOTING_RDP_SESSION) | 840 #if defined(OS_WIN) && defined(REMOTING_RDP_SESSION) |
| 841 if (curtain_required) | 841 if (curtain_required) |
| 842 return false; | 842 return false; |
| 843 #endif // defined(OS_WIN) && defined(REMOTING_RDP_SESSION) | 843 #endif // defined(OS_WIN) && defined(REMOTING_RDP_SESSION) |
| 844 | 844 |
| 845 // Shutdown the host if the username does not match. | 845 // Shutdown the host if the username does not match. |
| 846 if (shutdown) { | 846 if (shutdown) { |
| 847 LOG(ERROR) << "The host username does not match."; | 847 LOG(ERROR) << "The host username does not match."; |
| 848 ShutdownHost(kUsernameMismatchExitCode); | 848 ShutdownHost(kUsernameMismatchExitCode); |
| 849 } | 849 } |
| 850 } else { | 850 } else { |
| 851 LOG(INFO) << "Policy does not require host username match."; | 851 LOG_INFO << "Policy does not require host username match."; |
| 852 } | 852 } |
| 853 | 853 |
| 854 return false; | 854 return false; |
| 855 } | 855 } |
| 856 | 856 |
| 857 bool HostProcess::OnNatPolicyUpdate(bool nat_traversal_enabled) { | 857 bool HostProcess::OnNatPolicyUpdate(bool nat_traversal_enabled) { |
| 858 // Returns true if the host has to be restarted after this policy update. | 858 // Returns true if the host has to be restarted after this policy update. |
| 859 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 859 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 860 | 860 |
| 861 if (allow_nat_traversal_ != nat_traversal_enabled) { | 861 if (allow_nat_traversal_ != nat_traversal_enabled) { |
| 862 if (nat_traversal_enabled) | 862 if (nat_traversal_enabled) |
| 863 LOG(INFO) << "Policy enables NAT traversal."; | 863 LOG_INFO << "Policy enables NAT traversal."; |
| 864 else | 864 else |
| 865 LOG(INFO) << "Policy disables NAT traversal."; | 865 LOG_INFO << "Policy disables NAT traversal."; |
| 866 allow_nat_traversal_ = nat_traversal_enabled; | 866 allow_nat_traversal_ = nat_traversal_enabled; |
| 867 return true; | 867 return true; |
| 868 } | 868 } |
| 869 return false; | 869 return false; |
| 870 } | 870 } |
| 871 | 871 |
| 872 void HostProcess::OnCurtainPolicyUpdate(bool curtain_required) { | 872 void HostProcess::OnCurtainPolicyUpdate(bool curtain_required) { |
| 873 // Returns true if the host has to be restarted after this policy update. | 873 // Returns true if the host has to be restarted after this policy update. |
| 874 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 874 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 875 | 875 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 888 LOG(ERROR) << "Running the host in the console login session is yet not " | 888 LOG(ERROR) << "Running the host in the console login session is yet not " |
| 889 "supported."; | 889 "supported."; |
| 890 ShutdownHost(kLoginScreenNotSupportedExitCode); | 890 ShutdownHost(kLoginScreenNotSupportedExitCode); |
| 891 return; | 891 return; |
| 892 } | 892 } |
| 893 } | 893 } |
| 894 #endif | 894 #endif |
| 895 | 895 |
| 896 if (curtain_required_ != curtain_required) { | 896 if (curtain_required_ != curtain_required) { |
| 897 if (curtain_required) | 897 if (curtain_required) |
| 898 LOG(INFO) << "Policy requires curtain-mode."; | 898 LOG_INFO << "Policy requires curtain-mode."; |
| 899 else | 899 else |
| 900 LOG(INFO) << "Policy does not require curtain-mode."; | 900 LOG_INFO << "Policy does not require curtain-mode."; |
| 901 curtain_required_ = curtain_required; | 901 curtain_required_ = curtain_required; |
| 902 if (host_) | 902 if (host_) |
| 903 host_->SetEnableCurtaining(curtain_required_); | 903 host_->SetEnableCurtaining(curtain_required_); |
| 904 } | 904 } |
| 905 } | 905 } |
| 906 | 906 |
| 907 bool HostProcess::OnHostTalkGadgetPrefixPolicyUpdate( | 907 bool HostProcess::OnHostTalkGadgetPrefixPolicyUpdate( |
| 908 const std::string& talkgadget_prefix) { | 908 const std::string& talkgadget_prefix) { |
| 909 // Returns true if the host has to be restarted after this policy update. | 909 // Returns true if the host has to be restarted after this policy update. |
| 910 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 910 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 911 | 911 |
| 912 if (talkgadget_prefix != talkgadget_prefix_) { | 912 if (talkgadget_prefix != talkgadget_prefix_) { |
| 913 LOG(INFO) << "Policy sets talkgadget prefix: " << talkgadget_prefix; | 913 LOG_INFO << "Policy sets talkgadget prefix: " << talkgadget_prefix; |
| 914 talkgadget_prefix_ = talkgadget_prefix; | 914 talkgadget_prefix_ = talkgadget_prefix; |
| 915 return true; | 915 return true; |
| 916 } | 916 } |
| 917 return false; | 917 return false; |
| 918 } | 918 } |
| 919 | 919 |
| 920 bool HostProcess::OnHostTokenUrlPolicyUpdate( | 920 bool HostProcess::OnHostTokenUrlPolicyUpdate( |
| 921 const GURL& token_url, | 921 const GURL& token_url, |
| 922 const GURL& token_validation_url) { | 922 const GURL& token_validation_url) { |
| 923 // Returns true if the host has to be restarted after this policy update. | 923 // Returns true if the host has to be restarted after this policy update. |
| 924 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 924 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 925 | 925 |
| 926 if (token_url_ != token_url || | 926 if (token_url_ != token_url || |
| 927 token_validation_url_ != token_validation_url) { | 927 token_validation_url_ != token_validation_url) { |
| 928 LOG(INFO) << "Policy sets third-party token URLs: " | 928 LOG_INFO << "Policy sets third-party token URLs: " |
| 929 << "TokenUrl: " << token_url << ", " | 929 << "TokenUrl: " << token_url << ", " |
| 930 << "TokenValidationUrl: " << token_validation_url; | 930 << "TokenValidationUrl: " << token_validation_url; |
| 931 | 931 |
| 932 token_url_ = token_url; | 932 token_url_ = token_url; |
| 933 token_validation_url_ = token_validation_url; | 933 token_validation_url_ = token_validation_url; |
| 934 return true; | 934 return true; |
| 935 } | 935 } |
| 936 | 936 |
| 937 return false; | 937 return false; |
| 938 } | 938 } |
| 939 | 939 |
| 940 bool HostProcess::OnPairingPolicyUpdate(bool allow_pairing) { | 940 bool HostProcess::OnPairingPolicyUpdate(bool allow_pairing) { |
| 941 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 941 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 942 | 942 |
| 943 if (allow_pairing_ == allow_pairing) | 943 if (allow_pairing_ == allow_pairing) |
| 944 return false; | 944 return false; |
| 945 | 945 |
| 946 if (allow_pairing) | 946 if (allow_pairing) |
| 947 LOG(INFO) << "Policy enables client pairing."; | 947 LOG_INFO << "Policy enables client pairing."; |
| 948 else | 948 else |
| 949 LOG(INFO) << "Policy disables client pairing."; | 949 LOG_INFO << "Policy disables client pairing."; |
| 950 allow_pairing_ = allow_pairing; | 950 allow_pairing_ = allow_pairing; |
| 951 return true; | 951 return true; |
| 952 } | 952 } |
| 953 | 953 |
| 954 void HostProcess::StartHost() { | 954 void HostProcess::StartHost() { |
| 955 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 955 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 956 DCHECK(!host_); | 956 DCHECK(!host_); |
| 957 DCHECK(!signal_strategy_.get()); | 957 DCHECK(!signal_strategy_.get()); |
| 958 DCHECK(state_ == HOST_INITIALIZING || state_ == HOST_STOPPING_TO_RESTART || | 958 DCHECK(state_ == HOST_INITIALIZING || state_ == HOST_STOPPING_TO_RESTART || |
| 959 state_ == HOST_STOPPED) << state_; | 959 state_ == HOST_STOPPED) << state_; |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1175 return exit_code; | 1175 return exit_code; |
| 1176 } | 1176 } |
| 1177 | 1177 |
| 1178 } // namespace remoting | 1178 } // namespace remoting |
| 1179 | 1179 |
| 1180 #if !defined(OS_WIN) | 1180 #if !defined(OS_WIN) |
| 1181 int main(int argc, char** argv) { | 1181 int main(int argc, char** argv) { |
| 1182 return remoting::HostMain(argc, argv); | 1182 return remoting::HostMain(argc, argv); |
| 1183 } | 1183 } |
| 1184 #endif // !defined(OS_WIN) | 1184 #endif // !defined(OS_WIN) |
| OLD | NEW |