void applyBlockedStatusToRequest(const BlockedStatus& status, ResourceRequest& request) { if (status.blockedCookies) request.setAllowCookies(false); if (status.madeHTTPS) { const URL& originalURL = request.url(); ASSERT(originalURL.protocolIs("http")); ASSERT(!originalURL.port() || isDefaultPortForProtocol(originalURL.port().value(), originalURL.protocol())); URL newURL = originalURL; newURL.setProtocol("https"); if (originalURL.port()) newURL.setPort(defaultPortForProtocol("https").value()); request.setURL(newURL); } }
bool CSPSource::portMatches(int port, const String& protocol) const { if (m_portWildcard == HasWildcard) return true; if (port == m_port) return true; if (m_port == 80 && (port == 443 || (port == 0 && defaultPortForProtocol(protocol) == 443))) return true; if (!port) return isDefaultPortForProtocol(m_port, protocol); if (!m_port) return isDefaultPortForProtocol(port, protocol); return false; }
TEST(KnownPortsTest, DefaultPortForProtocol) { struct TestCase { const unsigned short port; const char* protocol; } inputs[] = { // Known ones. { 80, "http"}, { 443, "https"}, { 80, "ws"}, { 443, "wss"}, { 21, "ftp"}, { 990, "ftps"}, // Unknown ones. { 0, "foo"}, { 0, "http:"}, { 0, "HTTP"}, { 0, "Https"}, }; for (const TestCase& test : inputs) EXPECT_EQ(test.port, defaultPortForProtocol(test.protocol)); }
BlockedStatus ContentExtensionsBackend::processContentExtensionRulesForLoad(ResourceRequest& request, ResourceType resourceType, DocumentLoader& initiatingDocumentLoader) { Document* currentDocument = nullptr; URL mainDocumentURL; if (Frame* frame = initiatingDocumentLoader.frame()) { currentDocument = frame->document(); if (initiatingDocumentLoader.isLoadingMainResource() && frame->isMainFrame() && resourceType == ResourceType::Document) mainDocumentURL = request.url(); else if (Document* mainDocument = frame->mainFrame().document()) mainDocumentURL = mainDocument->url(); } ResourceLoadInfo resourceLoadInfo = { request.url(), mainDocumentURL, resourceType }; Vector<ContentExtensions::Action> actions = actionsForResourceLoad(resourceLoadInfo); bool willBlockLoad = false; for (const auto& action : actions) { switch (action.type()) { case ContentExtensions::ActionType::BlockLoad: willBlockLoad = true; break; case ContentExtensions::ActionType::BlockCookies: request.setAllowCookies(false); break; case ContentExtensions::ActionType::CSSDisplayNoneSelector: if (resourceType == ResourceType::Document) initiatingDocumentLoader.addPendingContentExtensionDisplayNoneSelector(action.extensionIdentifier(), action.stringArgument(), action.actionID()); else if (currentDocument) currentDocument->extensionStyleSheets().addDisplayNoneSelector(action.extensionIdentifier(), action.stringArgument(), action.actionID()); break; case ContentExtensions::ActionType::CSSDisplayNoneStyleSheet: { StyleSheetContents* styleSheetContents = globalDisplayNoneStyleSheet(action.stringArgument()); if (styleSheetContents) { if (resourceType == ResourceType::Document) initiatingDocumentLoader.addPendingContentExtensionSheet(action.stringArgument(), *styleSheetContents); else if (currentDocument) currentDocument->extensionStyleSheets().maybeAddContentExtensionSheet(action.stringArgument(), *styleSheetContents); } break; } case ContentExtensions::ActionType::MakeHTTPS: { const URL originalURL = request.url(); if (originalURL.protocolIs("http") && (!originalURL.hasPort() || isDefaultPortForProtocol(originalURL.port(), originalURL.protocol()))) { URL newURL = originalURL; newURL.setProtocol("https"); if (originalURL.hasPort()) newURL.setPort(defaultPortForProtocol("https")); request.setURL(newURL); if (resourceType == ResourceType::Document && initiatingDocumentLoader.isLoadingMainResource()) { // This is to make sure the correct 'new' URL shows in the location bar. initiatingDocumentLoader.request().setURL(newURL); initiatingDocumentLoader.frameLoader()->client().dispatchDidChangeProvisionalURL(); } if (currentDocument) currentDocument->addConsoleMessage(MessageSource::ContentBlocker, MessageLevel::Info, makeString("Content blocker promoted URL from ", originalURL.string(), " to ", newURL.string())); } break; } case ContentExtensions::ActionType::IgnorePreviousRules: case ContentExtensions::ActionType::InvalidAction: RELEASE_ASSERT_NOT_REACHED(); } } if (willBlockLoad) { if (currentDocument) currentDocument->addConsoleMessage(MessageSource::ContentBlocker, MessageLevel::Info, makeString("Content blocker prevented frame displaying ", mainDocumentURL.string(), " from loading a resource from ", request.url().string())); return BlockedStatus::Blocked; } return BlockedStatus::NotBlocked; }