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

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: Rebase and fix a unit test 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 = NULL;
54
55 if (!value)
56 return false;
57
58 if (!value->GetAsList(&list) && list->GetSize() == 0)
59 return false;
60
61 for (size_t i = 0; i < list->GetSize(); ++i) {
62 std::string str;
63 SocketPermissionData data;
64 if (!list->GetString(i, &str) || !data.Parse(str))
65 return false;
66 data_set_.insert(data);
67 }
68 return true;
69 }
70
71 void SocketPermission::ToValue(base::Value** value) const {
72 base::ListValue* list = new ListValue();
73
74 std::set<SocketPermissionData>::const_iterator it = data_set_.begin();
75 std::set<SocketPermissionData>::const_iterator end = data_set_.end();
76
77 for (;it != end; ++it) {
78 list->Append(base::Value::CreateStringValue(it->GetAsString()));
79 }
80 *value = list;
81 }
82
83 APIPermissionDetail* SocketPermission::Clone() const {
84 SocketPermission* result = new SocketPermission(permission());
85 result->data_set_ = data_set_;
86 return result;
87 }
88
89 APIPermissionDetail* SocketPermission::Diff(
90 const APIPermissionDetail* rhs) const {
91 CHECK(rhs->permission() == permission());
92 const SocketPermission* perm = static_cast<const SocketPermission*>(rhs);
93 scoped_refptr<SocketPermission> result = new SocketPermission(permission());
94 std::set_difference(data_set_.begin(), data_set_.end(),
95 perm->data_set_.begin(), perm->data_set_.end(),
96 std::inserter<std::set<SocketPermissionData> >(
97 result->data_set_, result->data_set_.begin()));
98 return result->data_set_.empty() ? NULL : result.release();
99 }
100
101 APIPermissionDetail* SocketPermission::Union(
102 const APIPermissionDetail* rhs) const {
103 CHECK(rhs->permission() == permission());
104 const SocketPermission* perm = static_cast<const SocketPermission*>(rhs);
105 scoped_refptr<SocketPermission> result = new SocketPermission(permission());
106 std::set_union(data_set_.begin(), data_set_.end(),
107 perm->data_set_.begin(), perm->data_set_.end(),
108 std::inserter<std::set<SocketPermissionData> >(
109 result->data_set_, result->data_set_.begin()));
110 return result->data_set_.empty() ? NULL : result.release();
111 }
112
113 APIPermissionDetail* SocketPermission::Intersect(
114 const APIPermissionDetail* rhs) const {
115 CHECK(rhs->permission() == permission());
116 const SocketPermission* perm = static_cast<const SocketPermission*>(rhs);
117 scoped_refptr<SocketPermission> result = new SocketPermission(permission());
118 std::set_intersection(data_set_.begin(), data_set_.end(),
119 perm->data_set_.begin(), perm->data_set_.end(),
120 std::inserter<std::set<SocketPermissionData> >(
121 result->data_set_, result->data_set_.begin()));
122 return result->data_set_.empty() ? NULL : result.release();
123 }
124
125 void SocketPermission::Write(IPC::Message* m) const {
126 IPC::WriteParam(m, data_set_);
127 }
128
129 bool SocketPermission::Read(const IPC::Message* m, PickleIterator* iter) {
130 return IPC::ReadParam(m, iter, &data_set_);
131 }
132
133 void SocketPermission::Log(std::string* log) const {
134 IPC::LogParam(data_set_, log);
135 }
136
137 } // namespace extensions
138
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698