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