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