Chromium Code Reviews| 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/setup/me2me_native_messaging_host.h" | 5 #include "remoting/host/setup/me2me_native_messaging_host.h" |
| 6 #include <string> | 6 #include <string> |
| 7 | 7 |
| 8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| 11 #include "base/callback_helpers.h" | 11 #include "base/callback_helpers.h" |
| 12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
| 13 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/strings/stringize_macros.h" | 14 #include "base/strings/stringize_macros.h" |
| 15 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
| 16 #include "base/strings/utf_string_conversions.h" | 16 #include "base/strings/utf_string_conversions.h" |
| 17 #include "base/threading/thread.h" | 17 #include "base/threading/thread.h" |
| 18 #include "base/values.h" | 18 #include "base/values.h" |
| 19 #include "google_apis/gaia/gaia_oauth_client.h" | 19 #include "google_apis/gaia/gaia_oauth_client.h" |
| 20 #include "google_apis/google_api_keys.h" | 20 #include "google_apis/google_api_keys.h" |
| 21 #include "ipc/ipc_channel.h" | 21 #include "ipc/ipc_channel.h" |
| 22 #include "net/base/net_util.h" | 22 #include "net/base/net_util.h" |
| 23 #include "remoting/base/rsa_key_pair.h" | 23 #include "remoting/base/rsa_key_pair.h" |
| 24 #include "remoting/host/native_messaging/pipe_messaging_channel.h" | |
| 24 #include "remoting/host/pin_hash.h" | 25 #include "remoting/host/pin_hash.h" |
| 25 #include "remoting/host/setup/oauth_client.h" | 26 #include "remoting/host/setup/oauth_client.h" |
| 26 #include "remoting/protocol/pairing_registry.h" | 27 #include "remoting/protocol/pairing_registry.h" |
| 27 | 28 |
| 28 #if defined(OS_WIN) | 29 #if defined(OS_WIN) |
| 29 #include <shellapi.h> | 30 #include <shellapi.h> |
| 30 #include "base/win/win_util.h" | 31 #include "base/win/win_util.h" |
| 31 #include "remoting/host/win/security_descriptor.h" | 32 #include "remoting/host/win/security_descriptor.h" |
| 32 #endif // defined(OS_WIN) | 33 #endif // defined(OS_WIN) |
| 33 | 34 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 65 return result.Pass(); | 66 return result.Pass(); |
| 66 } | 67 } |
| 67 | 68 |
| 68 } // namespace | 69 } // namespace |
| 69 | 70 |
| 70 namespace remoting { | 71 namespace remoting { |
| 71 | 72 |
| 72 Me2MeNativeMessagingHost::Me2MeNativeMessagingHost( | 73 Me2MeNativeMessagingHost::Me2MeNativeMessagingHost( |
| 73 bool needs_elevation, | 74 bool needs_elevation, |
| 74 intptr_t parent_window_handle, | 75 intptr_t parent_window_handle, |
| 75 scoped_ptr<NativeMessagingChannel> channel, | 76 scoped_ptr<extensions::NativeMessagingChannel> channel, |
| 76 scoped_refptr<DaemonController> daemon_controller, | 77 scoped_refptr<DaemonController> daemon_controller, |
| 77 scoped_refptr<protocol::PairingRegistry> pairing_registry, | 78 scoped_refptr<protocol::PairingRegistry> pairing_registry, |
| 78 scoped_ptr<OAuthClient> oauth_client) | 79 scoped_ptr<OAuthClient> oauth_client) |
| 79 : needs_elevation_(needs_elevation), | 80 : needs_elevation_(needs_elevation), |
| 80 parent_window_handle_(parent_window_handle), | 81 parent_window_handle_(parent_window_handle), |
| 81 channel_(channel.Pass()), | 82 channel_(channel.Pass()), |
| 82 daemon_controller_(daemon_controller), | 83 daemon_controller_(daemon_controller), |
| 83 pairing_registry_(pairing_registry), | 84 pairing_registry_(pairing_registry), |
| 84 oauth_client_(oauth_client.Pass()), | 85 oauth_client_(oauth_client.Pass()), |
| 85 weak_factory_(this) { | 86 weak_factory_(this) { |
| 86 weak_ptr_ = weak_factory_.GetWeakPtr(); | 87 weak_ptr_ = weak_factory_.GetWeakPtr(); |
| 87 } | 88 } |
| 88 | 89 |
| 89 Me2MeNativeMessagingHost::~Me2MeNativeMessagingHost() { | 90 Me2MeNativeMessagingHost::~Me2MeNativeMessagingHost() { |
| 90 DCHECK(thread_checker_.CalledOnValidThread()); | 91 DCHECK(thread_checker_.CalledOnValidThread()); |
| 91 } | 92 } |
| 92 | 93 |
| 93 void Me2MeNativeMessagingHost::Start( | 94 void Me2MeNativeMessagingHost::Start( |
| 94 const base::Closure& quit_closure) { | 95 const base::Closure& quit_closure) { |
| 95 DCHECK(thread_checker_.CalledOnValidThread()); | 96 DCHECK(thread_checker_.CalledOnValidThread()); |
| 97 DCHECK(!quit_closure.is_null()); | |
| 96 | 98 |
| 97 quit_closure_ = quit_closure; | 99 quit_closure_ = quit_closure; |
| 98 | 100 |
| 99 channel_->Start( | 101 channel_->Start(this); |
| 100 base::Bind(&Me2MeNativeMessagingHost::ProcessRequest, weak_ptr_), | |
| 101 base::Bind(&Me2MeNativeMessagingHost::Stop, weak_ptr_)); | |
| 102 } | 102 } |
| 103 | 103 |
| 104 void Me2MeNativeMessagingHost::ProcessRequest( | 104 void Me2MeNativeMessagingHost::OnMessage(scoped_ptr<base::Value> message) { |
| 105 scoped_ptr<base::DictionaryValue> message) { | |
| 106 DCHECK(thread_checker_.CalledOnValidThread()); | 105 DCHECK(thread_checker_.CalledOnValidThread()); |
| 107 | 106 |
| 107 scoped_ptr<base::DictionaryValue> message_dict( | |
| 108 static_cast<base::DictionaryValue*>(message.release())); | |
| 108 scoped_ptr<base::DictionaryValue> response(new base::DictionaryValue()); | 109 scoped_ptr<base::DictionaryValue> response(new base::DictionaryValue()); |
| 109 | 110 |
| 110 // If the client supplies an ID, it will expect it in the response. This | 111 // If the client supplies an ID, it will expect it in the response. This |
| 111 // might be a string or a number, so cope with both. | 112 // might be a string or a number, so cope with both. |
| 112 const base::Value* id; | 113 const base::Value* id; |
| 113 if (message->Get("id", &id)) | 114 if (message_dict->Get("id", &id)) |
| 114 response->Set("id", id->DeepCopy()); | 115 response->Set("id", id->DeepCopy()); |
| 115 | 116 |
| 116 std::string type; | 117 std::string type; |
| 117 if (!message->GetString("type", &type)) { | 118 if (!message_dict->GetString("type", &type)) { |
| 118 LOG(ERROR) << "'type' not found"; | 119 LOG(ERROR) << "'type' not found"; |
| 119 channel_->SendMessage(scoped_ptr<base::DictionaryValue>()); | 120 channel_->SendMessage(scoped_ptr<base::Value>()); |
| 120 return; | 121 return; |
| 121 } | 122 } |
| 122 | 123 |
| 123 response->SetString("type", type + "Response"); | 124 response->SetString("type", type + "Response"); |
| 124 | 125 |
| 125 if (type == "hello") { | 126 if (type == "hello") { |
| 126 ProcessHello(message.Pass(), response.Pass()); | 127 ProcessHello(message_dict.Pass(), response.Pass()); |
| 127 } else if (type == "clearPairedClients") { | 128 } else if (type == "clearPairedClients") { |
| 128 ProcessClearPairedClients(message.Pass(), response.Pass()); | 129 ProcessClearPairedClients(message_dict.Pass(), response.Pass()); |
| 129 } else if (type == "deletePairedClient") { | 130 } else if (type == "deletePairedClient") { |
| 130 ProcessDeletePairedClient(message.Pass(), response.Pass()); | 131 ProcessDeletePairedClient(message_dict.Pass(), response.Pass()); |
| 131 } else if (type == "getHostName") { | 132 } else if (type == "getHostName") { |
| 132 ProcessGetHostName(message.Pass(), response.Pass()); | 133 ProcessGetHostName(message_dict.Pass(), response.Pass()); |
| 133 } else if (type == "getPinHash") { | 134 } else if (type == "getPinHash") { |
| 134 ProcessGetPinHash(message.Pass(), response.Pass()); | 135 ProcessGetPinHash(message_dict.Pass(), response.Pass()); |
| 135 } else if (type == "generateKeyPair") { | 136 } else if (type == "generateKeyPair") { |
| 136 ProcessGenerateKeyPair(message.Pass(), response.Pass()); | 137 ProcessGenerateKeyPair(message_dict.Pass(), response.Pass()); |
| 137 } else if (type == "updateDaemonConfig") { | 138 } else if (type == "updateDaemonConfig") { |
| 138 ProcessUpdateDaemonConfig(message.Pass(), response.Pass()); | 139 ProcessUpdateDaemonConfig(message_dict.Pass(), response.Pass()); |
| 139 } else if (type == "getDaemonConfig") { | 140 } else if (type == "getDaemonConfig") { |
| 140 ProcessGetDaemonConfig(message.Pass(), response.Pass()); | 141 ProcessGetDaemonConfig(message_dict.Pass(), response.Pass()); |
| 141 } else if (type == "getPairedClients") { | 142 } else if (type == "getPairedClients") { |
| 142 ProcessGetPairedClients(message.Pass(), response.Pass()); | 143 ProcessGetPairedClients(message_dict.Pass(), response.Pass()); |
| 143 } else if (type == "getUsageStatsConsent") { | 144 } else if (type == "getUsageStatsConsent") { |
| 144 ProcessGetUsageStatsConsent(message.Pass(), response.Pass()); | 145 ProcessGetUsageStatsConsent(message_dict.Pass(), response.Pass()); |
| 145 } else if (type == "startDaemon") { | 146 } else if (type == "startDaemon") { |
| 146 ProcessStartDaemon(message.Pass(), response.Pass()); | 147 ProcessStartDaemon(message_dict.Pass(), response.Pass()); |
| 147 } else if (type == "stopDaemon") { | 148 } else if (type == "stopDaemon") { |
| 148 ProcessStopDaemon(message.Pass(), response.Pass()); | 149 ProcessStopDaemon(message_dict.Pass(), response.Pass()); |
| 149 } else if (type == "getDaemonState") { | 150 } else if (type == "getDaemonState") { |
| 150 ProcessGetDaemonState(message.Pass(), response.Pass()); | 151 ProcessGetDaemonState(message_dict.Pass(), response.Pass()); |
| 151 } else if (type == "getHostClientId") { | 152 } else if (type == "getHostClientId") { |
| 152 ProcessGetHostClientId(message.Pass(), response.Pass()); | 153 ProcessGetHostClientId(message_dict.Pass(), response.Pass()); |
| 153 } else if (type == "getCredentialsFromAuthCode") { | 154 } else if (type == "getCredentialsFromAuthCode") { |
| 154 ProcessGetCredentialsFromAuthCode(message.Pass(), response.Pass()); | 155 ProcessGetCredentialsFromAuthCode(message_dict.Pass(), response.Pass()); |
| 155 } else { | 156 } else { |
| 156 LOG(ERROR) << "Unsupported request type: " << type; | 157 LOG(ERROR) << "Unsupported request type: " << type; |
| 157 OnError(); | 158 OnError(); |
| 158 } | 159 } |
| 159 } | 160 } |
| 160 | 161 |
| 162 void Me2MeNativeMessagingHost::OnDisconnect() { | |
| 163 if (!quit_closure_.is_null()) { | |
|
Sergey Ulanov
2014/09/18 18:08:36
remove {}
kelvinp
2014/09/18 19:03:50
Done.
| |
| 164 base::ResetAndReturn(&quit_closure_).Run(); | |
| 165 } | |
| 166 } | |
| 167 | |
| 161 void Me2MeNativeMessagingHost::ProcessHello( | 168 void Me2MeNativeMessagingHost::ProcessHello( |
| 162 scoped_ptr<base::DictionaryValue> message, | 169 scoped_ptr<base::DictionaryValue> message, |
| 163 scoped_ptr<base::DictionaryValue> response) { | 170 scoped_ptr<base::DictionaryValue> response) { |
| 164 DCHECK(thread_checker_.CalledOnValidThread()); | 171 DCHECK(thread_checker_.CalledOnValidThread()); |
| 165 | 172 |
| 166 response->SetString("version", STRINGIZE(VERSION)); | 173 response->SetString("version", STRINGIZE(VERSION)); |
| 167 scoped_ptr<base::ListValue> supported_features_list(new base::ListValue()); | 174 scoped_ptr<base::ListValue> supported_features_list(new base::ListValue()); |
| 168 supported_features_list->AppendStrings(std::vector<std::string>( | 175 supported_features_list->AppendStrings(std::vector<std::string>( |
| 169 kSupportedFeatures, kSupportedFeatures + arraysize(kSupportedFeatures))); | 176 kSupportedFeatures, kSupportedFeatures + arraysize(kSupportedFeatures))); |
| 170 response->Set("supportedFeatures", supported_features_list.release()); | 177 response->Set("supportedFeatures", supported_features_list.release()); |
| 171 channel_->SendMessage(response.Pass()); | 178 channel_->SendMessage(response.PassAs<base::Value>()); |
| 172 } | 179 } |
| 173 | 180 |
| 174 void Me2MeNativeMessagingHost::ProcessClearPairedClients( | 181 void Me2MeNativeMessagingHost::ProcessClearPairedClients( |
| 175 scoped_ptr<base::DictionaryValue> message, | 182 scoped_ptr<base::DictionaryValue> message, |
| 176 scoped_ptr<base::DictionaryValue> response) { | 183 scoped_ptr<base::DictionaryValue> response) { |
| 177 DCHECK(thread_checker_.CalledOnValidThread()); | 184 DCHECK(thread_checker_.CalledOnValidThread()); |
| 178 | 185 |
| 179 if (needs_elevation_) { | 186 if (needs_elevation_) { |
| 180 if (!DelegateToElevatedHost(message.Pass())) | 187 if (!DelegateToElevatedHost(message.Pass())) |
| 181 SendBooleanResult(response.Pass(), false); | 188 SendBooleanResult(response.Pass(), false); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 219 SendBooleanResult(response.Pass(), false); | 226 SendBooleanResult(response.Pass(), false); |
| 220 } | 227 } |
| 221 } | 228 } |
| 222 | 229 |
| 223 void Me2MeNativeMessagingHost::ProcessGetHostName( | 230 void Me2MeNativeMessagingHost::ProcessGetHostName( |
| 224 scoped_ptr<base::DictionaryValue> message, | 231 scoped_ptr<base::DictionaryValue> message, |
| 225 scoped_ptr<base::DictionaryValue> response) { | 232 scoped_ptr<base::DictionaryValue> response) { |
| 226 DCHECK(thread_checker_.CalledOnValidThread()); | 233 DCHECK(thread_checker_.CalledOnValidThread()); |
| 227 | 234 |
| 228 response->SetString("hostname", net::GetHostName()); | 235 response->SetString("hostname", net::GetHostName()); |
| 229 channel_->SendMessage(response.Pass()); | 236 channel_->SendMessage(response.PassAs<base::Value>()); |
| 230 } | 237 } |
| 231 | 238 |
| 232 void Me2MeNativeMessagingHost::ProcessGetPinHash( | 239 void Me2MeNativeMessagingHost::ProcessGetPinHash( |
| 233 scoped_ptr<base::DictionaryValue> message, | 240 scoped_ptr<base::DictionaryValue> message, |
| 234 scoped_ptr<base::DictionaryValue> response) { | 241 scoped_ptr<base::DictionaryValue> response) { |
| 235 DCHECK(thread_checker_.CalledOnValidThread()); | 242 DCHECK(thread_checker_.CalledOnValidThread()); |
| 236 | 243 |
| 237 std::string host_id; | 244 std::string host_id; |
| 238 if (!message->GetString("hostId", &host_id)) { | 245 if (!message->GetString("hostId", &host_id)) { |
| 239 LOG(ERROR) << "'hostId' not found: " << message; | 246 LOG(ERROR) << "'hostId' not found: " << message; |
| 240 OnError(); | 247 OnError(); |
| 241 return; | 248 return; |
| 242 } | 249 } |
| 243 std::string pin; | 250 std::string pin; |
| 244 if (!message->GetString("pin", &pin)) { | 251 if (!message->GetString("pin", &pin)) { |
| 245 LOG(ERROR) << "'pin' not found: " << message; | 252 LOG(ERROR) << "'pin' not found: " << message; |
| 246 OnError(); | 253 OnError(); |
| 247 return; | 254 return; |
| 248 } | 255 } |
| 249 response->SetString("hash", MakeHostPinHash(host_id, pin)); | 256 response->SetString("hash", MakeHostPinHash(host_id, pin)); |
| 250 channel_->SendMessage(response.Pass()); | 257 channel_->SendMessage(response.PassAs<base::Value>()); |
| 251 } | 258 } |
| 252 | 259 |
| 253 void Me2MeNativeMessagingHost::ProcessGenerateKeyPair( | 260 void Me2MeNativeMessagingHost::ProcessGenerateKeyPair( |
| 254 scoped_ptr<base::DictionaryValue> message, | 261 scoped_ptr<base::DictionaryValue> message, |
| 255 scoped_ptr<base::DictionaryValue> response) { | 262 scoped_ptr<base::DictionaryValue> response) { |
| 256 DCHECK(thread_checker_.CalledOnValidThread()); | 263 DCHECK(thread_checker_.CalledOnValidThread()); |
| 257 | 264 |
| 258 scoped_refptr<RsaKeyPair> key_pair = RsaKeyPair::Generate(); | 265 scoped_refptr<RsaKeyPair> key_pair = RsaKeyPair::Generate(); |
| 259 response->SetString("privateKey", key_pair->ToString()); | 266 response->SetString("privateKey", key_pair->ToString()); |
| 260 response->SetString("publicKey", key_pair->GetPublicKey()); | 267 response->SetString("publicKey", key_pair->GetPublicKey()); |
| 261 channel_->SendMessage(response.Pass()); | 268 channel_->SendMessage(response.PassAs<base::Value>()); |
| 262 } | 269 } |
| 263 | 270 |
| 264 void Me2MeNativeMessagingHost::ProcessUpdateDaemonConfig( | 271 void Me2MeNativeMessagingHost::ProcessUpdateDaemonConfig( |
| 265 scoped_ptr<base::DictionaryValue> message, | 272 scoped_ptr<base::DictionaryValue> message, |
| 266 scoped_ptr<base::DictionaryValue> response) { | 273 scoped_ptr<base::DictionaryValue> response) { |
| 267 DCHECK(thread_checker_.CalledOnValidThread()); | 274 DCHECK(thread_checker_.CalledOnValidThread()); |
| 268 | 275 |
| 269 scoped_ptr<base::DictionaryValue> config_dict = | 276 scoped_ptr<base::DictionaryValue> config_dict = |
| 270 ConfigDictionaryFromMessage(message.Pass()); | 277 ConfigDictionaryFromMessage(message.Pass()); |
| 271 if (!config_dict) { | 278 if (!config_dict) { |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 374 case DaemonController::STATE_STARTED: | 381 case DaemonController::STATE_STARTED: |
| 375 response->SetString("state", "STARTED"); | 382 response->SetString("state", "STARTED"); |
| 376 break; | 383 break; |
| 377 case DaemonController::STATE_STOPPING: | 384 case DaemonController::STATE_STOPPING: |
| 378 response->SetString("state", "STOPPING"); | 385 response->SetString("state", "STOPPING"); |
| 379 break; | 386 break; |
| 380 case DaemonController::STATE_UNKNOWN: | 387 case DaemonController::STATE_UNKNOWN: |
| 381 response->SetString("state", "UNKNOWN"); | 388 response->SetString("state", "UNKNOWN"); |
| 382 break; | 389 break; |
| 383 } | 390 } |
| 384 channel_->SendMessage(response.Pass()); | 391 channel_->SendMessage(response.PassAs<base::Value>()); |
| 385 } | 392 } |
| 386 | 393 |
| 387 void Me2MeNativeMessagingHost::ProcessGetHostClientId( | 394 void Me2MeNativeMessagingHost::ProcessGetHostClientId( |
| 388 scoped_ptr<base::DictionaryValue> message, | 395 scoped_ptr<base::DictionaryValue> message, |
| 389 scoped_ptr<base::DictionaryValue> response) { | 396 scoped_ptr<base::DictionaryValue> response) { |
| 390 DCHECK(thread_checker_.CalledOnValidThread()); | 397 DCHECK(thread_checker_.CalledOnValidThread()); |
| 391 | 398 |
| 392 response->SetString("clientId", google_apis::GetOAuth2ClientID( | 399 response->SetString("clientId", google_apis::GetOAuth2ClientID( |
| 393 google_apis::CLIENT_REMOTING_HOST)); | 400 google_apis::CLIENT_REMOTING_HOST)); |
| 394 channel_->SendMessage(response.Pass()); | 401 channel_->SendMessage(response.PassAs<base::Value>()); |
| 395 } | 402 } |
| 396 | 403 |
| 397 void Me2MeNativeMessagingHost::ProcessGetCredentialsFromAuthCode( | 404 void Me2MeNativeMessagingHost::ProcessGetCredentialsFromAuthCode( |
| 398 scoped_ptr<base::DictionaryValue> message, | 405 scoped_ptr<base::DictionaryValue> message, |
| 399 scoped_ptr<base::DictionaryValue> response) { | 406 scoped_ptr<base::DictionaryValue> response) { |
| 400 DCHECK(thread_checker_.CalledOnValidThread()); | 407 DCHECK(thread_checker_.CalledOnValidThread()); |
| 401 | 408 |
| 402 std::string auth_code; | 409 std::string auth_code; |
| 403 if (!message->GetString("authorizationCode", &auth_code)) { | 410 if (!message->GetString("authorizationCode", &auth_code)) { |
| 404 LOG(ERROR) << "'authorizationCode' string not found."; | 411 LOG(ERROR) << "'authorizationCode' string not found."; |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 421 void Me2MeNativeMessagingHost::SendConfigResponse( | 428 void Me2MeNativeMessagingHost::SendConfigResponse( |
| 422 scoped_ptr<base::DictionaryValue> response, | 429 scoped_ptr<base::DictionaryValue> response, |
| 423 scoped_ptr<base::DictionaryValue> config) { | 430 scoped_ptr<base::DictionaryValue> config) { |
| 424 DCHECK(thread_checker_.CalledOnValidThread()); | 431 DCHECK(thread_checker_.CalledOnValidThread()); |
| 425 | 432 |
| 426 if (config) { | 433 if (config) { |
| 427 response->Set("config", config.release()); | 434 response->Set("config", config.release()); |
| 428 } else { | 435 } else { |
| 429 response->Set("config", base::Value::CreateNullValue()); | 436 response->Set("config", base::Value::CreateNullValue()); |
| 430 } | 437 } |
| 431 channel_->SendMessage(response.Pass()); | 438 channel_->SendMessage(response.PassAs<base::Value>()); |
| 432 } | 439 } |
| 433 | 440 |
| 434 void Me2MeNativeMessagingHost::SendPairedClientsResponse( | 441 void Me2MeNativeMessagingHost::SendPairedClientsResponse( |
| 435 scoped_ptr<base::DictionaryValue> response, | 442 scoped_ptr<base::DictionaryValue> response, |
| 436 scoped_ptr<base::ListValue> pairings) { | 443 scoped_ptr<base::ListValue> pairings) { |
| 437 DCHECK(thread_checker_.CalledOnValidThread()); | 444 DCHECK(thread_checker_.CalledOnValidThread()); |
| 438 | 445 |
| 439 response->Set("pairedClients", pairings.release()); | 446 response->Set("pairedClients", pairings.release()); |
| 440 channel_->SendMessage(response.Pass()); | 447 channel_->SendMessage(response.PassAs<base::Value>()); |
| 441 } | 448 } |
| 442 | 449 |
| 443 void Me2MeNativeMessagingHost::SendUsageStatsConsentResponse( | 450 void Me2MeNativeMessagingHost::SendUsageStatsConsentResponse( |
| 444 scoped_ptr<base::DictionaryValue> response, | 451 scoped_ptr<base::DictionaryValue> response, |
| 445 const DaemonController::UsageStatsConsent& consent) { | 452 const DaemonController::UsageStatsConsent& consent) { |
| 446 DCHECK(thread_checker_.CalledOnValidThread()); | 453 DCHECK(thread_checker_.CalledOnValidThread()); |
| 447 | 454 |
| 448 response->SetBoolean("supported", consent.supported); | 455 response->SetBoolean("supported", consent.supported); |
| 449 response->SetBoolean("allowed", consent.allowed); | 456 response->SetBoolean("allowed", consent.allowed); |
| 450 response->SetBoolean("setByPolicy", consent.set_by_policy); | 457 response->SetBoolean("setByPolicy", consent.set_by_policy); |
| 451 channel_->SendMessage(response.Pass()); | 458 channel_->SendMessage(response.PassAs<base::Value>()); |
| 452 } | 459 } |
| 453 | 460 |
| 454 void Me2MeNativeMessagingHost::SendAsyncResult( | 461 void Me2MeNativeMessagingHost::SendAsyncResult( |
| 455 scoped_ptr<base::DictionaryValue> response, | 462 scoped_ptr<base::DictionaryValue> response, |
| 456 DaemonController::AsyncResult result) { | 463 DaemonController::AsyncResult result) { |
| 457 DCHECK(thread_checker_.CalledOnValidThread()); | 464 DCHECK(thread_checker_.CalledOnValidThread()); |
| 458 | 465 |
| 459 switch (result) { | 466 switch (result) { |
| 460 case DaemonController::RESULT_OK: | 467 case DaemonController::RESULT_OK: |
| 461 response->SetString("result", "OK"); | 468 response->SetString("result", "OK"); |
| 462 break; | 469 break; |
| 463 case DaemonController::RESULT_FAILED: | 470 case DaemonController::RESULT_FAILED: |
| 464 response->SetString("result", "FAILED"); | 471 response->SetString("result", "FAILED"); |
| 465 break; | 472 break; |
| 466 case DaemonController::RESULT_CANCELLED: | 473 case DaemonController::RESULT_CANCELLED: |
| 467 response->SetString("result", "CANCELLED"); | 474 response->SetString("result", "CANCELLED"); |
| 468 break; | 475 break; |
| 469 case DaemonController::RESULT_FAILED_DIRECTORY: | 476 case DaemonController::RESULT_FAILED_DIRECTORY: |
| 470 response->SetString("result", "FAILED_DIRECTORY"); | 477 response->SetString("result", "FAILED_DIRECTORY"); |
| 471 break; | 478 break; |
| 472 } | 479 } |
| 473 channel_->SendMessage(response.Pass()); | 480 channel_->SendMessage(response.PassAs<base::Value>()); |
| 474 } | 481 } |
| 475 | 482 |
| 476 void Me2MeNativeMessagingHost::SendBooleanResult( | 483 void Me2MeNativeMessagingHost::SendBooleanResult( |
| 477 scoped_ptr<base::DictionaryValue> response, bool result) { | 484 scoped_ptr<base::DictionaryValue> response, bool result) { |
| 478 DCHECK(thread_checker_.CalledOnValidThread()); | 485 DCHECK(thread_checker_.CalledOnValidThread()); |
| 479 | 486 |
| 480 response->SetBoolean("result", result); | 487 response->SetBoolean("result", result); |
| 481 channel_->SendMessage(response.Pass()); | 488 channel_->SendMessage(response.PassAs<base::Value>()); |
| 482 } | 489 } |
| 483 | 490 |
| 484 void Me2MeNativeMessagingHost::SendCredentialsResponse( | 491 void Me2MeNativeMessagingHost::SendCredentialsResponse( |
| 485 scoped_ptr<base::DictionaryValue> response, | 492 scoped_ptr<base::DictionaryValue> response, |
| 486 const std::string& user_email, | 493 const std::string& user_email, |
| 487 const std::string& refresh_token) { | 494 const std::string& refresh_token) { |
| 488 DCHECK(thread_checker_.CalledOnValidThread()); | 495 DCHECK(thread_checker_.CalledOnValidThread()); |
| 489 | 496 |
| 490 response->SetString("userEmail", user_email); | 497 response->SetString("userEmail", user_email); |
| 491 response->SetString("refreshToken", refresh_token); | 498 response->SetString("refreshToken", refresh_token); |
| 492 channel_->SendMessage(response.Pass()); | 499 channel_->SendMessage(response.PassAs<base::Value>()); |
| 493 } | 500 } |
| 494 | 501 |
| 495 void Me2MeNativeMessagingHost::OnError() { | 502 void Me2MeNativeMessagingHost::OnError() { |
| 496 // Trigger a host shutdown by sending a NULL message. | 503 // Trigger a host shutdown by sending a NULL message. |
| 497 channel_->SendMessage(scoped_ptr<base::DictionaryValue>()); | 504 channel_->SendMessage(scoped_ptr<base::Value>()); |
| 498 } | 505 } |
| 499 | 506 |
| 500 void Me2MeNativeMessagingHost::Stop() { | 507 void Me2MeNativeMessagingHost::Stop() { |
| 501 DCHECK(thread_checker_.CalledOnValidThread()); | 508 DCHECK(thread_checker_.CalledOnValidThread()); |
| 502 | 509 |
| 503 if (!quit_closure_.is_null()) | 510 if (!quit_closure_.is_null()) |
| 504 base::ResetAndReturn(&quit_closure_).Run(); | 511 base::ResetAndReturn(&quit_closure_).Run(); |
| 505 } | 512 } |
| 506 | 513 |
| 507 #if defined(OS_WIN) | 514 #if defined(OS_WIN) |
| 515 Me2MeNativeMessagingHost::ElevatedChannelEventHandler:: | |
| 516 ElevatedChannelEventHandler(Me2MeNativeMessagingHost* host) | |
| 517 : parent_(host) { | |
| 518 } | |
| 519 | |
| 520 void Me2MeNativeMessagingHost::ElevatedChannelEventHandler::OnMessage( | |
| 521 scoped_ptr<base::Value> message) { | |
| 522 DCHECK(parent_->thread_checker_.CalledOnValidThread()); | |
| 523 | |
| 524 // Simply pass along the response from the elevated host to the client. | |
| 525 parent_->channel_->SendMessage(message.Pass()); | |
| 526 } | |
| 527 | |
| 528 void Me2MeNativeMessagingHost::ElevatedChannelEventHandler::OnDisconnect() { | |
| 529 parent_->OnDisconnect(); | |
| 530 } | |
| 508 | 531 |
| 509 bool Me2MeNativeMessagingHost::DelegateToElevatedHost( | 532 bool Me2MeNativeMessagingHost::DelegateToElevatedHost( |
| 510 scoped_ptr<base::DictionaryValue> message) { | 533 scoped_ptr<base::DictionaryValue> message) { |
| 511 DCHECK(thread_checker_.CalledOnValidThread()); | 534 DCHECK(thread_checker_.CalledOnValidThread()); |
| 512 | 535 |
| 513 EnsureElevatedHostCreated(); | 536 EnsureElevatedHostCreated(); |
| 514 | 537 |
| 515 // elevated_channel_ will be null if user rejects the UAC request. | 538 // elevated_channel_ will be null if user rejects the UAC request. |
| 516 if (elevated_channel_) | 539 if (elevated_channel_) |
| 517 elevated_channel_->SendMessage(message.Pass()); | 540 elevated_channel_->SendMessage(message.PassAs<base::Value>()); |
| 518 | 541 |
| 519 return elevated_channel_ != NULL; | 542 return elevated_channel_ != NULL; |
| 520 } | 543 } |
| 521 | 544 |
| 522 void Me2MeNativeMessagingHost::EnsureElevatedHostCreated() { | 545 void Me2MeNativeMessagingHost::EnsureElevatedHostCreated() { |
| 523 DCHECK(thread_checker_.CalledOnValidThread()); | 546 DCHECK(thread_checker_.CalledOnValidThread()); |
| 524 DCHECK(needs_elevation_); | 547 DCHECK(needs_elevation_); |
| 525 | 548 |
| 526 if (elevated_channel_) | 549 if (elevated_channel_) |
| 527 return; | 550 return; |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 651 if (!::ConnectNamedPipe(delegate_read_handle.Get(), NULL)) { | 674 if (!::ConnectNamedPipe(delegate_read_handle.Get(), NULL)) { |
| 652 DWORD error = ::GetLastError(); | 675 DWORD error = ::GetLastError(); |
| 653 if (error != ERROR_PIPE_CONNECTED) { | 676 if (error != ERROR_PIPE_CONNECTED) { |
| 654 PLOG(ERROR) << "Unable to connect '" << output_pipe_name << "'"; | 677 PLOG(ERROR) << "Unable to connect '" << output_pipe_name << "'"; |
| 655 OnError(); | 678 OnError(); |
| 656 return; | 679 return; |
| 657 } | 680 } |
| 658 } | 681 } |
| 659 | 682 |
| 660 // Set up the native messaging channel to talk to the elevated host. | 683 // Set up the native messaging channel to talk to the elevated host. |
| 661 // Note that input for the elevate channel is output forthe elevated host. | 684 // Note that input for the elevated channel is output for the elevated host. |
| 662 elevated_channel_.reset(new NativeMessagingChannel( | 685 scoped_ptr<PipeMessagingChannel> channel( |
| 663 base::File(delegate_read_handle.Take()), | 686 new PipeMessagingChannel(base::File(delegate_read_handle.Take()), |
| 664 base::File(delegate_write_handle.Take()))); | 687 base::File(delegate_write_handle.Take()))); |
| 688 elevated_channel_.reset( | |
| 689 static_cast<extensions::NativeMessagingChannel*>(channel.release())); | |
|
Sergey Ulanov
2014/09/18 18:08:36
Why static_cast<> instead of PassAs<>? But I think
kelvinp
2014/09/18 19:03:50
Done.
| |
| 665 | 690 |
| 666 elevated_channel_->Start( | 691 elevated_channel_event_handler_.reset( |
| 667 base::Bind(&Me2MeNativeMessagingHost::ProcessDelegateResponse, weak_ptr_), | 692 new Me2MeNativeMessagingHost::ElevatedChannelEventHandler(this)); |
| 668 base::Bind(&Me2MeNativeMessagingHost::Stop, weak_ptr_)); | 693 elevated_channel_->Start(elevated_channel_event_handler_.get()); |
| 669 | 694 |
| 670 elevated_host_timer_.Start( | 695 elevated_host_timer_.Start( |
| 671 FROM_HERE, base::TimeDelta::FromSeconds(kElevatedHostTimeoutSeconds), | 696 FROM_HERE, base::TimeDelta::FromSeconds(kElevatedHostTimeoutSeconds), |
| 672 this, &Me2MeNativeMessagingHost::DisconnectElevatedHost); | 697 this, &Me2MeNativeMessagingHost::DisconnectElevatedHost); |
| 673 } | 698 } |
| 674 | 699 |
| 675 void Me2MeNativeMessagingHost::ProcessDelegateResponse( | |
| 676 scoped_ptr<base::DictionaryValue> message) { | |
| 677 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 678 | |
| 679 // Simply pass along the response from the elevated host to the client. | |
| 680 channel_->SendMessage(message.Pass()); | |
| 681 } | |
| 682 | |
| 683 void Me2MeNativeMessagingHost::DisconnectElevatedHost() { | 700 void Me2MeNativeMessagingHost::DisconnectElevatedHost() { |
| 684 DCHECK(thread_checker_.CalledOnValidThread()); | 701 DCHECK(thread_checker_.CalledOnValidThread()); |
| 685 | 702 |
| 686 // This will send an EOF to the elevated host, triggering its shutdown. | 703 // This will send an EOF to the elevated host, triggering its shutdown. |
| 687 elevated_channel_.reset(); | 704 elevated_channel_.reset(); |
| 688 } | 705 } |
| 689 | 706 |
| 690 #else // defined(OS_WIN) | 707 #else // defined(OS_WIN) |
| 691 | 708 |
| 692 bool Me2MeNativeMessagingHost::DelegateToElevatedHost( | 709 bool Me2MeNativeMessagingHost::DelegateToElevatedHost( |
| 693 scoped_ptr<base::DictionaryValue> message) { | 710 scoped_ptr<base::DictionaryValue> message) { |
| 694 NOTREACHED(); | 711 NOTREACHED(); |
| 695 return false; | 712 return false; |
| 696 } | 713 } |
| 697 | 714 |
| 698 #endif // !defined(OS_WIN) | 715 #endif // !defined(OS_WIN) |
| 699 | 716 |
| 700 } // namespace remoting | 717 } // namespace remoting |
| OLD | NEW |