Changeset 244544 in webkit


Ignore:
Timestamp:
Apr 23, 2019 9:14:05 AM (5 years ago)
Author:
wilander@apple.com
Message:

Ad Click Attribution redirects to well-known location should not trigger a conversion if they are blocked by content blockers
https://bugs.webkit.org/show_bug.cgi?id=197183
<rdar://problem/47763188>

Reviewed by Alex Christensen.

Source/WebKit:

Ad Click Attribution conversions are picked up in the redirect handler
in WebKit::NetworkResourceLoader. Content blocking typically happens in
the continued redirect request handling in the web content process and
a blocked request comes back empty.

We need to call the WebKit::NetworkLoadChecker in the network process
for these specific redirects, just like we do for Ping.

The change makes use of the existing function
NetworkLoadChecker::enableContentExtensionsCheck() for this purpose.

In essence, this change makes it possible to block all conversions made
to a "/.well-known/ad-click-attribution/" URL.

  • NetworkProcess/NetworkResourceLoader.cpp:

(WebKit::NetworkResourceLoader::handleAdClickAttributionConversion):

New convenience function.

(WebKit::NetworkResourceLoader::willSendRedirectedRequest):

Now calls NetworkLoadChecker::enableContentExtensionsCheck() if
an Ad Click Attribution conversion was found in the redirect URL.

(WebKit::NetworkResourceLoader::continueWillSendRedirectedRequest):

If the request was not blocked, it will store any found conversion here.

  • NetworkProcess/NetworkResourceLoader.h:

LayoutTests:

  • http/tests/contentextensions/block-ad-click-attribution-expected.txt: Added.
  • http/tests/contentextensions/block-ad-click-attribution.html: Added.
  • http/tests/contentextensions/block-ad-click-attribution.html.json: Added.
Location:
trunk
Files:
3 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r244542 r244544  
     12019-04-23  John Wilander  <wilander@apple.com>
     2
     3        Ad Click Attribution redirects to well-known location should not trigger a conversion if they are blocked by content blockers
     4        https://bugs.webkit.org/show_bug.cgi?id=197183
     5        <rdar://problem/47763188>
     6
     7        Reviewed by Alex Christensen.
     8
     9        * http/tests/contentextensions/block-ad-click-attribution-expected.txt: Added.
     10        * http/tests/contentextensions/block-ad-click-attribution.html: Added.
     11        * http/tests/contentextensions/block-ad-click-attribution.html.json: Added.
     12
    1132019-04-23  Shawn Roberts  <sroberts@apple.com>
    214
  • trunk/Source/WebKit/ChangeLog

    r244541 r244544  
     12019-04-23  John Wilander  <wilander@apple.com>
     2
     3        Ad Click Attribution redirects to well-known location should not trigger a conversion if they are blocked by content blockers
     4        https://bugs.webkit.org/show_bug.cgi?id=197183
     5        <rdar://problem/47763188>
     6
     7        Reviewed by Alex Christensen.
     8
     9        Ad Click Attribution conversions are picked up in the redirect handler
     10        in WebKit::NetworkResourceLoader. Content blocking typically happens in
     11        the continued redirect request handling in the web content process and
     12        a blocked request comes back empty.
     13
     14        We need to call the WebKit::NetworkLoadChecker in the network process
     15        for these specific redirects, just like we do for Ping.
     16
     17        The change makes use of the existing function
     18        NetworkLoadChecker::enableContentExtensionsCheck() for this purpose.
     19
     20        In essence, this change makes it possible to block all conversions made
     21        to a "/.well-known/ad-click-attribution/" URL.
     22
     23        * NetworkProcess/NetworkResourceLoader.cpp:
     24        (WebKit::NetworkResourceLoader::handleAdClickAttributionConversion):
     25            New convenience function.
     26        (WebKit::NetworkResourceLoader::willSendRedirectedRequest):
     27            Now calls NetworkLoadChecker::enableContentExtensionsCheck() if
     28            an Ad Click Attribution conversion was found in the redirect URL.
     29        (WebKit::NetworkResourceLoader::continueWillSendRedirectedRequest):
     30            If the request was not blocked, it will store any found conversion here.
     31        * NetworkProcess/NetworkResourceLoader.h:
     32
    1332019-04-23  Don Olmstead  <don.olmstead@sony.com>
    234
  • trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp

    r244521 r244544  
    4343#include "WebResourceLoaderMessages.h"
    4444#include "WebsiteDataStoreParameters.h"
    45 #include <WebCore/AdClickAttribution.h>
    4645#include <WebCore/BlobDataFileReference.h>
    4746#include <WebCore/CertificateInfo.h>
     
    582581}
    583582
     583void NetworkResourceLoader::handleAdClickAttributionConversion(AdClickAttribution::Conversion&& conversion, const URL& requestURL, const WebCore::ResourceRequest& redirectRequest)
     584{
     585    ASSERT(!sessionID().isEphemeral());
     586
     587    RegistrableDomain redirectDomain { redirectRequest.url() };
     588    auto& firstPartyURL = redirectRequest.firstPartyForCookies();
     589    NetworkSession* networkSession = nullptr;
     590    // The redirect has to be done by the same registrable domain and it has to be a third-party request.
     591    if (redirectDomain.matches(requestURL) && !redirectDomain.matches(firstPartyURL) && (networkSession = m_connection->networkProcess().networkSession(sessionID())))
     592        networkSession->convertAdClickAttribution(AdClickAttribution::Source { WTFMove(redirectDomain) }, AdClickAttribution::Destination { firstPartyURL }, WTFMove(conversion));
     593}
     594
    584595void NetworkResourceLoader::willSendRedirectedRequest(ResourceRequest&& request, ResourceRequest&& redirectRequest, ResourceResponse&& redirectResponse)
    585596{
    586597    ++m_redirectCount;
    587598
    588     auto& redirectURL = redirectRequest.url();
    589     if (!sessionID().isEphemeral()) {
    590         if (auto adClickConversion = AdClickAttribution::parseConversionRequest(redirectURL)) {
    591             RegistrableDomain redirectDomain { redirectURL };
    592             auto& firstPartyURL = redirectRequest.firstPartyForCookies();
    593             NetworkSession* networkSession = nullptr;
    594             // The redirect has to be done by the same registrable domain and it has to be a third-party request.
    595             if (redirectDomain.matches(request.url()) && !redirectDomain.matches(firstPartyURL) && (networkSession = m_connection->networkProcess().networkSession(sessionID())))
    596                 networkSession->convertAdClickAttribution(AdClickAttribution::Source { WTFMove(redirectDomain) }, AdClickAttribution::Destination { firstPartyURL }, WTFMove(*adClickConversion));
    597         }
    598     }
     599    Optional<AdClickAttribution::Conversion> adClickConversion;
     600    if (!sessionID().isEphemeral())
     601        adClickConversion = AdClickAttribution::parseConversionRequest(redirectRequest.url());
    599602
    600603    auto maxAgeCap = validateCacheEntryForMaxAgeCapValidation(request, redirectRequest, redirectResponse);
     
    603606
    604607    if (m_networkLoadChecker) {
     608        if (adClickConversion)
     609            m_networkLoadChecker->enableContentExtensionsCheck();
    605610        m_networkLoadChecker->storeRedirectionIfNeeded(request, redirectResponse);
    606         m_networkLoadChecker->checkRedirection(WTFMove(request), WTFMove(redirectRequest), WTFMove(redirectResponse), this, [protectedThis = makeRef(*this), this, storedCredentialsPolicy = m_networkLoadChecker->storedCredentialsPolicy()](auto&& result) mutable {
     611        m_networkLoadChecker->checkRedirection(WTFMove(request), WTFMove(redirectRequest), WTFMove(redirectResponse), this, [protectedThis = makeRef(*this), this, storedCredentialsPolicy = m_networkLoadChecker->storedCredentialsPolicy(), adClickConversion = WTFMove(adClickConversion)](auto&& result) mutable {
    607612            if (!result.has_value()) {
    608613                if (result.error().isCancellation())
     
    632637
    633638            m_shouldRestartLoad = storedCredentialsPolicy != m_networkLoadChecker->storedCredentialsPolicy();
    634             this->continueWillSendRedirectedRequest(WTFMove(result->request), WTFMove(result->redirectRequest), WTFMove(result->redirectResponse));
     639            this->continueWillSendRedirectedRequest(WTFMove(result->request), WTFMove(result->redirectRequest), WTFMove(result->redirectResponse), WTFMove(adClickConversion));
    635640        });
    636641        return;
    637642    }
    638     continueWillSendRedirectedRequest(WTFMove(request), WTFMove(redirectRequest), WTFMove(redirectResponse));
    639 }
    640 
    641 void NetworkResourceLoader::continueWillSendRedirectedRequest(ResourceRequest&& request, ResourceRequest&& redirectRequest, ResourceResponse&& redirectResponse)
     643    continueWillSendRedirectedRequest(WTFMove(request), WTFMove(redirectRequest), WTFMove(redirectResponse), WTFMove(adClickConversion));
     644}
     645
     646void NetworkResourceLoader::continueWillSendRedirectedRequest(ResourceRequest&& request, ResourceRequest&& redirectRequest, ResourceResponse&& redirectResponse, Optional<AdClickAttribution::Conversion>&& adClickConversion)
    642647{
    643648    ASSERT(!isSynchronous());
    644649
     650    if (adClickConversion)
     651        handleAdClickAttributionConversion(WTFMove(*adClickConversion), request.url(), redirectRequest);
    645652    send(Messages::WebResourceLoader::WillSendRequest(redirectRequest, sanitizeResponseIfPossible(WTFMove(redirectResponse), ResourceResponse::SanitizationType::Redirection)));
    646653}
  • trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.h

    r244428 r244544  
    3232#include "NetworkLoadClient.h"
    3333#include "NetworkResourceLoadParameters.h"
     34#include <WebCore/AdClickAttribution.h>
    3435#include <WebCore/ContentSecurityPolicyClient.h>
    3536#include <WebCore/ResourceResponse.h>
     
    160161#endif
    161162
    162     void continueWillSendRedirectedRequest(WebCore::ResourceRequest&&, WebCore::ResourceRequest&& redirectRequest, WebCore::ResourceResponse&&);
     163    void continueWillSendRedirectedRequest(WebCore::ResourceRequest&&, WebCore::ResourceRequest&& redirectRequest, WebCore::ResourceResponse&&, Optional<WebCore::AdClickAttribution::Conversion>&&);
    163164    void didFinishWithRedirectResponse(WebCore::ResourceResponse&&);
    164165    WebCore::ResourceResponse sanitizeResponseIfPossible(WebCore::ResourceResponse&&, WebCore::ResourceResponse::SanitizationType);
     
    170171
    171172    void logSlowCacheRetrieveIfNeeded(const NetworkCache::Cache::RetrieveInfo&);
     173
     174    void handleAdClickAttributionConversion(WebCore::AdClickAttribution::Conversion&&, const URL&, const WebCore::ResourceRequest&);
    172175
    173176    Optional<Seconds> validateCacheEntryForMaxAgeCapValidation(const WebCore::ResourceRequest&, const WebCore::ResourceRequest& redirectRequest, const WebCore::ResourceResponse&);
Note: See TracChangeset for help on using the changeset viewer.