Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Side by Side Diff: remoting/host/remoting_me2me_host.cc

Issue 1061903002: Disable chromoting service on permanent errors. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 const char kWindowIdSwitchName[] = "window-id"; 142 const char kWindowIdSwitchName[] = "window-id";
143 143
144 // Maximum time to wait for clean shutdown to occur, before forcing termination 144 // Maximum time to wait for clean shutdown to occur, before forcing termination
145 // of the process. 145 // of the process.
146 const int kShutdownTimeoutSeconds = 15; 146 const int kShutdownTimeoutSeconds = 15;
147 147
148 // Maximum time to wait for reporting host-offline-reason to the service, 148 // Maximum time to wait for reporting host-offline-reason to the service,
149 // before continuing normal process shutdown. 149 // before continuing normal process shutdown.
150 const int kHostOfflineReasonTimeoutSeconds = 10; 150 const int kHostOfflineReasonTimeoutSeconds = 10;
151 151
152 // Host offline reasons not associated with shutting down the host process
153 // and therefore not expressible through HostExitCodes enum.
154 const char kHostOfflineReasonPolicyReadError[] = "POLICY_READ_ERROR";
155 const char kHostOfflineReasonPolicyChangeRequiresRestart[] =
156 "POLICY_CHANGE_REQUIRES_RESTART";
157
158 } // namespace 152 } // namespace
159 153
160 namespace remoting { 154 namespace remoting {
161 155
162 class HostProcess : public ConfigWatcher::Delegate, 156 class HostProcess : public ConfigWatcher::Delegate,
163 public HostSignalingManager::Listener, 157 public HostSignalingManager::Listener,
164 public HostChangeNotificationListener::Listener, 158 public HostChangeNotificationListener::Listener,
165 public IPC::Listener, 159 public IPC::Listener,
166 public base::RefCountedThreadSafe<HostProcess> { 160 public base::RefCountedThreadSafe<HostProcess> {
167 public: 161 public:
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 scoped_ptr<HostSignalingManager> CreateHostSignalingManager(); 270 scoped_ptr<HostSignalingManager> CreateHostSignalingManager();
277 271
278 void StartHostIfReady(); 272 void StartHostIfReady();
279 void StartHost(); 273 void StartHost();
280 274
281 // Overrides for HostSignalingManager::Listener interface. 275 // Overrides for HostSignalingManager::Listener interface.
282 void OnHeartbeatSuccessful() override; 276 void OnHeartbeatSuccessful() override;
283 void OnUnknownHostIdError() override; 277 void OnUnknownHostIdError() override;
284 void OnAuthFailed() override; 278 void OnAuthFailed() override;
285 279
286 void RestartHost(const std::string& host_offline_reason); 280 void RestartHost(HostExitCodes exit_code);
287 void ShutdownHost(HostExitCodes exit_code); 281 void ShutdownHost(HostExitCodes exit_code);
288 282
289 // Helper methods doing the work needed by RestartHost and ShutdownHost. 283 // Helper methods doing the work needed by RestartHost and ShutdownHost.
290 void GoOffline(const std::string& host_offline_reason); 284 void GoOffline(HostExitCodes exit_code);
291 void OnHostOfflineReasonAck(bool success); 285 void OnHostOfflineReasonAck(bool success);
292 286
293 #if defined(OS_WIN) 287 #if defined(OS_WIN)
294 // Initializes the pairing registry on Windows. This should be invoked on the 288 // Initializes the pairing registry on Windows. This should be invoked on the
295 // network thread. 289 // network thread.
296 void InitializePairingRegistry( 290 void InitializePairingRegistry(
297 IPC::PlatformFileForTransit privileged_key, 291 IPC::PlatformFileForTransit privileged_key,
298 IPC::PlatformFileForTransit unprivileged_key); 292 IPC::PlatformFileForTransit unprivileged_key);
299 #endif // defined(OS_WIN) 293 #endif // defined(OS_WIN)
300 294
(...skipping 706 matching lines...) Expand 10 before | Expand all | Expand 10 after
1007 restart_required |= OnHostTokenUrlPolicyUpdate(policies.get()); 1001 restart_required |= OnHostTokenUrlPolicyUpdate(policies.get());
1008 restart_required |= OnPairingPolicyUpdate(policies.get()); 1002 restart_required |= OnPairingPolicyUpdate(policies.get());
1009 restart_required |= OnGnubbyAuthPolicyUpdate(policies.get()); 1003 restart_required |= OnGnubbyAuthPolicyUpdate(policies.get());
1010 1004
1011 policy_state_ = POLICY_LOADED; 1005 policy_state_ = POLICY_LOADED;
1012 1006
1013 if (state_ == HOST_STARTING) { 1007 if (state_ == HOST_STARTING) {
1014 StartHostIfReady(); 1008 StartHostIfReady();
1015 } else if (state_ == HOST_STARTED) { 1009 } else if (state_ == HOST_STARTED) {
1016 if (restart_required) 1010 if (restart_required)
1017 RestartHost(kHostOfflineReasonPolicyChangeRequiresRestart); 1011 RestartHost(kPolicyChangeRequiresRestart);
1018 } 1012 }
1019 } 1013 }
1020 1014
1021 void HostProcess::OnPolicyError() { 1015 void HostProcess::OnPolicyError() {
1022 if (!context_->network_task_runner()->BelongsToCurrentThread()) { 1016 if (!context_->network_task_runner()->BelongsToCurrentThread()) {
1023 context_->network_task_runner()->PostTask( 1017 context_->network_task_runner()->PostTask(
1024 FROM_HERE, base::Bind(&HostProcess::OnPolicyError, this)); 1018 FROM_HERE, base::Bind(&HostProcess::OnPolicyError, this));
1025 return; 1019 return;
1026 } 1020 }
1027 1021
1028 if (policy_state_ != POLICY_ERROR_REPORTED) { 1022 if (policy_state_ != POLICY_ERROR_REPORTED) {
1029 policy_state_ = POLICY_ERROR_REPORT_PENDING; 1023 policy_state_ = POLICY_ERROR_REPORT_PENDING;
1030 if ((state_ == HOST_STARTED) || 1024 if ((state_ == HOST_STARTED) ||
1031 (state_ == HOST_STARTING && !serialized_config_.empty())) { 1025 (state_ == HOST_STARTING && !serialized_config_.empty())) {
1032 ReportPolicyErrorAndRestartHost(); 1026 ReportPolicyErrorAndRestartHost();
1033 } 1027 }
1034 } 1028 }
1035 } 1029 }
1036 1030
1037 void HostProcess::ReportPolicyErrorAndRestartHost() { 1031 void HostProcess::ReportPolicyErrorAndRestartHost() {
1038 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); 1032 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
1039 DCHECK(!serialized_config_.empty()); 1033 DCHECK(!serialized_config_.empty());
1040 1034
1041 DCHECK_EQ(policy_state_, POLICY_ERROR_REPORT_PENDING); 1035 DCHECK_EQ(policy_state_, POLICY_ERROR_REPORT_PENDING);
1042 policy_state_ = POLICY_ERROR_REPORTED; 1036 policy_state_ = POLICY_ERROR_REPORTED;
1043 1037
1044 LOG(INFO) << "Restarting the host due to policy errors."; 1038 LOG(INFO) << "Restarting the host due to policy errors.";
1045 RestartHost(kHostOfflineReasonPolicyReadError); 1039 RestartHost(kPolicyReadError);
1046 } 1040 }
1047 1041
1048 void HostProcess::ApplyHostDomainPolicy() { 1042 void HostProcess::ApplyHostDomainPolicy() {
1049 if (state_ != HOST_STARTED) 1043 if (state_ != HOST_STARTED)
1050 return; 1044 return;
1051 1045
1052 HOST_LOG << "Policy sets host domain: " << host_domain_; 1046 HOST_LOG << "Policy sets host domain: " << host_domain_;
1053 1047
1054 if (!host_domain_.empty()) { 1048 if (!host_domain_.empty()) {
1055 // If the user does not have a Google email, their client JID will not be 1049 // If the user does not have a Google email, their client JID will not be
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after
1406 CreateAuthenticatorFactory(); 1400 CreateAuthenticatorFactory();
1407 1401
1408 ApplyHostDomainPolicy(); 1402 ApplyHostDomainPolicy();
1409 ApplyUsernamePolicy(); 1403 ApplyUsernamePolicy();
1410 } 1404 }
1411 1405
1412 void HostProcess::OnAuthFailed() { 1406 void HostProcess::OnAuthFailed() {
1413 ShutdownHost(kInvalidOauthCredentialsExitCode); 1407 ShutdownHost(kInvalidOauthCredentialsExitCode);
1414 } 1408 }
1415 1409
1416 void HostProcess::RestartHost(const std::string& host_offline_reason) { 1410 void HostProcess::RestartHost(HostExitCodes exit_code) {
1417 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); 1411 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
1418 DCHECK(!host_offline_reason.empty());
1419 1412
1420 SetState(HOST_GOING_OFFLINE_TO_RESTART); 1413 SetState(HOST_GOING_OFFLINE_TO_RESTART);
1421 GoOffline(host_offline_reason); 1414 GoOffline(exit_code);
1422 } 1415 }
1423 1416
1424 void HostProcess::ShutdownHost(HostExitCodes exit_code) { 1417 void HostProcess::ShutdownHost(HostExitCodes exit_code) {
1425 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); 1418 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
1426 1419
1427 *exit_code_out_ = exit_code; 1420 *exit_code_out_ = exit_code;
1428 1421
1429 switch (state_) { 1422 switch (state_) {
1430 case HOST_STARTING: 1423 case HOST_STARTING:
1431 case HOST_STARTED: 1424 case HOST_STARTED:
1432 SetState(HOST_GOING_OFFLINE_TO_STOP); 1425 SetState(HOST_GOING_OFFLINE_TO_STOP);
1433 GoOffline(ExitCodeToString(exit_code)); 1426 GoOffline(exit_code);
1434 break; 1427 break;
1435 1428
1436 case HOST_GOING_OFFLINE_TO_RESTART: 1429 case HOST_GOING_OFFLINE_TO_RESTART:
1437 SetState(HOST_GOING_OFFLINE_TO_STOP); 1430 SetState(HOST_GOING_OFFLINE_TO_STOP);
1438 break; 1431 break;
1439 1432
1440 case HOST_GOING_OFFLINE_TO_STOP: 1433 case HOST_GOING_OFFLINE_TO_STOP:
1441 case HOST_STOPPED: 1434 case HOST_STOPPED:
1442 // Host is already stopped or being stopped. No action is required. 1435 // Host is already stopped or being stopped. No action is required.
1443 break; 1436 break;
1444 } 1437 }
1445 } 1438 }
1446 1439
1447 void HostProcess::GoOffline(const std::string& host_offline_reason) { 1440 void HostProcess::GoOffline(HostExitCodes exit_code) {
1448 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); 1441 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
1449 DCHECK(!host_offline_reason.empty());
1450 DCHECK((state_ == HOST_GOING_OFFLINE_TO_STOP) || 1442 DCHECK((state_ == HOST_GOING_OFFLINE_TO_STOP) ||
1451 (state_ == HOST_GOING_OFFLINE_TO_RESTART)); 1443 (state_ == HOST_GOING_OFFLINE_TO_RESTART));
1452 1444
1445 std::string host_offline_reason = ExitCodeToString(exit_code);
1453 // Shut down everything except the HostSignalingManager. 1446 // Shut down everything except the HostSignalingManager.
1447 host_->SetExitCode(exit_code);
1454 host_.reset(); 1448 host_.reset();
1455 host_event_logger_.reset(); 1449 host_event_logger_.reset();
1456 host_status_logger_.reset(); 1450 host_status_logger_.reset();
1457 host_change_notification_listener_.reset(); 1451 host_change_notification_listener_.reset();
1458 1452
1459 // Before shutting down HostSignalingManager, send the |host_offline_reason| 1453 // Before shutting down HostSignalingManager, send the |host_offline_reason|
1460 // if possible (i.e. if we have the config). 1454 // if possible (i.e. if we have the config).
1461 if (!serialized_config_.empty()) { 1455 if (!serialized_config_.empty()) {
1462 if (!host_signaling_manager_) { 1456 if (!host_signaling_manager_) {
1463 host_signaling_manager_ = CreateHostSignalingManager(); 1457 host_signaling_manager_ = CreateHostSignalingManager();
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
1560 base::TimeDelta::FromSeconds(kShutdownTimeoutSeconds)); 1554 base::TimeDelta::FromSeconds(kShutdownTimeoutSeconds));
1561 new HostProcess(context.Pass(), &exit_code, &shutdown_watchdog); 1555 new HostProcess(context.Pass(), &exit_code, &shutdown_watchdog);
1562 1556
1563 // Run the main (also UI) message loop until the host no longer needs it. 1557 // Run the main (also UI) message loop until the host no longer needs it.
1564 message_loop.Run(); 1558 message_loop.Run();
1565 1559
1566 return exit_code; 1560 return exit_code;
1567 } 1561 }
1568 1562
1569 } // namespace remoting 1563 } // namespace remoting
OLDNEW
« remoting/host/host_exit_codes.h ('K') | « remoting/host/ipc_host_event_logger.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698