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

Side by Side Diff: chrome/common/extensions/api/sockets/sockets_handler.cc

Issue 51433002: Enable permission warnings from ManifestHandlers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address code review comments. Created 7 years, 1 month 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 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/extension_messages.h"
12 #include "chrome/common/extensions/permissions/permissions_data.h" 13 #include "chrome/common/extensions/permissions/permissions_data.h"
13 #include "chrome/common/extensions/permissions/socket_permission_data.h" 14 #include "chrome/common/extensions/permissions/socket_permission_data.h"
14 #include "extensions/common/error_utils.h" 15 #include "extensions/common/error_utils.h"
15 #include "extensions/common/manifest_constants.h" 16 #include "extensions/common/manifest_constants.h"
16 #include "extensions/common/permissions/api_permission_set.h" 17 #include "extensions/common/permissions/api_permission_set.h"
18 #include "grit/generated_resources.h"
19 #include "ipc/ipc_message.h"
20 #include "ipc/ipc_message_utils.h"
21 #include "ui/base/l10n/l10n_util.h"
17 22
18 namespace extensions { 23 namespace extensions {
19 24
20 namespace sockets_errors { 25 namespace sockets_errors {
21 const char kErrorInvalidHostPattern[] = "Invalid host:port pattern '*'"; 26 const char kErrorInvalidHostPattern[] = "Invalid host:port pattern '*'";
22 } 27 }
23 28
24 namespace keys = extensions::manifest_keys; 29 namespace keys = extensions::manifest_keys;
25 namespace errors = sockets_errors; 30 namespace errors = sockets_errors;
26 using api::manifest_types::Sockets; 31 using api::manifest_types::Sockets;
32 using content::SocketPermissionRequest;
33
34 // TODO(rpaquay): Unit test for all this class (Diff, Union, etc).
35 class SocketsManifestPermission : public ManifestPermission {
36 public:
37 SocketsManifestPermission() {
38 }
39
40 explicit SocketsManifestPermission(scoped_ptr<SocketsManifestData> data)
41 : data_(data.Pass()) {
42 }
43
44 virtual std::string name() const OVERRIDE {
45 return keys::kSockets;
46 }
47
48 virtual std::string id() const OVERRIDE {
49 return name();
50 }
51
52 // Returns true if this permission has any PermissionMessages.
53 virtual bool HasMessages() const OVERRIDE {
54 if (!data_)
55 return false;
56
57 return data_->HasMessages();
58 }
59
60 // Returns the localized permission messages of this permission.
61 virtual PermissionMessages GetMessages() const OVERRIDE {
62 if (!data_)
63 return PermissionMessages();
64 return data_->GetPermissionMessages();
65 }
66
67 // Parses the ManifestPermission from |value|. Returns false if error happens.
68 virtual bool FromValue(const base::Value* value) OVERRIDE {
69 if (!value)
70 return false;
71
72 std::vector<InstallWarning> warnings;
73 string16 error;
74 scoped_ptr<SocketsManifestData> data(
75 SocketsManifestData::FromValue(*value, &warnings, &error));
76
77 if (!data)
78 return false;
79
80 data_ = data.Pass();
81 return true;
82 }
83
84 // Stores this into a new created |value|.
85 virtual scoped_ptr<base::Value> ToValue() const OVERRIDE {
86 if (!data_) {
87 return Sockets().ToValue();
88 }
89
90 return data_->ToValue();
91 }
92
93 // Clones this.
94 virtual ManifestPermission* Clone() const OVERRIDE {
95 if (!data_)
96 return new SocketsManifestPermission();
97
98 scoped_ptr<SocketsManifestData> clone_data(data_->Clone());
99 return new SocketsManifestPermission(clone_data.Pass());
100 }
101
102 // Returns a new API permission which equals this - |rhs|.
103 virtual ManifestPermission* Diff(const ManifestPermission* rhs)
104 const OVERRIDE {
105 const SocketsManifestPermission* other =
106 static_cast<const SocketsManifestPermission*>(rhs);
107
108 if (!data_)
109 return new SocketsManifestPermission();
110
111 if (!other->data_)
112 return Clone();
113
114 scoped_ptr<SocketsManifestData> data(data_->Diff(other->data_.get()));
115 return new SocketsManifestPermission(data.Pass());
116 }
117
118 // Returns a new API permission which equals the union of this and |rhs|.
119 virtual ManifestPermission* Union(const ManifestPermission* rhs)
120 const OVERRIDE {
121 const SocketsManifestPermission* other =
122 static_cast<const SocketsManifestPermission*>(rhs);
123
124 if (!data_)
125 return other->Clone();
126
127 if (!other->data_)
128 return Clone();
129
130 scoped_ptr<SocketsManifestData> data(data_->Union(other->data_.get()));
131 return new SocketsManifestPermission(data.Pass());
132 }
133
134 // Returns a new API permission which equals the intersect of this and |rhs|.
135 virtual ManifestPermission* Intersect(const ManifestPermission* rhs)
136 const OVERRIDE {
137 const SocketsManifestPermission* other =
138 static_cast<const SocketsManifestPermission*>(rhs);
139
140 if (!data_)
141 return new SocketsManifestPermission();
142
143 if (!other->data_)
144 return new SocketsManifestPermission();
145
146 scoped_ptr<SocketsManifestData> data(data_->Intersect(other->data_.get()));
147 return new SocketsManifestPermission(data.Pass());
148 }
149
150 // Returns true if |rhs| is a subset of this.
151 virtual bool Contains(const ManifestPermission* rhs) const OVERRIDE {
152 const SocketsManifestPermission* other =
153 static_cast<const SocketsManifestPermission*>(rhs);
154
155 if (!data_)
156 return !other->data_;
157
158 if (!other->data_)
159 return true;
160
161 return data_->Contains(other->data_.get());
162 }
163
164 // Returns true if |rhs| is equal to this.
165 virtual bool Equal(const ManifestPermission* rhs) const OVERRIDE {
166 const SocketsManifestPermission* other =
167 static_cast<const SocketsManifestPermission*>(rhs);
168
169 if (!data_)
170 return !other->data_;
171
172 if (!other->data_)
173 return false;
174
175 return data_->Equal(other->data_.get());
176 }
177
178 // IPC functions
179 // Writes this into the given IPC message |m|.
180 virtual void Write(IPC::Message* m) const OVERRIDE {
181 bool has_data = !!data_;
182 IPC::WriteParam(m, has_data);
183 if (has_data) {
184 data_->Write(m);
185 }
186 }
187
188 // Reads from the given IPC message |m|.
189 virtual bool Read(const IPC::Message* m, PickleIterator* iter) OVERRIDE {
190 data_.reset();
191
192 bool has_data;
193 bool result = IPC::ReadParam(m, iter, &has_data);
194 if (!result)
195 return result;
196
197 if (!has_data)
198 return true;
199
200 data_.reset(new SocketsManifestData());
201 return data_->Read(m, iter);
202 }
203
204 // Logs this permission.
205 virtual void Log(std::string* log) const OVERRIDE {
206 if (data_)
207 data_->Log(log);
208 }
209
210 private:
211 scoped_ptr<SocketsManifestData> data_;
212 };
27 213
28 SocketsHandler::SocketsHandler() {} 214 SocketsHandler::SocketsHandler() {}
29 215
30 SocketsHandler::~SocketsHandler() {} 216 SocketsHandler::~SocketsHandler() {}
31 217
32 bool SocketsHandler::Parse(Extension* extension, string16* error) { 218 bool SocketsHandler::Parse(Extension* extension, string16* error) {
33 const base::Value* sockets = NULL; 219 const base::Value* sockets = NULL;
34 CHECK(extension->manifest()->Get(keys::kSockets, &sockets)); 220 CHECK(extension->manifest()->Get(keys::kSockets, &sockets));
35 std::vector<InstallWarning> install_warnings; 221 std::vector<InstallWarning> install_warnings;
36 scoped_ptr<SocketsManifestData> data = 222 scoped_ptr<SocketsManifestData> data =
37 SocketsManifestData::FromValue(*sockets, 223 SocketsManifestData::FromValue(*sockets,
38 &install_warnings, 224 &install_warnings,
39 error); 225 error);
40 if (!data) 226 if (!data)
41 return false; 227 return false;
42 228
43 extension->AddInstallWarnings(install_warnings); 229 extension->AddInstallWarnings(install_warnings);
44 extension->SetManifestData(keys::kSockets, data.release()); 230 extension->SetManifestData(keys::kSockets, data.release());
45 return true; 231 return true;
46 } 232 }
47 233
234 ManifestPermission* SocketsHandler::CreatePermission() {
235 return new SocketsManifestPermission();
236 }
237
238 ManifestPermission* SocketsHandler::CreateInitialRequiredPermission(
239 const Extension* extension) {
240 SocketsManifestData* data = SocketsManifestData::Get(extension);
241 if (data) {
242 return new SocketsManifestPermission(
243 scoped_ptr<SocketsManifestData>(data->Clone()).Pass());
244 }
245 return new SocketsManifestPermission();
246 }
247
48 const std::vector<std::string> SocketsHandler::Keys() const { 248 const std::vector<std::string> SocketsHandler::Keys() const {
49 return SingleKey(manifest_keys::kSockets); 249 return SingleKey(manifest_keys::kSockets);
50 } 250 }
51 251
52 SocketsManifestData::SocketsManifestData() {} 252 SocketsManifestData::SocketsManifestData() : kinds_(kNone) {}
53 SocketsManifestData::~SocketsManifestData() {} 253 SocketsManifestData::~SocketsManifestData() {}
54 254
55 // static 255 // static
56 SocketsManifestData* SocketsManifestData::Get(const Extension* extension) { 256 SocketsManifestData* SocketsManifestData::Get(const Extension* extension) {
57 return static_cast<SocketsManifestData*>( 257 return static_cast<SocketsManifestData*>(
58 extension->GetManifestData(keys::kSockets)); 258 extension->GetManifestData(keys::kSockets));
59 } 259 }
60 260
61 // static 261 // static
62 bool SocketsManifestData::CheckRequest( 262 bool SocketsManifestData::CheckRequest(
63 const Extension* extension, 263 const Extension* extension,
64 const content::SocketPermissionRequest& request) { 264 const content::SocketPermissionRequest& request) {
65 SocketsManifestData* data = SocketsManifestData::Get(extension); 265 SocketsManifestData* data = SocketsManifestData::Get(extension);
66 if (data == NULL) 266 if (!data)
67 return false; 267 return false;
68 268
69 return data->CheckRequestImpl(extension, request); 269 return data->CheckRequestImpl(extension, request);
70 } 270 }
71 271
72 // static 272 // static
73 scoped_ptr<SocketsManifestData> SocketsManifestData::FromValue( 273 scoped_ptr<SocketsManifestData> SocketsManifestData::FromValue(
74 const base::Value& value, 274 const base::Value& value,
75 std::vector<InstallWarning>* install_warnings, 275 std::vector<InstallWarning>* install_warnings,
76 string16* error) { 276 string16* error) {
77 scoped_ptr<Sockets> sockets = Sockets::FromValue(value, error); 277 scoped_ptr<Sockets> sockets = Sockets::FromValue(value, error);
78 if (!sockets) 278 if (!sockets)
79 return scoped_ptr<SocketsManifestData>(); 279 return scoped_ptr<SocketsManifestData>();
80 280
81 scoped_ptr<SocketsManifestData> result(new SocketsManifestData()); 281 scoped_ptr<SocketsManifestData> result(new SocketsManifestData());
82 if (sockets->udp) { 282 if (sockets->udp) {
283 result->kinds_ |= kUdpPermission;
83 if (!ParseHostPattern(result.get(), 284 if (!ParseHostPattern(result.get(),
84 content::SocketPermissionRequest::UDP_BIND, 285 content::SocketPermissionRequest::UDP_BIND,
85 sockets->udp->bind, 286 sockets->udp->bind,
86 error)) { 287 error)) {
87 return scoped_ptr<SocketsManifestData>(); 288 return scoped_ptr<SocketsManifestData>();
88 } 289 }
89 if (!ParseHostPattern(result.get(), 290 if (!ParseHostPattern(result.get(),
90 content::SocketPermissionRequest::UDP_SEND_TO, 291 content::SocketPermissionRequest::UDP_SEND_TO,
91 sockets->udp->send, 292 sockets->udp->send,
92 error)) { 293 error)) {
93 return scoped_ptr<SocketsManifestData>(); 294 return scoped_ptr<SocketsManifestData>();
94 } 295 }
95 if (!ParseHostPattern(result.get(), 296 if (!ParseHostPattern(result.get(),
96 content::SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP, 297 content::SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP,
97 sockets->udp->multicast_membership, 298 sockets->udp->multicast_membership,
98 error)) { 299 error)) {
99 return scoped_ptr<SocketsManifestData>(); 300 return scoped_ptr<SocketsManifestData>();
100 } 301 }
101 } 302 }
102 if (sockets->tcp) { 303 if (sockets->tcp) {
304 result->kinds_ |= kTcpPermission;
103 if (!ParseHostPattern(result.get(), 305 if (!ParseHostPattern(result.get(),
104 content::SocketPermissionRequest::TCP_CONNECT, 306 content::SocketPermissionRequest::TCP_CONNECT,
105 sockets->tcp->connect, 307 sockets->tcp->connect,
106 error)) { 308 error)) {
107 return scoped_ptr<SocketsManifestData>(); 309 return scoped_ptr<SocketsManifestData>();
108 } 310 }
109 } 311 }
110 if (sockets->tcp_server) { 312 if (sockets->tcp_server) {
313 result->kinds_ |= kTcpServerPermission;
111 if (!ParseHostPattern(result.get(), 314 if (!ParseHostPattern(result.get(),
112 content::SocketPermissionRequest::TCP_LISTEN, 315 content::SocketPermissionRequest::TCP_LISTEN,
113 sockets->tcp_server->listen, 316 sockets->tcp_server->listen,
114 error)) { 317 error)) {
115 return scoped_ptr<SocketsManifestData>(); 318 return scoped_ptr<SocketsManifestData>();
116 } 319 }
117 } 320 }
118 return result.Pass(); 321 return result.Pass();
119 } 322 }
120 323
324 scoped_ptr<base::Value> SocketsManifestData::ToValue() const {
325 Sockets sockets;
326 if (has_udp()) {
327 sockets.udp.reset(new Sockets::Udp());
328 sockets.udp->bind = CreateHostPattern(SocketPermissionRequest::UDP_BIND);
329 sockets.udp->send = CreateHostPattern(SocketPermissionRequest::UDP_SEND_TO);
330 sockets.udp->multicast_membership =
331 CreateHostPattern(SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP);
332 }
333 if (has_tcp()) {
334 sockets.tcp.reset(new Sockets::Tcp());
335 sockets.tcp->connect =
336 CreateHostPattern(SocketPermissionRequest::TCP_CONNECT);
337 }
338 if (has_tcp_server()) {
339 sockets.tcp_server.reset(new Sockets::TcpServer());
340 sockets.tcp_server->listen =
341 CreateHostPattern(SocketPermissionRequest::TCP_LISTEN);
342 }
343
344 return sockets.ToValue().Pass();
345 }
346
121 // static 347 // static
122 bool SocketsManifestData::ParseHostPattern( 348 bool SocketsManifestData::ParseHostPattern(
123 SocketsManifestData* manifest_data, 349 SocketsManifestData* manifest_data,
124 content::SocketPermissionRequest::OperationType operation_type, 350 content::SocketPermissionRequest::OperationType operation_type,
125 const scoped_ptr<std::string>& value, 351 const scoped_ptr<std::string>& value,
126 string16* error) { 352 string16* error) {
127 if (value) { 353 if (value) {
128 SocketPermissionEntry entry; 354 SocketPermissionEntry entry;
129 if (!SocketPermissionEntry::ParseHostPattern( 355 if (!SocketPermissionEntry::ParseHostPattern(
130 operation_type, *value, &entry)) { 356 operation_type, *value, &entry)) {
131 *error = ErrorUtils::FormatErrorMessageUTF16( 357 *error = ErrorUtils::FormatErrorMessageUTF16(
132 errors::kErrorInvalidHostPattern, *value); 358 errors::kErrorInvalidHostPattern, *value);
133 return false; 359 return false;
134 } 360 }
135 manifest_data->AddPermission(entry); 361 manifest_data->AddPermission(entry);
136 } 362 }
137 return true; 363 return true;
138 } 364 }
139 365
366 scoped_ptr<std::string> SocketsManifestData::CreateHostPattern(
367 content::SocketPermissionRequest::OperationType operation_type) const {
368 scoped_ptr<std::string> result;
369 for (SocketsManifestData::SocketPermissionEntrySet::const_iterator it =
370 entries().begin(); it != entries().end() ; ++it) {
371 if (it->pattern().type == operation_type) {
372 result.reset(new std::string(it->GetHostPatternAsString()));
373 break;
374 }
375 }
376 return result.Pass();
377 }
378
140 void SocketsManifestData::AddPermission(const SocketPermissionEntry& entry) { 379 void SocketsManifestData::AddPermission(const SocketPermissionEntry& entry) {
141 permissions_.insert(entry); 380 permissions_.insert(entry);
142 } 381 }
143 382
144 bool SocketsManifestData::CheckRequestImpl( 383 bool SocketsManifestData::CheckRequestImpl(
145 const Extension* extension, 384 const Extension* extension,
146 const content::SocketPermissionRequest& request) { 385 const content::SocketPermissionRequest& request) {
147 for (PermissionSet::const_iterator it = permissions_.begin(); 386 for (SocketPermissionEntrySet::const_iterator it = permissions_.begin();
148 it != permissions_.end(); ++it) { 387 it != permissions_.end(); ++it) {
149 if (it->Check(request)) 388 if (it->Check(request))
150 return true; 389 return true;
151 } 390 }
152 return false; 391 return false;
153 } 392 }
154 393
394 bool SocketsManifestData::HasMessages() const {
395 bool is_empty = permissions_.empty() && (kinds_ == kNone);
396 return !is_empty;
397 }
398
399 PermissionMessages SocketsManifestData::GetPermissionMessages() const {
400 // TODO(rpaquay): This function and callees is (almost) a copy/paste
401 // from |extensions::SocketPermission|.
402 PermissionMessages result;
403 if (!AddAnyHostMessage(result)) {
404 AddSpecificHostMessage(result);
405 AddSubdomainHostMessage(result);
406 }
407 AddNetworkListMessage(result);
408 return result;
409 }
410
411 SocketsManifestData* SocketsManifestData::Diff(const SocketsManifestData* rhs)
412 const {
413 scoped_ptr<SocketsManifestData> data(new SocketsManifestData());
414 std::set_difference(
415 permissions_.begin(), permissions_.end(),
416 rhs->permissions_.begin(), rhs->permissions_.end(),
417 std::inserter<SocketPermissionEntrySet>(
418 data->permissions_, data->permissions_.begin()));
419
420 data->kinds_ = (kinds_ & (~rhs->kinds_));
421 return data.release();
422 }
423
424 SocketsManifestData* SocketsManifestData::Union(const SocketsManifestData* rhs)
425 const {
426 scoped_ptr<SocketsManifestData> data(new SocketsManifestData());
427 std::set_union(
428 permissions_.begin(), permissions_.end(),
429 rhs->permissions_.begin(), rhs->permissions_.end(),
430 std::inserter<SocketPermissionEntrySet>(
431 data->permissions_, data->permissions_.begin()));
432
433 data->kinds_ = (kinds_ | rhs->kinds_);
434 return data.release();
435 }
436
437 SocketsManifestData* SocketsManifestData::Intersect(
438 const SocketsManifestData* rhs) const {
439 scoped_ptr<SocketsManifestData> data(new SocketsManifestData());
440 std::set_intersection(
441 permissions_.begin(), permissions_.end(),
442 rhs->permissions_.begin(), rhs->permissions_.end(),
443 std::inserter<SocketPermissionEntrySet>(
444 data->permissions_, data->permissions_.begin()));
445
446 data->kinds_ = (kinds_ & rhs->kinds_);
447 return data.release();
448 }
449
450 bool SocketsManifestData::Contains(const SocketsManifestData* rhs) const {
451 return std::includes(
452 entries().begin(), entries().end(),
453 rhs->entries().begin(), rhs->entries().end()) &&
454 ((kinds_ | rhs->kinds_) == kinds_);
455 }
456
457 bool SocketsManifestData::Equal(const SocketsManifestData* rhs) const {
458 return (permissions_ == rhs->permissions_) &&
459 (kinds_ == rhs->kinds_);
460 }
461
462 SocketsManifestData* SocketsManifestData::Clone() const {
463 scoped_ptr<SocketsManifestData> result(new SocketsManifestData());
464 result->permissions_ = permissions_;
465 result->kinds_ = kinds_;
466 return result.release();
467 }
468
469 void SocketsManifestData::Write(IPC::Message* m) const {
470 IPC::WriteParam(m, permissions_);
471 IPC::WriteParam(m, kinds_);
472 }
473
474 bool SocketsManifestData::Read(const IPC::Message* m, PickleIterator* iter) {
475 return IPC::ReadParam(m, iter, &permissions_) &&
476 IPC::ReadParam(m, iter, &kinds_);
477 }
478
479 void SocketsManifestData::Log(std::string* log) const {
480 IPC::LogParam(permissions_, log);
481 IPC::LogParam(kinds_, log);
482 }
483
484 bool SocketsManifestData::AddAnyHostMessage(
485 PermissionMessages& messages) const {
486 for (SocketPermissionEntrySet::const_iterator it = permissions_.begin();
487 it != permissions_.end(); ++it) {
488 if (it->IsAddressBoundType() &&
489 it->GetHostType() == SocketPermissionEntry::ANY_HOST) {
490 messages.push_back(PermissionMessage(
491 PermissionMessage::kSocketAnyHost,
492 l10n_util::GetStringUTF16(
493 IDS_EXTENSION_PROMPT_WARNING_SOCKET_ANY_HOST)));
494 return true;
495 }
496 }
497 return false;
498 }
499
500 void SocketsManifestData::AddSubdomainHostMessage(
501 PermissionMessages& messages) const {
502 std::set<string16> domains;
503 for (SocketPermissionEntrySet::const_iterator it = permissions_.begin();
504 it != permissions_.end(); ++it) {
505 if (it->GetHostType() == SocketPermissionEntry::HOSTS_IN_DOMAINS)
506 domains.insert(UTF8ToUTF16(it->pattern().host));
507 }
508 if (!domains.empty()) {
509 int id = (domains.size() == 1) ?
510 IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAIN :
511 IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAINS;
512 messages.push_back(PermissionMessage(
513 PermissionMessage::kSocketDomainHosts,
514 l10n_util::GetStringFUTF16(
515 id,
516 JoinString(
517 std::vector<string16>(
518 domains.begin(), domains.end()), ' '))));
519 }
520 }
521
522 void SocketsManifestData::AddSpecificHostMessage(
523 PermissionMessages& messages) const {
524 std::set<string16> hostnames;
525 for (SocketPermissionEntrySet::const_iterator it = permissions_.begin();
526 it != permissions_.end(); ++it) {
527 if (it->GetHostType() == SocketPermissionEntry::SPECIFIC_HOSTS)
528 hostnames.insert(UTF8ToUTF16(it->pattern().host));
529 }
530 if (!hostnames.empty()) {
531 int id = (hostnames.size() == 1) ?
532 IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOST :
533 IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOSTS;
534 messages.push_back(PermissionMessage(
535 PermissionMessage::kSocketSpecificHosts,
536 l10n_util::GetStringFUTF16(
537 id,
538 JoinString(
539 std::vector<string16>(
540 hostnames.begin(), hostnames.end()), ' '))));
541 }
542 }
543
544 void SocketsManifestData::AddNetworkListMessage(
545 PermissionMessages& messages) const {
546 for (SocketPermissionEntrySet::const_iterator it = permissions_.begin();
547 it != permissions_.end(); ++it) {
548 if (it->pattern().type == content::SocketPermissionRequest::NETWORK_STATE) {
549 messages.push_back(PermissionMessage(
550 PermissionMessage::kNetworkState,
551 l10n_util::GetStringUTF16(
552 IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE)));
553 }
554 }
555 }
556
155 } // namespace extensions 557 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698