Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(117)

Side by Side Diff: extensions/renderer/storage_area.cc

Issue 2953453002: [Extensions Bindings] Add access checks in custom types (Closed)
Patch Set: lazyboy's Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « extensions/renderer/storage_area.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "extensions/renderer/storage_area.h" 5 #include "extensions/renderer/storage_area.h"
6 6
7 #include "base/memory/ptr_util.h" 7 #include "base/memory/ptr_util.h"
8 #include "base/strings/stringprintf.h" 8 #include "base/strings/stringprintf.h"
9 #include "extensions/common/api/storage.h" 9 #include "extensions/common/api/storage.h"
10 #include "extensions/renderer/api_request_handler.h" 10 #include "extensions/renderer/api_request_handler.h"
11 #include "extensions/renderer/api_signature.h" 11 #include "extensions/renderer/api_signature.h"
12 #include "extensions/renderer/api_type_reference_map.h" 12 #include "extensions/renderer/api_type_reference_map.h"
13 #include "extensions/renderer/binding_access_checker.h"
13 #include "gin/arguments.h" 14 #include "gin/arguments.h"
14 #include "gin/handle.h" 15 #include "gin/handle.h"
15 #include "gin/object_template_builder.h" 16 #include "gin/object_template_builder.h"
16 #include "gin/wrappable.h" 17 #include "gin/wrappable.h"
17 18
18 namespace extensions { 19 namespace extensions {
19 20
20 namespace { 21 namespace {
21 22
22 #define DEFINE_STORAGE_AREA_HANDLERS() \ 23 #define DEFINE_STORAGE_AREA_HANDLERS() \
(...skipping 12 matching lines...) Expand all
35 void GetBytesInUse(gin::Arguments* arguments) { \ 36 void GetBytesInUse(gin::Arguments* arguments) { \
36 storage_area_.HandleFunctionCall("getBytesInUse", arguments); \ 37 storage_area_.HandleFunctionCall("getBytesInUse", arguments); \
37 } 38 }
38 39
39 // gin::Wrappables for each of the storage areas. Since each has slightly 40 // gin::Wrappables for each of the storage areas. Since each has slightly
40 // different properties, and the object template is shared between all 41 // different properties, and the object template is shared between all
41 // instances, this is a little verbose. 42 // instances, this is a little verbose.
42 class LocalStorageArea final : public gin::Wrappable<LocalStorageArea> { 43 class LocalStorageArea final : public gin::Wrappable<LocalStorageArea> {
43 public: 44 public:
44 LocalStorageArea(APIRequestHandler* request_handler, 45 LocalStorageArea(APIRequestHandler* request_handler,
45 const APITypeReferenceMap* type_refs) 46 const APITypeReferenceMap* type_refs,
46 : storage_area_(request_handler, type_refs, "local") {} 47 const BindingAccessChecker* access_checker)
48 : storage_area_(request_handler, type_refs, "local", access_checker) {}
47 ~LocalStorageArea() override = default; 49 ~LocalStorageArea() override = default;
48 50
49 static gin::WrapperInfo kWrapperInfo; 51 static gin::WrapperInfo kWrapperInfo;
50 52
51 gin::ObjectTemplateBuilder GetObjectTemplateBuilder( 53 gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
52 v8::Isolate* isolate) override { 54 v8::Isolate* isolate) override {
53 return Wrappable<LocalStorageArea>::GetObjectTemplateBuilder(isolate) 55 return Wrappable<LocalStorageArea>::GetObjectTemplateBuilder(isolate)
54 .SetMethod("get", &LocalStorageArea::Get) 56 .SetMethod("get", &LocalStorageArea::Get)
55 .SetMethod("set", &LocalStorageArea::Set) 57 .SetMethod("set", &LocalStorageArea::Set)
56 .SetMethod("remove", &LocalStorageArea::Remove) 58 .SetMethod("remove", &LocalStorageArea::Remove)
57 .SetMethod("clear", &LocalStorageArea::Clear) 59 .SetMethod("clear", &LocalStorageArea::Clear)
58 .SetMethod("getBytesInUse", &LocalStorageArea::GetBytesInUse) 60 .SetMethod("getBytesInUse", &LocalStorageArea::GetBytesInUse)
59 .SetValue("QUOTA_BYTES", api::storage::local::QUOTA_BYTES); 61 .SetValue("QUOTA_BYTES", api::storage::local::QUOTA_BYTES);
60 } 62 }
61 63
62 private: 64 private:
63 DEFINE_STORAGE_AREA_HANDLERS() 65 DEFINE_STORAGE_AREA_HANDLERS()
64 66
65 StorageArea storage_area_; 67 StorageArea storage_area_;
66 68
67 DISALLOW_COPY_AND_ASSIGN(LocalStorageArea); 69 DISALLOW_COPY_AND_ASSIGN(LocalStorageArea);
68 }; 70 };
69 71
70 gin::WrapperInfo LocalStorageArea::kWrapperInfo = {gin::kEmbedderNativeGin}; 72 gin::WrapperInfo LocalStorageArea::kWrapperInfo = {gin::kEmbedderNativeGin};
71 73
72 class SyncStorageArea final : public gin::Wrappable<SyncStorageArea> { 74 class SyncStorageArea final : public gin::Wrappable<SyncStorageArea> {
73 public: 75 public:
74 SyncStorageArea(APIRequestHandler* request_handler, 76 SyncStorageArea(APIRequestHandler* request_handler,
75 const APITypeReferenceMap* type_refs) 77 const APITypeReferenceMap* type_refs,
76 : storage_area_(request_handler, type_refs, "sync") {} 78 const BindingAccessChecker* access_checker)
79 : storage_area_(request_handler, type_refs, "sync", access_checker) {}
77 ~SyncStorageArea() override = default; 80 ~SyncStorageArea() override = default;
78 81
79 static gin::WrapperInfo kWrapperInfo; 82 static gin::WrapperInfo kWrapperInfo;
80 83
81 gin::ObjectTemplateBuilder GetObjectTemplateBuilder( 84 gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
82 v8::Isolate* isolate) override { 85 v8::Isolate* isolate) override {
83 return Wrappable<SyncStorageArea>::GetObjectTemplateBuilder(isolate) 86 return Wrappable<SyncStorageArea>::GetObjectTemplateBuilder(isolate)
84 .SetMethod("get", &SyncStorageArea::Get) 87 .SetMethod("get", &SyncStorageArea::Get)
85 .SetMethod("set", &SyncStorageArea::Set) 88 .SetMethod("set", &SyncStorageArea::Set)
86 .SetMethod("remove", &SyncStorageArea::Remove) 89 .SetMethod("remove", &SyncStorageArea::Remove)
(...skipping 18 matching lines...) Expand all
105 StorageArea storage_area_; 108 StorageArea storage_area_;
106 109
107 DISALLOW_COPY_AND_ASSIGN(SyncStorageArea); 110 DISALLOW_COPY_AND_ASSIGN(SyncStorageArea);
108 }; 111 };
109 112
110 gin::WrapperInfo SyncStorageArea::kWrapperInfo = {gin::kEmbedderNativeGin}; 113 gin::WrapperInfo SyncStorageArea::kWrapperInfo = {gin::kEmbedderNativeGin};
111 114
112 class ManagedStorageArea final : public gin::Wrappable<ManagedStorageArea> { 115 class ManagedStorageArea final : public gin::Wrappable<ManagedStorageArea> {
113 public: 116 public:
114 ManagedStorageArea(APIRequestHandler* request_handler, 117 ManagedStorageArea(APIRequestHandler* request_handler,
115 const APITypeReferenceMap* type_refs) 118 const APITypeReferenceMap* type_refs,
116 : storage_area_(request_handler, type_refs, "managed") {} 119 const BindingAccessChecker* access_checker)
120 : storage_area_(request_handler, type_refs, "managed", access_checker) {}
117 ~ManagedStorageArea() override = default; 121 ~ManagedStorageArea() override = default;
118 122
119 static gin::WrapperInfo kWrapperInfo; 123 static gin::WrapperInfo kWrapperInfo;
120 124
121 gin::ObjectTemplateBuilder GetObjectTemplateBuilder( 125 gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
122 v8::Isolate* isolate) override { 126 v8::Isolate* isolate) override {
123 return Wrappable<ManagedStorageArea>::GetObjectTemplateBuilder(isolate) 127 return Wrappable<ManagedStorageArea>::GetObjectTemplateBuilder(isolate)
124 .SetMethod("get", &ManagedStorageArea::Get) 128 .SetMethod("get", &ManagedStorageArea::Get)
125 .SetMethod("set", &ManagedStorageArea::Set) 129 .SetMethod("set", &ManagedStorageArea::Set)
126 .SetMethod("remove", &ManagedStorageArea::Remove) 130 .SetMethod("remove", &ManagedStorageArea::Remove)
(...skipping 10 matching lines...) Expand all
137 }; 141 };
138 142
139 gin::WrapperInfo ManagedStorageArea::kWrapperInfo = {gin::kEmbedderNativeGin}; 143 gin::WrapperInfo ManagedStorageArea::kWrapperInfo = {gin::kEmbedderNativeGin};
140 144
141 #undef DEFINE_STORAGE_AREA_HANDLERS 145 #undef DEFINE_STORAGE_AREA_HANDLERS
142 146
143 } // namespace 147 } // namespace
144 148
145 StorageArea::StorageArea(APIRequestHandler* request_handler, 149 StorageArea::StorageArea(APIRequestHandler* request_handler,
146 const APITypeReferenceMap* type_refs, 150 const APITypeReferenceMap* type_refs,
147 const std::string& name) 151 const std::string& name,
148 : request_handler_(request_handler), type_refs_(type_refs), name_(name) {} 152 const BindingAccessChecker* access_checker)
153 : request_handler_(request_handler),
154 type_refs_(type_refs),
155 name_(name),
156 access_checker_(access_checker) {}
149 StorageArea::~StorageArea() = default; 157 StorageArea::~StorageArea() = default;
150 158
151 // static 159 // static
152 v8::Local<v8::Object> StorageArea::CreateStorageArea( 160 v8::Local<v8::Object> StorageArea::CreateStorageArea(
153 v8::Isolate* isolate, 161 v8::Isolate* isolate,
154 const std::string& property_name, 162 const std::string& property_name,
155 const base::ListValue* property_values, 163 const base::ListValue* property_values,
156 APIRequestHandler* request_handler, 164 APIRequestHandler* request_handler,
157 APIEventHandler* event_handler, 165 APIEventHandler* event_handler,
158 APITypeReferenceMap* type_refs) { 166 APITypeReferenceMap* type_refs,
167 const BindingAccessChecker* access_checker) {
159 v8::Local<v8::Object> object; 168 v8::Local<v8::Object> object;
160 if (property_name == "local") { 169 if (property_name == "local") {
161 gin::Handle<LocalStorageArea> handle = gin::CreateHandle( 170 gin::Handle<LocalStorageArea> handle = gin::CreateHandle(
162 isolate, new LocalStorageArea(request_handler, type_refs)); 171 isolate,
172 new LocalStorageArea(request_handler, type_refs, access_checker));
163 object = handle.ToV8().As<v8::Object>(); 173 object = handle.ToV8().As<v8::Object>();
164 } else if (property_name == "sync") { 174 } else if (property_name == "sync") {
165 gin::Handle<SyncStorageArea> handle = gin::CreateHandle( 175 gin::Handle<SyncStorageArea> handle = gin::CreateHandle(
166 isolate, new SyncStorageArea(request_handler, type_refs)); 176 isolate,
177 new SyncStorageArea(request_handler, type_refs, access_checker));
167 object = handle.ToV8().As<v8::Object>(); 178 object = handle.ToV8().As<v8::Object>();
168 } else { 179 } else {
169 CHECK_EQ("managed", property_name); 180 CHECK_EQ("managed", property_name);
170 gin::Handle<ManagedStorageArea> handle = gin::CreateHandle( 181 gin::Handle<ManagedStorageArea> handle = gin::CreateHandle(
171 isolate, new ManagedStorageArea(request_handler, type_refs)); 182 isolate,
183 new ManagedStorageArea(request_handler, type_refs, access_checker));
172 object = handle.ToV8().As<v8::Object>(); 184 object = handle.ToV8().As<v8::Object>();
173 } 185 }
174 return object; 186 return object;
175 } 187 }
176 188
177 void StorageArea::HandleFunctionCall(const std::string& method_name, 189 void StorageArea::HandleFunctionCall(const std::string& method_name,
178 gin::Arguments* arguments) { 190 gin::Arguments* arguments) {
179 v8::Isolate* isolate = arguments->isolate(); 191 v8::Isolate* isolate = arguments->isolate();
180 v8::HandleScope handle_scope(isolate); 192 v8::HandleScope handle_scope(isolate);
181 v8::Local<v8::Context> context = arguments->GetHolderCreationContext(); 193 v8::Local<v8::Context> context = arguments->GetHolderCreationContext();
182 194
195 std::string full_method_name = "storage." + method_name;
196 if (!access_checker_->HasAccessOrThrowError(context, full_method_name))
197 return;
198
183 std::vector<v8::Local<v8::Value>> argument_list = arguments->GetAll(); 199 std::vector<v8::Local<v8::Value>> argument_list = arguments->GetAll();
184 200
185 std::unique_ptr<base::ListValue> converted_arguments; 201 std::unique_ptr<base::ListValue> converted_arguments;
186 v8::Local<v8::Function> callback; 202 v8::Local<v8::Function> callback;
187 std::string error; 203 std::string error;
188 const APISignature* signature = type_refs_->GetTypeMethodSignature( 204 const APISignature* signature = type_refs_->GetTypeMethodSignature(
189 base::StringPrintf("%s.%s", "storage.StorageArea", method_name.c_str())); 205 base::StringPrintf("%s.%s", "storage.StorageArea", method_name.c_str()));
190 DCHECK(signature); 206 DCHECK(signature);
191 if (!signature->ParseArgumentsToJSON(context, argument_list, *type_refs_, 207 if (!signature->ParseArgumentsToJSON(context, argument_list, *type_refs_,
192 &converted_arguments, &callback, 208 &converted_arguments, &callback,
193 &error)) { 209 &error)) {
194 arguments->ThrowTypeError("Invalid invocation"); 210 arguments->ThrowTypeError("Invalid invocation");
195 return; 211 return;
196 } 212 }
197 213
198 converted_arguments->Insert(0u, base::MakeUnique<base::Value>(name_)); 214 converted_arguments->Insert(0u, base::MakeUnique<base::Value>(name_));
199 request_handler_->StartRequest( 215 request_handler_->StartRequest(
200 context, "storage." + method_name, std::move(converted_arguments), 216 context, full_method_name, std::move(converted_arguments), callback,
201 callback, v8::Local<v8::Function>(), binding::RequestThread::UI); 217 v8::Local<v8::Function>(), binding::RequestThread::UI);
202 } 218 }
203 219
204 } // namespace extensions 220 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/renderer/storage_area.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698