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