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

Side by Side Diff: remoting/client/plugin/chromoting_instance.cc

Issue 12475020: Client plugin changes to support third party authentication. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: extraneous override Created 7 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 #include "remoting/client/plugin/chromoting_instance.h" 5 #include "remoting/client/plugin/chromoting_instance.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/callback.h" 11 #include "base/callback.h"
12 #include "base/json/json_reader.h" 12 #include "base/json/json_reader.h"
13 #include "base/json/json_writer.h" 13 #include "base/json/json_writer.h"
14 #include "base/lazy_instance.h" 14 #include "base/lazy_instance.h"
15 #include "base/logging.h" 15 #include "base/logging.h"
16 #include "base/stringprintf.h" 16 #include "base/stringprintf.h"
17 #include "base/strings/string_split.h" 17 #include "base/strings/string_split.h"
18 #include "base/synchronization/lock.h" 18 #include "base/synchronization/lock.h"
19 #include "base/synchronization/waitable_event.h" 19 #include "base/synchronization/waitable_event.h"
20 #include "base/threading/thread.h" 20 #include "base/threading/thread.h"
21 #include "base/values.h" 21 #include "base/values.h"
22 #include "googleurl/src/gurl.h"
22 #include "jingle/glue/thread_wrapper.h" 23 #include "jingle/glue/thread_wrapper.h"
23 #include "media/base/media.h" 24 #include "media/base/media.h"
24 #include "net/socket/ssl_server_socket.h" 25 #include "net/socket/ssl_server_socket.h"
25 #include "ppapi/cpp/completion_callback.h" 26 #include "ppapi/cpp/completion_callback.h"
26 #include "ppapi/cpp/dev/url_util_dev.h" 27 #include "ppapi/cpp/dev/url_util_dev.h"
27 #include "ppapi/cpp/input_event.h" 28 #include "ppapi/cpp/input_event.h"
28 #include "ppapi/cpp/mouse_cursor.h" 29 #include "ppapi/cpp/mouse_cursor.h"
29 #include "ppapi/cpp/rect.h" 30 #include "ppapi/cpp/rect.h"
30 #include "remoting/base/constants.h" 31 #include "remoting/base/constants.h"
31 #include "remoting/base/util.h" 32 #include "remoting/base/util.h"
32 #include "remoting/client/chromoting_client.h" 33 #include "remoting/client/chromoting_client.h"
33 #include "remoting/client/client_config.h" 34 #include "remoting/client/client_config.h"
34 #include "remoting/client/frame_consumer_proxy.h" 35 #include "remoting/client/frame_consumer_proxy.h"
35 #include "remoting/client/plugin/pepper_audio_player.h" 36 #include "remoting/client/plugin/pepper_audio_player.h"
36 #include "remoting/client/plugin/pepper_input_handler.h" 37 #include "remoting/client/plugin/pepper_input_handler.h"
37 #include "remoting/client/plugin/pepper_port_allocator.h" 38 #include "remoting/client/plugin/pepper_port_allocator.h"
39 #include "remoting/client/plugin/pepper_token_fetcher.h"
38 #include "remoting/client/plugin/pepper_view.h" 40 #include "remoting/client/plugin/pepper_view.h"
39 #include "remoting/client/plugin/pepper_xmpp_proxy.h" 41 #include "remoting/client/plugin/pepper_xmpp_proxy.h"
40 #include "remoting/client/rectangle_update_decoder.h" 42 #include "remoting/client/rectangle_update_decoder.h"
41 #include "remoting/protocol/connection_to_host.h" 43 #include "remoting/protocol/connection_to_host.h"
42 #include "remoting/protocol/host_stub.h" 44 #include "remoting/protocol/host_stub.h"
43 #include "remoting/protocol/libjingle_transport_factory.h" 45 #include "remoting/protocol/libjingle_transport_factory.h"
44 46
45 // Windows defines 'PostMessage', so we have to undef it. 47 // Windows defines 'PostMessage', so we have to undef it.
46 #if defined(PostMessage) 48 #if defined(PostMessage)
47 #undef PostMessage 49 #undef PostMessage
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 base::LazyInstance<base::Lock>::Leaky 130 base::LazyInstance<base::Lock>::Leaky
129 g_logging_lock = LAZY_INSTANCE_INITIALIZER; 131 g_logging_lock = LAZY_INSTANCE_INITIALIZER;
130 logging::LogMessageHandlerFunction g_logging_old_handler = NULL; 132 logging::LogMessageHandlerFunction g_logging_old_handler = NULL;
131 133
132 } // namespace 134 } // namespace
133 135
134 // String sent in the "hello" message to the plugin to describe features. 136 // String sent in the "hello" message to the plugin to describe features.
135 const char ChromotingInstance::kApiFeatures[] = 137 const char ChromotingInstance::kApiFeatures[] =
136 "highQualityScaling injectKeyEvent sendClipboardItem remapKey trapKey " 138 "highQualityScaling injectKeyEvent sendClipboardItem remapKey trapKey "
137 "notifyClientDimensions notifyClientResolution pauseVideo pauseAudio " 139 "notifyClientDimensions notifyClientResolution pauseVideo pauseAudio "
138 "asyncPin"; 140 "asyncPin thirdPartyAuth";
139 141
140 bool ChromotingInstance::ParseAuthMethods(const std::string& auth_methods_str, 142 bool ChromotingInstance::ParseAuthMethods(const std::string& auth_methods_str,
141 ClientConfig* config) { 143 ClientConfig* config) {
142 std::vector<std::string> auth_methods; 144 std::vector<std::string> auth_methods;
143 base::SplitString(auth_methods_str, ',', &auth_methods); 145 base::SplitString(auth_methods_str, ',', &auth_methods);
144 for (std::vector<std::string>::iterator it = auth_methods.begin(); 146 for (std::vector<std::string>::iterator it = auth_methods.begin();
145 it != auth_methods.end(); ++it) { 147 it != auth_methods.end(); ++it) {
146 protocol::AuthenticationMethod authentication_method = 148 protocol::AuthenticationMethod authentication_method =
147 protocol::AuthenticationMethod::FromString(*it); 149 protocol::AuthenticationMethod::FromString(*it);
148 if (authentication_method.is_valid()) 150 if (authentication_method.is_valid())
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 PauseAudio(pause); 390 PauseAudio(pause);
389 } else if (method == "useAsyncPinDialog") { 391 } else if (method == "useAsyncPinDialog") {
390 use_async_pin_dialog_ = true; 392 use_async_pin_dialog_ = true;
391 } else if (method == "onPinFetched") { 393 } else if (method == "onPinFetched") {
392 std::string pin; 394 std::string pin;
393 if (!data->GetString("pin", &pin)) { 395 if (!data->GetString("pin", &pin)) {
394 LOG(ERROR) << "Invalid onPinFetched."; 396 LOG(ERROR) << "Invalid onPinFetched.";
395 return; 397 return;
396 } 398 }
397 OnPinFetched(pin); 399 OnPinFetched(pin);
400 } else if (method == "onThirdPartyTokenFetched") {
401 std::string token;
402 std::string shared_secret;
403 if (!data->GetString("token", &token) ||
404 !data->GetString("sharedSecret", &shared_secret)) {
405 LOG(ERROR) << "Invalid onThirdPartyTokenFetched data.";
406 return;
407 }
408 OnThirdPartyTokenFetched(token, shared_secret);
398 } 409 }
399 } 410 }
400 411
401 void ChromotingInstance::DidChangeView(const pp::View& view) { 412 void ChromotingInstance::DidChangeView(const pp::View& view) {
402 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); 413 DCHECK(plugin_task_runner_->BelongsToCurrentThread());
403 414
404 plugin_view_ = view; 415 plugin_view_ = view;
405 if (view_) { 416 if (view_) {
406 view_->SetView(view); 417 view_->SetView(view);
407 mouse_input_filter_.set_input_size(view_->get_view_size_dips()); 418 mouse_input_filter_.set_input_size(view_->get_view_size_dips());
(...skipping 25 matching lines...) Expand all
433 444
434 void ChromotingInstance::OnConnectionState( 445 void ChromotingInstance::OnConnectionState(
435 protocol::ConnectionToHost::State state, 446 protocol::ConnectionToHost::State state,
436 protocol::ErrorCode error) { 447 protocol::ErrorCode error) {
437 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); 448 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue());
438 data->SetString("state", ConnectionStateToString(state)); 449 data->SetString("state", ConnectionStateToString(state));
439 data->SetString("error", ConnectionErrorToString(error)); 450 data->SetString("error", ConnectionErrorToString(error));
440 PostChromotingMessage("onConnectionStatus", data.Pass()); 451 PostChromotingMessage("onConnectionStatus", data.Pass());
441 } 452 }
442 453
454 void ChromotingInstance::FetchThirdPartyToken(
455 const GURL& token_url,
456 const std::string& host_public_key,
457 const std::string& scope,
458 base::WeakPtr<PepperTokenFetcher> pepper_token_fetcher) {
459 // Once the Session object calls this function, it won't continue the
460 // authentication until the callback is called (or connection is canceled).
461 // So, it's impossible to reach this with a callback already registered.
462 DCHECK(!pepper_token_fetcher_);
463 pepper_token_fetcher_ = pepper_token_fetcher;
464 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue());
465 data->SetString("tokenUrl", token_url.spec());
466 data->SetString("hostPublicKey", host_public_key);
467 data->SetString("scope", scope);
468 PostChromotingMessage("fetchThirdPartyToken", data.Pass());
469 }
470
443 void ChromotingInstance::OnConnectionReady(bool ready) { 471 void ChromotingInstance::OnConnectionReady(bool ready) {
444 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); 472 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue());
445 data->SetBoolean("ready", ready); 473 data->SetBoolean("ready", ready);
446 PostChromotingMessage("onConnectionReady", data.Pass()); 474 PostChromotingMessage("onConnectionReady", data.Pass());
447 } 475 }
448 476
449 void ChromotingInstance::FetchSecretFromDialog( 477 void ChromotingInstance::FetchSecretFromDialog(
450 const protocol::SecretFetchedCallback& secret_fetched_callback) { 478 const protocol::SecretFetchedCallback& secret_fetched_callback) {
451 // Once the Session object calls this function, it won't continue the 479 // Once the Session object calls this function, it won't continue the
452 // authentication until the callback is called (or connection is canceled). 480 // authentication until the callback is called (or connection is canceled).
(...skipping 15 matching lines...) Expand all
468 // crbug.com/138108 496 // crbug.com/138108
469 return this; 497 return this;
470 } 498 }
471 499
472 protocol::CursorShapeStub* ChromotingInstance::GetCursorShapeStub() { 500 protocol::CursorShapeStub* ChromotingInstance::GetCursorShapeStub() {
473 // TODO(sergeyu): Move cursor shape code to a separate class. 501 // TODO(sergeyu): Move cursor shape code to a separate class.
474 // crbug.com/138108 502 // crbug.com/138108
475 return this; 503 return this;
476 } 504 }
477 505
506 scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher>
507 ChromotingInstance::GetTokenFetcher(const std::string& host_public_key) {
508 return scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher>(
509 new PepperTokenFetcher(this->AsWeakPtr(), host_public_key));
510 }
511
478 void ChromotingInstance::InjectClipboardEvent( 512 void ChromotingInstance::InjectClipboardEvent(
479 const protocol::ClipboardEvent& event) { 513 const protocol::ClipboardEvent& event) {
480 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); 514 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue());
481 data->SetString("mimeType", event.mime_type()); 515 data->SetString("mimeType", event.mime_type());
482 data->SetString("item", event.data()); 516 data->SetString("item", event.data());
483 PostChromotingMessage("injectClipboardItem", data.Pass()); 517 PostChromotingMessage("injectClipboardItem", data.Pass());
484 } 518 }
485 519
486 void ChromotingInstance::SetCursorShape( 520 void ChromotingInstance::SetCursorShape(
487 const protocol::CursorShapeInfo& cursor_shape) { 521 const protocol::CursorShapeInfo& cursor_shape) {
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 } 715 }
682 716
683 void ChromotingInstance::PauseAudio(bool pause) { 717 void ChromotingInstance::PauseAudio(bool pause) {
684 if (!IsConnected()) { 718 if (!IsConnected()) {
685 return; 719 return;
686 } 720 }
687 protocol::AudioControl audio_control; 721 protocol::AudioControl audio_control;
688 audio_control.set_enable(!pause); 722 audio_control.set_enable(!pause);
689 host_connection_->host_stub()->ControlAudio(audio_control); 723 host_connection_->host_stub()->ControlAudio(audio_control);
690 } 724 }
691
692 void ChromotingInstance::OnPinFetched(const std::string& pin) { 725 void ChromotingInstance::OnPinFetched(const std::string& pin) {
693 if (!secret_fetched_callback_.is_null()) { 726 if (!secret_fetched_callback_.is_null()) {
694 secret_fetched_callback_.Run(pin); 727 secret_fetched_callback_.Run(pin);
695 secret_fetched_callback_.Reset(); 728 secret_fetched_callback_.Reset();
696 } else { 729 } else {
697 VLOG(1) << "Ignored OnPinFetched received without a pending fetch."; 730 LOG(WARNING) << "Ignored OnPinFetched received without a pending fetch.";
698 } 731 }
699 } 732 }
700 733
734 void ChromotingInstance::OnThirdPartyTokenFetched(
735 const std::string& token,
736 const std::string& shared_secret) {
737 if (pepper_token_fetcher_) {
738 pepper_token_fetcher_->OnTokenFetched(token, shared_secret);
739 pepper_token_fetcher_.reset();
740 } else {
741 LOG(WARNING) << "Ignored OnThirdPartyTokenFetched without a pending fetch.";
742 }
743 }
744
701 ChromotingStats* ChromotingInstance::GetStats() { 745 ChromotingStats* ChromotingInstance::GetStats() {
702 if (!client_.get()) 746 if (!client_.get())
703 return NULL; 747 return NULL;
704 return client_->GetStats(); 748 return client_->GetStats();
705 } 749 }
706 750
707 void ChromotingInstance::PostChromotingMessage( 751 void ChromotingInstance::PostChromotingMessage(
708 const std::string& method, 752 const std::string& method,
709 scoped_ptr<base::DictionaryValue> data) { 753 scoped_ptr<base::DictionaryValue> data) {
710 scoped_ptr<base::DictionaryValue> message(new base::DictionaryValue()); 754 scoped_ptr<base::DictionaryValue> message(new base::DictionaryValue());
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 url_components.scheme.len); 911 url_components.scheme.len);
868 return url_scheme == kChromeExtensionUrlScheme; 912 return url_scheme == kChromeExtensionUrlScheme;
869 } 913 }
870 914
871 bool ChromotingInstance::IsConnected() { 915 bool ChromotingInstance::IsConnected() {
872 return host_connection_.get() && 916 return host_connection_.get() &&
873 (host_connection_->state() == protocol::ConnectionToHost::CONNECTED); 917 (host_connection_->state() == protocol::ConnectionToHost::CONNECTED);
874 } 918 }
875 919
876 } // namespace remoting 920 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/client/plugin/chromoting_instance.h ('k') | remoting/client/plugin/pepper_token_fetcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698