OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/renderer/pepper/url_request_info_util.h" | 5 #include "content/renderer/pepper/url_request_info_util.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
9 #include "content/child/request_extra_data.h" | 9 #include "content/child/request_extra_data.h" |
10 #include "content/common/fileapi/file_system_messages.h" | 10 #include "content/common/fileapi/file_system_messages.h" |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
96 bool ValidateURLRequestData(const URLRequestInfoData& data) { | 96 bool ValidateURLRequestData(const URLRequestInfoData& data) { |
97 if (data.prefetch_buffer_lower_threshold < 0 || | 97 if (data.prefetch_buffer_lower_threshold < 0 || |
98 data.prefetch_buffer_upper_threshold < 0 || | 98 data.prefetch_buffer_upper_threshold < 0 || |
99 data.prefetch_buffer_upper_threshold <= | 99 data.prefetch_buffer_upper_threshold <= |
100 data.prefetch_buffer_lower_threshold) { | 100 data.prefetch_buffer_lower_threshold) { |
101 return false; | 101 return false; |
102 } | 102 } |
103 return true; | 103 return true; |
104 } | 104 } |
105 | 105 |
106 std::string FilterStringForXRequestedWithValue(const std::string& s) { | |
107 std::string rv; | |
108 rv.reserve(s.length()); | |
109 for (size_t i = 0; i < s.length(); i++) { | |
110 char c = s[i]; | |
111 // Allow ASCII digits, letters, periods, commas, and underscores. (Ignore | |
112 // all other characters.) | |
113 if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || | |
114 (c >= 'a' && c <= 'z') || (c == '.') || (c == ',') || (c == '_')) | |
115 rv.push_back(c); | |
116 } | |
117 return rv; | |
118 } | |
119 | |
120 // Returns an appropriate value for the X-Requested-With header for plugins that | |
121 // present an X-Requested-With header. Returns a blank string for other plugins. | |
122 // We produce a user-agent-like string (eating spaces and other undesired | |
123 // characters) like "ShockwaveFlash/11.5.31.135" from the plugin name and | |
124 // version. | |
125 std::string MakeXRequestedWithValue(const std::string& name, | |
126 const std::string& version) { | |
127 std::string rv = FilterStringForXRequestedWithValue(name); | |
128 if (rv.empty()) | |
129 return ""; | |
brettw
2014/08/18 21:22:48
When returning an empty string, can you do
retur
Tom Sepez
2014/08/18 22:15:23
Done.
| |
130 | |
131 // Apply to a narrow list of plugins only. | |
132 if (rv != "ShockwaveFlash" && rv != "PPAPITests") | |
133 return ""; | |
134 | |
135 std::string filtered_version = FilterStringForXRequestedWithValue(version); | |
136 if (!filtered_version.empty()) | |
137 rv += "/" + filtered_version; | |
138 | |
139 return rv; | |
140 } | |
141 | |
106 } // namespace | 142 } // namespace |
107 | 143 |
108 bool CreateWebURLRequest(PP_Instance instance, | 144 bool CreateWebURLRequest(PP_Instance instance, |
109 URLRequestInfoData* data, | 145 URLRequestInfoData* data, |
110 WebFrame* frame, | 146 WebFrame* frame, |
111 WebURLRequest* dest) { | 147 WebURLRequest* dest) { |
112 // In the out-of-process case, we've received the URLRequestInfoData | 148 // In the out-of-process case, we've received the URLRequestInfoData |
113 // from the untrusted plugin and done no validation on it. We need to be | 149 // from the untrusted plugin and done no validation on it. We need to be |
114 // sure it's not being malicious by checking everything for consistency. | 150 // sure it's not being malicious by checking everything for consistency. |
115 if (!ValidateURLRequestData(*data)) | 151 if (!ValidateURLRequestData(*data)) |
116 return false; | 152 return false; |
117 | 153 |
154 std::string name_version; | |
155 | |
156 // Allow null instances for testing purposes. | |
157 if (instance) { | |
158 PepperPluginInstanceImpl* instance_impl = | |
159 HostGlobals::Get()->GetInstance(instance); | |
160 if (instance_impl) { | |
161 name_version = MakeXRequestedWithValue( | |
162 instance_impl->module()->name(), | |
163 instance_impl->module()->version()); | |
164 } | |
165 } else { | |
166 name_version = "internal_testing_only"; | |
167 } | |
168 | |
118 dest->initialize(); | 169 dest->initialize(); |
119 dest->setURL(frame->document().completeURL(WebString::fromUTF8(data->url))); | 170 dest->setURL(frame->document().completeURL(WebString::fromUTF8(data->url))); |
120 dest->setDownloadToFile(data->stream_to_file); | 171 dest->setDownloadToFile(data->stream_to_file); |
121 dest->setReportUploadProgress(data->record_upload_progress); | 172 dest->setReportUploadProgress(data->record_upload_progress); |
122 | 173 |
123 if (!data->method.empty()) | 174 if (!data->method.empty()) |
124 dest->setHTTPMethod(WebString::fromUTF8(data->method)); | 175 dest->setHTTPMethod(WebString::fromUTF8(data->method)); |
125 | 176 |
126 dest->setFirstPartyForCookies(frame->document().firstPartyForCookies()); | 177 dest->setFirstPartyForCookies(frame->document().firstPartyForCookies()); |
127 | 178 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
164 if (data->has_custom_referrer_url && !data->custom_referrer_url.empty()) | 215 if (data->has_custom_referrer_url && !data->custom_referrer_url.empty()) |
165 frame->setReferrerForRequest(*dest, GURL(data->custom_referrer_url)); | 216 frame->setReferrerForRequest(*dest, GURL(data->custom_referrer_url)); |
166 | 217 |
167 if (data->has_custom_content_transfer_encoding && | 218 if (data->has_custom_content_transfer_encoding && |
168 !data->custom_content_transfer_encoding.empty()) { | 219 !data->custom_content_transfer_encoding.empty()) { |
169 dest->addHTTPHeaderField( | 220 dest->addHTTPHeaderField( |
170 WebString::fromUTF8("Content-Transfer-Encoding"), | 221 WebString::fromUTF8("Content-Transfer-Encoding"), |
171 WebString::fromUTF8(data->custom_content_transfer_encoding)); | 222 WebString::fromUTF8(data->custom_content_transfer_encoding)); |
172 } | 223 } |
173 | 224 |
174 if (data->has_custom_user_agent) { | 225 if (data->has_custom_user_agent || !name_version.empty()) { |
175 RequestExtraData* extra_data = new RequestExtraData(); | 226 RequestExtraData* extra_data = new RequestExtraData(); |
176 extra_data->set_custom_user_agent( | 227 if (data->has_custom_user_agent) { |
177 WebString::fromUTF8(data->custom_user_agent)); | 228 extra_data->set_custom_user_agent( |
229 WebString::fromUTF8(data->custom_user_agent)); | |
230 } | |
231 if (!name_version.empty()) { | |
232 extra_data->set_x_requested_with( | |
233 WebString::fromUTF8(name_version)); | |
234 } | |
178 dest->setExtraData(extra_data); | 235 dest->setExtraData(extra_data); |
179 } | 236 } |
180 | 237 |
181 return true; | 238 return true; |
182 } | 239 } |
183 | 240 |
184 bool URLRequestRequiresUniversalAccess(const URLRequestInfoData& data) { | 241 bool URLRequestRequiresUniversalAccess(const URLRequestInfoData& data) { |
185 return data.has_custom_referrer_url || | 242 return data.has_custom_referrer_url || |
186 data.has_custom_content_transfer_encoding || | 243 data.has_custom_content_transfer_encoding || |
187 data.has_custom_user_agent || | 244 data.has_custom_user_agent || |
188 url::FindAndCompareScheme(data.url, "javascript", NULL); | 245 url::FindAndCompareScheme(data.url, "javascript", NULL); |
189 } | 246 } |
190 | 247 |
191 } // namespace content | 248 } // namespace content |
OLD | NEW |