15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/permissions/permissions_info.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/lazy_instance.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/stl_util.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "extensions/common/extensions_client.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static base::LazyInstance<PermissionsInfo> g_permissions_info = 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LAZY_INSTANCE_INITIALIZER; 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PermissionsInfo* PermissionsInfo::GetInstance() { 204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return g_permissions_info.Pointer(); 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PermissionsInfo::~PermissionsInfo() { 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) STLDeleteContainerPairSecondPointers(id_map_.begin(), id_map_.end()); 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const APIPermissionInfo* PermissionsInfo::GetByID( 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APIPermission::ID id) const { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDMap::const_iterator i = id_map_.find(id); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (i == id_map_.end()) ? NULL : i->second; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const APIPermissionInfo* PermissionsInfo::GetByName( 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name) const { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameMap::const_iterator i = name_map_.find(name); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (i == name_map_.end()) ? NULL : i->second; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)APIPermissionSet PermissionsInfo::GetAll() const { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APIPermissionSet permissions; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (IDMap::const_iterator i = id_map_.begin(); i != id_map_.end(); ++i) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) permissions.insert(i->second->id()); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return permissions; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)APIPermissionSet PermissionsInfo::GetAllByName( 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::set<std::string>& permission_names) const { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APIPermissionSet permissions; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<std::string>::const_iterator i = permission_names.begin(); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != permission_names.end(); ++i) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const APIPermissionInfo* permission_info = GetByName(*i); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (permission_info) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) permissions.insert(permission_info->id()); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return permissions; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PermissionsInfo::HasChildPermissions(const std::string& name) const { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameMap::const_iterator i = name_map_.lower_bound(name + '.'); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i == name_map_.end()) return false; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return StartsWithASCII(i->first, name + '.', true); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PermissionsInfo::PermissionsInfo() 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : hosted_app_permission_count_(0), 664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch permission_count_(0) { 674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch DCHECK(ExtensionsClient::Get()); 684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch InitializeWithProvider(ExtensionsClient::Get()->GetPermissionsProvider()); 694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} 704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid PermissionsInfo::InitializeWithProvider( 724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const PermissionsProvider& provider) { 734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch std::vector<APIPermissionInfo*> permissions = provider.GetAllPermissions(); 744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch std::vector<PermissionsProvider::AliasInfo> aliases = 754311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch provider.GetAllAliases(); 764311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch for (size_t i = 0; i < permissions.size(); ++i) 784311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch RegisterPermission(permissions[i]); 794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch for (size_t i = 0; i < aliases.size(); ++i) 804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch RegisterAlias(aliases[i].name, aliases[i].alias); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PermissionsInfo::RegisterAlias( 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* name, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* alias) { 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(ContainsKey(name_map_, name)); 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!ContainsKey(name_map_, alias)); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_map_[alias] = name_map_[name]; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PermissionsInfo::RegisterPermission(APIPermissionInfo* permission) { 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!ContainsKey(id_map_, permission->id())); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!ContainsKey(name_map_, permission->name())); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) id_map_[permission->id()] = permission; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) name_map_[permission->name()] = permission; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) permission_count_++; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 102