OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 20 matching lines...) Expand all Loading... | |
31 | 31 |
32 #include "core/dom/Document.h" | 32 #include "core/dom/Document.h" |
33 #include "core/frame/LocalFrame.h" | 33 #include "core/frame/LocalFrame.h" |
34 #include "core/frame/Settings.h" | 34 #include "core/frame/Settings.h" |
35 #include "core/frame/UseCounter.h" | 35 #include "core/frame/UseCounter.h" |
36 #include "core/inspector/ConsoleMessage.h" | 36 #include "core/inspector/ConsoleMessage.h" |
37 #include "core/loader/DocumentLoader.h" | 37 #include "core/loader/DocumentLoader.h" |
38 #include "core/loader/FrameLoader.h" | 38 #include "core/loader/FrameLoader.h" |
39 #include "core/loader/FrameLoaderClient.h" | 39 #include "core/loader/FrameLoaderClient.h" |
40 #include "platform/RuntimeEnabledFeatures.h" | 40 #include "platform/RuntimeEnabledFeatures.h" |
41 #include "platform/network/ResourceRequest.h" | |
41 #include "platform/weborigin/SchemeRegistry.h" | 42 #include "platform/weborigin/SchemeRegistry.h" |
42 #include "platform/weborigin/SecurityOrigin.h" | 43 #include "platform/weborigin/SecurityOrigin.h" |
43 #include "public/platform/Platform.h" | 44 #include "public/platform/Platform.h" |
44 #include "wtf/text/StringBuilder.h" | 45 #include "wtf/text/StringBuilder.h" |
45 | 46 |
46 namespace blink { | 47 namespace blink { |
47 | 48 |
48 static void measureStricterVersionOfIsMixedContent(LocalFrame* frame, const KURL & url) | 49 static void measureStricterVersionOfIsMixedContent(LocalFrame* frame, const KURL & url) |
49 { | 50 { |
50 // We're currently only checking for mixed content in `https://*` contexts. | 51 // We're currently only checking for mixed content in `https://*` contexts. |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
92 | 93 |
93 measureStricterVersionOfIsMixedContent(frame, url); | 94 measureStricterVersionOfIsMixedContent(frame, url); |
94 if (isMixedContent(frame->document()->securityOrigin(), url)) | 95 if (isMixedContent(frame->document()->securityOrigin(), url)) |
95 return frame; | 96 return frame; |
96 | 97 |
97 // No mixed content, no problem. | 98 // No mixed content, no problem. |
98 return nullptr; | 99 return nullptr; |
99 } | 100 } |
100 | 101 |
101 // static | 102 // static |
102 MixedContentChecker::ContextType MixedContentChecker::contextTypeFromContext(Web URLRequest::RequestContext context, LocalFrame* frame) | 103 ResourceRequest::ContextType MixedContentChecker::contextTypeFromContext(WebURLR equest::RequestContext context, LocalFrame* frame) |
103 { | 104 { |
104 switch (context) { | 105 switch (context) { |
105 // "Optionally-blockable" mixed content | 106 // "Optionally-blockable" mixed content |
106 case WebURLRequest::RequestContextAudio: | 107 case WebURLRequest::RequestContextAudio: |
107 case WebURLRequest::RequestContextFavicon: | 108 case WebURLRequest::RequestContextFavicon: |
108 case WebURLRequest::RequestContextImage: | 109 case WebURLRequest::RequestContextImage: |
109 case WebURLRequest::RequestContextVideo: | 110 case WebURLRequest::RequestContextVideo: |
110 return ContextTypeOptionallyBlockable; | 111 return ResourceRequest::ContextTypeOptionallyBlockable; |
111 | 112 |
112 // Plugins! Oh how dearly we love plugin-loaded content! | 113 // Plugins! Oh how dearly we love plugin-loaded content! |
113 case WebURLRequest::RequestContextPlugin: { | 114 case WebURLRequest::RequestContextPlugin: { |
114 Settings* settings = frame->settings(); | 115 Settings* settings = frame->settings(); |
115 return settings || settings->strictMixedContentCheckingForPlugin() ? Con textTypeBlockable : ContextTypeOptionallyBlockable; | 116 return settings || settings->strictMixedContentCheckingForPlugin() ? Res ourceRequest::ContextTypeBlockable : ResourceRequest::ContextTypeOptionallyBlock able; |
116 } | 117 } |
117 | 118 |
118 // "Blockable" mixed content | 119 // "Blockable" mixed content |
119 case WebURLRequest::RequestContextBeacon: | 120 case WebURLRequest::RequestContextBeacon: |
120 case WebURLRequest::RequestContextCSPReport: | 121 case WebURLRequest::RequestContextCSPReport: |
121 case WebURLRequest::RequestContextEmbed: | 122 case WebURLRequest::RequestContextEmbed: |
122 case WebURLRequest::RequestContextEventSource: | 123 case WebURLRequest::RequestContextEventSource: |
123 case WebURLRequest::RequestContextFetch: | 124 case WebURLRequest::RequestContextFetch: |
124 case WebURLRequest::RequestContextFont: | 125 case WebURLRequest::RequestContextFont: |
125 case WebURLRequest::RequestContextForm: | 126 case WebURLRequest::RequestContextForm: |
126 case WebURLRequest::RequestContextFrame: | 127 case WebURLRequest::RequestContextFrame: |
127 case WebURLRequest::RequestContextHyperlink: | 128 case WebURLRequest::RequestContextHyperlink: |
128 case WebURLRequest::RequestContextIframe: | 129 case WebURLRequest::RequestContextIframe: |
129 case WebURLRequest::RequestContextImageSet: | 130 case WebURLRequest::RequestContextImageSet: |
130 case WebURLRequest::RequestContextImport: | 131 case WebURLRequest::RequestContextImport: |
131 case WebURLRequest::RequestContextLocation: | 132 case WebURLRequest::RequestContextLocation: |
132 case WebURLRequest::RequestContextManifest: | 133 case WebURLRequest::RequestContextManifest: |
133 case WebURLRequest::RequestContextObject: | 134 case WebURLRequest::RequestContextObject: |
134 case WebURLRequest::RequestContextPing: | 135 case WebURLRequest::RequestContextPing: |
135 case WebURLRequest::RequestContextScript: | 136 case WebURLRequest::RequestContextScript: |
136 case WebURLRequest::RequestContextServiceWorker: | 137 case WebURLRequest::RequestContextServiceWorker: |
137 case WebURLRequest::RequestContextSharedWorker: | 138 case WebURLRequest::RequestContextSharedWorker: |
138 case WebURLRequest::RequestContextStyle: | 139 case WebURLRequest::RequestContextStyle: |
139 case WebURLRequest::RequestContextSubresource: | 140 case WebURLRequest::RequestContextSubresource: |
140 case WebURLRequest::RequestContextTrack: | 141 case WebURLRequest::RequestContextTrack: |
141 case WebURLRequest::RequestContextWorker: | 142 case WebURLRequest::RequestContextWorker: |
142 case WebURLRequest::RequestContextXMLHttpRequest: | 143 case WebURLRequest::RequestContextXMLHttpRequest: |
143 case WebURLRequest::RequestContextXSLT: | 144 case WebURLRequest::RequestContextXSLT: |
144 return ContextTypeBlockable; | 145 return ResourceRequest::ContextTypeBlockable; |
145 | 146 |
146 // FIXME: Contexts that we should block, but don't currently. https://crbug. com/388650 | 147 // FIXME: Contexts that we should block, but don't currently. https://crbug. com/388650 |
147 case WebURLRequest::RequestContextDownload: | 148 case WebURLRequest::RequestContextDownload: |
148 case WebURLRequest::RequestContextInternal: | 149 case WebURLRequest::RequestContextInternal: |
149 case WebURLRequest::RequestContextPrefetch: | 150 case WebURLRequest::RequestContextPrefetch: |
150 return ContextTypeShouldBeBlockable; | 151 return ResourceRequest::ContextTypeShouldBeBlockable; |
151 | 152 |
152 case WebURLRequest::RequestContextUnspecified: | 153 case WebURLRequest::RequestContextUnspecified: |
153 ASSERT_NOT_REACHED(); | 154 ASSERT_NOT_REACHED(); |
154 } | 155 } |
155 ASSERT_NOT_REACHED(); | 156 ASSERT_NOT_REACHED(); |
156 return ContextTypeBlockable; | 157 return ResourceRequest::ContextTypeBlockable; |
157 } | 158 } |
158 | 159 |
159 // static | 160 // static |
160 const char* MixedContentChecker::typeNameFromContext(WebURLRequest::RequestConte xt context) | 161 const char* MixedContentChecker::typeNameFromContext(WebURLRequest::RequestConte xt context) |
161 { | 162 { |
162 switch (context) { | 163 switch (context) { |
163 case WebURLRequest::RequestContextAudio: | 164 case WebURLRequest::RequestContextAudio: |
164 return "audio file"; | 165 return "audio file"; |
165 case WebURLRequest::RequestContextBeacon: | 166 case WebURLRequest::RequestContextBeacon: |
166 return "Beacon endpoint"; | 167 return "Beacon endpoint"; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
244 frame->document()->addConsoleMessage(ConsoleMessage::create(SecurityMessageS ource, messageLevel, message)); | 245 frame->document()->addConsoleMessage(ConsoleMessage::create(SecurityMessageS ource, messageLevel, message)); |
245 } | 246 } |
246 | 247 |
247 // static | 248 // static |
248 void MixedContentChecker::count(LocalFrame* frame, WebURLRequest::RequestContext requestContext) | 249 void MixedContentChecker::count(LocalFrame* frame, WebURLRequest::RequestContext requestContext) |
249 { | 250 { |
250 UseCounter::count(frame, UseCounter::MixedContentPresent); | 251 UseCounter::count(frame, UseCounter::MixedContentPresent); |
251 | 252 |
252 // Roll blockable content up into a single counter, count unblocked types in dividually so we | 253 // Roll blockable content up into a single counter, count unblocked types in dividually so we |
253 // can determine when they can be safely moved to the blockable category: | 254 // can determine when they can be safely moved to the blockable category: |
254 ContextType contextType = contextTypeFromContext(requestContext, frame); | 255 ResourceRequest::ContextType contextType = contextTypeFromContext(requestCon text, frame); |
255 if (contextType == ContextTypeBlockable) { | 256 if (contextType == ResourceRequest::ContextTypeBlockable) { |
256 UseCounter::count(frame, UseCounter::MixedContentBlockable); | 257 UseCounter::count(frame, UseCounter::MixedContentBlockable); |
257 return; | 258 return; |
258 } | 259 } |
259 | 260 |
260 UseCounter::Feature feature; | 261 UseCounter::Feature feature; |
261 switch (requestContext) { | 262 switch (requestContext) { |
262 case WebURLRequest::RequestContextAudio: | 263 case WebURLRequest::RequestContextAudio: |
263 feature = UseCounter::MixedContentAudio; | 264 feature = UseCounter::MixedContentAudio; |
264 break; | 265 break; |
265 case WebURLRequest::RequestContextDownload: | 266 case WebURLRequest::RequestContextDownload: |
(...skipping 19 matching lines...) Expand all Loading... | |
285 break; | 286 break; |
286 | 287 |
287 default: | 288 default: |
288 ASSERT_NOT_REACHED(); | 289 ASSERT_NOT_REACHED(); |
289 return; | 290 return; |
290 } | 291 } |
291 UseCounter::count(frame, feature); | 292 UseCounter::count(frame, feature); |
292 } | 293 } |
293 | 294 |
294 // static | 295 // static |
295 bool MixedContentChecker::shouldBlockFetch(LocalFrame* frame, WebURLRequest::Req uestContext requestContext, WebURLRequest::FrameType frameType, const KURL& url, MixedContentChecker::ReportingStatus reportingStatus) | 296 bool MixedContentChecker::shouldBlockFetch(LocalFrame* frame, ResourceRequest* r equest, WebURLRequest::RequestContext requestContext, WebURLRequest::FrameType f rameType, const KURL& url, MixedContentChecker::ReportingStatus reportingStatus) |
296 { | 297 { |
297 LocalFrame* mixedFrame = inWhichFrameIsContentMixed(frame, frameType, url); | 298 LocalFrame* mixedFrame = inWhichFrameIsContentMixed(frame, frameType, url); |
298 if (!mixedFrame) | 299 if (!mixedFrame) { |
300 if (request) | |
301 request->setContextType(ResourceRequest::ContextTypeNotMixedContent) ; | |
pfeldman
2015/08/17 20:32:52
Sorry for not taking a look at it earlier. You sho
estark
2015/08/17 20:36:22
Mike preferred setting it here on the request. If
| |
299 return false; | 302 return false; |
303 } | |
300 | 304 |
301 MixedContentChecker::count(mixedFrame, requestContext); | 305 MixedContentChecker::count(mixedFrame, requestContext); |
302 | 306 |
303 Settings* settings = mixedFrame->settings(); | 307 Settings* settings = mixedFrame->settings(); |
304 FrameLoaderClient* client = mixedFrame->loader().client(); | 308 FrameLoaderClient* client = mixedFrame->loader().client(); |
305 SecurityOrigin* securityOrigin = mixedFrame->document()->securityOrigin(); | 309 SecurityOrigin* securityOrigin = mixedFrame->document()->securityOrigin(); |
306 bool allowed = false; | 310 bool allowed = false; |
307 | 311 |
308 // If we're in strict mode, we'll automagically fail everything, and intenti onally skip | 312 // If we're in strict mode, we'll automagically fail everything, and intenti onally skip |
309 // the client checks in order to prevent degrading the site's security UI. | 313 // the client checks in order to prevent degrading the site's security UI. |
310 bool strictMode = mixedFrame->document()->shouldEnforceStrictMixedContentChe cking() || settings->strictMixedContentChecking(); | 314 bool strictMode = mixedFrame->document()->shouldEnforceStrictMixedContentChe cking() || settings->strictMixedContentChecking(); |
311 | 315 |
312 ContextType contextType = contextTypeFromContext(requestContext, mixedFrame) ; | 316 ResourceRequest::ContextType contextType = contextTypeFromContext(requestCon text, mixedFrame); |
313 | 317 |
314 // If we're loading the main resource of a subframe, we need to take a close look at the loaded URL. | 318 // If we're loading the main resource of a subframe, we need to take a close look at the loaded URL. |
315 // If we're dealing with a CORS-enabled scheme, then block mixed frames as a ctive content. Otherwise, | 319 // If we're dealing with a CORS-enabled scheme, then block mixed frames as a ctive content. Otherwise, |
316 // treat frames as passive content. | 320 // treat frames as passive content. |
317 // | 321 // |
318 // FIXME: Remove this temporary hack once we have a reasonable API for launc hing external applications | 322 // FIXME: Remove this temporary hack once we have a reasonable API for launc hing external applications |
319 // via URLs. http://crbug.com/318788 and https://crbug.com/393481 | 323 // via URLs. http://crbug.com/318788 and https://crbug.com/393481 |
320 if (frameType == WebURLRequest::FrameTypeNested && !SchemeRegistry::shouldTr eatURLSchemeAsCORSEnabled(url.protocol())) | 324 if (frameType == WebURLRequest::FrameTypeNested && !SchemeRegistry::shouldTr eatURLSchemeAsCORSEnabled(url.protocol())) |
321 contextType = ContextTypeOptionallyBlockable; | 325 contextType = ResourceRequest::ContextTypeOptionallyBlockable; |
322 | 326 |
323 switch (contextType) { | 327 switch (contextType) { |
324 case ContextTypeOptionallyBlockable: | 328 case ResourceRequest::ContextTypeOptionallyBlockable: |
325 allowed = !strictMode && client->allowDisplayingInsecureContent(settings && settings->allowDisplayOfInsecureContent(), securityOrigin, url); | 329 allowed = !strictMode && client->allowDisplayingInsecureContent(settings && settings->allowDisplayOfInsecureContent(), securityOrigin, url); |
326 if (allowed) | 330 if (allowed) |
327 client->didDisplayInsecureContent(); | 331 client->didDisplayInsecureContent(); |
328 break; | 332 break; |
329 | 333 |
330 case ContextTypeBlockable: { | 334 case ResourceRequest::ContextTypeBlockable: { |
331 bool shouldAskEmbedder = !strictMode && settings && (!settings->strictly BlockBlockableMixedContent() || settings->allowRunningOfInsecureContent()); | 335 bool shouldAskEmbedder = !strictMode && settings && (!settings->strictly BlockBlockableMixedContent() || settings->allowRunningOfInsecureContent()); |
332 allowed = shouldAskEmbedder && client->allowRunningInsecureContent(setti ngs && settings->allowRunningOfInsecureContent(), securityOrigin, url); | 336 allowed = shouldAskEmbedder && client->allowRunningInsecureContent(setti ngs && settings->allowRunningOfInsecureContent(), securityOrigin, url); |
333 if (allowed) { | 337 if (allowed) { |
334 client->didRunInsecureContent(securityOrigin, url); | 338 client->didRunInsecureContent(securityOrigin, url); |
335 UseCounter::count(mixedFrame, UseCounter::MixedContentBlockableAllow ed); | 339 UseCounter::count(mixedFrame, UseCounter::MixedContentBlockableAllow ed); |
336 } | 340 } |
337 break; | 341 break; |
338 } | 342 } |
339 | 343 |
340 case ContextTypeShouldBeBlockable: | 344 case ResourceRequest::ContextTypeShouldBeBlockable: |
341 allowed = !strictMode; | 345 allowed = !strictMode; |
342 if (allowed) | 346 if (allowed) |
343 client->didDisplayInsecureContent(); | 347 client->didDisplayInsecureContent(); |
344 break; | 348 break; |
349 case ResourceRequest::ContextTypeNotMixedContent: | |
350 ASSERT_NOT_REACHED(); | |
351 break; | |
345 }; | 352 }; |
346 | 353 |
354 if (request) | |
355 request->setContextType(contextType); | |
356 | |
347 if (reportingStatus == SendReport) | 357 if (reportingStatus == SendReport) |
348 logToConsoleAboutFetch(frame, url, requestContext, allowed); | 358 logToConsoleAboutFetch(frame, url, requestContext, allowed); |
349 return !allowed; | 359 return !allowed; |
350 } | 360 } |
351 | 361 |
352 // static | 362 // static |
353 void MixedContentChecker::logToConsoleAboutWebSocket(LocalFrame* frame, const KU RL& url, bool allowed) | 363 void MixedContentChecker::logToConsoleAboutWebSocket(LocalFrame* frame, const KU RL& url, bool allowed) |
354 { | 364 { |
355 String message = String::format( | 365 String message = String::format( |
356 "Mixed Content: The page at '%s' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint '%s'. %s", | 366 "Mixed Content: The page at '%s' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint '%s'. %s", |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
421 { | 431 { |
422 if (!frame || !frame->document() || !frame->document()->loader()) | 432 if (!frame || !frame->document() || !frame->document()->loader()) |
423 return; | 433 return; |
424 | 434 |
425 // Just count these for the moment, don't block them. | 435 // Just count these for the moment, don't block them. |
426 if (Platform::current()->isReservedIPAddress(resourceIPAddress) && !frame->d ocument()->isHostedInReservedIPRange()) | 436 if (Platform::current()->isReservedIPAddress(resourceIPAddress) && !frame->d ocument()->isHostedInReservedIPRange()) |
427 UseCounter::count(frame->document(), UseCounter::MixedContentPrivateHost nameInPublicHostname); | 437 UseCounter::count(frame->document(), UseCounter::MixedContentPrivateHost nameInPublicHostname); |
428 } | 438 } |
429 | 439 |
430 } // namespace blink | 440 } // namespace blink |
OLD | NEW |