| 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 15 matching lines...) Expand all Loading... |
| 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 char kUDPMulticastMembership[] = "udp-multicast-membership"; |
| 34 const char kResolveHost[] = "resolve-host"; | 34 const char kResolveHost[] = "resolve-host"; |
| 35 const char kResolveProxy[] = "resolve-proxy"; | 35 const char kResolveProxy[] = "resolve-proxy"; |
| 36 const char kNetworkState[] = "network-state"; |
| 36 const int kWildcardPortNumber = 0; | 37 const int kWildcardPortNumber = 0; |
| 37 const int kInvalidPort = -1; | 38 const int kInvalidPort = -1; |
| 38 | 39 |
| 39 SocketPermissionRequest::OperationType StringToType(const std::string& s) { | 40 SocketPermissionRequest::OperationType StringToType(const std::string& s) { |
| 40 if (s == kTCPConnect) | 41 if (s == kTCPConnect) |
| 41 return SocketPermissionRequest::TCP_CONNECT; | 42 return SocketPermissionRequest::TCP_CONNECT; |
| 42 if (s == kTCPListen) | 43 if (s == kTCPListen) |
| 43 return SocketPermissionRequest::TCP_LISTEN; | 44 return SocketPermissionRequest::TCP_LISTEN; |
| 44 if (s == kUDPBind) | 45 if (s == kUDPBind) |
| 45 return SocketPermissionRequest::UDP_BIND; | 46 return SocketPermissionRequest::UDP_BIND; |
| 46 if (s == kUDPSendTo) | 47 if (s == kUDPSendTo) |
| 47 return SocketPermissionRequest::UDP_SEND_TO; | 48 return SocketPermissionRequest::UDP_SEND_TO; |
| 48 if (s == kUDPMulticastMembership) | 49 if (s == kUDPMulticastMembership) |
| 49 return SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP; | 50 return SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP; |
| 50 if (s == kResolveHost) | 51 if (s == kResolveHost) |
| 51 return SocketPermissionRequest::RESOLVE_HOST; | 52 return SocketPermissionRequest::RESOLVE_HOST; |
| 52 if (s == kResolveProxy) | 53 if (s == kResolveProxy) |
| 53 return SocketPermissionRequest::RESOLVE_PROXY; | 54 return SocketPermissionRequest::RESOLVE_PROXY; |
| 55 if (s == kNetworkState) |
| 56 return SocketPermissionRequest::NETWORK_STATE; |
| 54 return SocketPermissionRequest::NONE; | 57 return SocketPermissionRequest::NONE; |
| 55 } | 58 } |
| 56 | 59 |
| 57 const char* TypeToString(SocketPermissionRequest::OperationType type) { | 60 const char* TypeToString(SocketPermissionRequest::OperationType type) { |
| 58 switch (type) { | 61 switch (type) { |
| 59 case SocketPermissionRequest::TCP_CONNECT: | 62 case SocketPermissionRequest::TCP_CONNECT: |
| 60 return kTCPConnect; | 63 return kTCPConnect; |
| 61 case SocketPermissionRequest::TCP_LISTEN: | 64 case SocketPermissionRequest::TCP_LISTEN: |
| 62 return kTCPListen; | 65 return kTCPListen; |
| 63 case SocketPermissionRequest::UDP_BIND: | 66 case SocketPermissionRequest::UDP_BIND: |
| 64 return kUDPBind; | 67 return kUDPBind; |
| 65 case SocketPermissionRequest::UDP_SEND_TO: | 68 case SocketPermissionRequest::UDP_SEND_TO: |
| 66 return kUDPSendTo; | 69 return kUDPSendTo; |
| 67 case SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP: | 70 case SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP: |
| 68 return kUDPMulticastMembership; | 71 return kUDPMulticastMembership; |
| 69 case SocketPermissionRequest::RESOLVE_HOST: | 72 case SocketPermissionRequest::RESOLVE_HOST: |
| 70 return kResolveHost; | 73 return kResolveHost; |
| 71 case SocketPermissionRequest::RESOLVE_PROXY: | 74 case SocketPermissionRequest::RESOLVE_PROXY: |
| 72 return kResolveProxy; | 75 return kResolveProxy; |
| 76 case SocketPermissionRequest::NETWORK_STATE: |
| 77 return kNetworkState; |
| 73 default: | 78 default: |
| 74 return kInvalid; | 79 return kInvalid; |
| 75 } | 80 } |
| 76 } | 81 } |
| 77 | 82 |
| 78 bool StartsOrEndsWithWhitespace(const std::string& str) { | 83 bool StartsOrEndsWithWhitespace(const std::string& str) { |
| 79 if (str.find_first_not_of(kWhitespaceASCII) != 0) | 84 if (str.find_first_not_of(kWhitespaceASCII) != 0) |
| 80 return true; | 85 return true; |
| 81 if (str.find_last_not_of(kWhitespaceASCII) != str.length() - 1) | 86 if (str.find_last_not_of(kWhitespaceASCII) != str.length() - 1) |
| 82 return true; | 87 return true; |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 } | 178 } |
| 174 | 179 |
| 175 bool SocketPermissionData::FromValue(const base::Value* value) { | 180 bool SocketPermissionData::FromValue(const base::Value* value) { |
| 176 std::string spec; | 181 std::string spec; |
| 177 if (!value->GetAsString(&spec)) | 182 if (!value->GetAsString(&spec)) |
| 178 return false; | 183 return false; |
| 179 | 184 |
| 180 return Parse(spec); | 185 return Parse(spec); |
| 181 } | 186 } |
| 182 | 187 |
| 188 bool SocketPermissionData::IsAddressBoundType() const { |
| 189 return pattern_.type == SocketPermissionRequest::TCP_CONNECT || |
| 190 pattern_.type == SocketPermissionRequest::TCP_LISTEN || |
| 191 pattern_.type == SocketPermissionRequest::UDP_BIND || |
| 192 pattern_.type == SocketPermissionRequest::UDP_SEND_TO; |
| 193 } |
| 194 |
| 183 SocketPermissionData::HostType SocketPermissionData::GetHostType() const { | 195 SocketPermissionData::HostType SocketPermissionData::GetHostType() const { |
| 184 return pattern_.host.empty() ? SocketPermissionData::ANY_HOST : | 196 return pattern_.host.empty() ? SocketPermissionData::ANY_HOST : |
| 185 match_subdomains_ ? SocketPermissionData::HOSTS_IN_DOMAINS : | 197 match_subdomains_ ? SocketPermissionData::HOSTS_IN_DOMAINS : |
| 186 SocketPermissionData::SPECIFIC_HOSTS; | 198 SocketPermissionData::SPECIFIC_HOSTS; |
| 187 } | 199 } |
| 188 | 200 |
| 189 const std::string SocketPermissionData::GetHost() const { | 201 const std::string SocketPermissionData::GetHost() const { |
| 190 return pattern_.host; | 202 return pattern_.host; |
| 191 } | 203 } |
| 192 | 204 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 216 if (tokens.empty() || tokens.size() > 3) | 228 if (tokens.empty() || tokens.size() > 3) |
| 217 break; | 229 break; |
| 218 | 230 |
| 219 pattern_.type = StringToType(tokens[0]); | 231 pattern_.type = StringToType(tokens[0]); |
| 220 if (pattern_.type == SocketPermissionRequest::NONE) | 232 if (pattern_.type == SocketPermissionRequest::NONE) |
| 221 break; | 233 break; |
| 222 | 234 |
| 223 if (tokens.size() == 1) | 235 if (tokens.size() == 1) |
| 224 return true; | 236 return true; |
| 225 | 237 |
| 226 // Multicast membership, resolve proxy and resolve host permission strings | 238 // Return an error if address is specified for permissions that don't |
| 227 // do not carry an address. | 239 // need it (such as 'resolve-host'). |
| 228 if (pattern_.type == SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP || | 240 if (!IsAddressBoundType()) |
| 229 pattern_.type == SocketPermissionRequest::RESOLVE_PROXY || | |
| 230 pattern_.type == SocketPermissionRequest::RESOLVE_HOST) | |
| 231 break; | 241 break; |
| 232 | 242 |
| 233 pattern_.host = tokens[1]; | 243 pattern_.host = tokens[1]; |
| 234 if (!pattern_.host.empty()) { | 244 if (!pattern_.host.empty()) { |
| 235 if (StartsOrEndsWithWhitespace(pattern_.host)) | 245 if (StartsOrEndsWithWhitespace(pattern_.host)) |
| 236 break; | 246 break; |
| 237 pattern_.host = StringToLowerASCII(pattern_.host); | 247 pattern_.host = StringToLowerASCII(pattern_.host); |
| 238 | 248 |
| 239 // The first component can optionally be '*' to match all subdomains. | 249 // The first component can optionally be '*' to match all subdomains. |
| 240 std::vector<std::string> host_components; | 250 std::vector<std::string> host_components; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 266 return false; | 276 return false; |
| 267 } | 277 } |
| 268 | 278 |
| 269 const std::string& SocketPermissionData::GetAsString() const { | 279 const std::string& SocketPermissionData::GetAsString() const { |
| 270 if (!spec_.empty()) | 280 if (!spec_.empty()) |
| 271 return spec_; | 281 return spec_; |
| 272 | 282 |
| 273 spec_.reserve(64); | 283 spec_.reserve(64); |
| 274 spec_.append(TypeToString(pattern_.type)); | 284 spec_.append(TypeToString(pattern_.type)); |
| 275 | 285 |
| 276 if (pattern_.type == SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP || | 286 if (!IsAddressBoundType()) |
| 277 pattern_.type == SocketPermissionRequest::RESOLVE_PROXY || | |
| 278 pattern_.type == SocketPermissionRequest::RESOLVE_HOST) | |
| 279 return spec_; | 287 return spec_; |
| 280 | 288 |
| 281 if (match_subdomains_) { | 289 if (match_subdomains_) { |
| 282 spec_.append(1, kColon).append(kWildcard); | 290 spec_.append(1, kColon).append(kWildcard); |
| 283 if (!pattern_.host.empty()) | 291 if (!pattern_.host.empty()) |
| 284 spec_.append(1, kDot).append(pattern_.host); | 292 spec_.append(1, kDot).append(pattern_.host); |
| 285 } else { | 293 } else { |
| 286 spec_.append(1, kColon).append(pattern_.host); | 294 spec_.append(1, kColon).append(pattern_.host); |
| 287 } | 295 } |
| 288 | 296 |
| 289 if (pattern_.port == kWildcardPortNumber) | 297 if (pattern_.port == kWildcardPortNumber) |
| 290 spec_.append(1, kColon).append(kWildcard); | 298 spec_.append(1, kColon).append(kWildcard); |
| 291 else | 299 else |
| 292 spec_.append(1, kColon).append(base::IntToString(pattern_.port)); | 300 spec_.append(1, kColon).append(base::IntToString(pattern_.port)); |
| 293 | 301 |
| 294 return spec_; | 302 return spec_; |
| 295 } | 303 } |
| 296 | 304 |
| 297 void SocketPermissionData::Reset() { | 305 void SocketPermissionData::Reset() { |
| 298 pattern_.type = SocketPermissionRequest::NONE; | 306 pattern_.type = SocketPermissionRequest::NONE; |
| 299 pattern_.host.clear(); | 307 pattern_.host.clear(); |
| 300 match_subdomains_ = false; | 308 match_subdomains_ = false; |
| 301 pattern_.port = kInvalidPort; | 309 pattern_.port = kInvalidPort; |
| 302 spec_.clear(); | 310 spec_.clear(); |
| 303 } | 311 } |
| 304 | 312 |
| 305 } // namespace extensions | 313 } // namespace extensions |
| OLD | NEW |