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 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
167 | 167 |
168 void It2MeHost::FinishConnect() { | 168 void It2MeHost::FinishConnect() { |
169 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); | 169 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); |
170 | 170 |
171 if (state_ != kStarting) { | 171 if (state_ != kStarting) { |
172 // Host has been stopped while we were fetching policy. | 172 // Host has been stopped while we were fetching policy. |
173 return; | 173 return; |
174 } | 174 } |
175 | 175 |
176 // Check the host domain policy. | 176 // Check the host domain policy. |
177 if (!required_host_domain_.empty() && | 177 if (!required_host_domain_list_.empty()) { |
178 !base::EndsWith(username_, std::string("@") + required_host_domain_, | 178 bool matched = false; |
179 base::CompareCase::INSENSITIVE_ASCII)) { | 179 for (const std::string& domain : required_host_domain_list_) { |
Jamie
2017/04/19 00:29:02
Can this be "const auto&"?
rkjnsn
2017/04/19 16:45:26
If you think that's more readable.
Jamie
2017/04/19 16:55:47
Being explicit about the type doesn't add to reada
rkjnsn
2017/04/19 18:24:06
The style guide says it is "permitted when it incr
| |
180 SetState(kInvalidDomainError, ""); | 180 if (base::EndsWith(username_, std::string("@") + domain, |
181 return; | 181 base::CompareCase::INSENSITIVE_ASCII)) { |
182 matched = true; | |
183 break; | |
184 } | |
185 } | |
186 if (!matched) { | |
187 SetState(kInvalidDomainError, ""); | |
188 return; | |
189 } | |
182 } | 190 } |
183 | 191 |
184 // Generate a key pair for the Host to use. | 192 // Generate a key pair for the Host to use. |
185 // TODO(wez): Move this to the worker thread. | 193 // TODO(wez): Move this to the worker thread. |
186 host_key_pair_ = RsaKeyPair::Generate(); | 194 host_key_pair_ = RsaKeyPair::Generate(); |
187 | 195 |
188 // Request registration of the host for support. | 196 // Request registration of the host for support. |
189 std::unique_ptr<RegisterSupportHostRequest> register_request( | 197 std::unique_ptr<RegisterSupportHostRequest> register_request( |
190 new RegisterSupportHostRequest( | 198 new RegisterSupportHostRequest( |
191 signal_strategy_.get(), host_key_pair_, directory_bot_jid_, | 199 signal_strategy_.get(), host_key_pair_, directory_bot_jid_, |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
307 FROM_HERE, | 315 FROM_HERE, |
308 base::Bind(&It2MeHost::OnPolicyUpdate, this, base::Passed(&policies))); | 316 base::Bind(&It2MeHost::OnPolicyUpdate, this, base::Passed(&policies))); |
309 return; | 317 return; |
310 } | 318 } |
311 | 319 |
312 bool nat_policy; | 320 bool nat_policy; |
313 if (policies->GetBoolean(policy::key::kRemoteAccessHostFirewallTraversal, | 321 if (policies->GetBoolean(policy::key::kRemoteAccessHostFirewallTraversal, |
314 &nat_policy)) { | 322 &nat_policy)) { |
315 UpdateNatPolicy(nat_policy); | 323 UpdateNatPolicy(nat_policy); |
316 } | 324 } |
317 std::string host_domain; | 325 const base::ListValue* host_domain_list; |
318 if (policies->GetString(policy::key::kRemoteAccessHostDomain, &host_domain)) { | 326 if (policies->GetList(policy::key::kRemoteAccessHostDomainList, |
319 UpdateHostDomainPolicy(host_domain); | 327 &host_domain_list)) { |
328 std::vector<std::string> host_domain_list_vector; | |
329 for (const auto& value : *host_domain_list) { | |
330 host_domain_list_vector.push_back(value.GetString()); | |
331 } | |
332 UpdateHostDomainListPolicy(std::move(host_domain_list_vector)); | |
Jamie
2017/04/19 00:29:02
Don't need move() if you pass by const reference.
rkjnsn
2017/04/19 18:24:06
True, but that would guarantee that that vector wo
Jamie
2017/04/19 19:21:06
Thanks for the detailed follow-up. I am happy for
| |
320 } | 333 } |
321 std::string client_domain; | 334 const base::ListValue* client_domain_list; |
322 if (policies->GetString(policy::key::kRemoteAccessHostClientDomain, | 335 if (policies->GetList(policy::key::kRemoteAccessHostClientDomainList, |
323 &client_domain)) { | 336 &client_domain_list)) { |
324 UpdateClientDomainPolicy(client_domain); | 337 std::vector<std::string> client_domain_list_vector; |
338 for (const auto& value : *client_domain_list) { | |
339 client_domain_list_vector.push_back(value.GetString()); | |
340 } | |
341 UpdateClientDomainListPolicy(std::move(client_domain_list_vector)); | |
325 } | 342 } |
326 | 343 |
327 policy_received_ = true; | 344 policy_received_ = true; |
328 | 345 |
329 if (!pending_connect_.is_null()) { | 346 if (!pending_connect_.is_null()) { |
330 base::ResetAndReturn(&pending_connect_).Run(); | 347 base::ResetAndReturn(&pending_connect_).Run(); |
331 } | 348 } |
332 } | 349 } |
333 | 350 |
334 void It2MeHost::OnPolicyError() { | 351 void It2MeHost::OnPolicyError() { |
(...skipping 13 matching lines...) Expand all Loading... | |
348 } | 365 } |
349 | 366 |
350 nat_traversal_enabled_ = nat_traversal_enabled; | 367 nat_traversal_enabled_ = nat_traversal_enabled; |
351 | 368 |
352 // Notify the web-app of the policy setting. | 369 // Notify the web-app of the policy setting. |
353 host_context_->ui_task_runner()->PostTask( | 370 host_context_->ui_task_runner()->PostTask( |
354 FROM_HERE, base::Bind(&It2MeHost::Observer::OnNatPolicyChanged, observer_, | 371 FROM_HERE, base::Bind(&It2MeHost::Observer::OnNatPolicyChanged, observer_, |
355 nat_traversal_enabled_)); | 372 nat_traversal_enabled_)); |
356 } | 373 } |
357 | 374 |
358 void It2MeHost::UpdateHostDomainPolicy(const std::string& host_domain) { | 375 void It2MeHost::UpdateHostDomainListPolicy( |
376 std::vector<std::string> host_domain_list) { | |
359 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); | 377 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); |
360 | 378 |
361 VLOG(2) << "UpdateHostDomainPolicy: " << host_domain; | 379 VLOG(2) << "UpdateHostDomainListPolicy: " |
380 << base::JoinString(host_domain_list, ", "); | |
362 | 381 |
363 // When setting a host domain policy, force disconnect any existing session. | 382 // When setting a host domain policy, force disconnect any existing session. |
364 if (!host_domain.empty() && IsRunning()) { | 383 if (!host_domain_list.empty() && IsRunning()) { |
365 DisconnectOnNetworkThread(); | 384 DisconnectOnNetworkThread(); |
366 } | 385 } |
367 | 386 |
368 required_host_domain_ = host_domain; | 387 required_host_domain_list_ = std::move(host_domain_list); |
369 } | 388 } |
370 | 389 |
371 void It2MeHost::UpdateClientDomainPolicy(const std::string& client_domain) { | 390 void It2MeHost::UpdateClientDomainListPolicy( |
391 std::vector<std::string> client_domain_list) { | |
372 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); | 392 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); |
373 | 393 |
374 VLOG(2) << "UpdateClientDomainPolicy: " << client_domain; | 394 VLOG(2) << "UpdateClientDomainPolicy: " |
395 << base::JoinString(client_domain_list, ", "); | |
375 | 396 |
376 // When setting a client domain policy, disconnect any existing session. | 397 // When setting a client domain policy, disconnect any existing session. |
377 if (!client_domain.empty() && IsRunning()) { | 398 if (!client_domain_list.empty() && IsRunning()) { |
378 DisconnectOnNetworkThread(); | 399 DisconnectOnNetworkThread(); |
379 } | 400 } |
380 | 401 |
381 required_client_domain_ = client_domain; | 402 required_client_domain_list_ = client_domain_list; |
382 } | 403 } |
383 | 404 |
384 void It2MeHost::SetState(It2MeHostState state, | 405 void It2MeHost::SetState(It2MeHostState state, |
385 const std::string& error_message) { | 406 const std::string& error_message) { |
386 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); | 407 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); |
387 | 408 |
388 switch (state_) { | 409 switch (state_) { |
389 case kDisconnected: | 410 case kDisconnected: |
390 DCHECK(state == kStarting || | 411 DCHECK(state == kStarting || |
391 state == kError) << state; | 412 state == kError) << state; |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
495 | 516 |
496 if (client_username.empty()) { | 517 if (client_username.empty()) { |
497 LOG(ERROR) << "Invalid user name passed in: " << remote_jid; | 518 LOG(ERROR) << "Invalid user name passed in: " << remote_jid; |
498 result_callback.Run( | 519 result_callback.Run( |
499 protocol::ValidatingAuthenticator::Result::ERROR_INVALID_ACCOUNT); | 520 protocol::ValidatingAuthenticator::Result::ERROR_INVALID_ACCOUNT); |
500 DisconnectOnNetworkThread(); | 521 DisconnectOnNetworkThread(); |
501 return; | 522 return; |
502 } | 523 } |
503 | 524 |
504 // Check the client domain policy. | 525 // Check the client domain policy. |
505 if (!required_client_domain_.empty()) { | 526 if (!required_client_domain_list_.empty()) { |
506 if (!base::EndsWith(client_username, | 527 bool matched = false; |
507 std::string("@") + required_client_domain_, | 528 for (const std::string& domain : required_client_domain_list_) { |
Jamie
2017/04/19 00:29:02
auto?
| |
508 base::CompareCase::INSENSITIVE_ASCII)) { | 529 if (base::EndsWith(client_username, std::string("@") + domain, |
530 base::CompareCase::INSENSITIVE_ASCII)) { | |
531 matched = true; | |
532 break; | |
533 } | |
534 } | |
535 if (!matched) { | |
509 LOG(ERROR) << "Rejecting incoming connection from " << remote_jid | 536 LOG(ERROR) << "Rejecting incoming connection from " << remote_jid |
510 << ": Domain mismatch."; | 537 << ": Domain not allowed."; |
511 result_callback.Run(ValidationResult::ERROR_INVALID_ACCOUNT); | 538 result_callback.Run(ValidationResult::ERROR_INVALID_ACCOUNT); |
512 DisconnectOnNetworkThread(); | 539 DisconnectOnNetworkThread(); |
513 return; | 540 return; |
514 } | 541 } |
515 } | 542 } |
516 | 543 |
517 // If we receive valid connection details multiple times, then we don't know | 544 // If we receive valid connection details multiple times, then we don't know |
518 // which remote user (if either) is valid so disconnect everyone. | 545 // which remote user (if either) is valid so disconnect everyone. |
519 if (state_ != kReceivedAccessCode) { | 546 if (state_ != kReceivedAccessCode) { |
520 DCHECK_EQ(kConnecting, state_); | 547 DCHECK_EQ(kConnecting, state_); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
570 | 597 |
571 std::unique_ptr<PolicyWatcher> policy_watcher = | 598 std::unique_ptr<PolicyWatcher> policy_watcher = |
572 PolicyWatcher::Create(policy_service, context->file_task_runner()); | 599 PolicyWatcher::Create(policy_service, context->file_task_runner()); |
573 return new It2MeHost(std::move(context), std::move(policy_watcher), | 600 return new It2MeHost(std::move(context), std::move(policy_watcher), |
574 base::MakeUnique<It2MeConfirmationDialogFactory>(), | 601 base::MakeUnique<It2MeConfirmationDialogFactory>(), |
575 observer, std::move(signal_strategy), username, | 602 observer, std::move(signal_strategy), username, |
576 directory_bot_jid); | 603 directory_bot_jid); |
577 } | 604 } |
578 | 605 |
579 } // namespace remoting | 606 } // namespace remoting |
OLD | NEW |