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

Side by Side Diff: chrome/common/extensions/permissions/socket_permission.cc

Issue 10692160: Support socket endpoint permissions for AppsV2 Socket API. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Support socket endpoint permissions Created 8 years, 4 months 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
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/common/extensions/permissions/socket_permission.h"
6
7 #include <algorithm>
8
9 #include "base/logging.h"
10 #include "base/values.h"
11 #include "chrome/common/extensions/extension_messages.h"
12 #include "chrome/common/extensions/permissions/permissions_info.h"
13 #include "grit/generated_resources.h"
14 #include "ui/base/l10n/l10n_util.h"
15
16 namespace extensions {
17
18 SocketPermission::SocketPermission(const APIPermission* permission)
19 : APIPermissionDetail(permission) {
20 }
21
22 SocketPermission::~SocketPermission() {
23 }
24
25 bool SocketPermission::Check(
26 const APIPermissionDetail::CheckParam* param) const {
27 const CheckParam* socket_param = static_cast<const CheckParam*>(param);
28 std::set<SocketPermissionData>::const_iterator it = data_set_.begin();
29 std::set<SocketPermissionData>::const_iterator end = data_set_.end();
30
31 for (; it != end; ++it) {
32 if (it->Match(socket_param->type, socket_param->host, socket_param->port))
33 return true;
34 }
35 return false;
36 }
37
38 bool SocketPermission::Contains(const APIPermissionDetail* rhs) const {
39 CHECK(rhs->permission() == permission());
40 const SocketPermission* perm = static_cast<const SocketPermission*>(rhs);
41 return std::includes(data_set_.begin(), data_set_.end(),
42 perm->data_set_.begin(), perm->data_set_.end());
43 }
44
45 bool SocketPermission::Equal(const APIPermissionDetail* rhs) const {
46 CHECK(rhs->permission() == permission());
47 const SocketPermission* perm = static_cast<const SocketPermission*>(rhs);
48 return data_set_ == perm->data_set_;
49 }
50
51 bool SocketPermission::FromValue(const base::Value* value) {
52 data_set_.clear();
53 const base::ListValue* list;
54 if (!value->GetAsList(&list) && list->GetSize() == 0)
55 return false;
56 for (size_t i = 0; i < list->GetSize(); ++i) {
57 std::string str;
58 SocketPermissionData data;
59 if (!list->GetString(i, &str) || !data.Parse(str))
60 return false;
61 data_set_.insert(data);
62 }
63 return true;
64 }
65
66 void SocketPermission::ToValue(base::Value** value) const {
67 base::ListValue* list = new ListValue();
68
69 std::set<SocketPermissionData>::const_iterator it = data_set_.begin();
70 std::set<SocketPermissionData>::const_iterator end = data_set_.end();
71
72 for (;it != end; ++it) {
73 list->Append(base::Value::CreateStringValue(it->GetAsString()));
74 }
75 *value = list;
76 }
77
78 APIPermissionDetail* SocketPermission::Clone() const {
79 SocketPermission* result = new SocketPermission(permission());
80 result->data_set_ = data_set_;
81 return result;
82 }
83
84 APIPermissionDetail* SocketPermission::Diff(
85 const APIPermissionDetail* rhs) const {
86 CHECK(rhs->permission() == permission());
87 const SocketPermission* perm = static_cast<const SocketPermission*>(rhs);
88 scoped_refptr<SocketPermission> result = new SocketPermission(permission());
89 std::set_difference(data_set_.begin(), data_set_.end(),
90 perm->data_set_.begin(), perm->data_set_.end(),
91 std::inserter<std::set<SocketPermissionData> >(
92 result->data_set_, result->data_set_.begin()));
93 return result->data_set_.empty() ? NULL : result.release();
94 }
95
96 APIPermissionDetail* SocketPermission::Union(
97 const APIPermissionDetail* rhs) const {
98 CHECK(rhs->permission() == permission());
99 const SocketPermission* perm = static_cast<const SocketPermission*>(rhs);
100 scoped_refptr<SocketPermission> result = new SocketPermission(permission());
101 std::set_union(data_set_.begin(), data_set_.end(),
102 perm->data_set_.begin(), perm->data_set_.end(),
103 std::inserter<std::set<SocketPermissionData> >(
104 result->data_set_, result->data_set_.begin()));
105 return result->data_set_.empty() ? NULL : result.release();
106 }
107
108 APIPermissionDetail* SocketPermission::Intersect(
109 const APIPermissionDetail* rhs) const {
110 CHECK(rhs->permission() == permission());
111 const SocketPermission* perm = static_cast<const SocketPermission*>(rhs);
112 scoped_refptr<SocketPermission> result = new SocketPermission(permission());
113 std::set_intersection(data_set_.begin(), data_set_.end(),
114 perm->data_set_.begin(), perm->data_set_.end(),
115 std::inserter<std::set<SocketPermissionData> >(
116 result->data_set_, result->data_set_.begin()));
117 return result->data_set_.empty() ? NULL : result.release();
118 }
119
120 void SocketPermission::Write(IPC::Message* m) const {
121 IPC::WriteParam(m, data_set_);
122 }
123
124 bool SocketPermission::Read(const IPC::Message* m, PickleIterator* iter) {
125 return IPC::ReadParam(m, iter, &data_set_);
126 }
127
128 void SocketPermission::Log(std::string* log) const {
129 IPC::LogParam(data_set_, log);
130 }
131
132 } // namespace extensions
133
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698