Skip to content

Commit a77be84

Browse files
REGRESSION(r230681) Do not use stored credentials if WKBundlePageResourceLoadClient.shouldUseCredentialStorage returns false
https://bugs.webkit.org/show_bug.cgi?id=197093 <rdar://problem/49708268> Reviewed by Chris Dumez. Source/WebKit: Only get the StoredCredentialsPolicy from the NetworkLoadChecker if we haven't already been told not to use credentials. Also add some test infrastructure for clearing persistent credentials added by the test. * NetworkProcess/NetworkProcess.cpp: (WebKit::NetworkProcess::removeCredential): * NetworkProcess/NetworkProcess.h: * NetworkProcess/NetworkProcess.messages.in: * NetworkProcess/NetworkResourceLoader.cpp: (WebKit::NetworkResourceLoader::startNetworkLoad): * NetworkProcess/cocoa/NetworkProcessCocoa.mm: (WebKit::NetworkProcess::removeCredential): * UIProcess/API/Cocoa/WKProcessPool.mm: (-[WKProcessPool _removeCredential:forProtectionSpace:completionHandler:]): * UIProcess/API/Cocoa/WKProcessPoolPrivate.h: * UIProcess/WebProcessPool.cpp: (WebKit::WebProcessPool::removeCredential): * UIProcess/WebProcessPool.h: Tools: Add a test that does two loads. The first load shouldUseCredentialStorage returns true and we provide a persistent credential. The second load shouldUseCredentialStorage returns false and we verify that a challenge is received with no suggested credential. We also need to make the TCPServer able to handle more than one connection because we need these two loads to come from the same protection space, and our current Cocoa implementation of NetworkSession uses two NSURLSessions that don't share a connection cache, one for loads with credentials and one for loads without credentials, so there are two TCP connections to the same server in this test. * TestWebKitAPI/TCPServer.cpp: (TestWebKitAPI::TCPServer::TCPServer): (TestWebKitAPI::TCPServer::~TCPServer): (TestWebKitAPI::TCPServer::socketBindListen): (TestWebKitAPI::TCPServer::waitForAndReplyToRequests): Deleted. * TestWebKitAPI/TCPServer.h: * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WebKitCocoa/BasicProposedCredentialPlugIn.mm: Added. (-[BasicProposedCredentialPlugIn webProcessPlugIn:didCreateBrowserContextController:]): * TestWebKitAPI/Tests/WebKitCocoa/Challenge.mm: (respondWithChallengeThenOK): (TestWebKitAPI::TEST): (-[ProposedCredentialDelegate webView:didFinishNavigation:]): (-[ProposedCredentialDelegate webView:didReceiveAuthenticationChallenge:completionHandler:]): (TEST): Canonical link: https://commits.webkit.org/211393@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@244521 268f45cc-cd09-0410-ab3c-d52691b4dbfc
1 parent fb8768d commit a77be84

16 files changed

Lines changed: 269 additions & 72 deletions

File tree

Source/WebKit/ChangeLog

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,29 @@
1+
2019-04-22 Alex Christensen <[email protected]>
2+
3+
REGRESSION(r230681) Do not use stored credentials if WKBundlePageResourceLoadClient.shouldUseCredentialStorage returns false
4+
https://bugs.webkit.org/show_bug.cgi?id=197093
5+
<rdar://problem/49708268>
6+
7+
Reviewed by Chris Dumez.
8+
9+
Only get the StoredCredentialsPolicy from the NetworkLoadChecker if we haven't already been told not to use credentials.
10+
Also add some test infrastructure for clearing persistent credentials added by the test.
11+
12+
* NetworkProcess/NetworkProcess.cpp:
13+
(WebKit::NetworkProcess::removeCredential):
14+
* NetworkProcess/NetworkProcess.h:
15+
* NetworkProcess/NetworkProcess.messages.in:
16+
* NetworkProcess/NetworkResourceLoader.cpp:
17+
(WebKit::NetworkResourceLoader::startNetworkLoad):
18+
* NetworkProcess/cocoa/NetworkProcessCocoa.mm:
19+
(WebKit::NetworkProcess::removeCredential):
20+
* UIProcess/API/Cocoa/WKProcessPool.mm:
21+
(-[WKProcessPool _removeCredential:forProtectionSpace:completionHandler:]):
22+
* UIProcess/API/Cocoa/WKProcessPoolPrivate.h:
23+
* UIProcess/WebProcessPool.cpp:
24+
(WebKit::WebProcessPool::removeCredential):
25+
* UIProcess/WebProcessPool.h:
26+
127
2019-04-22 Chris Dumez <[email protected]>
228

329
Delayed WebProcessLaunch may break the _relatedWebView SPI

Source/WebKit/NetworkProcess/NetworkProcess.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2470,6 +2470,11 @@ StorageQuotaManager& NetworkProcess::storageQuotaManager(PAL::SessionID sessionI
24702470
}
24712471

24722472
#if !PLATFORM(COCOA)
2473+
void NetworkProcess::removeCredential(WebCore::Credential&&, WebCore::ProtectionSpace&&, CompletionHandler<void()>&& completionHandler)
2474+
{
2475+
completionHandler();
2476+
}
2477+
24732478
void NetworkProcess::initializeProcess(const AuxiliaryProcessInitializationParameters&)
24742479
{
24752480
}

Source/WebKit/NetworkProcess/NetworkProcess.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ namespace WebCore {
7272
class CertificateInfo;
7373
class CurlProxySettings;
7474
class DownloadID;
75+
class ProtectionSpace;
7576
class StorageQuotaManager;
7677
class NetworkStorageSession;
7778
class ResourceError;
@@ -426,6 +427,8 @@ class NetworkProcess : public AuxiliaryProcess, private DownloadManager::Client,
426427

427428
void platformSyncAllCookies(CompletionHandler<void()>&&);
428429

430+
void removeCredential(WebCore::Credential&&, WebCore::ProtectionSpace&&, CompletionHandler<void()>&&);
431+
429432
void registerURLSchemeAsSecure(const String&) const;
430433
void registerURLSchemeAsBypassingContentSecurityPolicy(const String&) const;
431434
void registerURLSchemeAsLocal(const String&) const;

Source/WebKit/NetworkProcess/NetworkProcess.messages.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,4 +171,5 @@ messages -> NetworkProcess LegacyReceiver {
171171
ClearAdClickAttribution(PAL::SessionID sessionID) -> () Async
172172
SetAdClickAttributionOverrideTimerForTesting(PAL::SessionID sessionID, bool value) -> () Async
173173
SetAdClickAttributionConversionURLForTesting(PAL::SessionID sessionID, URL url) -> () Async
174+
RemoveCredential(WebCore::Credential credential, WebCore::ProtectionSpace protectionSpace) -> () Async
174175
}

Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ void NetworkResourceLoader::startNetworkLoad(ResourceRequest&& request, FirstLoa
270270

271271
NetworkLoadParameters parameters = m_parameters;
272272
parameters.networkActivityTracker = m_networkActivityTracker;
273-
if (m_networkLoadChecker)
273+
if (parameters.storedCredentialsPolicy == WebCore::StoredCredentialsPolicy::Use && m_networkLoadChecker)
274274
parameters.storedCredentialsPolicy = m_networkLoadChecker->storedCredentialsPolicy();
275275

276276
if (request.url().protocolIsBlob())

Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,18 @@ static void filterPreloadHSTSEntry(const void* key, const void* value, void* con
205205
}).get());
206206
}
207207

208+
void NetworkProcess::removeCredential(WebCore::Credential&& credential, WebCore::ProtectionSpace&& protectionSpace, CompletionHandler<void()>&& completionHandler)
209+
{
210+
NSURLProtectionSpace *nsSpace = protectionSpace.nsSpace();
211+
NSURLCredential *nsCredential = [[[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:nsSpace] objectForKey:credential.user()];
212+
RELEASE_ASSERT(nsCredential);
213+
RELEASE_ASSERT([nsCredential.user isEqualToString:credential.user()]);
214+
RELEASE_ASSERT([nsCredential.password isEqualToString:credential.password()]);
215+
[[NSURLCredentialStorage sharedCredentialStorage] removeCredential:nsCredential forProtectionSpace:nsSpace];
216+
RELEASE_ASSERT(![[[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:nsSpace] objectForKey:credential.user()]);
217+
completionHandler();
218+
}
219+
208220
#if PLATFORM(MAC)
209221
void NetworkProcess::setSharedHTTPCookieStorage(const Vector<uint8_t>& identifier)
210222
{

Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,13 @@ - (void)_preconnectToServer:(NSURL *)serverURL
519519
_processPool->preconnectToServer(serverURL);
520520
}
521521

522+
- (void)_removeCredential:(NSURLCredential *)credential forProtectionSpace:(NSURLProtectionSpace *)protectionSpace completionHandler:(void(^)())completionHandler
523+
{
524+
_processPool->removeCredential(WebCore::Credential(credential), WebCore::ProtectionSpace(protectionSpace), [completionHandler = makeBlockPtr(completionHandler)] {
525+
completionHandler();
526+
});
527+
}
528+
522529
- (size_t)_pluginProcessCount
523530
{
524531
#if !PLATFORM(IOS_FAMILY)

Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@
115115

116116
- (void)_preconnectToServer:(NSURL *)serverURL WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
117117

118+
// Test only.
119+
- (void)_removeCredential:(NSURLCredential *)credential forProtectionSpace:(NSURLProtectionSpace *)protectionSpace completionHandler:(void(^)(void))completionHandler WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
120+
118121
// Test only.
119122
- (void)_setAllowsAnySSLCertificateForServiceWorker:(BOOL)allows WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
120123
- (void)_registerURLSchemeServiceWorkersCanHandle:(NSString *)scheme WK_API_AVAILABLE(macos(10.13.4), ios(11.3));

Source/WebKit/UIProcess/WebProcessPool.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1721,6 +1721,11 @@ void WebProcessPool::useTestingNetworkSession()
17211721
m_shouldUseTestingNetworkSession = true;
17221722
}
17231723

1724+
void WebProcessPool::removeCredential(WebCore::Credential&& credential, WebCore::ProtectionSpace&& protectionSpace, CompletionHandler<void()>&& completionHandler)
1725+
{
1726+
m_networkProcess->sendWithAsyncReply(Messages::NetworkProcess::RemoveCredential(credential, protectionSpace), WTFMove(completionHandler));
1727+
}
1728+
17241729
template<typename T, typename U>
17251730
void WebProcessPool::sendSyncToNetworkingProcess(T&& message, U&& reply)
17261731
{

Source/WebKit/UIProcess/WebProcessPool.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,8 @@ class WebProcessPool final : public API::ObjectImpl<API::Object::Type::ProcessPo
507507

508508
void disableDelayedWebProcessLaunch() { m_isDelayedWebProcessLaunchDisabled = true; }
509509

510+
void removeCredential(WebCore::Credential&&, WebCore::ProtectionSpace&&, CompletionHandler<void()>&&);
511+
510512
private:
511513
void platformInitialize();
512514

0 commit comments

Comments
 (0)