Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "chrome/browser/extensions/api/socket/socket_api.h" | 5 #include "chrome/browser/extensions/api/socket/socket_api.h" |
| 6 | 6 |
| 7 #include <vector> | |
| 8 | |
| 7 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/hash_tables.h" | |
| 8 #include "chrome/common/extensions/extension.h" | 11 #include "chrome/common/extensions/extension.h" |
| 9 #include "chrome/common/extensions/permissions/socket_permission.h" | 12 #include "chrome/common/extensions/permissions/socket_permission.h" |
| 10 #include "chrome/browser/browser_process.h" | 13 #include "chrome/browser/browser_process.h" |
| 11 #include "chrome/browser/extensions/api/dns/host_resolver_wrapper.h" | 14 #include "chrome/browser/extensions/api/dns/host_resolver_wrapper.h" |
| 12 #include "chrome/browser/extensions/api/socket/socket.h" | 15 #include "chrome/browser/extensions/api/socket/socket.h" |
| 13 #include "chrome/browser/extensions/api/socket/tcp_socket.h" | 16 #include "chrome/browser/extensions/api/socket/tcp_socket.h" |
| 14 #include "chrome/browser/extensions/api/socket/udp_socket.h" | 17 #include "chrome/browser/extensions/api/socket/udp_socket.h" |
| 15 #include "chrome/browser/extensions/extension_system.h" | 18 #include "chrome/browser/extensions/extension_system.h" |
| 16 #include "chrome/browser/io_thread.h" | 19 #include "chrome/browser/io_thread.h" |
| 17 #include "net/base/host_port_pair.h" | 20 #include "net/base/host_port_pair.h" |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 31 const char kDataKey[] = "data"; | 34 const char kDataKey[] = "data"; |
| 32 const char kResultCodeKey[] = "resultCode"; | 35 const char kResultCodeKey[] = "resultCode"; |
| 33 const char kSocketIdKey[] = "socketId"; | 36 const char kSocketIdKey[] = "socketId"; |
| 34 | 37 |
| 35 const char kSocketNotFoundError[] = "Socket not found"; | 38 const char kSocketNotFoundError[] = "Socket not found"; |
| 36 const char kDnsLookupFailedError[] = "DNS resolution failed"; | 39 const char kDnsLookupFailedError[] = "DNS resolution failed"; |
| 37 const char kPermissionError[] = "App does not have permission"; | 40 const char kPermissionError[] = "App does not have permission"; |
| 38 const char kNetworkListError[] = "Network lookup failed or unsupported"; | 41 const char kNetworkListError[] = "Network lookup failed or unsupported"; |
| 39 const char kTCPSocketBindError[] = | 42 const char kTCPSocketBindError[] = |
| 40 "TCP socket does not support bind. For TCP server please use listen."; | 43 "TCP socket does not support bind. For TCP server please use listen."; |
| 44 const char kMulticastSocketTypeError[] = | |
| 45 "Only UDP socket supports multicast."; | |
| 46 const char kWildcardArress[] = "*"; | |
|
miket_OOO
2013/04/25 21:52:12
I think this word is supposed to be "Address"
Bei Zhang
2013/04/25 23:56:21
Done.
| |
| 47 const int kWildcardPortNumber = 0; | |
|
miket_OOO
2013/04/25 21:52:12
"Port Number" is overly descriptive. Just "Port" w
Bei Zhang
2013/04/25 23:56:21
Done.
| |
| 41 | 48 |
| 42 SocketAsyncApiFunction::SocketAsyncApiFunction() | 49 SocketAsyncApiFunction::SocketAsyncApiFunction() |
| 43 : manager_(NULL) { | 50 : manager_(NULL) { |
| 44 } | 51 } |
| 45 | 52 |
| 46 SocketAsyncApiFunction::~SocketAsyncApiFunction() { | 53 SocketAsyncApiFunction::~SocketAsyncApiFunction() { |
| 47 } | 54 } |
| 48 | 55 |
| 49 bool SocketAsyncApiFunction::PrePrepare() { | 56 bool SocketAsyncApiFunction::PrePrepare() { |
| 50 manager_ = ExtensionSystem::Get(profile())->socket_manager(); | 57 manager_ = ExtensionSystem::Get(profile())->socket_manager(); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 152 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &socket_id_)); | 159 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &socket_id_)); |
| 153 return true; | 160 return true; |
| 154 } | 161 } |
| 155 | 162 |
| 156 void SocketDestroyFunction::Work() { | 163 void SocketDestroyFunction::Work() { |
| 157 RemoveSocket(socket_id_); | 164 RemoveSocket(socket_id_); |
| 158 } | 165 } |
| 159 | 166 |
| 160 SocketConnectFunction::SocketConnectFunction() | 167 SocketConnectFunction::SocketConnectFunction() |
| 161 : socket_id_(0), | 168 : socket_id_(0), |
| 162 port_(0) { | 169 hostname_(), |
| 170 port_(0), | |
| 171 socket_(NULL) { | |
| 163 } | 172 } |
| 164 | 173 |
| 165 SocketConnectFunction::~SocketConnectFunction() { | 174 SocketConnectFunction::~SocketConnectFunction() { |
| 166 } | 175 } |
| 167 | 176 |
| 168 bool SocketConnectFunction::Prepare() { | 177 bool SocketConnectFunction::Prepare() { |
| 169 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &socket_id_)); | 178 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &socket_id_)); |
| 170 EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &hostname_)); | 179 EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &hostname_)); |
| 171 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(2, &port_)); | 180 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(2, &port_)); |
| 172 return true; | 181 return true; |
| (...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 469 result->SetInteger(kPortKey, port); | 478 result->SetInteger(kPortKey, port); |
| 470 SetResult(result); | 479 SetResult(result); |
| 471 | 480 |
| 472 AsyncWorkCompleted(); | 481 AsyncWorkCompleted(); |
| 473 } | 482 } |
| 474 | 483 |
| 475 SocketSendToFunction::SocketSendToFunction() | 484 SocketSendToFunction::SocketSendToFunction() |
| 476 : socket_id_(0), | 485 : socket_id_(0), |
| 477 io_buffer_(NULL), | 486 io_buffer_(NULL), |
| 478 io_buffer_size_(0), | 487 io_buffer_size_(0), |
| 479 port_(0) { | 488 port_(0), |
| 489 socket_(NULL) { | |
| 480 } | 490 } |
| 481 | 491 |
| 482 SocketSendToFunction::~SocketSendToFunction() {} | 492 SocketSendToFunction::~SocketSendToFunction() {} |
| 483 | 493 |
| 484 bool SocketSendToFunction::Prepare() { | 494 bool SocketSendToFunction::Prepare() { |
| 485 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &socket_id_)); | 495 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &socket_id_)); |
| 486 base::BinaryValue *data = NULL; | 496 base::BinaryValue *data = NULL; |
| 487 EXTENSION_FUNCTION_VALIDATE(args_->GetBinary(1, &data)); | 497 EXTENSION_FUNCTION_VALIDATE(args_->GetBinary(1, &data)); |
| 488 EXTENSION_FUNCTION_VALIDATE(args_->GetString(2, &hostname_)); | 498 EXTENSION_FUNCTION_VALIDATE(args_->GetString(2, &hostname_)); |
| 489 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(3, &port_)); | 499 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(3, &port_)); |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 673 make_linked_ptr(new api::socket::NetworkInterface); | 683 make_linked_ptr(new api::socket::NetworkInterface); |
| 674 info->name = i->name; | 684 info->name = i->name; |
| 675 info->address = net::IPAddressToString(i->address); | 685 info->address = net::IPAddressToString(i->address); |
| 676 create_arg.push_back(info); | 686 create_arg.push_back(info); |
| 677 } | 687 } |
| 678 | 688 |
| 679 results_ = api::socket::GetNetworkList::Results::Create(create_arg); | 689 results_ = api::socket::GetNetworkList::Results::Create(create_arg); |
| 680 SendResponse(true); | 690 SendResponse(true); |
| 681 } | 691 } |
| 682 | 692 |
| 693 SocketJoinGroupFunction::SocketJoinGroupFunction() | |
| 694 : params_(NULL) {} | |
| 695 | |
| 696 SocketJoinGroupFunction::~SocketJoinGroupFunction() {} | |
| 697 | |
| 698 bool SocketJoinGroupFunction::Prepare() { | |
| 699 params_ = api::socket::JoinGroup::Params::Create(*args_); | |
| 700 EXTENSION_FUNCTION_VALIDATE(params_.get()); | |
| 701 return true; | |
| 702 } | |
| 703 | |
| 704 void SocketJoinGroupFunction::Work() { | |
| 705 int result = -1; | |
| 706 Socket* socket = GetSocket(params_->socket_id); | |
| 707 if (!socket) { | |
| 708 error_ = kSocketNotFoundError; | |
| 709 SetResult(Value::CreateIntegerValue(result)); | |
| 710 return; | |
| 711 } | |
| 712 | |
| 713 if (socket->GetSocketType() == Socket::TYPE_UDP) { | |
| 714 SocketPermission::CheckParam param( | |
| 715 SocketPermissionRequest::UDP_MUTICAST_MEMBERSHIP, | |
|
miket_OOO
2013/04/25 21:52:12
Spelling: MULTICAST
Bei Zhang
2013/04/25 23:56:21
Done.
| |
| 716 kWildcardArress, | |
| 717 kWildcardPortNumber); | |
| 718 if (!GetExtension()->CheckAPIPermissionWithParam(APIPermission::kSocket, | |
| 719 ¶m)) { | |
| 720 error_ = kPermissionError; | |
| 721 SetResult(Value::CreateIntegerValue(result)); | |
| 722 return; | |
| 723 } | |
| 724 } else { | |
|
miket_OOO
2013/04/25 21:52:12
I wouldn't put this in an else, because it's going
Bei Zhang
2013/04/25 23:56:21
Done.
| |
| 725 error_ = kMulticastSocketTypeError; | |
| 726 SetResult(Value::CreateIntegerValue(result)); | |
| 727 return; | |
| 728 } | |
| 729 | |
| 730 result = static_cast<UDPSocket*>(socket)->JoinGroup(params_->address); | |
| 731 if (result != 0) { | |
| 732 error_ = net::ErrorToString(result); | |
| 733 } | |
| 734 SetResult(Value::CreateIntegerValue(result)); | |
| 735 } | |
| 736 | |
| 737 | |
| 738 SocketLeaveGroupFunction::SocketLeaveGroupFunction() | |
| 739 : params_(NULL) {} | |
| 740 | |
| 741 SocketLeaveGroupFunction::~SocketLeaveGroupFunction() {} | |
| 742 | |
| 743 bool SocketLeaveGroupFunction::Prepare() { | |
| 744 params_ = api::socket::LeaveGroup::Params::Create(*args_); | |
| 745 EXTENSION_FUNCTION_VALIDATE(params_.get()); | |
| 746 return true; | |
| 747 } | |
| 748 | |
| 749 void SocketLeaveGroupFunction::Work() { | |
| 750 int result = -1; | |
| 751 Socket* socket = GetSocket(params_->socket_id); | |
| 752 | |
| 753 if (!socket) { | |
| 754 error_ = kSocketNotFoundError; | |
| 755 SetResult(Value::CreateIntegerValue(result)); | |
| 756 return; | |
| 757 } | |
| 758 | |
| 759 if (socket->GetSocketType() == Socket::TYPE_UDP) { | |
|
miket_OOO
2013/04/25 21:52:12
Same here -- rearrange so obvious validation failu
Bei Zhang
2013/04/25 23:56:21
Done.
| |
| 760 SocketPermission::CheckParam param( | |
| 761 SocketPermissionRequest::UDP_MUTICAST_MEMBERSHIP, | |
| 762 kWildcardArress, | |
| 763 kWildcardPortNumber); | |
| 764 if (!GetExtension()->CheckAPIPermissionWithParam(APIPermission::kSocket, | |
| 765 ¶m)) { | |
| 766 error_ = kPermissionError; | |
| 767 SetResult(Value::CreateIntegerValue(result)); | |
| 768 return; | |
| 769 } | |
| 770 } else { | |
| 771 error_ = kMulticastSocketTypeError; | |
| 772 SetResult(Value::CreateIntegerValue(result)); | |
| 773 return; | |
| 774 } | |
| 775 | |
| 776 result = static_cast<UDPSocket*>(socket)->LeaveGroup(params_->address); | |
| 777 if (result != 0) | |
| 778 error_ = net::ErrorToString(result); | |
| 779 SetResult(Value::CreateIntegerValue(result)); | |
| 780 } | |
| 781 | |
| 782 SocketSetMulticastTimeToLiveFunction::SocketSetMulticastTimeToLiveFunction() | |
| 783 : params_(NULL) {} | |
| 784 | |
| 785 SocketSetMulticastTimeToLiveFunction::~SocketSetMulticastTimeToLiveFunction() {} | |
| 786 | |
| 787 bool SocketSetMulticastTimeToLiveFunction::Prepare() { | |
| 788 params_ = api::socket::SetMulticastTimeToLive::Params::Create(*args_); | |
| 789 EXTENSION_FUNCTION_VALIDATE(params_.get()); | |
| 790 return true; | |
| 791 } | |
| 792 void SocketSetMulticastTimeToLiveFunction::Work() { | |
| 793 int result = -1; | |
| 794 Socket* socket = GetSocket(params_->socket_id); | |
| 795 if (!socket) { | |
| 796 error_ = kSocketNotFoundError; | |
| 797 SetResult(Value::CreateIntegerValue(result)); | |
| 798 return; | |
| 799 } | |
| 800 | |
| 801 if (socket->GetSocketType() == Socket::TYPE_UDP) { | |
|
miket_OOO
2013/04/25 21:52:12
There's a bunch of boilerplate code here. What abo
Bei Zhang
2013/04/25 23:56:21
That'll be ideal. But I think maybe we should do i
| |
| 802 result = static_cast<UDPSocket*>(socket)-> | |
| 803 SetMulticastTimeToLive(params_->ttl); | |
| 804 if (result != 0) | |
| 805 error_ = net::ErrorToString(result); | |
| 806 SetResult(Value::CreateIntegerValue(result)); | |
| 807 } else { | |
| 808 error_ = kMulticastSocketTypeError; | |
| 809 } | |
| 810 SetResult(Value::CreateIntegerValue(result)); | |
| 811 } | |
| 812 | |
| 813 SocketSetMulticastLoopbackModeFunction::SocketSetMulticastLoopbackModeFunction() | |
| 814 : params_(NULL) {} | |
| 815 | |
| 816 SocketSetMulticastLoopbackModeFunction:: | |
| 817 ~SocketSetMulticastLoopbackModeFunction() {} | |
| 818 | |
| 819 bool SocketSetMulticastLoopbackModeFunction::Prepare() { | |
| 820 params_ = api::socket::SetMulticastLoopbackMode::Params::Create(*args_); | |
| 821 EXTENSION_FUNCTION_VALIDATE(params_.get()); | |
| 822 return true; | |
| 823 } | |
| 824 | |
| 825 void SocketSetMulticastLoopbackModeFunction::Work() { | |
| 826 int result = -1; | |
| 827 Socket* socket = GetSocket(params_->socket_id); | |
| 828 if (!socket) { | |
| 829 error_ = kSocketNotFoundError; | |
| 830 SetResult(Value::CreateIntegerValue(result)); | |
| 831 return; | |
| 832 } | |
| 833 | |
| 834 if (socket->GetSocketType() == Socket::TYPE_UDP) { | |
| 835 result = static_cast<UDPSocket*>(socket)-> | |
| 836 SetMulticastLoopbackMode(params_->enabled); | |
| 837 if (result != 0) | |
| 838 error_ = net::ErrorToString(result); | |
| 839 } else { | |
| 840 error_ = kMulticastSocketTypeError; | |
| 841 } | |
| 842 SetResult(Value::CreateIntegerValue(result)); | |
| 843 } | |
| 844 | |
| 845 SocketGetJoinedGroupsFunction::SocketGetJoinedGroupsFunction() | |
| 846 : params_(NULL) {} | |
| 847 | |
| 848 SocketGetJoinedGroupsFunction::~SocketGetJoinedGroupsFunction() {} | |
| 849 | |
| 850 bool SocketGetJoinedGroupsFunction::Prepare() { | |
| 851 params_ = api::socket::GetJoinedGroups::Params::Create(*args_); | |
| 852 EXTENSION_FUNCTION_VALIDATE(params_.get()); | |
| 853 return true; | |
| 854 } | |
| 855 | |
| 856 void SocketGetJoinedGroupsFunction::Work() { | |
| 857 int result = -1; | |
| 858 Socket* socket = GetSocket(params_->socket_id); | |
| 859 if (!socket) { | |
| 860 error_ = kSocketNotFoundError; | |
| 861 SetResult(Value::CreateIntegerValue(result)); | |
| 862 return; | |
| 863 } | |
| 864 | |
| 865 if (socket->GetSocketType() == Socket::TYPE_UDP) { | |
| 866 SocketPermission::CheckParam param( | |
| 867 SocketPermissionRequest::UDP_SEND_TO, | |
| 868 kWildcardArress, | |
| 869 kWildcardPortNumber); | |
| 870 if (!GetExtension()->CheckAPIPermissionWithParam(APIPermission::kSocket, | |
| 871 ¶m)) { | |
| 872 error_ = kPermissionError; | |
| 873 SetResult(Value::CreateIntegerValue(result)); | |
| 874 return; | |
| 875 } | |
| 876 } else { | |
| 877 error_ = kMulticastSocketTypeError; | |
| 878 SetResult(Value::CreateIntegerValue(result)); | |
| 879 return; | |
| 880 } | |
| 881 | |
| 882 base::hash_set<std::string> groups; | |
| 883 result = static_cast<UDPSocket*>(socket)->GetJoinedGroups(&groups); | |
| 884 if (result != 0) | |
| 885 error_ = net::ErrorToString(result); | |
| 886 base::ListValue* list = new base::ListValue(); | |
| 887 for (base::hash_set<std::string>::iterator it = groups.begin(); | |
| 888 it != groups.end(); ++it) { | |
| 889 list->AppendString(*it); | |
|
miket_OOO
2013/04/25 21:52:12
Please confirm that AppendString does a copy of th
Bei Zhang
2013/04/25 23:56:21
The copy cannot be avoided by changing the ownersh
| |
| 890 } | |
| 891 SetResult(list); | |
| 892 } | |
| 893 | |
| 683 } // namespace extensions | 894 } // namespace extensions |
| OLD | NEW |