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 |