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

Side by Side Diff: extensions/common/permissions/api_permission_set.cc

Issue 51433002: Enable permission warnings from ManifestHandlers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix unit test and clang presubmit errors. 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 "extensions/common/permissions/api_permission_set.h" 5 #include "extensions/common/permissions/api_permission_set.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "base/strings/string_number_conversions.h" 9 #include "base/strings/string_number_conversions.h"
10 #include "base/values.h" 10 #include "base/values.h"
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 return false; 102 return false;
103 } 103 }
104 } 104 }
105 105
106 return CreateAPIPermission(base_name, NULL, source, 106 return CreateAPIPermission(base_name, NULL, source,
107 api_permissions, error, NULL); 107 api_permissions, error, NULL);
108 } 108 }
109 109
110 } // namespace 110 } // namespace
111 111
112 APIPermissionSet::APIPermissionSet() {
113 }
114
115 APIPermissionSet::APIPermissionSet(const APIPermissionSet& set) {
116 this->operator=(set);
117 }
118
119 APIPermissionSet::~APIPermissionSet() {
120 }
121
122 APIPermissionSet::const_iterator::const_iterator(
123 const APIPermissionMap::const_iterator& it)
124 : it_(it) {
125 }
126
127 APIPermissionSet::const_iterator::const_iterator(
128 const const_iterator& ids_it)
129 : it_(ids_it.it_) {
130 }
131
132 APIPermissionSet& APIPermissionSet::operator=(const APIPermissionSet& rhs) {
133 const_iterator it = rhs.begin();
134 const const_iterator end = rhs.end();
135 while (it != end) {
136 insert(it->Clone());
137 ++it;
138 }
139 return *this;
140 }
141
142 bool APIPermissionSet::operator==(const APIPermissionSet& rhs) const {
143 const_iterator it = begin();
144 const_iterator rhs_it = rhs.begin();
145 const_iterator it_end = end();
146 const_iterator rhs_it_end = rhs.end();
147
148 while (it != it_end && rhs_it != rhs_it_end) {
149 if (!it->Equal(*rhs_it))
150 return false;
151 ++it;
152 ++rhs_it;
153 }
154 return it == it_end && rhs_it == rhs_it_end;
155 }
156
157 void APIPermissionSet::insert(APIPermission::ID id) { 112 void APIPermissionSet::insert(APIPermission::ID id) {
158 const APIPermissionInfo* permission_info = 113 const APIPermissionInfo* permission_info =
159 PermissionsInfo::GetInstance()->GetByID(id); 114 PermissionsInfo::GetInstance()->GetByID(id);
160 insert(permission_info->CreateAPIPermission()); 115 insert(permission_info->CreateAPIPermission());
161 } 116 }
162 117
163 void APIPermissionSet::insert(APIPermission* permission) { 118 void APIPermissionSet::insert(APIPermission* permission) {
164 map_[permission->id()].reset(permission); 119 BaseSetOperators<APIPermissionSet>::insert(permission);
165 }
166
167 bool APIPermissionSet::Contains(const APIPermissionSet& rhs) const {
168 APIPermissionSet::const_iterator it1 = begin();
169 APIPermissionSet::const_iterator it2 = rhs.begin();
170 APIPermissionSet::const_iterator end1 = end();
171 APIPermissionSet::const_iterator end2 = rhs.end();
172
173 while (it1 != end1 && it2 != end2) {
174 if (it1->id() > it2->id()) {
175 return false;
176 } else if (it1->id() < it2->id()) {
177 ++it1;
178 } else {
179 if (!it1->Contains(*it2))
180 return false;
181 ++it1;
182 ++it2;
183 }
184 }
185
186 return it2 == end2;
187 }
188
189 void APIPermissionSet::Difference(
190 const APIPermissionSet& set1,
191 const APIPermissionSet& set2,
192 APIPermissionSet* set3) {
193 CHECK(set3);
194 set3->clear();
195
196 APIPermissionSet::const_iterator it1 = set1.begin();
197 APIPermissionSet::const_iterator it2 = set2.begin();
198 const APIPermissionSet::const_iterator end1 = set1.end();
199 const APIPermissionSet::const_iterator end2 = set2.end();
200
201 while (it1 != end1 && it2 != end2) {
202 if (it1->id() < it2->id()) {
203 set3->insert(it1->Clone());
204 ++it1;
205 } else if (it1->id() > it2->id()) {
206 ++it2;
207 } else {
208 APIPermission* p = it1->Diff(*it2);
209 if (p)
210 set3->insert(p);
211 ++it1;
212 ++it2;
213 }
214 }
215
216 while (it1 != end1) {
217 set3->insert(it1->Clone());
218 ++it1;
219 }
220 }
221
222 void APIPermissionSet::Intersection(
223 const APIPermissionSet& set1,
224 const APIPermissionSet& set2,
225 APIPermissionSet* set3) {
226 DCHECK(set3);
227 set3->clear();
228
229 APIPermissionSet::const_iterator it1 = set1.begin();
230 APIPermissionSet::const_iterator it2 = set2.begin();
231 const APIPermissionSet::const_iterator end1 = set1.end();
232 const APIPermissionSet::const_iterator end2 = set2.end();
233
234 while (it1 != end1 && it2 != end2) {
235 if (it1->id() < it2->id()) {
236 ++it1;
237 } else if (it1->id() > it2->id()) {
238 ++it2;
239 } else {
240 APIPermission* p = it1->Intersect(*it2);
241 if (p)
242 set3->insert(p);
243 ++it1;
244 ++it2;
245 }
246 }
247 }
248
249 void APIPermissionSet::Union(
250 const APIPermissionSet& set1,
251 const APIPermissionSet& set2,
252 APIPermissionSet* set3) {
253 DCHECK(set3);
254 set3->clear();
255
256 APIPermissionSet::const_iterator it1 = set1.begin();
257 APIPermissionSet::const_iterator it2 = set2.begin();
258 const APIPermissionSet::const_iterator end1 = set1.end();
259 const APIPermissionSet::const_iterator end2 = set2.end();
260
261 while (true) {
262 if (it1 == end1) {
263 while (it2 != end2) {
264 set3->insert(it2->Clone());
265 ++it2;
266 }
267 break;
268 }
269 if (it2 == end2) {
270 while (it1 != end1) {
271 set3->insert(it1->Clone());
272 ++it1;
273 }
274 break;
275 }
276 if (it1->id() < it2->id()) {
277 set3->insert(it1->Clone());
278 ++it1;
279 } else if (it1->id() > it2->id()) {
280 set3->insert(it2->Clone());
281 ++it2;
282 } else {
283 set3->insert(it1->Union(*it2));
284 ++it1;
285 ++it2;
286 }
287 }
288 } 120 }
289 121
290 // static 122 // static
291 bool APIPermissionSet::ParseFromJSON( 123 bool APIPermissionSet::ParseFromJSON(
292 const base::ListValue* permissions, 124 const base::ListValue* permissions,
293 APIPermissionSet::ParseSource source, 125 APIPermissionSet::ParseSource source,
294 APIPermissionSet* api_permissions, 126 APIPermissionSet* api_permissions,
295 string16* error, 127 string16* error,
296 std::vector<std::string>* unhandled_permissions) { 128 std::vector<std::string>* unhandled_permissions) {
297 for (size_t i = 0; i < permissions->GetSize(); ++i) { 129 for (size_t i = 0; i < permissions->GetSize(); ++i) {
(...skipping 29 matching lines...) Expand all
327 api_permissions, error, unhandled_permissions)) 159 api_permissions, error, unhandled_permissions))
328 return false; 160 return false;
329 } 161 }
330 return true; 162 return true;
331 } 163 }
332 164
333 void APIPermissionSet::AddImpliedPermissions() { 165 void APIPermissionSet::AddImpliedPermissions() {
334 // The fileSystem.write and fileSystem.directory permissions imply 166 // The fileSystem.write and fileSystem.directory permissions imply
335 // fileSystem.writeDirectory. 167 // fileSystem.writeDirectory.
336 // TODO(sammc): Remove this. See http://crbug.com/284849. 168 // TODO(sammc): Remove this. See http://crbug.com/284849.
337 if (ContainsKey(map_, APIPermission::kFileSystemWrite) && 169 if (ContainsKey(map(), APIPermission::kFileSystemWrite) &&
338 ContainsKey(map_, APIPermission::kFileSystemDirectory)) { 170 ContainsKey(map(), APIPermission::kFileSystemDirectory)) {
339 insert(APIPermission::kFileSystemWriteDirectory); 171 insert(APIPermission::kFileSystemWriteDirectory);
340 } 172 }
341 } 173 }
342 174
343 } // namespace extensions 175 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/common/permissions/api_permission_set.h ('k') | extensions/common/permissions/base_set_operators.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698