Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/api/sockets/sockets_handler.h" | 5 #include "chrome/common/extensions/api/sockets/sockets_handler.h" |
| 6 | 6 |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "base/values.h" | 9 #include "base/values.h" |
| 10 #include "chrome/common/extensions/api/manifest_types.h" | 10 #include "chrome/common/extensions/api/manifest_types.h" |
| 11 #include "chrome/common/extensions/extension.h" | 11 #include "chrome/common/extensions/extension.h" |
| 12 #include "chrome/common/extensions/permissions/permissions_data.h" | 12 #include "chrome/common/extensions/permissions/permissions_data.h" |
| 13 #include "chrome/common/extensions/permissions/socket_permission_data.h" | 13 #include "chrome/common/extensions/permissions/socket_permission_data.h" |
| 14 #include "extensions/common/error_utils.h" | 14 #include "extensions/common/error_utils.h" |
| 15 #include "extensions/common/manifest_constants.h" | 15 #include "extensions/common/manifest_constants.h" |
| 16 #include "extensions/common/permissions/api_permission_set.h" | 16 #include "extensions/common/permissions/api_permission_set.h" |
| 17 #include "grit/generated_resources.h" | |
| 18 #include "ui/base/l10n/l10n_util.h" | |
| 17 | 19 |
| 18 namespace extensions { | 20 namespace extensions { |
| 19 | 21 |
| 20 namespace sockets_errors { | 22 namespace sockets_errors { |
| 21 const char kErrorInvalidHostPattern[] = "Invalid host:port pattern '*'"; | 23 const char kErrorInvalidHostPattern[] = "Invalid host:port pattern '*'"; |
| 22 } | 24 } |
| 23 | 25 |
| 24 namespace keys = extensions::manifest_keys; | 26 namespace keys = extensions::manifest_keys; |
| 25 namespace errors = sockets_errors; | 27 namespace errors = sockets_errors; |
| 26 using api::manifest_types::Sockets; | 28 using api::manifest_types::Sockets; |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 38 &install_warnings, | 40 &install_warnings, |
| 39 error); | 41 error); |
| 40 if (!data) | 42 if (!data) |
| 41 return false; | 43 return false; |
| 42 | 44 |
| 43 extension->AddInstallWarnings(install_warnings); | 45 extension->AddInstallWarnings(install_warnings); |
| 44 extension->SetManifestData(keys::kSockets, data.release()); | 46 extension->SetManifestData(keys::kSockets, data.release()); |
| 45 return true; | 47 return true; |
| 46 } | 48 } |
| 47 | 49 |
| 50 void SocketsHandler::AddPermissionWarningMessages( | |
| 51 const Extension* extension, | |
| 52 std::vector<string16>& messages) const { | |
| 53 SocketsManifestData* manifest_data = SocketsManifestData::Get(extension); | |
| 54 if (!manifest_data) | |
| 55 return; | |
| 56 PermissionMessages permission_messages = | |
| 57 manifest_data->GetPermissionMessages(); | |
| 58 for (PermissionMessages::const_iterator i = permission_messages.begin(); | |
| 59 i != permission_messages.end(); ++i) { | |
| 60 messages.push_back(i->message()); | |
| 61 } | |
| 62 } | |
| 63 | |
| 64 void SocketsHandler::AddPermissionWarningMessagesDetails( | |
| 65 const Extension* extension, | |
| 66 std::vector<string16>& messages) const { | |
| 67 SocketsManifestData* manifest_data = SocketsManifestData::Get(extension); | |
| 68 if (!manifest_data) | |
| 69 return; | |
| 70 PermissionMessages permission_messages = | |
| 71 manifest_data->GetPermissionMessages(); | |
| 72 for (PermissionMessages::const_iterator i = permission_messages.begin(); | |
| 73 i != permission_messages.end(); ++i) { | |
| 74 messages.push_back(i->details()); | |
| 75 } | |
| 76 } | |
| 77 | |
| 48 const std::vector<std::string> SocketsHandler::Keys() const { | 78 const std::vector<std::string> SocketsHandler::Keys() const { |
| 49 return SingleKey(manifest_keys::kSockets); | 79 return SingleKey(manifest_keys::kSockets); |
| 50 } | 80 } |
| 51 | 81 |
| 52 SocketsManifestData::SocketsManifestData() {} | 82 SocketsManifestData::SocketsManifestData() {} |
| 53 SocketsManifestData::~SocketsManifestData() {} | 83 SocketsManifestData::~SocketsManifestData() {} |
| 54 | 84 |
| 55 // static | 85 // static |
| 56 SocketsManifestData* SocketsManifestData::Get(const Extension* extension) { | 86 SocketsManifestData* SocketsManifestData::Get(const Extension* extension) { |
| 57 return static_cast<SocketsManifestData*>( | 87 return static_cast<SocketsManifestData*>( |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 145 const Extension* extension, | 175 const Extension* extension, |
| 146 const content::SocketPermissionRequest& request) { | 176 const content::SocketPermissionRequest& request) { |
| 147 for (PermissionSet::const_iterator it = permissions_.begin(); | 177 for (PermissionSet::const_iterator it = permissions_.begin(); |
| 148 it != permissions_.end(); ++it) { | 178 it != permissions_.end(); ++it) { |
| 149 if (it->Check(request)) | 179 if (it->Check(request)) |
| 150 return true; | 180 return true; |
| 151 } | 181 } |
| 152 return false; | 182 return false; |
| 153 } | 183 } |
| 154 | 184 |
| 185 PermissionMessages SocketsManifestData::GetPermissionMessages() const { | |
| 186 // TODO(rpaquay): This function and callees is (almost) a copy/paste | |
|
Yoyo Zhou
2013/11/06 04:02:36
Have you thought about how extensions that current
rpaquay
2013/11/06 16:16:16
Good question. I guess unless we do extra work, th
| |
| 187 // from |extensions::SocketPermission|. | |
| 188 PermissionMessages result; | |
| 189 if (!AddAnyHostMessage(result)) { | |
| 190 AddSpecificHostMessage(result); | |
| 191 AddSubdomainHostMessage(result); | |
| 192 } | |
| 193 AddNetworkListMessage(result); | |
| 194 return result; | |
| 195 } | |
| 196 | |
| 197 bool SocketsManifestData::AddAnyHostMessage( | |
| 198 PermissionMessages& messages) const { | |
| 199 for (PermissionSet::const_iterator it = permissions_.begin(); | |
| 200 it != permissions_.end(); ++it) { | |
| 201 if (it->IsAddressBoundType() && | |
| 202 it->GetHostType() == SocketPermissionEntry::ANY_HOST) { | |
| 203 messages.push_back(PermissionMessage( | |
| 204 PermissionMessage::kSocketAnyHost, | |
| 205 l10n_util::GetStringUTF16( | |
| 206 IDS_EXTENSION_PROMPT_WARNING_SOCKET_ANY_HOST))); | |
| 207 return true; | |
| 208 } | |
| 209 } | |
| 210 return false; | |
| 211 } | |
| 212 | |
| 213 void SocketsManifestData::AddSubdomainHostMessage( | |
| 214 PermissionMessages& messages) const { | |
| 215 std::set<string16> domains; | |
| 216 std::set<SocketPermissionData>::const_iterator i; | |
| 217 for (PermissionSet::const_iterator it = permissions_.begin(); | |
| 218 it != permissions_.end(); ++it) { | |
| 219 if (it->GetHostType() == SocketPermissionEntry::HOSTS_IN_DOMAINS) | |
| 220 domains.insert(UTF8ToUTF16(i->entry().pattern().host)); | |
| 221 } | |
| 222 if (!domains.empty()) { | |
| 223 int id = (domains.size() == 1) ? | |
| 224 IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAIN : | |
| 225 IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAINS; | |
| 226 messages.push_back(PermissionMessage( | |
| 227 PermissionMessage::kSocketDomainHosts, | |
| 228 l10n_util::GetStringFUTF16( | |
| 229 id, | |
| 230 JoinString( | |
| 231 std::vector<string16>( | |
| 232 domains.begin(), domains.end()), ' ')))); | |
| 233 } | |
| 234 } | |
| 235 | |
| 236 void SocketsManifestData::AddSpecificHostMessage( | |
| 237 PermissionMessages& messages) const { | |
| 238 std::set<string16> hostnames; | |
| 239 std::set<SocketPermissionData>::const_iterator i; | |
| 240 for (PermissionSet::const_iterator it = permissions_.begin(); | |
| 241 it != permissions_.end(); ++it) { | |
| 242 if (it->GetHostType() == SocketPermissionEntry::SPECIFIC_HOSTS) | |
| 243 hostnames.insert(UTF8ToUTF16(i->entry().pattern().host)); | |
| 244 } | |
| 245 if (!hostnames.empty()) { | |
| 246 int id = (hostnames.size() == 1) ? | |
| 247 IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOST : | |
| 248 IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOSTS; | |
| 249 messages.push_back(PermissionMessage( | |
| 250 PermissionMessage::kSocketSpecificHosts, | |
| 251 l10n_util::GetStringFUTF16( | |
| 252 id, | |
| 253 JoinString( | |
| 254 std::vector<string16>( | |
| 255 hostnames.begin(), hostnames.end()), ' ')))); | |
| 256 } | |
| 257 } | |
| 258 | |
| 259 void SocketsManifestData::AddNetworkListMessage( | |
| 260 PermissionMessages& messages) const { | |
| 261 std::set<SocketPermissionData>::const_iterator i; | |
| 262 for (PermissionSet::const_iterator it = permissions_.begin(); | |
| 263 it != permissions_.end(); ++it) { | |
| 264 if (it->pattern().type == content::SocketPermissionRequest::NETWORK_STATE) { | |
| 265 messages.push_back(PermissionMessage( | |
| 266 PermissionMessage::kNetworkState, | |
| 267 l10n_util::GetStringUTF16( | |
| 268 IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE))); | |
| 269 } | |
| 270 } | |
| 271 } | |
| 272 | |
| 155 } // namespace extensions | 273 } // namespace extensions |
| OLD | NEW |