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/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 |
OLD | NEW |