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

Side by Side Diff: remoting/host/it2me/it2me_host.cc

Issue 2682473003: Add support for multiple allowed domains (Closed)
Patch Set: Created 3 years, 10 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 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 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 } 173 }
174 174
175 // Check the host domain policy. 175 // Check the host domain policy.
176 if (!required_host_domain_.empty() && 176 if (!required_host_domain_.empty() &&
177 !base::EndsWith(username_, std::string("@") + required_host_domain_, 177 !base::EndsWith(username_, std::string("@") + required_host_domain_,
178 base::CompareCase::INSENSITIVE_ASCII)) { 178 base::CompareCase::INSENSITIVE_ASCII)) {
179 SetState(kInvalidDomainError, ""); 179 SetState(kInvalidDomainError, "");
180 return; 180 return;
181 } 181 }
182 182
183 if (!required_host_domain_list_.empty()) {
184 bool matched = false;
185 for (const std::string& domain : required_client_domain_list_) {
186 if (base::EndsWith(username_, std::string("@") + domain,
187 base::CompareCase::INSENSITIVE_ASCII)) {
188 matched = true;
189 break;
190 }
191 }
192 if (!matched) {
193 SetState(kInvalidDomainError, "");
194 return;
195 }
196 }
197
183 // Generate a key pair for the Host to use. 198 // Generate a key pair for the Host to use.
184 // TODO(wez): Move this to the worker thread. 199 // TODO(wez): Move this to the worker thread.
185 host_key_pair_ = RsaKeyPair::Generate(); 200 host_key_pair_ = RsaKeyPair::Generate();
186 201
187 // Request registration of the host for support. 202 // Request registration of the host for support.
188 std::unique_ptr<RegisterSupportHostRequest> register_request( 203 std::unique_ptr<RegisterSupportHostRequest> register_request(
189 new RegisterSupportHostRequest( 204 new RegisterSupportHostRequest(
190 signal_strategy_.get(), host_key_pair_, directory_bot_jid_, 205 signal_strategy_.get(), host_key_pair_, directory_bot_jid_,
191 base::Bind(&It2MeHost::OnReceivedSupportID, base::Unretained(this)))); 206 base::Bind(&It2MeHost::OnReceivedSupportID, base::Unretained(this))));
192 207
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 329
315 bool nat_policy; 330 bool nat_policy;
316 if (policies->GetBoolean(policy::key::kRemoteAccessHostFirewallTraversal, 331 if (policies->GetBoolean(policy::key::kRemoteAccessHostFirewallTraversal,
317 &nat_policy)) { 332 &nat_policy)) {
318 UpdateNatPolicy(nat_policy); 333 UpdateNatPolicy(nat_policy);
319 } 334 }
320 std::string host_domain; 335 std::string host_domain;
321 if (policies->GetString(policy::key::kRemoteAccessHostDomain, &host_domain)) { 336 if (policies->GetString(policy::key::kRemoteAccessHostDomain, &host_domain)) {
322 UpdateHostDomainPolicy(host_domain); 337 UpdateHostDomainPolicy(host_domain);
323 } 338 }
339 const base::ListValue* host_domain_list;
340 if (policies->GetList(policy::key::kRemoteAccessHostDomainList,
341 &host_domain_list)) {
342 std::vector<std::string> host_domain_list_vector;
343 for (const auto& value : *host_domain_list) {
344 const base::StringValue* domain;
345 if(!value->GetAsString(&domain)) {
346 // Should be prevented by policy validation
347 DCHECK(false);
348 continue;
349 }
350 host_domain_list_vector.push_back(domain->GetString());
351 }
352 UpdateHostDomainListPolicy(std::move(host_domain_list_vector));
353 }
324 std::string client_domain; 354 std::string client_domain;
325 if (policies->GetString(policy::key::kRemoteAccessHostClientDomain, 355 if (policies->GetString(policy::key::kRemoteAccessHostClientDomain,
326 &client_domain)) { 356 &client_domain)) {
327 UpdateClientDomainPolicy(client_domain); 357 UpdateClientDomainPolicy(client_domain);
328 } 358 }
359 const base::ListValue* client_domain_list;
360 if (policies->GetList(policy::key::kRemoteAccessHostClientDomainList,
361 &client_domain_list)) {
362 std::vector<std::string> client_domain_list_vector;
363 for (const auto& value : *client_domain_list) {
364 const base::StringValue* domain;
365 if(!value->GetAsString(&domain)) {
366 // Should be prevented by policy validation
367 DCHECK(false);
368 continue;
369 }
370 client_domain_list_vector.push_back(domain->GetString());
371 }
372 UpdateClientDomainListPolicy(std::move(client_domain_list_vector));
373 }
329 374
330 policy_received_ = true; 375 policy_received_ = true;
331 376
332 if (!pending_connect_.is_null()) { 377 if (!pending_connect_.is_null()) {
333 base::ResetAndReturn(&pending_connect_).Run(); 378 base::ResetAndReturn(&pending_connect_).Run();
334 } 379 }
335 } 380 }
336 381
337 void It2MeHost::OnPolicyError() { 382 void It2MeHost::OnPolicyError() {
338 // TODO(lukasza): Report the policy error to the user. crbug.com/433009 383 // TODO(lukasza): Report the policy error to the user. crbug.com/433009
(...skipping 25 matching lines...) Expand all
364 VLOG(2) << "UpdateHostDomainPolicy: " << host_domain; 409 VLOG(2) << "UpdateHostDomainPolicy: " << host_domain;
365 410
366 // When setting a host domain policy, force disconnect any existing session. 411 // When setting a host domain policy, force disconnect any existing session.
367 if (!host_domain.empty() && IsRunning()) { 412 if (!host_domain.empty() && IsRunning()) {
368 DisconnectOnNetworkThread(); 413 DisconnectOnNetworkThread();
369 } 414 }
370 415
371 required_host_domain_ = host_domain; 416 required_host_domain_ = host_domain;
372 } 417 }
373 418
419 void It2MeHost::UpdateHostDomainListPolicy(
420 std::vector<std::string> host_domain_list) {
421 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread());
422
423 VLOG(2) << "UpdateHostDomainListPolicy: "
424 << base::JoinString(host_domain_list, ", ");
425
426 // When setting a host domain policy, force disconnect any existing session.
427 if (!host_domain_list.empty() && IsRunning()) {
428 DisconnectOnNetworkThread();
429 }
430
431 required_host_domain_list_ = std::move(host_domain_list);
432 }
433
374 void It2MeHost::UpdateClientDomainPolicy(const std::string& client_domain) { 434 void It2MeHost::UpdateClientDomainPolicy(const std::string& client_domain) {
375 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); 435 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread());
376 436
377 VLOG(2) << "UpdateClientDomainPolicy: " << client_domain; 437 VLOG(2) << "UpdateClientDomainPolicy: " << client_domain;
378 438
379 // When setting a client domain policy, disconnect any existing session. 439 // When setting a client domain policy, disconnect any existing session.
380 if (!client_domain.empty() && IsRunning()) { 440 if (!client_domain.empty() && IsRunning()) {
381 DisconnectOnNetworkThread(); 441 DisconnectOnNetworkThread();
382 } 442 }
383 443
384 required_client_domain_ = client_domain; 444 required_client_domain_ = client_domain;
385 } 445 }
386 446
447 void It2MeHost::UpdateClientDomainListPolicy(
448 std::vector<std::string> client_domain_list) {
449 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread());
450
451 VLOG(2) << "UpdateClientDomainListPolicy: "
452 << base::JoinString(client_domain_list, ", ");
453
454 // When setting a client domain policy, disconnect any existing session.
455 if (!client_domain_list.empty() && IsRunning()) {
456 DisconnectOnNetworkThread();
457 }
458
459 required_client_domain_list_ = std::move(client_domain_list);
460 }
461
387 void It2MeHost::SetState(It2MeHostState state, 462 void It2MeHost::SetState(It2MeHostState state,
388 const std::string& error_message) { 463 const std::string& error_message) {
389 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); 464 DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread());
390 465
391 switch (state_) { 466 switch (state_) {
392 case kDisconnected: 467 case kDisconnected:
393 DCHECK(state == kStarting || 468 DCHECK(state == kStarting ||
394 state == kError) << state; 469 state == kError) << state;
395 break; 470 break;
396 case kStarting: 471 case kStarting:
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 std::string("@") + required_client_domain_, 585 std::string("@") + required_client_domain_,
511 base::CompareCase::INSENSITIVE_ASCII)) { 586 base::CompareCase::INSENSITIVE_ASCII)) {
512 LOG(ERROR) << "Rejecting incoming connection from " << remote_jid 587 LOG(ERROR) << "Rejecting incoming connection from " << remote_jid
513 << ": Domain mismatch."; 588 << ": Domain mismatch.";
514 result_callback.Run(ValidationResult::ERROR_INVALID_ACCOUNT); 589 result_callback.Run(ValidationResult::ERROR_INVALID_ACCOUNT);
515 DisconnectOnNetworkThread(); 590 DisconnectOnNetworkThread();
516 return; 591 return;
517 } 592 }
518 } 593 }
519 594
595 if (!required_client_domain_list_.empty()) {
596 bool matched = false;
597 for (const std::string& domain : required_client_domain_list_) {
598 if (base::EndsWith(client_username, std::string("@") + domain,
599 base::CompareCase::INSENSITIVE_ASCII)) {
600 matched = true;
601 break;
602 }
603 }
604 if (!matched) {
605 LOG(ERROR) << "Rejecting incoming connection from " << remote_jid
606 << ": Domain not allowed.";
607 result_callback.Run(ValidationResult::ERROR_INVALID_ACCOUNT);
608 DisconnectOnNetworkThread();
609 return;
610 }
611 }
612
520 HOST_LOG << "Client " << client_username << " connecting."; 613 HOST_LOG << "Client " << client_username << " connecting.";
521 SetState(kConnecting, std::string()); 614 SetState(kConnecting, std::string());
522 615
523 // Show a confirmation dialog to the user to allow them to confirm/reject it. 616 // Show a confirmation dialog to the user to allow them to confirm/reject it.
524 confirmation_dialog_proxy_.reset(new It2MeConfirmationDialogProxy( 617 confirmation_dialog_proxy_.reset(new It2MeConfirmationDialogProxy(
525 host_context_->ui_task_runner(), std::move(confirmation_dialog_))); 618 host_context_->ui_task_runner(), std::move(confirmation_dialog_)));
526 619
527 confirmation_dialog_proxy_->Show( 620 confirmation_dialog_proxy_->Show(
528 client_username, base::Bind(&It2MeHost::OnConfirmationResult, 621 client_username, base::Bind(&It2MeHost::OnConfirmationResult,
529 base::Unretained(this), result_callback)); 622 base::Unretained(this), result_callback));
(...skipping 30 matching lines...) Expand all
560 DCHECK(context->ui_task_runner()->BelongsToCurrentThread()); 653 DCHECK(context->ui_task_runner()->BelongsToCurrentThread());
561 654
562 std::unique_ptr<PolicyWatcher> policy_watcher = 655 std::unique_ptr<PolicyWatcher> policy_watcher =
563 PolicyWatcher::Create(policy_service, context->file_task_runner()); 656 PolicyWatcher::Create(policy_service, context->file_task_runner());
564 return new It2MeHost(std::move(context), std::move(policy_watcher), 657 return new It2MeHost(std::move(context), std::move(policy_watcher),
565 It2MeConfirmationDialog::Create(), observer, 658 It2MeConfirmationDialog::Create(), observer,
566 std::move(signal_strategy), username, directory_bot_jid); 659 std::move(signal_strategy), username, directory_bot_jid);
567 } 660 }
568 661
569 } // namespace remoting 662 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698