1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/permissions/manifest_permission_set.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/logging.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/values.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/error_utils.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/manifest_constants.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/manifest_handler.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/permissions/manifest_permission.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace { 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using extensions::ErrorUtils; 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using extensions::ManifestPermission; 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using extensions::ManifestPermissionSet; 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using extensions::ManifestHandler; 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace errors = extensions::manifest_errors; 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool CreateManifestPermission( 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& permission_name, 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::Value* permission_value, 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ManifestPermissionSet* manifest_permissions, 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* error, 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<std::string>* unhandled_permissions) { 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<ManifestPermission> permission( 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ManifestHandler::CreatePermission(permission_name)); 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!permission) { 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (unhandled_permissions) 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) unhandled_permissions->push_back(permission_name); 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) else 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LOG(WARNING) << "Unknown permission[" << permission_name << "]."; 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!permission->FromValue(permission_value)) { 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (error) { 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *error = ErrorUtils::FormatErrorMessageUTF16( 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) errors::kInvalidPermission, permission_name); 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LOG(WARNING) << "Parse permission failed."; 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) manifest_permissions->insert(permission.release()); 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace extensions { 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ManifestPermissionSet::ParseFromJSON( 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::ListValue* permissions, 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ManifestPermissionSet* manifest_permissions, 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* error, 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<std::string>* unhandled_permissions) { 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < permissions->GetSize(); ++i) { 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string permission_name; 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::Value* permission_value = NULL; 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!permissions->GetString(i, &permission_name)) { 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::DictionaryValue* dict = NULL; 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // permission should be a string or a single key dict. 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!permissions->GetDictionary(i, &dict) || dict->size() != 1) { 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (error) { 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *error = ErrorUtils::FormatErrorMessageUTF16( 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) errors::kInvalidPermission, base::IntToString(i)); 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LOG(WARNING) << "Permission is not a string or single key dict."; 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) continue; 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::DictionaryValue::Iterator it(*dict); 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) permission_name = it.key(); 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) permission_value = &it.value(); 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!CreateManifestPermission(permission_name, permission_value, 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) manifest_permissions, error, 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) unhandled_permissions)) 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace extensions 94