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/common/extensions/permissions/socket_permission_data.h" | 5 #include "chrome/common/extensions/permissions/socket_permission_data.h" |
6 | 6 |
7 #include <cstdlib> | 7 #include <cstdlib> |
8 #include <sstream> | 8 #include <sstream> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 12 matching lines...) Expand all Loading... | |
23 using extensions::SocketPermissionData; | 23 using extensions::SocketPermissionData; |
24 | 24 |
25 const char kColon = ':'; | 25 const char kColon = ':'; |
26 const char kDot = '.'; | 26 const char kDot = '.'; |
27 const char kWildcard[] = "*"; | 27 const char kWildcard[] = "*"; |
28 const char kInvalid[] = "invalid"; | 28 const char kInvalid[] = "invalid"; |
29 const char kTCPConnect[] = "tcp-connect"; | 29 const char kTCPConnect[] = "tcp-connect"; |
30 const char kTCPListen[] = "tcp-listen"; | 30 const char kTCPListen[] = "tcp-listen"; |
31 const char kUDPBind[] = "udp-bind"; | 31 const char kUDPBind[] = "udp-bind"; |
32 const char kUDPSendTo[] = "udp-send-to"; | 32 const char kUDPSendTo[] = "udp-send-to"; |
33 const char kUDPMulticastMembership[] = "udp-multicast-membership"; | |
33 const int kWildcardPortNumber = 0; | 34 const int kWildcardPortNumber = 0; |
34 const int kInvalidPort = -1; | 35 const int kInvalidPort = -1; |
35 | 36 |
36 SocketPermissionRequest::OperationType StringToType(const std::string& s) { | 37 SocketPermissionRequest::OperationType StringToType(const std::string& s) { |
37 if (s == kTCPConnect) | 38 if (s == kTCPConnect) |
38 return SocketPermissionRequest::TCP_CONNECT; | 39 return SocketPermissionRequest::TCP_CONNECT; |
39 if (s == kTCPListen) | 40 if (s == kTCPListen) |
40 return SocketPermissionRequest::TCP_LISTEN; | 41 return SocketPermissionRequest::TCP_LISTEN; |
41 if (s == kUDPBind) | 42 if (s == kUDPBind) |
42 return SocketPermissionRequest::UDP_BIND; | 43 return SocketPermissionRequest::UDP_BIND; |
43 if (s == kUDPSendTo) | 44 if (s == kUDPSendTo) |
44 return SocketPermissionRequest::UDP_SEND_TO; | 45 return SocketPermissionRequest::UDP_SEND_TO; |
46 if (s == kUDPMulticastMembership) | |
47 return SocketPermissionRequest::UDP_MUTICAST_MEMBERSHIP; | |
45 return SocketPermissionRequest::NONE; | 48 return SocketPermissionRequest::NONE; |
46 } | 49 } |
47 | 50 |
48 const char* TypeToString(SocketPermissionRequest::OperationType type) { | 51 const char* TypeToString(SocketPermissionRequest::OperationType type) { |
49 switch (type) { | 52 switch (type) { |
50 case SocketPermissionRequest::TCP_CONNECT: | 53 case SocketPermissionRequest::TCP_CONNECT: |
51 return kTCPConnect; | 54 return kTCPConnect; |
52 case SocketPermissionRequest::TCP_LISTEN: | 55 case SocketPermissionRequest::TCP_LISTEN: |
53 return kTCPListen; | 56 return kTCPListen; |
54 case SocketPermissionRequest::UDP_BIND: | 57 case SocketPermissionRequest::UDP_BIND: |
55 return kUDPBind; | 58 return kUDPBind; |
56 case SocketPermissionRequest::UDP_SEND_TO: | 59 case SocketPermissionRequest::UDP_SEND_TO: |
57 return kUDPSendTo; | 60 return kUDPSendTo; |
61 case SocketPermissionRequest::UDP_MUTICAST_MEMBERSHIP: | |
miket_OOO
2013/04/25 21:52:12
spelling (fix everywhere, please)
| |
62 return kUDPMulticastMembership; | |
58 default: | 63 default: |
59 return kInvalid; | 64 return kInvalid; |
60 } | 65 } |
61 } | 66 } |
62 | 67 |
63 bool StartsOrEndsWithWhitespace(const std::string& str) { | 68 bool StartsOrEndsWithWhitespace(const std::string& str) { |
64 if (str.find_first_not_of(kWhitespaceASCII) != 0) | 69 if (str.find_first_not_of(kWhitespaceASCII) != 0) |
65 return true; | 70 return true; |
66 if (str.find_last_not_of(kWhitespaceASCII) != str.length() - 1) | 71 if (str.find_last_not_of(kWhitespaceASCII) != str.length() - 1) |
67 return true; | 72 return true; |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
200 if (tokens.empty() || tokens.size() > 3) | 205 if (tokens.empty() || tokens.size() > 3) |
201 break; | 206 break; |
202 | 207 |
203 pattern_.type = StringToType(tokens[0]); | 208 pattern_.type = StringToType(tokens[0]); |
204 if (pattern_.type == SocketPermissionRequest::NONE) | 209 if (pattern_.type == SocketPermissionRequest::NONE) |
205 break; | 210 break; |
206 | 211 |
207 if (tokens.size() == 1) | 212 if (tokens.size() == 1) |
208 return true; | 213 return true; |
209 | 214 |
215 // Multicast membership permission string does not include an address. | |
216 if (pattern_.type == SocketPermissionRequest::UDP_MUTICAST_MEMBERSHIP) | |
217 return false; | |
218 | |
210 pattern_.host = tokens[1]; | 219 pattern_.host = tokens[1]; |
211 if (!pattern_.host.empty()) { | 220 if (!pattern_.host.empty()) { |
212 if (StartsOrEndsWithWhitespace(pattern_.host)) | 221 if (StartsOrEndsWithWhitespace(pattern_.host)) |
213 break; | 222 break; |
214 pattern_.host = StringToLowerASCII(pattern_.host); | 223 pattern_.host = StringToLowerASCII(pattern_.host); |
215 | 224 |
216 // The first component can optionally be '*' to match all subdomains. | 225 // The first component can optionally be '*' to match all subdomains. |
217 std::vector<std::string> host_components; | 226 std::vector<std::string> host_components; |
218 base::SplitString(pattern_.host, kDot, &host_components); | 227 base::SplitString(pattern_.host, kDot, &host_components); |
219 DCHECK(!host_components.empty()); | 228 DCHECK(!host_components.empty()); |
(...skipping 23 matching lines...) Expand all Loading... | |
243 return false; | 252 return false; |
244 } | 253 } |
245 | 254 |
246 const std::string& SocketPermissionData::GetAsString() const { | 255 const std::string& SocketPermissionData::GetAsString() const { |
247 if (!spec_.empty()) | 256 if (!spec_.empty()) |
248 return spec_; | 257 return spec_; |
249 | 258 |
250 spec_.reserve(64); | 259 spec_.reserve(64); |
251 spec_.append(TypeToString(pattern_.type)); | 260 spec_.append(TypeToString(pattern_.type)); |
252 | 261 |
262 if (pattern_.type == SocketPermissionRequest::UDP_MUTICAST_MEMBERSHIP) | |
263 return spec_; | |
264 | |
253 if (match_subdomains_) { | 265 if (match_subdomains_) { |
254 spec_.append(1, kColon).append(kWildcard); | 266 spec_.append(1, kColon).append(kWildcard); |
255 if (!pattern_.host.empty()) | 267 if (!pattern_.host.empty()) |
256 spec_.append(1, kDot).append(pattern_.host); | 268 spec_.append(1, kDot).append(pattern_.host); |
257 } else { | 269 } else { |
258 spec_.append(1, kColon).append(pattern_.host); | 270 spec_.append(1, kColon).append(pattern_.host); |
259 } | 271 } |
260 | 272 |
261 if (pattern_.port == kWildcardPortNumber) | 273 if (pattern_.port == kWildcardPortNumber) |
262 spec_.append(1, kColon).append(kWildcard); | 274 spec_.append(1, kColon).append(kWildcard); |
263 else | 275 else |
264 spec_.append(1, kColon).append(base::IntToString(pattern_.port)); | 276 spec_.append(1, kColon).append(base::IntToString(pattern_.port)); |
265 | 277 |
266 return spec_; | 278 return spec_; |
267 } | 279 } |
268 | 280 |
269 void SocketPermissionData::Reset() { | 281 void SocketPermissionData::Reset() { |
270 pattern_.type = SocketPermissionRequest::NONE; | 282 pattern_.type = SocketPermissionRequest::NONE; |
271 pattern_.host.clear(); | 283 pattern_.host.clear(); |
272 match_subdomains_ = false; | 284 match_subdomains_ = false; |
273 pattern_.port = kInvalidPort; | 285 pattern_.port = kInvalidPort; |
274 spec_.clear(); | 286 spec_.clear(); |
275 } | 287 } |
276 | 288 |
277 } // namespace extensions | 289 } // namespace extensions |
OLD | NEW |