Changeset 195509 in webkit


Ignore:
Timestamp:
Jan 23, 2016 1:44:10 AM (8 years ago)
Author:
commit-queue@webkit.org
Message:

Use credentials from a URL with NetworkSession like we did with ResourceHandle
https://bugs.webkit.org/show_bug.cgi?id=153328

Patch by Alex Christensen <achristensen@webkit.org> on 2016-01-23
Reviewed by Alexey Proskuryakov.

Source/WebCore:

This patch fixes at least http/tests/xmlhttprequest/basic-auth-credentials-escaping.html when using NetworkSession.

  • platform/network/ProtectionSpaceBase.h:

(WebCore::ProtectionSpaceBase::encodingRequiresPlatformData):

  • platform/network/ResourceRequestBase.h:

Add some WEBCORE_EXPORT macros for functions that are now used in WebKit2.

Source/WebKit2:

  • NetworkProcess/NetworkLoad.cpp:

(WebKit::NetworkLoad::NetworkLoad):
createDataTaskWithRequest is being removed, so use std::make_unique<NetworkDataTask> directly instead.
Also, create the task even if we are deferring loading. Don't call resume if we are deferring loading.

  • NetworkProcess/NetworkSession.h:

Callbacks are not just used in NetworkSessionTaskClient, so declare them outside.
The NetworkDataTask now takes a ResourceRequest so we can strip its credentials.

  • NetworkProcess/cocoa/NetworkSessionCocoa.mm:

(-[WKNetworkSessionDelegate URLSession:task:didReceiveChallenge:completionHandler:]):
Try credentials stored with the NetworkDataTask before asking the client for credentials.
(WebKit::NetworkSession::~NetworkSession):
(WebKit::NetworkSession::dataTaskForIdentifier):
(WebKit::NetworkSession::takeDownloadID):
(WebKit::NetworkDataTask::NetworkDataTask):
Strip the credentials from the url before creating the task because we do not know the authentication type.
We will use these credentials when a challenge is received.
(WebKit::NetworkDataTask::~NetworkDataTask):
(WebKit::NetworkDataTask::tryPasswordBasedAuthentication):
If we have credentials from the initial URL, try using them if it is appropriate.
(WebKit::NetworkDataTask::cancel):
(WebKit::NetworkSession::createDataTaskWithRequest): Deleted.

  • Shared/Authentication/AuthenticationManager.h:
Location:
trunk/Source
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r195508 r195509  
     12016-01-23  Alex Christensen  <achristensen@webkit.org>
     2
     3        Use credentials from a URL with NetworkSession like we did with ResourceHandle
     4        https://bugs.webkit.org/show_bug.cgi?id=153328
     5
     6        Reviewed by Alexey Proskuryakov.
     7
     8        This patch fixes at least http/tests/xmlhttprequest/basic-auth-credentials-escaping.html when using NetworkSession.
     9
     10        * platform/network/ProtectionSpaceBase.h:
     11        (WebCore::ProtectionSpaceBase::encodingRequiresPlatformData):
     12        * platform/network/ResourceRequestBase.h:
     13        Add some WEBCORE_EXPORT macros for functions that are now used in WebKit2.
     14
    1152016-01-23  Brady Eidson  <beidson@apple.com>
    216
  • trunk/Source/WebCore/platform/network/ProtectionSpaceBase.h

    r187691 r195509  
    6969   
    7070    bool receivesCredentialSecurely() const;
    71     bool isPasswordBased() const;
     71    WEBCORE_EXPORT bool isPasswordBased() const;
    7272
    7373    bool encodingRequiresPlatformData() const { return false; }
  • trunk/Source/WebCore/platform/network/ResourceRequestBase.h

    r195450 r195509  
    6666        WEBCORE_EXPORT void setURL(const URL& url);
    6767
    68         void removeCredentials();
     68        WEBCORE_EXPORT void removeCredentials();
    6969
    7070        WEBCORE_EXPORT ResourceRequestCachePolicy cachePolicy() const;
  • trunk/Source/WebKit2/ChangeLog

    r195506 r195509  
     12016-01-23  Alex Christensen  <achristensen@webkit.org>
     2
     3        Use credentials from a URL with NetworkSession like we did with ResourceHandle
     4        https://bugs.webkit.org/show_bug.cgi?id=153328
     5
     6        Reviewed by Alexey Proskuryakov.
     7
     8        * NetworkProcess/NetworkLoad.cpp:
     9        (WebKit::NetworkLoad::NetworkLoad):
     10        createDataTaskWithRequest is being removed, so use std::make_unique<NetworkDataTask> directly instead.
     11        Also, create the task even if we are deferring loading.  Don't call resume if we are deferring loading.
     12        * NetworkProcess/NetworkSession.h:
     13        Callbacks are not just used in NetworkSessionTaskClient, so declare them outside.
     14        The NetworkDataTask now takes a ResourceRequest so we can strip its credentials.
     15        * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
     16        (-[WKNetworkSessionDelegate URLSession:task:didReceiveChallenge:completionHandler:]):
     17        Try credentials stored with the NetworkDataTask before asking the client for credentials.
     18        (WebKit::NetworkSession::~NetworkSession):
     19        (WebKit::NetworkSession::dataTaskForIdentifier):
     20        (WebKit::NetworkSession::takeDownloadID):
     21        (WebKit::NetworkDataTask::NetworkDataTask):
     22        Strip the credentials from the url before creating the task because we do not know the authentication type.
     23        We will use these credentials when a challenge is received.
     24        (WebKit::NetworkDataTask::~NetworkDataTask):
     25        (WebKit::NetworkDataTask::tryPasswordBasedAuthentication):
     26        If we have credentials from the initial URL, try using them if it is appropriate.
     27        (WebKit::NetworkDataTask::cancel):
     28        (WebKit::NetworkSession::createDataTaskWithRequest): Deleted.
     29        * Shared/Authentication/AuthenticationManager.h:
     30
    1312016-01-22  Dan Bernstein  <mitz@apple.com>
    232
  • trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp

    r194810 r195509  
    5151{
    5252#if USE(NETWORK_SESSION)
    53     if (!parameters.defersLoading) {
    54         if (auto* networkSession = SessionTracker::networkSession(parameters.sessionID)) {
    55             m_task = networkSession->createDataTaskWithRequest(parameters.request, *this);
     53    if (auto* networkSession = SessionTracker::networkSession(parameters.sessionID)) {
     54        m_task = std::make_unique<NetworkDataTask>(*networkSession, *this, parameters.request);
     55        if (!parameters.defersLoading)
    5656            m_task->resume();
    57         } else
    58             ASSERT_NOT_REACHED();
    59     }
     57    } else
     58        ASSERT_NOT_REACHED();
    6059#else
    6160    m_handle = ResourceHandle::create(m_networkingContext.get(), parameters.request, this, parameters.defersLoading, parameters.contentSniffingPolicy == SniffContent);
  • trunk/Source/WebKit2/NetworkProcess/NetworkSession.h

    r194810 r195509  
    4242#include <wtf/RetainPtr.h>
    4343#include <wtf/WeakPtr.h>
     44#include <wtf/text/WTFString.h>
    4445
    4546namespace WebCore {
     
    6465class PendingDownload;
    6566
     67typedef std::function<void(const WebCore::ResourceRequest&)> RedirectCompletionHandler;
     68typedef std::function<void(AuthenticationChallengeDisposition, const WebCore::Credential&)> ChallengeCompletionHandler;
     69typedef std::function<void(WebCore::PolicyAction)> ResponseCompletionHandler;
     70
    6671class NetworkSessionTaskClient {
    6772public:
    68     typedef std::function<void(const WebCore::ResourceRequest&)> RedirectCompletionHandler;
    6973    virtual void willPerformHTTPRedirection(const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, RedirectCompletionHandler) = 0;
    70     typedef std::function<void(AuthenticationChallengeDisposition, const WebCore::Credential&)> ChallengeCompletionHandler;
    7174    virtual void didReceiveChallenge(const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler) = 0;
    72     typedef std::function<void(WebCore::PolicyAction)> ResponseCompletionHandler;
    7375    virtual void didReceiveResponse(const WebCore::ResourceResponse&, ResponseCompletionHandler) = 0;
    7476    virtual void didReceiveData(RefPtr<WebCore::SharedBuffer>&&) = 0;
     
    8284    friend class NetworkSession;
    8385public:
    84 #if PLATFORM(COCOA)
    85     explicit NetworkDataTask(NetworkSession&, NetworkSessionTaskClient&, RetainPtr<NSURLSessionDataTask>&&);
    86 #else
    87     explicit NetworkDataTask(NetworkSession&, NetworkSessionTaskClient&);
    88 #endif
     86    explicit NetworkDataTask(NetworkSession&, NetworkSessionTaskClient&, const WebCore::ResourceRequest&);
    8987
    9088    void suspend();
     
    112110        m_pendingDownload = &pendingDownload;
    113111    }
     112    bool tryPasswordBasedAuthentication(const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler);
    114113   
    115114private:
     
    118117    PendingDownload* m_pendingDownload { nullptr };
    119118    DownloadID m_pendingDownloadID;
     119    String m_user;
     120    String m_password;
    120121#if PLATFORM(COCOA)
    121122    RetainPtr<NSURLSessionDataTask> m_task;
     
    134135
    135136    static NetworkSession& defaultSession();
    136    
    137     std::unique_ptr<NetworkDataTask> createDataTaskWithRequest(const WebCore::ResourceRequest&, NetworkSessionTaskClient&);
    138137
    139138    NetworkDataTask* dataTaskForIdentifier(NetworkDataTask::TaskIdentifier);
  • trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm

    r195005 r195509  
    111111    if (auto* networkDataTask = _session->dataTaskForIdentifier(task.taskIdentifier)) {
    112112        auto completionHandlerCopy = Block_copy(completionHandler);
    113         networkDataTask->client().didReceiveChallenge(challenge, [completionHandlerCopy](WebKit::AuthenticationChallengeDisposition disposition, const WebCore::Credential& credential) {
     113        auto challengeCompletionHandler = [completionHandlerCopy](WebKit::AuthenticationChallengeDisposition disposition, const WebCore::Credential& credential)
     114        {
    114115            completionHandlerCopy(toNSURLSessionAuthChallengeDisposition(disposition), credential.nsCredential());
    115116            Block_release(completionHandlerCopy);
    116         });
     117        };
     118       
     119        if (networkDataTask->tryPasswordBasedAuthentication(challenge, challengeCompletionHandler))
     120            return;
     121       
     122        networkDataTask->client().didReceiveChallenge(challenge, challengeCompletionHandler);
    117123    }
    118124}
     
    230236}
    231237
    232 std::unique_ptr<NetworkDataTask> NetworkSession::createDataTaskWithRequest(const WebCore::ResourceRequest& request, NetworkSessionTaskClient& client)
    233 {
    234     return std::make_unique<NetworkDataTask>(*this, client, [m_session dataTaskWithRequest:request.nsURLRequest(WebCore::UpdateHTTPBody)]);
    235 }
    236 
    237238NetworkDataTask* NetworkSession::dataTaskForIdentifier(NetworkDataTask::TaskIdentifier taskIdentifier)
    238239{
     
    264265}
    265266
    266 NetworkDataTask::NetworkDataTask(NetworkSession& session, NetworkSessionTaskClient& client, RetainPtr<NSURLSessionDataTask>&& task)
     267NetworkDataTask::NetworkDataTask(NetworkSession& session, NetworkSessionTaskClient& client, const WebCore::ResourceRequest& requestWithCredentials)
    267268    : m_session(session)
    268269    , m_client(client)
    269     , m_task(WTFMove(task))
    270 {
     270{
     271    ASSERT(isMainThread());
     272
     273    auto request = requestWithCredentials;
     274    m_user = request.url().user();
     275    m_password = request.url().pass();
     276    request.removeCredentials();
     277   
     278    m_task = [m_session.m_session dataTaskWithRequest:request.nsURLRequest(WebCore::UpdateHTTPBody)];
     279   
    271280    ASSERT(!m_session.m_dataTaskMap.contains(taskIdentifier()));
    272     ASSERT(isMainThread());
    273281    m_session.m_dataTaskMap.add(taskIdentifier(), this);
    274282}
     
    282290}
    283291
     292bool NetworkDataTask::tryPasswordBasedAuthentication(const WebCore::AuthenticationChallenge& challenge, ChallengeCompletionHandler completionHandler)
     293{
     294    if (!challenge.protectionSpace().isPasswordBased())
     295        return false;
     296
     297    if (!m_user.isNull() && !m_password.isNull()) {
     298        completionHandler(AuthenticationChallengeDisposition::UseCredential, WebCore::Credential(m_user, m_password, WebCore::CredentialPersistenceForSession));
     299        m_user = String();
     300        m_password = String();
     301        return true;
     302    }
     303
     304    return false;
     305}
     306   
    284307void NetworkDataTask::cancel()
    285308{
  • trunk/Source/WebKit2/Shared/Authentication/AuthenticationManager.h

    r194902 r195509  
    5757
    5858#if USE(NETWORK_SESSION)
    59     typedef NetworkSessionTaskClient::ChallengeCompletionHandler ChallengeCompletionHandler;
    6059    void didReceiveAuthenticationChallenge(uint64_t pageID, uint64_t frameID, const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler);
    6160    void didReceiveAuthenticationChallenge(PendingDownload&, const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler);
Note: See TracChangeset for help on using the changeset viewer.