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 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
216 | 216 |
217 // Called on the network thread to set the host's Authenticator factory. | 217 // Called on the network thread to set the host's Authenticator factory. |
218 void CreateAuthenticatorFactory(); | 218 void CreateAuthenticatorFactory(); |
219 | 219 |
220 // Tear down resources that run on the UI thread. | 220 // Tear down resources that run on the UI thread. |
221 void ShutdownOnUiThread(); | 221 void ShutdownOnUiThread(); |
222 | 222 |
223 // Applies the host config, returning true if successful. | 223 // Applies the host config, returning true if successful. |
224 bool ApplyConfig(scoped_ptr<JsonHostConfig> config); | 224 bool ApplyConfig(scoped_ptr<JsonHostConfig> config); |
225 | 225 |
226 // Handles policy updates, by calling On*PolicyUpdate methods. | |
226 void OnPolicyUpdate(scoped_ptr<base::DictionaryValue> policies); | 227 void OnPolicyUpdate(scoped_ptr<base::DictionaryValue> policies); |
227 bool OnHostDomainPolicyUpdate(const std::string& host_domain); | 228 void ApplyHostDomainPolicy(); |
228 bool OnUsernamePolicyUpdate(bool curtain_required, | 229 void ApplyUsernamePolicy(); |
229 bool username_match_required); | 230 bool OnHostDomainPolicyUpdate(base::DictionaryValue* policies); |
230 bool OnNatPolicyUpdate(bool nat_traversal_enabled); | 231 bool OnUsernamePolicyUpdate(base::DictionaryValue* policies); |
231 bool OnRelayPolicyUpdate(bool allow_relay); | 232 bool OnNatPolicyUpdate(base::DictionaryValue* policies); |
232 bool OnUdpPortPolicyUpdate(const std::string& udp_port_range); | 233 bool OnRelayPolicyUpdate(base::DictionaryValue* policies); |
233 void OnCurtainPolicyUpdate(bool curtain_required); | 234 bool OnUdpPortPolicyUpdate(base::DictionaryValue* policies); |
234 bool OnHostTalkGadgetPrefixPolicyUpdate(const std::string& talkgadget_prefix); | 235 bool OnCurtainPolicyUpdate(base::DictionaryValue* policies); |
235 bool OnHostTokenUrlPolicyUpdate( | 236 bool OnHostTalkGadgetPrefixPolicyUpdate(base::DictionaryValue* policies); |
236 const GURL& token_url, | 237 bool OnHostTokenUrlPolicyUpdate(base::DictionaryValue* policies); |
237 const GURL& token_validation_url, | 238 bool OnPairingPolicyUpdate(base::DictionaryValue* policies); |
238 const std::string& token_validation_cert_issuer); | 239 bool OnGnubbyAuthPolicyUpdate(base::DictionaryValue* policies); |
239 bool OnPairingPolicyUpdate(bool pairing_enabled); | |
240 bool OnGnubbyAuthPolicyUpdate(bool enable_gnubby_auth); | |
241 | 240 |
242 void StartHost(); | 241 void StartHost(); |
243 | 242 |
244 void OnAuthFailed(); | 243 void OnAuthFailed(); |
245 | 244 |
246 void RestartHost(); | 245 void RestartHost(); |
247 | 246 |
248 // Stops the host and shuts down the process with the specified |exit_code|. | 247 // Stops the host and shuts down the process with the specified |exit_code|. |
249 void ShutdownHost(HostExitCodes exit_code); | 248 void ShutdownHost(HostExitCodes exit_code); |
250 | 249 |
(...skipping 30 matching lines...) Expand all Loading... | |
281 | 280 |
282 scoped_ptr<ConfigWatcher> config_watcher_; | 281 scoped_ptr<ConfigWatcher> config_watcher_; |
283 | 282 |
284 std::string host_id_; | 283 std::string host_id_; |
285 protocol::SharedSecretHash host_secret_hash_; | 284 protocol::SharedSecretHash host_secret_hash_; |
286 scoped_refptr<RsaKeyPair> key_pair_; | 285 scoped_refptr<RsaKeyPair> key_pair_; |
287 std::string oauth_refresh_token_; | 286 std::string oauth_refresh_token_; |
288 std::string serialized_config_; | 287 std::string serialized_config_; |
289 std::string host_owner_; | 288 std::string host_owner_; |
290 bool use_service_account_; | 289 bool use_service_account_; |
290 | |
rmsousa
2014/06/06 23:23:14
empty line separates config variables from policy
| |
291 scoped_ptr<policy_hack::PolicyWatcher> policy_watcher_; | 291 scoped_ptr<policy_hack::PolicyWatcher> policy_watcher_; |
292 std::string host_domain_; | |
293 bool host_username_match_required_; | |
292 bool allow_nat_traversal_; | 294 bool allow_nat_traversal_; |
293 bool allow_relay_; | 295 bool allow_relay_; |
294 int min_udp_port_; | 296 int min_udp_port_; |
295 int max_udp_port_; | 297 int max_udp_port_; |
296 std::string talkgadget_prefix_; | 298 std::string talkgadget_prefix_; |
297 bool allow_pairing_; | 299 bool allow_pairing_; |
298 | 300 |
299 bool curtain_required_; | 301 bool curtain_required_; |
300 ThirdPartyAuthConfig third_party_auth_config_; | 302 ThirdPartyAuthConfig third_party_auth_config_; |
301 bool enable_gnubby_auth_; | 303 bool enable_gnubby_auth_; |
(...skipping 20 matching lines...) Expand all Loading... | |
322 bool signal_parent_; | 324 bool signal_parent_; |
323 | 325 |
324 scoped_ptr<PairingRegistry::Delegate> pairing_registry_delegate_; | 326 scoped_ptr<PairingRegistry::Delegate> pairing_registry_delegate_; |
325 }; | 327 }; |
326 | 328 |
327 HostProcess::HostProcess(scoped_ptr<ChromotingHostContext> context, | 329 HostProcess::HostProcess(scoped_ptr<ChromotingHostContext> context, |
328 int* exit_code_out) | 330 int* exit_code_out) |
329 : context_(context.Pass()), | 331 : context_(context.Pass()), |
330 state_(HOST_INITIALIZING), | 332 state_(HOST_INITIALIZING), |
331 use_service_account_(false), | 333 use_service_account_(false), |
334 host_username_match_required_(false), | |
332 allow_nat_traversal_(true), | 335 allow_nat_traversal_(true), |
333 allow_relay_(true), | 336 allow_relay_(true), |
334 min_udp_port_(0), | 337 min_udp_port_(0), |
335 max_udp_port_(0), | 338 max_udp_port_(0), |
336 allow_pairing_(true), | 339 allow_pairing_(true), |
337 curtain_required_(false), | 340 curtain_required_(false), |
338 enable_gnubby_auth_(false), | 341 enable_gnubby_auth_(false), |
339 #if defined(REMOTING_MULTI_PROCESS) | 342 #if defined(REMOTING_MULTI_PROCESS) |
340 desktop_session_connector_(NULL), | 343 desktop_session_connector_(NULL), |
341 #endif // defined(REMOTING_MULTI_PROCESS) | 344 #endif // defined(REMOTING_MULTI_PROCESS) |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
475 | 478 |
476 if (state_ == HOST_INITIALIZING) { | 479 if (state_ == HOST_INITIALIZING) { |
477 // TODO(sergeyu): Currently OnPolicyUpdate() assumes that host config is | 480 // TODO(sergeyu): Currently OnPolicyUpdate() assumes that host config is |
478 // already loaded so PolicyWatcher has to be started here. Separate policy | 481 // already loaded so PolicyWatcher has to be started here. Separate policy |
479 // loading from policy verifications and move |policy_watcher_| | 482 // loading from policy verifications and move |policy_watcher_| |
480 // initialization to StartOnNetworkThread(). | 483 // initialization to StartOnNetworkThread(). |
481 policy_watcher_.reset( | 484 policy_watcher_.reset( |
482 policy_hack::PolicyWatcher::Create(context_->file_task_runner())); | 485 policy_hack::PolicyWatcher::Create(context_->file_task_runner())); |
483 policy_watcher_->StartWatching( | 486 policy_watcher_->StartWatching( |
484 base::Bind(&HostProcess::OnPolicyUpdate, base::Unretained(this))); | 487 base::Bind(&HostProcess::OnPolicyUpdate, base::Unretained(this))); |
485 } else if (state_ == HOST_STARTED) { | 488 } else { |
486 // TODO(sergeyu): Here we assume that PIN is the only part of the config | 489 // Reapply policies that could be affected by a new config. |
487 // that may change while the service is running. Change ApplyConfig() to | 490 ApplyHostDomainPolicy(); |
488 // detect other changes in the config and restart host if necessary here. | 491 ApplyUsernamePolicy(); |
489 CreateAuthenticatorFactory(); | 492 |
493 if (state_ == HOST_STARTED) { | |
494 // TODO(sergeyu): Here we assume that PIN is the only part of the config | |
495 // that may change while the service is running. Change ApplyConfig() to | |
496 // detect other changes in the config and restart host if necessary here. | |
497 CreateAuthenticatorFactory(); | |
498 } | |
490 } | 499 } |
491 } | 500 } |
492 | 501 |
493 void HostProcess::OnConfigWatcherError() { | 502 void HostProcess::OnConfigWatcherError() { |
494 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 503 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
495 ShutdownHost(kInvalidHostConfigurationExitCode); | 504 ShutdownHost(kInvalidHostConfigurationExitCode); |
496 } | 505 } |
497 | 506 |
498 void HostProcess::StartOnNetworkThread() { | 507 void HostProcess::StartOnNetworkThread() { |
499 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 508 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
804 use_service_account_ = true; | 813 use_service_account_ = true; |
805 } else { | 814 } else { |
806 // User credential configs only have an xmpp_login, which is also the owner. | 815 // User credential configs only have an xmpp_login, which is also the owner. |
807 host_owner_ = xmpp_server_config_.username; | 816 host_owner_ = xmpp_server_config_.username; |
808 use_service_account_ = false; | 817 use_service_account_ = false; |
809 } | 818 } |
810 return true; | 819 return true; |
811 } | 820 } |
812 | 821 |
813 void HostProcess::OnPolicyUpdate(scoped_ptr<base::DictionaryValue> policies) { | 822 void HostProcess::OnPolicyUpdate(scoped_ptr<base::DictionaryValue> policies) { |
814 // TODO(rmsousa): Consolidate all On*PolicyUpdate methods into this one. | |
815 // TODO(sergeyu): Currently polices are verified only when they are loaded. | |
816 // Separate policy loading from policy verifications - this will allow to | |
817 // check policies again later, e.g. when host config changes. | |
818 | |
819 if (!context_->network_task_runner()->BelongsToCurrentThread()) { | 823 if (!context_->network_task_runner()->BelongsToCurrentThread()) { |
820 context_->network_task_runner()->PostTask(FROM_HERE, base::Bind( | 824 context_->network_task_runner()->PostTask(FROM_HERE, base::Bind( |
821 &HostProcess::OnPolicyUpdate, this, base::Passed(&policies))); | 825 &HostProcess::OnPolicyUpdate, this, base::Passed(&policies))); |
822 return; | 826 return; |
823 } | 827 } |
824 | 828 |
825 bool restart_required = false; | 829 bool restart_required = false; |
826 bool bool_value; | 830 restart_required |= OnHostDomainPolicyUpdate(policies.get()); |
827 std::string string_value; | 831 restart_required |= OnCurtainPolicyUpdate(policies.get()); |
828 if (policies->GetString(policy_hack::PolicyWatcher::kHostDomainPolicyName, | 832 // Note: UsernamePolicyUpdate must run after OnCurtainPolicyUpdate. |
829 &string_value)) { | 833 restart_required |= OnUsernamePolicyUpdate(policies.get()); |
830 restart_required |= OnHostDomainPolicyUpdate(string_value); | 834 restart_required |= OnNatPolicyUpdate(policies.get()); |
831 } | 835 restart_required |= OnRelayPolicyUpdate(policies.get()); |
832 bool curtain_required = false; | 836 restart_required |= OnUdpPortPolicyUpdate(policies.get()); |
833 if (policies->GetBoolean( | 837 restart_required |= OnHostTalkGadgetPrefixPolicyUpdate(policies.get()); |
834 policy_hack::PolicyWatcher::kHostRequireCurtainPolicyName, | 838 restart_required |= OnHostTokenUrlPolicyUpdate(policies.get()); |
835 &curtain_required)) { | 839 restart_required |= OnPairingPolicyUpdate(policies.get()); |
836 OnCurtainPolicyUpdate(curtain_required); | 840 restart_required |= OnGnubbyAuthPolicyUpdate(policies.get()); |
837 } | |
838 if (policies->GetBoolean( | |
839 policy_hack::PolicyWatcher::kHostMatchUsernamePolicyName, | |
840 &bool_value)) { | |
841 restart_required |= OnUsernamePolicyUpdate(curtain_required, bool_value); | |
842 } | |
843 if (policies->GetBoolean(policy_hack::PolicyWatcher::kNatPolicyName, | |
844 &bool_value)) { | |
845 restart_required |= OnNatPolicyUpdate(bool_value); | |
846 } | |
847 if (policies->GetBoolean(policy_hack::PolicyWatcher::kRelayPolicyName, | |
848 &bool_value)) { | |
849 restart_required |= OnRelayPolicyUpdate(bool_value); | |
850 } | |
851 std::string udp_port_range; | |
852 if (policies->GetString(policy_hack::PolicyWatcher::kUdpPortRangePolicyName, | |
853 &udp_port_range)) { | |
854 restart_required |= OnUdpPortPolicyUpdate(udp_port_range); | |
855 } | |
856 | |
857 if (policies->GetString( | |
858 policy_hack::PolicyWatcher::kHostTalkGadgetPrefixPolicyName, | |
859 &string_value)) { | |
860 restart_required |= OnHostTalkGadgetPrefixPolicyUpdate(string_value); | |
861 } | |
862 std::string token_url_string, token_validation_url_string; | |
863 std::string token_validation_cert_issuer; | |
864 if (policies->GetString( | |
865 policy_hack::PolicyWatcher::kHostTokenUrlPolicyName, | |
866 &token_url_string) && | |
867 policies->GetString( | |
868 policy_hack::PolicyWatcher::kHostTokenValidationUrlPolicyName, | |
869 &token_validation_url_string) && | |
870 policies->GetString( | |
871 policy_hack::PolicyWatcher::kHostTokenValidationCertIssuerPolicyName, | |
872 &token_validation_cert_issuer)) { | |
873 restart_required |= OnHostTokenUrlPolicyUpdate( | |
874 GURL(token_url_string), GURL(token_validation_url_string), | |
875 token_validation_cert_issuer); | |
876 } | |
877 if (policies->GetBoolean( | |
878 policy_hack::PolicyWatcher::kHostAllowClientPairing, | |
879 &bool_value)) { | |
880 restart_required |= OnPairingPolicyUpdate(bool_value); | |
881 } | |
882 if (policies->GetBoolean( | |
883 policy_hack::PolicyWatcher::kHostAllowGnubbyAuthPolicyName, | |
884 &bool_value)) | |
885 restart_required |= OnGnubbyAuthPolicyUpdate(bool_value); | |
886 | 841 |
887 if (state_ == HOST_INITIALIZING) { | 842 if (state_ == HOST_INITIALIZING) { |
888 StartHost(); | 843 StartHost(); |
889 } else if (state_ == HOST_STARTED && restart_required) { | 844 } else if (state_ == HOST_STARTED && restart_required) { |
890 RestartHost(); | 845 RestartHost(); |
891 } | 846 } |
892 } | 847 } |
893 | 848 |
894 bool HostProcess::OnHostDomainPolicyUpdate(const std::string& host_domain) { | 849 void HostProcess::ApplyHostDomainPolicy() { |
850 HOST_LOG << "Policy sets host domain: " << host_domain_; | |
851 if (!host_domain_.empty() && | |
852 !EndsWith(host_owner_, std::string("@") + host_domain_, false)) { | |
853 LOG(ERROR) << "The host domain does not match the policy."; | |
854 ShutdownHost(kInvalidHostDomainExitCode); | |
855 } | |
856 } | |
857 | |
858 bool HostProcess::OnHostDomainPolicyUpdate(base::DictionaryValue* policies) { | |
895 // Returns true if the host has to be restarted after this policy update. | 859 // Returns true if the host has to be restarted after this policy update. |
896 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 860 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
897 | 861 |
898 HOST_LOG << "Policy sets host domain: " << host_domain; | 862 if (!policies->GetString(policy_hack::PolicyWatcher::kHostDomainPolicyName, |
863 &host_domain_)) { | |
864 return false; | |
865 } | |
899 | 866 |
900 if (!host_domain.empty() && | 867 ApplyHostDomainPolicy(); |
901 !EndsWith(host_owner_, std::string("@") + host_domain, false)) { | |
902 ShutdownHost(kInvalidHostDomainExitCode); | |
903 } | |
904 return false; | 868 return false; |
905 } | 869 } |
906 | 870 |
907 bool HostProcess::OnUsernamePolicyUpdate(bool curtain_required, | 871 void HostProcess::ApplyUsernamePolicy() { |
908 bool host_username_match_required) { | 872 if (host_username_match_required_) { |
909 // Returns false: never restart the host after this policy update. | |
910 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | |
911 | |
912 if (host_username_match_required) { | |
913 HOST_LOG << "Policy requires host username match."; | 873 HOST_LOG << "Policy requires host username match."; |
914 std::string username = GetUsername(); | 874 std::string username = GetUsername(); |
915 bool shutdown = username.empty() || | 875 bool shutdown = username.empty() || |
916 !StartsWithASCII(host_owner_, username + std::string("@"), | 876 !StartsWithASCII(host_owner_, username + std::string("@"), |
917 false); | 877 false); |
918 | 878 |
919 #if defined(OS_MACOSX) | 879 #if defined(OS_MACOSX) |
920 // On Mac, we run as root at the login screen, so the username won't match. | 880 // On Mac, we run as root at the login screen, so the username won't match. |
921 // However, there's no need to enforce the policy at the login screen, as | 881 // However, there's no need to enforce the policy at the login screen, as |
922 // the client will have to reconnect if a login occurs. | 882 // the client will have to reconnect if a login occurs. |
923 if (shutdown && getuid() == 0) { | 883 if (shutdown && getuid() == 0) { |
924 shutdown = false; | 884 shutdown = false; |
925 } | 885 } |
926 #endif | 886 #endif |
927 | 887 |
928 // Curtain-mode on Windows presents the standard OS login prompt to the user | 888 // Curtain-mode on Windows presents the standard OS login prompt to the user |
929 // for each connection, removing the need for an explicit user-name matching | 889 // for each connection, removing the need for an explicit user-name matching |
930 // check. | 890 // check. |
931 #if defined(OS_WIN) && defined(REMOTING_RDP_SESSION) | 891 #if defined(OS_WIN) && defined(REMOTING_RDP_SESSION) |
932 if (curtain_required) | 892 if (curtain_required_) |
933 return false; | 893 return false; |
934 #endif // defined(OS_WIN) && defined(REMOTING_RDP_SESSION) | 894 #endif // defined(OS_WIN) && defined(REMOTING_RDP_SESSION) |
935 | 895 |
936 // Shutdown the host if the username does not match. | 896 // Shutdown the host if the username does not match. |
937 if (shutdown) { | 897 if (shutdown) { |
938 LOG(ERROR) << "The host username does not match."; | 898 LOG(ERROR) << "The host username does not match."; |
939 ShutdownHost(kUsernameMismatchExitCode); | 899 ShutdownHost(kUsernameMismatchExitCode); |
940 } | 900 } |
941 } else { | 901 } else { |
942 HOST_LOG << "Policy does not require host username match."; | 902 HOST_LOG << "Policy does not require host username match."; |
943 } | 903 } |
904 } | |
944 | 905 |
906 bool HostProcess::OnUsernamePolicyUpdate(base::DictionaryValue* policies) { | |
907 // Returns false: never restart the host after this policy update. | |
908 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | |
909 | |
910 if (!policies->GetBoolean( | |
911 policy_hack::PolicyWatcher::kHostMatchUsernamePolicyName, | |
912 &host_username_match_required_)) { | |
913 return false; | |
914 } | |
915 | |
916 ApplyUsernamePolicy(); | |
945 return false; | 917 return false; |
946 } | 918 } |
947 | 919 |
948 bool HostProcess::OnNatPolicyUpdate(bool nat_traversal_enabled) { | 920 bool HostProcess::OnNatPolicyUpdate(base::DictionaryValue* policies) { |
949 // Returns true if the host has to be restarted after this policy update. | 921 // Returns true if the host has to be restarted after this policy update. |
950 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 922 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
951 | 923 |
952 if (allow_nat_traversal_ != nat_traversal_enabled) { | 924 if (!policies->GetBoolean(policy_hack::PolicyWatcher::kNatPolicyName, |
953 if (nat_traversal_enabled) | 925 &allow_nat_traversal_)) { |
954 HOST_LOG << "Policy enables NAT traversal."; | 926 return false; |
955 else | |
956 HOST_LOG << "Policy disables NAT traversal."; | |
957 allow_nat_traversal_ = nat_traversal_enabled; | |
958 return true; | |
959 } | 927 } |
960 return false; | 928 |
929 if (allow_nat_traversal_) | |
930 HOST_LOG << "Policy enables NAT traversal."; | |
Sergey Ulanov
2014/06/07 00:51:44
add {} please
rmsousa
2014/06/07 01:09:03
Done.
| |
931 else | |
932 HOST_LOG << "Policy disables NAT traversal."; | |
933 return true; | |
961 } | 934 } |
962 | 935 |
963 bool HostProcess::OnRelayPolicyUpdate(bool allow_relay) { | 936 bool HostProcess::OnRelayPolicyUpdate(base::DictionaryValue* policies) { |
964 // Returns true if the host has to be restarted after this policy update. | 937 // Returns true if the host has to be restarted after this policy update. |
965 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 938 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
966 | 939 |
967 if (allow_relay_ != allow_relay) { | 940 if (!policies->GetBoolean(policy_hack::PolicyWatcher::kRelayPolicyName, |
968 if (allow_relay) | 941 &allow_relay_)) { |
969 HOST_LOG << "Policy enables use of relay server."; | 942 return false; |
970 else | |
971 HOST_LOG << "Policy disables use of relay server."; | |
972 allow_relay_ = allow_relay; | |
973 return true; | |
974 } | 943 } |
975 return false; | 944 |
945 if (allow_relay_) | |
946 HOST_LOG << "Policy enables use of relay server."; | |
947 else | |
948 HOST_LOG << "Policy disables use of relay server."; | |
949 return true; | |
976 } | 950 } |
977 | 951 |
978 bool HostProcess::OnUdpPortPolicyUpdate(const std::string& udp_port_range) { | 952 bool HostProcess::OnUdpPortPolicyUpdate(base::DictionaryValue* policies) { |
979 // Returns true if the host has to be restarted after this policy update. | 953 // Returns true if the host has to be restarted after this policy update. |
980 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 954 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
981 | 955 |
956 std::string udp_port_range; | |
957 if (!policies->GetString(policy_hack::PolicyWatcher::kUdpPortRangePolicyName, | |
958 &udp_port_range)) { | |
959 return false; | |
960 } | |
961 | |
982 // Use default values if policy setting is empty or invalid. | 962 // Use default values if policy setting is empty or invalid. |
983 int min_udp_port = 0; | 963 int min_udp_port = 0; |
984 int max_udp_port = 0; | 964 int max_udp_port = 0; |
985 if (!udp_port_range.empty() && | 965 if (!udp_port_range.empty() && |
986 !NetworkSettings::ParsePortRange(udp_port_range, &min_udp_port, | 966 !NetworkSettings::ParsePortRange(udp_port_range, &min_udp_port, |
987 &max_udp_port)) { | 967 &max_udp_port)) { |
988 LOG(WARNING) << "Invalid port range policy: \"" << udp_port_range | 968 LOG(WARNING) << "Invalid port range policy: \"" << udp_port_range |
989 << "\". Using default values."; | 969 << "\". Using default values."; |
990 } | 970 } |
991 | 971 |
992 if (min_udp_port_ != min_udp_port || max_udp_port_ != max_udp_port) { | 972 if (min_udp_port_ != min_udp_port || max_udp_port_ != max_udp_port) { |
993 if (min_udp_port != 0 && max_udp_port != 0) { | 973 if (min_udp_port != 0 && max_udp_port != 0) { |
994 HOST_LOG << "Policy restricts UDP port range to [" << min_udp_port | 974 HOST_LOG << "Policy restricts UDP port range to [" << min_udp_port |
995 << ", " << max_udp_port << "]"; | 975 << ", " << max_udp_port << "]"; |
996 } else { | 976 } else { |
997 HOST_LOG << "Policy does not restrict UDP port range."; | 977 HOST_LOG << "Policy does not restrict UDP port range."; |
998 } | 978 } |
999 min_udp_port_ = min_udp_port; | 979 min_udp_port_ = min_udp_port; |
1000 max_udp_port_ = max_udp_port; | 980 max_udp_port_ = max_udp_port; |
1001 return true; | 981 return true; |
1002 } | 982 } |
1003 return false; | 983 return false; |
1004 } | 984 } |
1005 | 985 |
1006 void HostProcess::OnCurtainPolicyUpdate(bool curtain_required) { | 986 bool HostProcess::OnCurtainPolicyUpdate(base::DictionaryValue* policies) { |
1007 // Returns true if the host has to be restarted after this policy update. | 987 // Returns true if the host has to be restarted after this policy update. |
1008 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 988 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
1009 | 989 |
990 if (!policies->GetBoolean( | |
991 policy_hack::PolicyWatcher::kHostRequireCurtainPolicyName, | |
992 &curtain_required_)) { | |
993 return false; | |
994 } | |
995 | |
1010 #if defined(OS_MACOSX) | 996 #if defined(OS_MACOSX) |
1011 if (curtain_required) { | 997 if (curtain_required_) { |
1012 // When curtain mode is in effect on Mac, the host process runs in the | 998 // When curtain mode is in effect on Mac, the host process runs in the |
1013 // user's switched-out session, but launchd will also run an instance at | 999 // user's switched-out session, but launchd will also run an instance at |
1014 // the console login screen. Even if no user is currently logged-on, we | 1000 // the console login screen. Even if no user is currently logged-on, we |
1015 // can't support remote-access to the login screen because the current host | 1001 // can't support remote-access to the login screen because the current host |
1016 // process model disconnects the client during login, which would leave | 1002 // process model disconnects the client during login, which would leave |
1017 // the logged in session un-curtained on the console until they reconnect. | 1003 // the logged in session un-curtained on the console until they reconnect. |
1018 // | 1004 // |
1019 // TODO(jamiewalch): Fix this once we have implemented the multi-process | 1005 // TODO(jamiewalch): Fix this once we have implemented the multi-process |
1020 // daemon architecture (crbug.com/134894) | 1006 // daemon architecture (crbug.com/134894) |
1021 if (getuid() == 0) { | 1007 if (getuid() == 0) { |
1022 LOG(ERROR) << "Running the host in the console login session is yet not " | 1008 LOG(ERROR) << "Running the host in the console login session is yet not " |
1023 "supported."; | 1009 "supported."; |
1024 ShutdownHost(kLoginScreenNotSupportedExitCode); | 1010 ShutdownHost(kLoginScreenNotSupportedExitCode); |
1025 return; | 1011 return false; |
1026 } | 1012 } |
1027 } | 1013 } |
1028 #endif | 1014 #endif |
1029 | 1015 |
1030 if (curtain_required_ != curtain_required) { | 1016 if (curtain_required_) |
1031 if (curtain_required) | 1017 HOST_LOG << "Policy requires curtain-mode."; |
1032 HOST_LOG << "Policy requires curtain-mode."; | 1018 else |
1033 else | 1019 HOST_LOG << "Policy does not require curtain-mode."; |
1034 HOST_LOG << "Policy does not require curtain-mode."; | 1020 |
1035 curtain_required_ = curtain_required; | 1021 if (host_) |
1036 if (host_) | 1022 host_->SetEnableCurtaining(curtain_required_); |
1037 host_->SetEnableCurtaining(curtain_required_); | 1023 return false; |
1038 } | |
1039 } | 1024 } |
1040 | 1025 |
1041 bool HostProcess::OnHostTalkGadgetPrefixPolicyUpdate( | 1026 bool HostProcess::OnHostTalkGadgetPrefixPolicyUpdate( |
1042 const std::string& talkgadget_prefix) { | 1027 base::DictionaryValue* policies) { |
1043 // Returns true if the host has to be restarted after this policy update. | 1028 // Returns true if the host has to be restarted after this policy update. |
1044 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 1029 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
1045 | 1030 |
1046 if (talkgadget_prefix != talkgadget_prefix_) { | 1031 if (!policies->GetString( |
1047 HOST_LOG << "Policy sets talkgadget prefix: " << talkgadget_prefix; | 1032 policy_hack::PolicyWatcher::kHostTalkGadgetPrefixPolicyName, |
1048 talkgadget_prefix_ = talkgadget_prefix; | 1033 &talkgadget_prefix_)) { |
1049 return true; | 1034 return false; |
1050 } | 1035 } |
1051 return false; | 1036 |
1037 HOST_LOG << "Policy sets talkgadget prefix: " << talkgadget_prefix_; | |
1038 return true; | |
1052 } | 1039 } |
1053 | 1040 |
1054 bool HostProcess::OnHostTokenUrlPolicyUpdate( | 1041 bool HostProcess::OnHostTokenUrlPolicyUpdate(base::DictionaryValue* policies) { |
1055 const GURL& token_url, | |
1056 const GURL& token_validation_url, | |
1057 const std::string& token_validation_cert_issuer) { | |
1058 // Returns true if the host has to be restarted after this policy update. | 1042 // Returns true if the host has to be restarted after this policy update. |
1059 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 1043 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
1060 | 1044 |
1061 if (third_party_auth_config_.token_url != token_url || | 1045 bool token_policy_changed = false; |
1062 third_party_auth_config_.token_validation_url != token_validation_url || | 1046 std::string token_url_string; |
1063 third_party_auth_config_.token_validation_cert_issuer != | 1047 if (policies->GetString( |
1064 token_validation_cert_issuer) { | 1048 policy_hack::PolicyWatcher::kHostTokenUrlPolicyName, |
1065 HOST_LOG << "Policy sets third-party token URLs: " | 1049 &token_url_string)) { |
1066 << "TokenUrl: " << token_url << ", " | 1050 token_policy_changed = true; |
1067 << "TokenValidationUrl: " << token_validation_url | 1051 third_party_auth_config_.token_url = GURL(token_url_string); |
1068 << "TokenValidationCertificateIssuer: " | 1052 } |
1069 << token_validation_cert_issuer; | 1053 std::string token_validation_url_string; |
1070 third_party_auth_config_.token_url = token_url; | 1054 if (policies->GetString( |
1071 third_party_auth_config_.token_validation_url = token_validation_url; | 1055 policy_hack::PolicyWatcher::kHostTokenValidationUrlPolicyName, |
1072 third_party_auth_config_.token_validation_cert_issuer = | 1056 &token_validation_url_string)) { |
1073 token_validation_cert_issuer; | 1057 token_policy_changed = true; |
1074 return true; | 1058 third_party_auth_config_.token_validation_url = |
1059 GURL(token_validation_url_string); | |
1060 } | |
1061 if (policies->GetString( | |
1062 policy_hack::PolicyWatcher::kHostTokenValidationCertIssuerPolicyName, | |
1063 &third_party_auth_config_.token_validation_cert_issuer)) { | |
1064 token_policy_changed = true; | |
1075 } | 1065 } |
1076 | 1066 |
1077 return false; | 1067 if (token_policy_changed) { |
1068 HOST_LOG << "Policy sets third-party token URLs: " | |
1069 << "TokenUrl: " | |
1070 << third_party_auth_config_.token_url << ", " | |
1071 << "TokenValidationUrl: " | |
1072 << third_party_auth_config_.token_validation_url << ", " | |
1073 << "TokenValidationCertificateIssuer: " | |
1074 << third_party_auth_config_.token_validation_cert_issuer; | |
1075 } | |
1076 return token_policy_changed; | |
1078 } | 1077 } |
1079 | 1078 |
1080 bool HostProcess::OnPairingPolicyUpdate(bool allow_pairing) { | 1079 bool HostProcess::OnPairingPolicyUpdate(base::DictionaryValue* policies) { |
1081 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 1080 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
1082 | 1081 |
1083 if (allow_pairing_ == allow_pairing) | 1082 if (!policies->GetBoolean( |
1083 policy_hack::PolicyWatcher::kHostAllowClientPairing, | |
1084 &allow_pairing_)) { | |
1084 return false; | 1085 return false; |
1086 } | |
1085 | 1087 |
1086 if (allow_pairing) | 1088 if (allow_pairing_) |
1087 HOST_LOG << "Policy enables client pairing."; | 1089 HOST_LOG << "Policy enables client pairing."; |
Sergey Ulanov
2014/06/07 00:51:45
add {} please
rmsousa
2014/06/07 01:09:03
Done.
| |
1088 else | 1090 else |
1089 HOST_LOG << "Policy disables client pairing."; | 1091 HOST_LOG << "Policy disables client pairing."; |
1090 allow_pairing_ = allow_pairing; | |
1091 return true; | 1092 return true; |
1092 } | 1093 } |
1093 | 1094 |
1094 bool HostProcess::OnGnubbyAuthPolicyUpdate(bool enable_gnubby_auth) { | 1095 bool HostProcess::OnGnubbyAuthPolicyUpdate(base::DictionaryValue* policies) { |
1095 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 1096 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
1096 | 1097 |
1097 if (enable_gnubby_auth_ == enable_gnubby_auth) | 1098 if (!policies->GetBoolean( |
1099 policy_hack::PolicyWatcher::kHostAllowGnubbyAuthPolicyName, | |
1100 &enable_gnubby_auth_)) { | |
1098 return false; | 1101 return false; |
1102 } | |
1099 | 1103 |
1100 if (enable_gnubby_auth) { | 1104 if (enable_gnubby_auth_) { |
1101 HOST_LOG << "Policy enables gnubby auth."; | 1105 HOST_LOG << "Policy enables gnubby auth."; |
1102 } else { | 1106 } else { |
1103 HOST_LOG << "Policy disables gnubby auth."; | 1107 HOST_LOG << "Policy disables gnubby auth."; |
1104 } | 1108 } |
1105 enable_gnubby_auth_ = enable_gnubby_auth; | |
1106 | 1109 |
1107 if (desktop_environment_factory_) | 1110 if (desktop_environment_factory_) |
1108 desktop_environment_factory_->SetEnableGnubbyAuth(enable_gnubby_auth); | 1111 desktop_environment_factory_->SetEnableGnubbyAuth(enable_gnubby_auth_); |
1109 | 1112 |
1110 return true; | 1113 return true; |
1111 } | 1114 } |
1112 | 1115 |
1113 void HostProcess::StartHost() { | 1116 void HostProcess::StartHost() { |
1114 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 1117 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
1115 DCHECK(!host_); | 1118 DCHECK(!host_); |
1116 DCHECK(!signal_strategy_.get()); | 1119 DCHECK(!signal_strategy_.get()); |
1117 DCHECK(state_ == HOST_INITIALIZING || state_ == HOST_STOPPING_TO_RESTART || | 1120 DCHECK(state_ == HOST_INITIALIZING || state_ == HOST_STOPPING_TO_RESTART || |
1118 state_ == HOST_STOPPED) << state_; | 1121 state_ == HOST_STOPPED) << state_; |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1353 return exit_code; | 1356 return exit_code; |
1354 } | 1357 } |
1355 | 1358 |
1356 } // namespace remoting | 1359 } // namespace remoting |
1357 | 1360 |
1358 #if !defined(OS_WIN) | 1361 #if !defined(OS_WIN) |
1359 int main(int argc, char** argv) { | 1362 int main(int argc, char** argv) { |
1360 return remoting::HostMain(argc, argv); | 1363 return remoting::HostMain(argc, argv); |
1361 } | 1364 } |
1362 #endif // !defined(OS_WIN) | 1365 #endif // !defined(OS_WIN) |
OLD | NEW |