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 "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 Loading... |
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 Loading... |
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 |
OLD | NEW |