14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 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) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "extensions/common/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" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static base::LazyInstance<PermissionsInfo> g_permissions_info = 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LAZY_INSTANCE_INITIALIZER; 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PermissionsInfo* PermissionsInfo::GetInstance() { 19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return g_permissions_info.Pointer(); 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void PermissionsInfo::AddProvider(const PermissionsProvider& provider) { 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::vector<APIPermissionInfo*> permissions = provider.GetAllPermissions(); 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::vector<PermissionsProvider::AliasInfo> aliases = 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) provider.GetAllAliases(); 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t i = 0; i < permissions.size(); ++i) 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RegisterPermission(permissions[i]); 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t i = 0; i < aliases.size(); ++i) 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RegisterAlias(aliases[i].name, aliases[i].alias); 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const APIPermissionInfo* PermissionsInfo::GetByID( 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APIPermission::ID id) const { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDMap::const_iterator i = id_map_.find(id); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (i == id_map_.end()) ? NULL : i->second; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const APIPermissionInfo* PermissionsInfo::GetByName( 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name) const { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameMap::const_iterator i = name_map_.find(name); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (i == name_map_.end()) ? NULL : i->second; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)APIPermissionSet PermissionsInfo::GetAll() const { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APIPermissionSet permissions; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (IDMap::const_iterator i = id_map_.begin(); i != id_map_.end(); ++i) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) permissions.insert(i->second->id()); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return permissions; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)APIPermissionSet PermissionsInfo::GetAllByName( 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::set<std::string>& permission_names) const { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APIPermissionSet permissions; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<std::string>::const_iterator i = permission_names.begin(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != permission_names.end(); ++i) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const APIPermissionInfo* permission_info = GetByName(*i); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (permission_info) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) permissions.insert(permission_info->id()); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return permissions; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PermissionsInfo::HasChildPermissions(const std::string& name) const { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameMap::const_iterator i = name_map_.lower_bound(name + '.'); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i == name_map_.end()) return false; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return StartsWithASCII(i->first, name + '.', true); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PermissionsInfo::PermissionsInfo() 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : hosted_app_permission_count_(0), 72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch permission_count_(0) { 73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)PermissionsInfo::~PermissionsInfo() { 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) STLDeleteContainerPairSecondPointers(id_map_.begin(), id_map_.end()); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PermissionsInfo::RegisterAlias( 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* name, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* alias) { 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(ContainsKey(name_map_, name)); 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!ContainsKey(name_map_, alias)); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_map_[alias] = name_map_[name]; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PermissionsInfo::RegisterPermission(APIPermissionInfo* permission) { 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!ContainsKey(id_map_, permission->id())); 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!ContainsKey(name_map_, permission->name())); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) id_map_[permission->id()] = permission; 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) name_map_[permission->name()] = permission; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) permission_count_++; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 98