| 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> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/hash_tables.h" | 10 #include "base/hash_tables.h" |
| 11 #include "chrome/common/extensions/extension.h" | |
| 12 #include "chrome/common/extensions/permissions/socket_permission.h" | |
| 13 #include "chrome/browser/browser_process.h" | 11 #include "chrome/browser/browser_process.h" |
| 14 #include "chrome/browser/extensions/api/dns/host_resolver_wrapper.h" | 12 #include "chrome/browser/extensions/api/dns/host_resolver_wrapper.h" |
| 15 #include "chrome/browser/extensions/api/socket/socket.h" | 13 #include "chrome/browser/extensions/api/socket/socket.h" |
| 16 #include "chrome/browser/extensions/api/socket/tcp_socket.h" | 14 #include "chrome/browser/extensions/api/socket/tcp_socket.h" |
| 17 #include "chrome/browser/extensions/api/socket/udp_socket.h" | 15 #include "chrome/browser/extensions/api/socket/udp_socket.h" |
| 18 #include "chrome/browser/extensions/extension_system.h" | 16 #include "chrome/browser/extensions/extension_system.h" |
| 19 #include "chrome/browser/io_thread.h" | 17 #include "chrome/browser/io_thread.h" |
| 18 #include "chrome/common/extensions/extension.h" |
| 19 #include "chrome/common/extensions/permissions/permissions_data.h" |
| 20 #include "chrome/common/extensions/permissions/socket_permission.h" |
| 20 #include "net/base/host_port_pair.h" | 21 #include "net/base/host_port_pair.h" |
| 21 #include "net/base/io_buffer.h" | 22 #include "net/base/io_buffer.h" |
| 22 #include "net/base/ip_endpoint.h" | 23 #include "net/base/ip_endpoint.h" |
| 23 #include "net/base/net_errors.h" | 24 #include "net/base/net_errors.h" |
| 24 #include "net/base/net_log.h" | 25 #include "net/base/net_log.h" |
| 25 #include "net/base/net_util.h" | 26 #include "net/base/net_util.h" |
| 26 | 27 |
| 27 namespace extensions { | 28 namespace extensions { |
| 28 | 29 |
| 29 using content::SocketPermissionRequest; | 30 using content::SocketPermissionRequest; |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 case Socket::TYPE_UDP: | 199 case Socket::TYPE_UDP: |
| 199 operation_type = SocketPermissionRequest::UDP_SEND_TO; | 200 operation_type = SocketPermissionRequest::UDP_SEND_TO; |
| 200 break; | 201 break; |
| 201 default: | 202 default: |
| 202 NOTREACHED() << "Unknown socket type."; | 203 NOTREACHED() << "Unknown socket type."; |
| 203 operation_type = SocketPermissionRequest::NONE; | 204 operation_type = SocketPermissionRequest::NONE; |
| 204 break; | 205 break; |
| 205 } | 206 } |
| 206 | 207 |
| 207 SocketPermission::CheckParam param(operation_type, hostname_, port_); | 208 SocketPermission::CheckParam param(operation_type, hostname_, port_); |
| 208 if (!GetExtension()->CheckAPIPermissionWithParam(APIPermission::kSocket, | 209 if (!PermissionsData::CheckAPIPermissionWithParam( |
| 209 ¶m)) { | 210 GetExtension(), APIPermission::kSocket, ¶m)) { |
| 210 error_ = kPermissionError; | 211 error_ = kPermissionError; |
| 211 SetResult(Value::CreateIntegerValue(-1)); | 212 SetResult(Value::CreateIntegerValue(-1)); |
| 212 AsyncWorkCompleted(); | 213 AsyncWorkCompleted(); |
| 213 return; | 214 return; |
| 214 } | 215 } |
| 215 | 216 |
| 216 StartDnsLookup(hostname_); | 217 StartDnsLookup(hostname_); |
| 217 } | 218 } |
| 218 | 219 |
| 219 void SocketConnectFunction::AfterDnsLookup(int lookup_result) { | 220 void SocketConnectFunction::AfterDnsLookup(int lookup_result) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 | 263 |
| 263 if (!socket) { | 264 if (!socket) { |
| 264 error_ = kSocketNotFoundError; | 265 error_ = kSocketNotFoundError; |
| 265 SetResult(Value::CreateIntegerValue(result)); | 266 SetResult(Value::CreateIntegerValue(result)); |
| 266 return; | 267 return; |
| 267 } | 268 } |
| 268 | 269 |
| 269 if (socket->GetSocketType() == Socket::TYPE_UDP) { | 270 if (socket->GetSocketType() == Socket::TYPE_UDP) { |
| 270 SocketPermission::CheckParam param( | 271 SocketPermission::CheckParam param( |
| 271 SocketPermissionRequest::UDP_BIND, address_, port_); | 272 SocketPermissionRequest::UDP_BIND, address_, port_); |
| 272 if (!GetExtension()->CheckAPIPermissionWithParam(APIPermission::kSocket, | 273 if (!PermissionsData::CheckAPIPermissionWithParam( |
| 273 ¶m)) { | 274 GetExtension(), |
| 275 APIPermission::kSocket, |
| 276 ¶m)) { |
| 274 error_ = kPermissionError; | 277 error_ = kPermissionError; |
| 275 SetResult(Value::CreateIntegerValue(result)); | 278 SetResult(Value::CreateIntegerValue(result)); |
| 276 return; | 279 return; |
| 277 } | 280 } |
| 278 } else if (socket->GetSocketType() == Socket::TYPE_TCP) { | 281 } else if (socket->GetSocketType() == Socket::TYPE_TCP) { |
| 279 error_ = kTCPSocketBindError; | 282 error_ = kTCPSocketBindError; |
| 280 SetResult(Value::CreateIntegerValue(result)); | 283 SetResult(Value::CreateIntegerValue(result)); |
| 281 return; | 284 return; |
| 282 } | 285 } |
| 283 | 286 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 297 return true; | 300 return true; |
| 298 } | 301 } |
| 299 | 302 |
| 300 void SocketListenFunction::Work() { | 303 void SocketListenFunction::Work() { |
| 301 int result = -1; | 304 int result = -1; |
| 302 | 305 |
| 303 Socket* socket = GetSocket(params_->socket_id); | 306 Socket* socket = GetSocket(params_->socket_id); |
| 304 if (socket) { | 307 if (socket) { |
| 305 SocketPermission::CheckParam param( | 308 SocketPermission::CheckParam param( |
| 306 SocketPermissionRequest::TCP_LISTEN, params_->address, params_->port); | 309 SocketPermissionRequest::TCP_LISTEN, params_->address, params_->port); |
| 307 if (!GetExtension()->CheckAPIPermissionWithParam(APIPermission::kSocket, | 310 if (!PermissionsData::CheckAPIPermissionWithParam( |
| 308 ¶m)) { | 311 GetExtension(), |
| 312 APIPermission::kSocket, |
| 313 ¶m)) { |
| 309 error_ = kPermissionError; | 314 error_ = kPermissionError; |
| 310 SetResult(Value::CreateIntegerValue(result)); | 315 SetResult(Value::CreateIntegerValue(result)); |
| 311 return; | 316 return; |
| 312 } | 317 } |
| 313 | 318 |
| 314 result = socket->Listen( | 319 result = socket->Listen( |
| 315 params_->address, | 320 params_->address, |
| 316 params_->port, | 321 params_->port, |
| 317 params_->backlog.get() ? *params_->backlog.get() : 5, | 322 params_->backlog.get() ? *params_->backlog.get() : 5, |
| 318 &error_); | 323 &error_); |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 508 if (!socket_) { | 513 if (!socket_) { |
| 509 error_ = kSocketNotFoundError; | 514 error_ = kSocketNotFoundError; |
| 510 SetResult(Value::CreateIntegerValue(-1)); | 515 SetResult(Value::CreateIntegerValue(-1)); |
| 511 AsyncWorkCompleted(); | 516 AsyncWorkCompleted(); |
| 512 return; | 517 return; |
| 513 } | 518 } |
| 514 | 519 |
| 515 if (socket_->GetSocketType() == Socket::TYPE_UDP) { | 520 if (socket_->GetSocketType() == Socket::TYPE_UDP) { |
| 516 SocketPermission::CheckParam param(SocketPermissionRequest::UDP_SEND_TO, | 521 SocketPermission::CheckParam param(SocketPermissionRequest::UDP_SEND_TO, |
| 517 hostname_, port_); | 522 hostname_, port_); |
| 518 if (!GetExtension()->CheckAPIPermissionWithParam(APIPermission::kSocket, | 523 if (!PermissionsData::CheckAPIPermissionWithParam( |
| 519 ¶m)) { | 524 GetExtension(), |
| 525 APIPermission::kSocket, |
| 526 ¶m)) { |
| 520 error_ = kPermissionError; | 527 error_ = kPermissionError; |
| 521 SetResult(Value::CreateIntegerValue(-1)); | 528 SetResult(Value::CreateIntegerValue(-1)); |
| 522 AsyncWorkCompleted(); | 529 AsyncWorkCompleted(); |
| 523 return; | 530 return; |
| 524 } | 531 } |
| 525 } | 532 } |
| 526 | 533 |
| 527 StartDnsLookup(hostname_); | 534 StartDnsLookup(hostname_); |
| 528 } | 535 } |
| 529 | 536 |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 714 error_ = kMulticastSocketTypeError; | 721 error_ = kMulticastSocketTypeError; |
| 715 SetResult(Value::CreateIntegerValue(result)); | 722 SetResult(Value::CreateIntegerValue(result)); |
| 716 return; | 723 return; |
| 717 } | 724 } |
| 718 | 725 |
| 719 SocketPermission::CheckParam param( | 726 SocketPermission::CheckParam param( |
| 720 SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP, | 727 SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP, |
| 721 kWildcardAddress, | 728 kWildcardAddress, |
| 722 kWildcardPort); | 729 kWildcardPort); |
| 723 | 730 |
| 724 if (!GetExtension()->CheckAPIPermissionWithParam(APIPermission::kSocket, | 731 if (!PermissionsData::CheckAPIPermissionWithParam( |
| 725 ¶m)) { | 732 GetExtension(), APIPermission::kSocket, ¶m)) { |
| 726 error_ = kPermissionError; | 733 error_ = kPermissionError; |
| 727 SetResult(Value::CreateIntegerValue(result)); | 734 SetResult(Value::CreateIntegerValue(result)); |
| 728 return; | 735 return; |
| 729 } | 736 } |
| 730 | 737 |
| 731 result = static_cast<UDPSocket*>(socket)->JoinGroup(params_->address); | 738 result = static_cast<UDPSocket*>(socket)->JoinGroup(params_->address); |
| 732 if (result != 0) { | 739 if (result != 0) { |
| 733 error_ = net::ErrorToString(result); | 740 error_ = net::ErrorToString(result); |
| 734 } | 741 } |
| 735 SetResult(Value::CreateIntegerValue(result)); | 742 SetResult(Value::CreateIntegerValue(result)); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 760 if (socket->GetSocketType() != Socket::TYPE_UDP) { | 767 if (socket->GetSocketType() != Socket::TYPE_UDP) { |
| 761 error_ = kMulticastSocketTypeError; | 768 error_ = kMulticastSocketTypeError; |
| 762 SetResult(Value::CreateIntegerValue(result)); | 769 SetResult(Value::CreateIntegerValue(result)); |
| 763 return; | 770 return; |
| 764 } | 771 } |
| 765 | 772 |
| 766 SocketPermission::CheckParam param( | 773 SocketPermission::CheckParam param( |
| 767 SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP, | 774 SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP, |
| 768 kWildcardAddress, | 775 kWildcardAddress, |
| 769 kWildcardPort); | 776 kWildcardPort); |
| 770 if (!GetExtension()->CheckAPIPermissionWithParam(APIPermission::kSocket, | 777 if (!PermissionsData::CheckAPIPermissionWithParam(GetExtension(), |
| 771 ¶m)) { | 778 APIPermission::kSocket, |
| 779 ¶m)) { |
| 772 error_ = kPermissionError; | 780 error_ = kPermissionError; |
| 773 SetResult(Value::CreateIntegerValue(result)); | 781 SetResult(Value::CreateIntegerValue(result)); |
| 774 return; | 782 return; |
| 775 } | 783 } |
| 776 | 784 |
| 777 result = static_cast<UDPSocket*>(socket)->LeaveGroup(params_->address); | 785 result = static_cast<UDPSocket*>(socket)->LeaveGroup(params_->address); |
| 778 if (result != 0) | 786 if (result != 0) |
| 779 error_ = net::ErrorToString(result); | 787 error_ = net::ErrorToString(result); |
| 780 SetResult(Value::CreateIntegerValue(result)); | 788 SetResult(Value::CreateIntegerValue(result)); |
| 781 } | 789 } |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 869 if (socket->GetSocketType() != Socket::TYPE_UDP) { | 877 if (socket->GetSocketType() != Socket::TYPE_UDP) { |
| 870 error_ = kMulticastSocketTypeError; | 878 error_ = kMulticastSocketTypeError; |
| 871 SetResult(Value::CreateIntegerValue(result)); | 879 SetResult(Value::CreateIntegerValue(result)); |
| 872 return; | 880 return; |
| 873 } | 881 } |
| 874 | 882 |
| 875 SocketPermission::CheckParam param( | 883 SocketPermission::CheckParam param( |
| 876 SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP, | 884 SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP, |
| 877 kWildcardAddress, | 885 kWildcardAddress, |
| 878 kWildcardPort); | 886 kWildcardPort); |
| 879 if (!GetExtension()->CheckAPIPermissionWithParam(APIPermission::kSocket, | 887 if (!PermissionsData::CheckAPIPermissionWithParam( |
| 880 ¶m)) { | 888 GetExtension(), |
| 889 APIPermission::kSocket, |
| 890 ¶m)) { |
| 881 error_ = kPermissionError; | 891 error_ = kPermissionError; |
| 882 SetResult(Value::CreateIntegerValue(result)); | 892 SetResult(Value::CreateIntegerValue(result)); |
| 883 return; | 893 return; |
| 884 } | 894 } |
| 885 | 895 |
| 886 base::ListValue* values = new base::ListValue(); | 896 base::ListValue* values = new base::ListValue(); |
| 887 values->AppendStrings((std::vector<std::string>&) | 897 values->AppendStrings((std::vector<std::string>&) |
| 888 static_cast<UDPSocket*>(socket)->GetJoinedGroups()); | 898 static_cast<UDPSocket*>(socket)->GetJoinedGroups()); |
| 889 SetResult(values); | 899 SetResult(values); |
| 890 } | 900 } |
| 891 | 901 |
| 892 } // namespace extensions | 902 } // namespace extensions |
| OLD | NEW |