| 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_MULTICAST_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_MULTICAST_MEMBERSHIP: |
| 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_MULTICAST_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_MULTICAST_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 |