| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 #include "remoting/host/it2me/it2me_host.h" | 5 #include "remoting/host/it2me/it2me_host.h" |
| 6 | 6 |
| 7 #include <cstdint> | 7 #include <cstdint> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 NOTIMPLEMENTED(); | 338 NOTIMPLEMENTED(); |
| 339 } | 339 } |
| 340 | 340 |
| 341 void It2MeHost::UpdateNatPolicy(bool nat_traversal_enabled) { | 341 void It2MeHost::UpdateNatPolicy(bool nat_traversal_enabled) { |
| 342 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); | 342 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); |
| 343 | 343 |
| 344 VLOG(2) << "UpdateNatPolicy: " << nat_traversal_enabled; | 344 VLOG(2) << "UpdateNatPolicy: " << nat_traversal_enabled; |
| 345 | 345 |
| 346 // When transitioning from enabled to disabled, force disconnect any | 346 // When transitioning from enabled to disabled, force disconnect any |
| 347 // existing session. | 347 // existing session. |
| 348 if (nat_traversal_enabled_ && !nat_traversal_enabled && IsConnected()) { | 348 if (nat_traversal_enabled_ && !nat_traversal_enabled && IsRunning()) { |
| 349 DisconnectOnNetworkThread(); | 349 DisconnectOnNetworkThread(); |
| 350 } | 350 } |
| 351 | 351 |
| 352 nat_traversal_enabled_ = nat_traversal_enabled; | 352 nat_traversal_enabled_ = nat_traversal_enabled; |
| 353 | 353 |
| 354 // Notify the web-app of the policy setting. | 354 // Notify the web-app of the policy setting. |
| 355 host_context_->ui_task_runner()->PostTask( | 355 host_context_->ui_task_runner()->PostTask( |
| 356 FROM_HERE, base::Bind(&It2MeHost::Observer::OnNatPolicyChanged, observer_, | 356 FROM_HERE, base::Bind(&It2MeHost::Observer::OnNatPolicyChanged, observer_, |
| 357 nat_traversal_enabled_)); | 357 nat_traversal_enabled_)); |
| 358 } | 358 } |
| 359 | 359 |
| 360 void It2MeHost::UpdateHostDomainPolicy(const std::string& host_domain) { | 360 void It2MeHost::UpdateHostDomainPolicy(const std::string& host_domain) { |
| 361 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); | 361 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); |
| 362 | 362 |
| 363 VLOG(2) << "UpdateHostDomainPolicy: " << host_domain; | 363 VLOG(2) << "UpdateHostDomainPolicy: " << host_domain; |
| 364 | 364 |
| 365 // When setting a host domain policy, force disconnect any existing session. | 365 // When setting a host domain policy, force disconnect any existing session. |
| 366 if (!host_domain.empty() && IsConnected()) { | 366 if (!host_domain.empty() && IsRunning()) { |
| 367 DisconnectOnNetworkThread(); | 367 DisconnectOnNetworkThread(); |
| 368 } | 368 } |
| 369 | 369 |
| 370 required_host_domain_ = host_domain; | 370 required_host_domain_ = host_domain; |
| 371 } | 371 } |
| 372 | 372 |
| 373 void It2MeHost::UpdateClientDomainPolicy(const std::string& client_domain) { | 373 void It2MeHost::UpdateClientDomainPolicy(const std::string& client_domain) { |
| 374 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); | 374 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); |
| 375 | 375 |
| 376 VLOG(2) << "UpdateClientDomainPolicy: " << client_domain; | 376 VLOG(2) << "UpdateClientDomainPolicy: " << client_domain; |
| 377 | 377 |
| 378 // When setting a client domain policy, disconnect any existing session. | 378 // When setting a client domain policy, disconnect any existing session. |
| 379 if (!client_domain.empty() && IsConnected()) { | 379 if (!client_domain.empty() && IsRunning()) { |
| 380 DisconnectOnNetworkThread(); | 380 DisconnectOnNetworkThread(); |
| 381 } | 381 } |
| 382 | 382 |
| 383 required_client_domain_ = client_domain; | 383 required_client_domain_ = client_domain; |
| 384 } | 384 } |
| 385 | 385 |
| 386 void It2MeHost::SetState(It2MeHostState state, | 386 void It2MeHost::SetState(It2MeHostState state, |
| 387 const std::string& error_message) { | 387 const std::string& error_message) { |
| 388 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); | 388 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); |
| 389 | 389 |
| 390 switch (state_) { | 390 switch (state_) { |
| 391 case kDisconnected: | 391 case kDisconnected: |
| 392 DCHECK(state == kStarting || | 392 DCHECK(state == kStarting || |
| 393 state == kError) << state; | 393 state == kError) << state; |
| 394 break; | 394 break; |
| 395 case kStarting: | 395 case kStarting: |
| 396 DCHECK(state == kRequestedAccessCode || | 396 DCHECK(state == kRequestedAccessCode || |
| 397 state == kDisconnected || | 397 state == kDisconnected || |
| 398 state == kError || | 398 state == kError || |
| 399 state == kInvalidDomainError) << state; | 399 state == kInvalidDomainError) << state; |
| 400 break; | 400 break; |
| 401 case kRequestedAccessCode: | 401 case kRequestedAccessCode: |
| 402 DCHECK(state == kReceivedAccessCode || | 402 DCHECK(state == kReceivedAccessCode || |
| 403 state == kDisconnected || | 403 state == kDisconnected || |
| 404 state == kError) << state; | 404 state == kError) << state; |
| 405 break; | 405 break; |
| 406 case kReceivedAccessCode: | 406 case kReceivedAccessCode: |
| 407 DCHECK(state == kConnecting || |
| 408 state == kDisconnected || |
| 409 state == kError) << state; |
| 410 break; |
| 411 case kConnecting: |
| 407 DCHECK(state == kConnected || | 412 DCHECK(state == kConnected || |
| 408 state == kDisconnected || | 413 state == kDisconnected || |
| 409 state == kError) << state; | 414 state == kError) << state; |
| 410 break; | 415 break; |
| 411 case kConnected: | 416 case kConnected: |
| 412 DCHECK(state == kDisconnected || | 417 DCHECK(state == kDisconnected || |
| 413 state == kError) << state; | 418 state == kError) << state; |
| 414 break; | 419 break; |
| 415 case kError: | 420 case kError: |
| 416 DCHECK(state == kDisconnected) << state; | 421 DCHECK(state == kDisconnected) << state; |
| 417 break; | 422 break; |
| 418 case kInvalidDomainError: | 423 case kInvalidDomainError: |
| 419 DCHECK(state == kDisconnected) << state; | 424 DCHECK(state == kDisconnected) << state; |
| 420 break; | 425 break; |
| 421 }; | 426 }; |
| 422 | 427 |
| 423 state_ = state; | 428 state_ = state; |
| 424 | 429 |
| 425 // Post a state-change notification to the web-app. | 430 // Post a state-change notification to the web-app. |
| 426 host_context_->ui_task_runner()->PostTask( | 431 host_context_->ui_task_runner()->PostTask( |
| 427 FROM_HERE, base::Bind(&It2MeHost::Observer::OnStateChanged, observer_, | 432 FROM_HERE, base::Bind(&It2MeHost::Observer::OnStateChanged, observer_, |
| 428 state, error_message)); | 433 state, error_message)); |
| 429 } | 434 } |
| 430 | 435 |
| 431 bool It2MeHost::IsConnected() const { | 436 bool It2MeHost::IsRunning() const { |
| 432 return state_ == kRequestedAccessCode || state_ == kReceivedAccessCode || | 437 return state_ == kRequestedAccessCode || state_ == kReceivedAccessCode || |
| 433 state_ == kConnected; | 438 state_ == kConnected || state_ == kConnecting; |
| 434 } | 439 } |
| 435 | 440 |
| 436 void It2MeHost::OnReceivedSupportID( | 441 void It2MeHost::OnReceivedSupportID( |
| 437 const std::string& support_id, | 442 const std::string& support_id, |
| 438 const base::TimeDelta& lifetime, | 443 const base::TimeDelta& lifetime, |
| 439 const std::string& error_message) { | 444 const std::string& error_message) { |
| 440 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); | 445 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); |
| 441 | 446 |
| 442 if (!error_message.empty()) { | 447 if (!error_message.empty()) { |
| 443 SetState(kError, error_message); | 448 SetState(kError, error_message); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 std::string("@") + required_client_domain_, | 509 std::string("@") + required_client_domain_, |
| 505 base::CompareCase::INSENSITIVE_ASCII)) { | 510 base::CompareCase::INSENSITIVE_ASCII)) { |
| 506 LOG(ERROR) << "Rejecting incoming connection from " << remote_jid | 511 LOG(ERROR) << "Rejecting incoming connection from " << remote_jid |
| 507 << ": Domain mismatch."; | 512 << ": Domain mismatch."; |
| 508 result_callback.Run(ValidationResult::ERROR_INVALID_ACCOUNT); | 513 result_callback.Run(ValidationResult::ERROR_INVALID_ACCOUNT); |
| 509 DisconnectOnNetworkThread(); | 514 DisconnectOnNetworkThread(); |
| 510 return; | 515 return; |
| 511 } | 516 } |
| 512 } | 517 } |
| 513 | 518 |
| 519 HOST_LOG << "Client " << client_username << " connecting."; |
| 520 SetState(kConnecting, std::string()); |
| 521 |
| 514 // Show a confirmation dialog to the user to allow them to confirm/reject it. | 522 // Show a confirmation dialog to the user to allow them to confirm/reject it. |
| 515 confirmation_dialog_proxy_.reset(new It2MeConfirmationDialogProxy( | 523 confirmation_dialog_proxy_.reset(new It2MeConfirmationDialogProxy( |
| 516 host_context_->ui_task_runner(), std::move(confirmation_dialog_))); | 524 host_context_->ui_task_runner(), std::move(confirmation_dialog_))); |
| 517 | 525 |
| 518 confirmation_dialog_proxy_->Show( | 526 confirmation_dialog_proxy_->Show( |
| 519 client_username, base::Bind(&It2MeHost::OnConfirmationResult, | 527 client_username, base::Bind(&It2MeHost::OnConfirmationResult, |
| 520 base::Unretained(this), result_callback)); | 528 base::Unretained(this), result_callback)); |
| 521 } | 529 } |
| 522 | 530 |
| 523 void It2MeHost::OnConfirmationResult( | 531 void It2MeHost::OnConfirmationResult( |
| (...skipping 27 matching lines...) Expand all Loading... |
| 551 DCHECK(context->ui_task_runner()->BelongsToCurrentThread()); | 559 DCHECK(context->ui_task_runner()->BelongsToCurrentThread()); |
| 552 | 560 |
| 553 std::unique_ptr<PolicyWatcher> policy_watcher = | 561 std::unique_ptr<PolicyWatcher> policy_watcher = |
| 554 PolicyWatcher::Create(policy_service, context->file_task_runner()); | 562 PolicyWatcher::Create(policy_service, context->file_task_runner()); |
| 555 return new It2MeHost(std::move(context), std::move(policy_watcher), | 563 return new It2MeHost(std::move(context), std::move(policy_watcher), |
| 556 It2MeConfirmationDialog::Create(), observer, | 564 It2MeConfirmationDialog::Create(), observer, |
| 557 std::move(signal_strategy), username, directory_bot_jid); | 565 std::move(signal_strategy), username, directory_bot_jid); |
| 558 } | 566 } |
| 559 | 567 |
| 560 } // namespace remoting | 568 } // namespace remoting |
| OLD | NEW |