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

Side by Side Diff: Source/modules/websockets/WebSocket.cpp

Issue 222153002: Disallow connecting an insecure WebSocket from a secure page. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase Created 6 years, 8 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 | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 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 are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * 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 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 if (!m_url.isValid()) { 294 if (!m_url.isValid()) {
295 m_state = CLOSED; 295 m_state = CLOSED;
296 exceptionState.throwDOMException(SyntaxError, "The URL '" + url + "' is invalid."); 296 exceptionState.throwDOMException(SyntaxError, "The URL '" + url + "' is invalid.");
297 return; 297 return;
298 } 298 }
299 if (!m_url.protocolIs("ws") && !m_url.protocolIs("wss")) { 299 if (!m_url.protocolIs("ws") && !m_url.protocolIs("wss")) {
300 m_state = CLOSED; 300 m_state = CLOSED;
301 exceptionState.throwDOMException(SyntaxError, "The URL's scheme must be either 'ws' or 'wss'. '" + m_url.protocol() + "' is not allowed."); 301 exceptionState.throwDOMException(SyntaxError, "The URL's scheme must be either 'ws' or 'wss'. '" + m_url.protocol() + "' is not allowed.");
302 return; 302 return;
303 } 303 }
304 if (MixedContentChecker::isMixedContent(executionContext()->securityOrigin() , m_url)) { 304
305 // FIXME: Throw an exception and close the connection.
306 String message = "Connecting to a non-secure WebSocket server from a sec ure origin is deprecated.";
307 executionContext()->addConsoleMessage(JSMessageSource, WarningMessageLev el, message);
308 }
309 if (m_url.hasFragmentIdentifier()) { 305 if (m_url.hasFragmentIdentifier()) {
310 m_state = CLOSED; 306 m_state = CLOSED;
311 exceptionState.throwDOMException(SyntaxError, "The URL contains a fragme nt identifier ('" + m_url.fragmentIdentifier() + "'). Fragment identifiers are n ot allowed in WebSocket URLs."); 307 exceptionState.throwDOMException(SyntaxError, "The URL contains a fragme nt identifier ('" + m_url.fragmentIdentifier() + "'). Fragment identifiers are n ot allowed in WebSocket URLs.");
312 return; 308 return;
313 } 309 }
314 if (!portAllowed(m_url)) { 310 if (!portAllowed(m_url)) {
315 m_state = CLOSED; 311 m_state = CLOSED;
316 exceptionState.throwSecurityError("The port " + String::number(m_url.por t()) + " is not allowed."); 312 exceptionState.throwSecurityError("The port " + String::number(m_url.por t()) + " is not allowed.");
317 return; 313 return;
318 } 314 }
(...skipping 28 matching lines...) Expand all
347 exceptionState.throwDOMException(SyntaxError, "The subprotocol '" + encodeSubprotocolString(protocols[i]) + "' is duplicated."); 343 exceptionState.throwDOMException(SyntaxError, "The subprotocol '" + encodeSubprotocolString(protocols[i]) + "' is duplicated.");
348 releaseChannel(); 344 releaseChannel();
349 return; 345 return;
350 } 346 }
351 } 347 }
352 348
353 String protocolString; 349 String protocolString;
354 if (!protocols.isEmpty()) 350 if (!protocols.isEmpty())
355 protocolString = joinStrings(protocols, subProtocolSeperator()); 351 protocolString = joinStrings(protocols, subProtocolSeperator());
356 352
357 m_channel->connect(m_url, protocolString); 353 if (!m_channel->connect(m_url, protocolString)) {
354 m_state = CLOSED;
355 exceptionState.throwSecurityError("An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.");
356 releaseChannel();
357 return;
358 }
358 } 359 }
359 360
360 void WebSocket::handleSendResult(WebSocketChannel::SendResult result, ExceptionS tate& exceptionState, WebSocketSendType dataType) 361 void WebSocket::handleSendResult(WebSocketChannel::SendResult result, ExceptionS tate& exceptionState, WebSocketSendType dataType)
361 { 362 {
362 switch (result) { 363 switch (result) {
363 case WebSocketChannel::InvalidMessage: 364 case WebSocketChannel::InvalidMessage:
364 exceptionState.throwDOMException(SyntaxError, "The message contains inva lid characters."); 365 exceptionState.throwDOMException(SyntaxError, "The message contains inva lid characters.");
365 return; 366 return;
366 case WebSocketChannel::SendFail: 367 case WebSocketChannel::SendFail:
367 logError("WebSocket send() failed."); 368 logError("WebSocket send() failed.");
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
676 static const size_t minimumPayloadSizeWithEightByteExtendedPayloadLength = 0 x10000; 677 static const size_t minimumPayloadSizeWithEightByteExtendedPayloadLength = 0 x10000;
677 size_t overhead = hybiBaseFramingOverhead + hybiMaskingKeyLength; 678 size_t overhead = hybiBaseFramingOverhead + hybiMaskingKeyLength;
678 if (payloadSize >= minimumPayloadSizeWithEightByteExtendedPayloadLength) 679 if (payloadSize >= minimumPayloadSizeWithEightByteExtendedPayloadLength)
679 overhead += 8; 680 overhead += 8;
680 else if (payloadSize >= minimumPayloadSizeWithTwoByteExtendedPayloadLength) 681 else if (payloadSize >= minimumPayloadSizeWithTwoByteExtendedPayloadLength)
681 overhead += 2; 682 overhead += 2;
682 return overhead; 683 return overhead;
683 } 684 }
684 685
685 } // namespace WebCore 686 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/modules/websockets/NewWebSocketChannelImpl.cpp ('k') | Source/modules/websockets/WebSocketChannel.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698