Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(214)

Side by Side Diff: extensions/common/api/sockets/sockets_manifest_permission.cc

Issue 794063002: Removed duplicate code from Socket permission messages (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@permissions_patch_2
Patch Set: Test namespace fix Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "extensions/common/api/sockets/sockets_manifest_permission.h" 5 #include "extensions/common/api/sockets/sockets_manifest_permission.h"
6 6
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "base/strings/string_split.h" 9 #include "base/strings/string_split.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 } 70 }
71 return true; 71 return true;
72 } 72 }
73 73
74 static void SetHostPatterns( 74 static void SetHostPatterns(
75 scoped_ptr<SocketHostPatterns>& host_patterns, 75 scoped_ptr<SocketHostPatterns>& host_patterns,
76 const SocketsManifestPermission* permission, 76 const SocketsManifestPermission* permission,
77 content::SocketPermissionRequest::OperationType operation_type) { 77 content::SocketPermissionRequest::OperationType operation_type) {
78 host_patterns.reset(new SocketHostPatterns()); 78 host_patterns.reset(new SocketHostPatterns());
79 host_patterns->as_strings.reset(new std::vector<std::string>()); 79 host_patterns->as_strings.reset(new std::vector<std::string>());
80 for (SocketsManifestPermission::SocketPermissionEntrySet::const_iterator it = 80 for (SocketPermissionEntrySet::const_iterator it =
81 permission->entries().begin(); 81 permission->entries().begin();
82 it != permission->entries().end(); 82 it != permission->entries().end(); ++it) {
83 ++it) {
84 if (it->pattern().type == operation_type) { 83 if (it->pattern().type == operation_type) {
85 host_patterns->as_strings->push_back(it->GetHostPatternAsString()); 84 host_patterns->as_strings->push_back(it->GetHostPatternAsString());
86 } 85 }
87 } 86 }
88 } 87 }
89 88
89 // Helper function for adding the 'any host' permission. Determines if the
90 // message is needed from |sockets|, and adds the permission to |ids| and/or
91 // |messages|, ignoring them if they are NULL. Returns true if it added the
92 // message.
93 bool AddAnyHostMessage(const SocketPermissionEntrySet& sockets,
94 PermissionIDSet* ids,
95 PermissionMessages* messages) {
96 for (const auto& socket : sockets) {
97 if (socket.IsAddressBoundType() &&
98 socket.GetHostType() == SocketPermissionEntry::ANY_HOST) {
99 // TODO(sashab): Add a rule to ChromePermissionMessageProvider:
100 // kSocketAnyHost -> IDS_EXTENSION_PROMPT_WARNING_SOCKET_ANY_HOST
101 if (ids)
102 ids->insert(APIPermission::kSocketAnyHost);
103 if (messages) {
104 messages->push_back(PermissionMessage(
105 PermissionMessage::kSocketAnyHost,
106 l10n_util::GetStringUTF16(
107 IDS_EXTENSION_PROMPT_WARNING_SOCKET_ANY_HOST)));
108 }
109 return true;
110 }
111 }
112 return false;
113 }
114
115 // Helper function for adding subdomain socket permissions. Determines what
116 // messages are needed from |sockets|, and adds permissions to |ids| and/or
117 // |messages|, ignoring them if they are NULL.
118 void AddSubdomainHostMessage(const SocketPermissionEntrySet& sockets,
119 PermissionIDSet* ids,
120 PermissionMessages* messages) {
121 std::set<base::string16> domains;
122 for (const auto& socket : sockets) {
123 if (socket.GetHostType() == SocketPermissionEntry::HOSTS_IN_DOMAINS)
124 domains.insert(base::UTF8ToUTF16(socket.pattern().host));
125 }
126 if (!domains.empty()) {
127 // TODO(sashab): This is not correct for all languages - add proper
128 // internationalization of this string for all plural states.
129 if (messages) {
130 int id = (domains.size() == 1)
131 ? IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAIN
132 : IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAINS;
133 messages->push_back(PermissionMessage(
134 PermissionMessage::kSocketDomainHosts,
135 l10n_util::GetStringFUTF16(
136 id, JoinString(std::vector<base::string16>(domains.begin(),
137 domains.end()),
138 ' '))));
139 }
140 // TODO(sashab): Add rules to ChromePermissionMessageProvider:
141 // kSocketDomainHosts ->
142 // IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAIN if 1
143 // IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAINS if many
144 if (ids) {
145 for (const auto& domain : domains)
146 ids->insert(APIPermission::kSocketDomainHosts, domain);
147 }
148 }
149 }
150
151 // Helper function for adding specific host socket permissions. Determines what
152 // messages are needed from |sockets|, and adds permissions to |ids| and/or
153 // |messages|, ignoring them if they are NULL.
154 void AddSpecificHostMessage(const SocketPermissionEntrySet& sockets,
155 PermissionIDSet* ids,
156 PermissionMessages* messages) {
157 std::set<base::string16> hostnames;
158 for (const auto& socket : sockets) {
159 if (socket.GetHostType() == SocketPermissionEntry::SPECIFIC_HOSTS)
160 hostnames.insert(base::UTF8ToUTF16(socket.pattern().host));
161 }
162 if (!hostnames.empty()) {
163 // TODO(sashab): This is not correct for all languages - add proper
164 // internationalization of this string for all plural states.
165 if (messages) {
166 int id = (hostnames.size() == 1)
167 ? IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOST
168 : IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOSTS;
169 messages->push_back(PermissionMessage(
170 PermissionMessage::kSocketSpecificHosts,
171 l10n_util::GetStringFUTF16(
172 id, JoinString(std::vector<base::string16>(hostnames.begin(),
173 hostnames.end()),
174 ' '))));
175 }
176 // TODO(sashab): Add rules to ChromePermissionMessageProvider:
177 // kSocketSpecificHosts ->
178 // IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOST if 1
179 // IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOSTS if many
180 if (ids) {
181 for (const auto& hostname : hostnames)
182 ids->insert(APIPermission::kSocketSpecificHosts, hostname);
183 }
184 }
185 }
186
187 // Helper function for adding the network list socket permission. Determines if
188 // the message is needed from |sockets|, and adds the permission to |ids| and/or
189 // |messages|, ignoring them if they are NULL.
190 void AddNetworkListMessage(const SocketPermissionEntrySet& sockets,
191 PermissionIDSet* ids,
192 PermissionMessages* messages) {
193 for (const auto& socket : sockets) {
194 if (socket.pattern().type == SocketPermissionRequest::NETWORK_STATE) {
195 // TODO(sashab): Add a rule to ChromePermissionMessageProvider:
196 // kNetworkState -> IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE
197 if (ids)
198 ids->insert(APIPermission::kNetworkState);
199 if (messages) {
200 messages->push_back(
201 PermissionMessage(PermissionMessage::kNetworkState,
202 l10n_util::GetStringUTF16(
203 IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE)));
204 }
205 }
206 }
207 }
208
90 } // namespace 209 } // namespace
91 210
92 SocketsManifestPermission::SocketsManifestPermission() {} 211 SocketsManifestPermission::SocketsManifestPermission() {}
93 212
94 SocketsManifestPermission::~SocketsManifestPermission() {} 213 SocketsManifestPermission::~SocketsManifestPermission() {}
95 214
96 // static 215 // static
97 scoped_ptr<SocketsManifestPermission> SocketsManifestPermission::FromValue( 216 scoped_ptr<SocketsManifestPermission> SocketsManifestPermission::FromValue(
98 const base::Value& value, 217 const base::Value& value,
99 base::string16* error) { 218 base::string16* error) {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 return false; 272 return false;
154 } 273 }
155 274
156 std::string SocketsManifestPermission::name() const { 275 std::string SocketsManifestPermission::name() const {
157 return manifest_keys::kSockets; 276 return manifest_keys::kSockets;
158 } 277 }
159 278
160 std::string SocketsManifestPermission::id() const { return name(); } 279 std::string SocketsManifestPermission::id() const { return name(); }
161 280
162 PermissionIDSet SocketsManifestPermission::GetPermissions() const { 281 PermissionIDSet SocketsManifestPermission::GetPermissions() const {
163 PermissionMessages messages;
164 PermissionIDSet ids; 282 PermissionIDSet ids;
165 AddAllHostMessages(messages, ids); 283 AddSocketHostPermissions(permissions_, &ids, NULL);
166 return ids; 284 return ids;
167 } 285 }
168 286
169 bool SocketsManifestPermission::HasMessages() const { 287 bool SocketsManifestPermission::HasMessages() const {
170 bool is_empty = permissions_.empty(); 288 bool is_empty = permissions_.empty();
171 return !is_empty; 289 return !is_empty;
172 } 290 }
173 291
174 PermissionMessages SocketsManifestPermission::GetMessages() const { 292 PermissionMessages SocketsManifestPermission::GetMessages() const {
175 PermissionMessages messages; 293 PermissionMessages messages;
176 PermissionIDSet ids; 294 AddSocketHostPermissions(permissions_, NULL, &messages);
177 AddAllHostMessages(messages, ids);
178 return messages; 295 return messages;
179 } 296 }
180 297
181 bool SocketsManifestPermission::FromValue(const base::Value* value) { 298 bool SocketsManifestPermission::FromValue(const base::Value* value) {
182 if (!value) 299 if (!value)
183 return false; 300 return false;
184 base::string16 error; 301 base::string16 error;
185 scoped_ptr<SocketsManifestPermission> manifest_permission( 302 scoped_ptr<SocketsManifestPermission> manifest_permission(
186 SocketsManifestPermission::FromValue(*value, &error)); 303 SocketsManifestPermission::FromValue(*value, &error));
187 304
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 result->permissions_ = base::STLSetIntersection<SocketPermissionEntrySet>( 373 result->permissions_ = base::STLSetIntersection<SocketPermissionEntrySet>(
257 permissions_, other->permissions_); 374 permissions_, other->permissions_);
258 return result.release(); 375 return result.release();
259 } 376 }
260 377
261 void SocketsManifestPermission::AddPermission( 378 void SocketsManifestPermission::AddPermission(
262 const SocketPermissionEntry& entry) { 379 const SocketPermissionEntry& entry) {
263 permissions_.insert(entry); 380 permissions_.insert(entry);
264 } 381 }
265 382
266 void SocketsManifestPermission::AddAllHostMessages(PermissionMessages& messages, 383 // static
267 PermissionIDSet& ids) const { 384 void SocketsManifestPermission::AddSocketHostPermissions(
268 // TODO(rpaquay): This function and callees is (almost) a copy/paste from 385 const SocketPermissionEntrySet& sockets,
269 // extensions::SocketPermission. 386 PermissionIDSet* ids,
270 if (!AddAnyHostMessage(messages, ids)) { 387 PermissionMessages* messages) {
271 AddSpecificHostMessage(messages, ids); 388 if (!AddAnyHostMessage(sockets, ids, messages)) {
272 AddSubdomainHostMessage(messages, ids); 389 AddSpecificHostMessage(sockets, ids, messages);
390 AddSubdomainHostMessage(sockets, ids, messages);
273 } 391 }
274 AddNetworkListMessage(messages, ids); 392 AddNetworkListMessage(sockets, ids, messages);
275 }
276
277 bool SocketsManifestPermission::AddAnyHostMessage(PermissionMessages& messages,
278 PermissionIDSet& ids) const {
279 for (SocketPermissionEntrySet::const_iterator it = permissions_.begin();
280 it != permissions_.end();
281 ++it) {
282 if (it->IsAddressBoundType() &&
283 it->GetHostType() == SocketPermissionEntry::ANY_HOST) {
284 // TODO(sashab): Add a rule to ChromePermissionMessageProvider:
285 // kSocketAnyHost -> IDS_EXTENSION_PROMPT_WARNING_SOCKET_ANY_HOST
286 ids.insert(APIPermission::kSocketAnyHost);
287 messages.push_back(
288 PermissionMessage(PermissionMessage::kSocketAnyHost,
289 l10n_util::GetStringUTF16(
290 IDS_EXTENSION_PROMPT_WARNING_SOCKET_ANY_HOST)));
291 return true;
292 }
293 }
294 return false;
295 }
296
297 void SocketsManifestPermission::AddSubdomainHostMessage(
298 PermissionMessages& messages,
299 PermissionIDSet& ids) const {
300 std::set<base::string16> domains;
301 for (SocketPermissionEntrySet::const_iterator it = permissions_.begin();
302 it != permissions_.end();
303 ++it) {
304 if (it->GetHostType() == SocketPermissionEntry::HOSTS_IN_DOMAINS)
305 domains.insert(base::UTF8ToUTF16(it->pattern().host));
306 }
307 if (!domains.empty()) {
308 // TODO(sashab): This is not correct for all languages - add proper
309 // internationalization of this string for all plural states.
310 int id = (domains.size() == 1)
311 ? IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAIN
312 : IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAINS;
313 messages.push_back(PermissionMessage(
314 PermissionMessage::kSocketDomainHosts,
315 l10n_util::GetStringFUTF16(
316 id,
317 JoinString(
318 std::vector<base::string16>(domains.begin(), domains.end()),
319 ' '))));
320 // TODO(sashab): Add rules to ChromePermissionMessageProvider:
321 // kSocketDomainHosts ->
322 // IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAIN if 1
323 // IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAINS if many
324 for (const auto& domain : domains)
325 ids.insert(APIPermission::kSocketDomainHosts, domain);
326 }
327 }
328
329 void SocketsManifestPermission::AddSpecificHostMessage(
330 PermissionMessages& messages,
331 PermissionIDSet& ids) const {
332 std::set<base::string16> hostnames;
333 for (SocketPermissionEntrySet::const_iterator it = permissions_.begin();
334 it != permissions_.end();
335 ++it) {
336 if (it->GetHostType() == SocketPermissionEntry::SPECIFIC_HOSTS)
337 hostnames.insert(base::UTF8ToUTF16(it->pattern().host));
338 }
339 if (!hostnames.empty()) {
340 // TODO(sashab): This is not correct for all languages - add proper
341 // internationalization of this string for all plural states.
342 int id = (hostnames.size() == 1)
343 ? IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOST
344 : IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOSTS;
345 messages.push_back(PermissionMessage(
346 PermissionMessage::kSocketSpecificHosts,
347 l10n_util::GetStringFUTF16(
348 id,
349 JoinString(
350 std::vector<base::string16>(hostnames.begin(), hostnames.end()),
351 ' '))));
352 // TODO(sashab): Add rules to ChromePermissionMessageProvider:
353 // kSocketSpecificHosts ->
354 // IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOST if 1
355 // IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOSTS if many
356 for (const auto& hostname : hostnames)
357 ids.insert(APIPermission::kSocketSpecificHosts, hostname);
358 }
359 }
360
361 void SocketsManifestPermission::AddNetworkListMessage(
362 PermissionMessages& messages,
363 PermissionIDSet& ids) const {
364 for (SocketPermissionEntrySet::const_iterator it = permissions_.begin();
365 it != permissions_.end();
366 ++it) {
367 if (it->pattern().type == SocketPermissionRequest::NETWORK_STATE) {
368 // TODO(sashab): Add a rule to ChromePermissionMessageProvider:
369 // kNetworkState -> IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE
370 ids.insert(APIPermission::kNetworkState);
371 messages.push_back(
372 PermissionMessage(PermissionMessage::kNetworkState,
373 l10n_util::GetStringUTF16(
374 IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE)));
375 }
376 }
377 } 393 }
378 394
379 } // namespace extensions 395 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698