| 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" |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 // Accessed on the network thread. | 259 // Accessed on the network thread. |
| 260 HostState state_; | 260 HostState state_; |
| 261 | 261 |
| 262 scoped_ptr<ConfigFileWatcher> config_watcher_; | 262 scoped_ptr<ConfigFileWatcher> config_watcher_; |
| 263 | 263 |
| 264 std::string host_id_; | 264 std::string host_id_; |
| 265 protocol::SharedSecretHash host_secret_hash_; | 265 protocol::SharedSecretHash host_secret_hash_; |
| 266 scoped_refptr<RsaKeyPair> key_pair_; | 266 scoped_refptr<RsaKeyPair> key_pair_; |
| 267 std::string oauth_refresh_token_; | 267 std::string oauth_refresh_token_; |
| 268 std::string serialized_config_; | 268 std::string serialized_config_; |
| 269 std::string host_owner_; |
| 269 std::string xmpp_login_; | 270 std::string xmpp_login_; |
| 271 bool use_service_account_; |
| 270 std::string xmpp_auth_token_; | 272 std::string xmpp_auth_token_; |
| 271 std::string xmpp_auth_service_; | 273 std::string xmpp_auth_service_; |
| 272 scoped_ptr<policy_hack::PolicyWatcher> policy_watcher_; | 274 scoped_ptr<policy_hack::PolicyWatcher> policy_watcher_; |
| 273 bool allow_nat_traversal_; | 275 bool allow_nat_traversal_; |
| 274 std::string talkgadget_prefix_; | 276 std::string talkgadget_prefix_; |
| 275 bool allow_pairing_; | 277 bool allow_pairing_; |
| 276 | 278 |
| 277 bool curtain_required_; | 279 bool curtain_required_; |
| 278 GURL token_url_; | 280 GURL token_url_; |
| 279 GURL token_validation_url_; | 281 GURL token_validation_url_; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 296 #endif // defined(REMOTING_MULTI_PROCESS) | 298 #endif // defined(REMOTING_MULTI_PROCESS) |
| 297 | 299 |
| 298 int* exit_code_out_; | 300 int* exit_code_out_; |
| 299 bool signal_parent_; | 301 bool signal_parent_; |
| 300 }; | 302 }; |
| 301 | 303 |
| 302 HostProcess::HostProcess(scoped_ptr<ChromotingHostContext> context, | 304 HostProcess::HostProcess(scoped_ptr<ChromotingHostContext> context, |
| 303 int* exit_code_out) | 305 int* exit_code_out) |
| 304 : context_(context.Pass()), | 306 : context_(context.Pass()), |
| 305 state_(HOST_INITIALIZING), | 307 state_(HOST_INITIALIZING), |
| 308 use_service_account_(false), |
| 306 allow_nat_traversal_(true), | 309 allow_nat_traversal_(true), |
| 307 allow_pairing_(true), | 310 allow_pairing_(true), |
| 308 curtain_required_(false), | 311 curtain_required_(false), |
| 309 #if defined(REMOTING_MULTI_PROCESS) | 312 #if defined(REMOTING_MULTI_PROCESS) |
| 310 desktop_session_connector_(NULL), | 313 desktop_session_connector_(NULL), |
| 311 #endif // defined(REMOTING_MULTI_PROCESS) | 314 #endif // defined(REMOTING_MULTI_PROCESS) |
| 312 self_(this), | 315 self_(this), |
| 313 exit_code_out_(exit_code_out), | 316 exit_code_out_(exit_code_out), |
| 314 signal_parent_(false) { | 317 signal_parent_(false) { |
| 315 StartOnUiThread(); | 318 StartOnUiThread(); |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 | 516 |
| 514 scoped_refptr<protocol::PairingRegistry> pairing_registry = NULL; | 517 scoped_refptr<protocol::PairingRegistry> pairing_registry = NULL; |
| 515 if (allow_pairing_) { | 518 if (allow_pairing_) { |
| 516 pairing_registry = CreatePairingRegistry(context_->file_task_runner()); | 519 pairing_registry = CreatePairingRegistry(context_->file_task_runner()); |
| 517 } | 520 } |
| 518 | 521 |
| 519 scoped_ptr<protocol::AuthenticatorFactory> factory; | 522 scoped_ptr<protocol::AuthenticatorFactory> factory; |
| 520 | 523 |
| 521 if (token_url_.is_empty() && token_validation_url_.is_empty()) { | 524 if (token_url_.is_empty() && token_validation_url_.is_empty()) { |
| 522 factory = protocol::Me2MeHostAuthenticatorFactory::CreateWithSharedSecret( | 525 factory = protocol::Me2MeHostAuthenticatorFactory::CreateWithSharedSecret( |
| 523 local_certificate, key_pair_, host_secret_hash_, pairing_registry); | 526 host_owner_, local_certificate, key_pair_, host_secret_hash_, |
| 527 pairing_registry); |
| 524 | 528 |
| 525 } else if (token_url_.is_valid() && token_validation_url_.is_valid()) { | 529 } else if (token_url_.is_valid() && token_validation_url_.is_valid()) { |
| 526 scoped_ptr<protocol::ThirdPartyHostAuthenticator::TokenValidatorFactory> | 530 scoped_ptr<protocol::ThirdPartyHostAuthenticator::TokenValidatorFactory> |
| 527 token_validator_factory(new TokenValidatorFactoryImpl( | 531 token_validator_factory(new TokenValidatorFactoryImpl( |
| 528 token_url_, token_validation_url_, key_pair_, | 532 token_url_, token_validation_url_, key_pair_, |
| 529 context_->url_request_context_getter())); | 533 context_->url_request_context_getter())); |
| 530 factory = protocol::Me2MeHostAuthenticatorFactory::CreateWithThirdPartyAuth( | 534 factory = protocol::Me2MeHostAuthenticatorFactory::CreateWithThirdPartyAuth( |
| 531 local_certificate, key_pair_, token_validator_factory.Pass()); | 535 host_owner_, local_certificate, key_pair_, |
| 536 token_validator_factory.Pass()); |
| 532 | 537 |
| 533 } else { | 538 } else { |
| 534 // TODO(rmsousa): If the policy is bad the host should not go online. It | 539 // TODO(rmsousa): If the policy is bad the host should not go online. It |
| 535 // should keep running, but not connected, until the policies are fixed. | 540 // should keep running, but not connected, until the policies are fixed. |
| 536 // Having it show up as online and then reject all clients is misleading. | 541 // Having it show up as online and then reject all clients is misleading. |
| 537 LOG(ERROR) << "One of the third-party token URLs is empty or invalid. " | 542 LOG(ERROR) << "One of the third-party token URLs is empty or invalid. " |
| 538 << "Host will reject all clients until policies are corrected. " | 543 << "Host will reject all clients until policies are corrected. " |
| 539 << "TokenUrl: " << token_url_ << ", " | 544 << "TokenUrl: " << token_url_ << ", " |
| 540 << "TokenValidationUrl: " << token_validation_url_; | 545 << "TokenValidationUrl: " << token_validation_url_; |
| 541 factory = protocol::Me2MeHostAuthenticatorFactory::CreateRejecting(); | 546 factory = protocol::Me2MeHostAuthenticatorFactory::CreateRejecting(); |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 720 if (!oauth_refresh_token_.empty()) { | 725 if (!oauth_refresh_token_.empty()) { |
| 721 xmpp_auth_token_ = ""; // This will be set to the access token later. | 726 xmpp_auth_token_ = ""; // This will be set to the access token later. |
| 722 xmpp_auth_service_ = "oauth2"; | 727 xmpp_auth_service_ = "oauth2"; |
| 723 } else if (!config->GetString(kXmppAuthServiceConfigPath, | 728 } else if (!config->GetString(kXmppAuthServiceConfigPath, |
| 724 &xmpp_auth_service_)) { | 729 &xmpp_auth_service_)) { |
| 725 // For the me2me host, we default to ClientLogin token for chromiumsync | 730 // For the me2me host, we default to ClientLogin token for chromiumsync |
| 726 // because earlier versions of the host had no HTTP stack with which to | 731 // because earlier versions of the host had no HTTP stack with which to |
| 727 // request an OAuth2 access token. | 732 // request an OAuth2 access token. |
| 728 xmpp_auth_service_ = kChromotingTokenDefaultServiceName; | 733 xmpp_auth_service_ = kChromotingTokenDefaultServiceName; |
| 729 } | 734 } |
| 735 |
| 736 if (config->GetString(kHostOwnerConfigPath, &host_owner_)) { |
| 737 // Service account configs have a host_owner, different from the xmpp_login. |
| 738 use_service_account_ = true; |
| 739 } else { |
| 740 // User credential configs only have an xmpp_login, which is also the owner. |
| 741 host_owner_ = xmpp_login_; |
| 742 use_service_account_ = false; |
| 743 } |
| 730 return true; | 744 return true; |
| 731 } | 745 } |
| 732 | 746 |
| 733 void HostProcess::OnPolicyUpdate(scoped_ptr<base::DictionaryValue> policies) { | 747 void HostProcess::OnPolicyUpdate(scoped_ptr<base::DictionaryValue> policies) { |
| 734 // TODO(rmsousa): Consolidate all On*PolicyUpdate methods into this one. | 748 // TODO(rmsousa): Consolidate all On*PolicyUpdate methods into this one. |
| 735 // TODO(sergeyu): Currently polices are verified only when they are loaded. | 749 // TODO(sergeyu): Currently polices are verified only when they are loaded. |
| 736 // Separate policy loading from policy verifications - this will allow to | 750 // Separate policy loading from policy verifications - this will allow to |
| 737 // check policies again later, e.g. when host config changes. | 751 // check policies again later, e.g. when host config changes. |
| 738 | 752 |
| 739 if (!context_->network_task_runner()->BelongsToCurrentThread()) { | 753 if (!context_->network_task_runner()->BelongsToCurrentThread()) { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 792 } | 806 } |
| 793 } | 807 } |
| 794 | 808 |
| 795 bool HostProcess::OnHostDomainPolicyUpdate(const std::string& host_domain) { | 809 bool HostProcess::OnHostDomainPolicyUpdate(const std::string& host_domain) { |
| 796 // Returns true if the host has to be restarted after this policy update. | 810 // Returns true if the host has to be restarted after this policy update. |
| 797 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 811 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 798 | 812 |
| 799 LOG(INFO) << "Policy sets host domain: " << host_domain; | 813 LOG(INFO) << "Policy sets host domain: " << host_domain; |
| 800 | 814 |
| 801 if (!host_domain.empty() && | 815 if (!host_domain.empty() && |
| 802 !EndsWith(xmpp_login_, std::string("@") + host_domain, false)) { | 816 !EndsWith(host_owner_, std::string("@") + host_domain, false)) { |
| 803 ShutdownHost(kInvalidHostDomainExitCode); | 817 ShutdownHost(kInvalidHostDomainExitCode); |
| 804 } | 818 } |
| 805 return false; | 819 return false; |
| 806 } | 820 } |
| 807 | 821 |
| 808 bool HostProcess::OnUsernamePolicyUpdate(bool curtain_required, | 822 bool HostProcess::OnUsernamePolicyUpdate(bool curtain_required, |
| 809 bool host_username_match_required) { | 823 bool host_username_match_required) { |
| 810 // Returns false: never restart the host after this policy update. | 824 // Returns false: never restart the host after this policy update. |
| 811 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 825 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 812 | 826 |
| 813 if (host_username_match_required) { | 827 if (host_username_match_required) { |
| 814 LOG(INFO) << "Policy requires host username match."; | 828 LOG(INFO) << "Policy requires host username match."; |
| 815 std::string username = GetUsername(); | 829 std::string username = GetUsername(); |
| 816 bool shutdown = username.empty() || | 830 bool shutdown = username.empty() || |
| 817 !StartsWithASCII(xmpp_login_, username + std::string("@"), | 831 !StartsWithASCII(host_owner_, username + std::string("@"), |
| 818 false); | 832 false); |
| 819 | 833 |
| 820 #if defined(OS_MACOSX) | 834 #if defined(OS_MACOSX) |
| 821 // On Mac, we run as root at the login screen, so the username won't match. | 835 // On Mac, we run as root at the login screen, so the username won't match. |
| 822 // However, there's no need to enforce the policy at the login screen, as | 836 // However, there's no need to enforce the policy at the login screen, as |
| 823 // the client will have to reconnect if a login occurs. | 837 // the client will have to reconnect if a login occurs. |
| 824 if (shutdown && getuid() == 0) { | 838 if (shutdown && getuid() == 0) { |
| 825 shutdown = false; | 839 shutdown = false; |
| 826 } | 840 } |
| 827 #endif | 841 #endif |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 965 | 979 |
| 966 signaling_connector_.reset(new SignalingConnector( | 980 signaling_connector_.reset(new SignalingConnector( |
| 967 signal_strategy_.get(), | 981 signal_strategy_.get(), |
| 968 context_->url_request_context_getter(), | 982 context_->url_request_context_getter(), |
| 969 dns_blackhole_checker.Pass(), | 983 dns_blackhole_checker.Pass(), |
| 970 base::Bind(&HostProcess::OnAuthFailed, this))); | 984 base::Bind(&HostProcess::OnAuthFailed, this))); |
| 971 | 985 |
| 972 if (!oauth_refresh_token_.empty()) { | 986 if (!oauth_refresh_token_.empty()) { |
| 973 scoped_ptr<SignalingConnector::OAuthCredentials> oauth_credentials( | 987 scoped_ptr<SignalingConnector::OAuthCredentials> oauth_credentials( |
| 974 new SignalingConnector::OAuthCredentials( | 988 new SignalingConnector::OAuthCredentials( |
| 975 xmpp_login_, oauth_refresh_token_)); | 989 xmpp_login_, oauth_refresh_token_, use_service_account_)); |
| 976 signaling_connector_->EnableOAuth(oauth_credentials.Pass()); | 990 signaling_connector_->EnableOAuth(oauth_credentials.Pass()); |
| 977 } | 991 } |
| 978 | 992 |
| 979 NetworkSettings network_settings( | 993 NetworkSettings network_settings( |
| 980 allow_nat_traversal_ ? | 994 allow_nat_traversal_ ? |
| 981 NetworkSettings::NAT_TRAVERSAL_ENABLED : | 995 NetworkSettings::NAT_TRAVERSAL_ENABLED : |
| 982 NetworkSettings::NAT_TRAVERSAL_DISABLED); | 996 NetworkSettings::NAT_TRAVERSAL_DISABLED); |
| 983 if (!allow_nat_traversal_) { | 997 if (!allow_nat_traversal_) { |
| 984 network_settings.min_port = NetworkSettings::kDefaultMinPort; | 998 network_settings.min_port = NetworkSettings::kDefaultMinPort; |
| 985 network_settings.max_port = NetworkSettings::kDefaultMaxPort; | 999 network_settings.max_port = NetworkSettings::kDefaultMaxPort; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1019 // Set up repoting the host status notifications. | 1033 // Set up repoting the host status notifications. |
| 1020 #if defined(REMOTING_MULTI_PROCESS) | 1034 #if defined(REMOTING_MULTI_PROCESS) |
| 1021 host_event_logger_.reset( | 1035 host_event_logger_.reset( |
| 1022 new IpcHostEventLogger(host_->AsWeakPtr(), daemon_channel_.get())); | 1036 new IpcHostEventLogger(host_->AsWeakPtr(), daemon_channel_.get())); |
| 1023 #else // !defined(REMOTING_MULTI_PROCESS) | 1037 #else // !defined(REMOTING_MULTI_PROCESS) |
| 1024 host_event_logger_ = | 1038 host_event_logger_ = |
| 1025 HostEventLogger::Create(host_->AsWeakPtr(), kApplicationName); | 1039 HostEventLogger::Create(host_->AsWeakPtr(), kApplicationName); |
| 1026 #endif // !defined(REMOTING_MULTI_PROCESS) | 1040 #endif // !defined(REMOTING_MULTI_PROCESS) |
| 1027 | 1041 |
| 1028 host_->SetEnableCurtaining(curtain_required_); | 1042 host_->SetEnableCurtaining(curtain_required_); |
| 1029 host_->Start(xmpp_login_); | 1043 host_->Start(host_owner_); |
| 1030 | 1044 |
| 1031 CreateAuthenticatorFactory(); | 1045 CreateAuthenticatorFactory(); |
| 1032 } | 1046 } |
| 1033 | 1047 |
| 1034 void HostProcess::OnAuthFailed() { | 1048 void HostProcess::OnAuthFailed() { |
| 1035 ShutdownHost(kInvalidOauthCredentialsExitCode); | 1049 ShutdownHost(kInvalidOauthCredentialsExitCode); |
| 1036 } | 1050 } |
| 1037 | 1051 |
| 1038 void HostProcess::RestartHost() { | 1052 void HostProcess::RestartHost() { |
| 1039 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 1053 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1166 return exit_code; | 1180 return exit_code; |
| 1167 } | 1181 } |
| 1168 | 1182 |
| 1169 } // namespace remoting | 1183 } // namespace remoting |
| 1170 | 1184 |
| 1171 #if !defined(OS_WIN) | 1185 #if !defined(OS_WIN) |
| 1172 int main(int argc, char** argv) { | 1186 int main(int argc, char** argv) { |
| 1173 return remoting::HostMain(argc, argv); | 1187 return remoting::HostMain(argc, argv); |
| 1174 } | 1188 } |
| 1175 #endif // !defined(OS_WIN) | 1189 #endif // !defined(OS_WIN) |
| OLD | NEW |