- Revision
- 244883
- Author
- pvol...@apple.com
- Date
- 2019-05-02 13:50:54 -0700 (Thu, 02 May 2019)
Log Message
-[WKWebsiteDataStore removeDataOfTypes:forDataRecords:completionHandler:] doesn't delete _WKWebsiteDataTypeCredentials
https://bugs.webkit.org/show_bug.cgi?id=197510
Source/WebKit:
<rdar://problem/50372338>
Reviewed by Alex Christensen.
When asked to delete persistent credentials for a set of origins, send a message to the network process with the
list of origins. The network process will then delete all persistent credentials from these origins from
NSURLCredentialStorage.
* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::removeCredentialsWithOrigins):
* NetworkProcess/NetworkProcess.h:
* NetworkProcess/NetworkProcess.messages.in:
* NetworkProcess/cocoa/NetworkProcessCocoa.mm:
(WebKit::NetworkProcess::removeCredentialsWithOrigins):
* UIProcess/WebsiteData/WebsiteDataStore.cpp:
(WebKit::WebsiteDataStore::removeData):
Tools:
Reviewed by Alex Christensen.
* TestWebKitAPI/Tests/WebKitCocoa/WKWebsiteDatastore.mm:
(TestWebKitAPI::TEST):
Modified Paths
Diff
Modified: trunk/Source/WebKit/ChangeLog (244882 => 244883)
--- trunk/Source/WebKit/ChangeLog 2019-05-02 20:46:40 UTC (rev 244882)
+++ trunk/Source/WebKit/ChangeLog 2019-05-02 20:50:54 UTC (rev 244883)
@@ -1,3 +1,24 @@
+2019-05-02 Per Arne Vollan <pvol...@apple.com>
+
+ -[WKWebsiteDataStore removeDataOfTypes:forDataRecords:completionHandler:] doesn't delete _WKWebsiteDataTypeCredentials
+ https://bugs.webkit.org/show_bug.cgi?id=197510
+ <rdar://problem/50372338>
+
+ Reviewed by Alex Christensen.
+
+ When asked to delete persistent credentials for a set of origins, send a message to the network process with the
+ list of origins. The network process will then delete all persistent credentials from these origins from
+ NSURLCredentialStorage.
+
+ * NetworkProcess/NetworkProcess.cpp:
+ (WebKit::NetworkProcess::removeCredentialsWithOrigins):
+ * NetworkProcess/NetworkProcess.h:
+ * NetworkProcess/NetworkProcess.messages.in:
+ * NetworkProcess/cocoa/NetworkProcessCocoa.mm:
+ (WebKit::NetworkProcess::removeCredentialsWithOrigins):
+ * UIProcess/WebsiteData/WebsiteDataStore.cpp:
+ (WebKit::WebsiteDataStore::removeData):
+
2019-05-02 Don Olmstead <don.olmst...@sony.com>
[CMake] Refactor WEBKIT_MAKE_FORWARDING_HEADERS into WEBKIT_COPY_FILES
Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (244882 => 244883)
--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp 2019-05-02 20:46:40 UTC (rev 244882)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp 2019-05-02 20:50:54 UTC (rev 244883)
@@ -2506,7 +2506,12 @@
{
completionHandler(Vector<WebCore::SecurityOriginData>());
}
-
+
+void NetworkProcess::removeCredentialsWithOrigins(const Vector<WebCore::SecurityOriginData>&, CompletionHandler<void()>&& completionHandler)
+{
+ completionHandler();
+}
+
void NetworkProcess::initializeProcess(const AuxiliaryProcessInitializationParameters&)
{
}
Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.h (244882 => 244883)
--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h 2019-05-02 20:46:40 UTC (rev 244882)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h 2019-05-02 20:50:54 UTC (rev 244883)
@@ -435,6 +435,7 @@
void removeCredential(WebCore::Credential&&, WebCore::ProtectionSpace&&, CompletionHandler<void()>&&);
void originsWithPersistentCredentials(CompletionHandler<void(Vector<WebCore::SecurityOriginData>)>&&);
+ void removeCredentialsWithOrigins(const Vector<WebCore::SecurityOriginData>& origins, CompletionHandler<void()>&&);
void registerURLSchemeAsSecure(const String&) const;
void registerURLSchemeAsBypassingContentSecurityPolicy(const String&) const;
Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in (244882 => 244883)
--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in 2019-05-02 20:46:40 UTC (rev 244882)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in 2019-05-02 20:50:54 UTC (rev 244883)
@@ -173,5 +173,6 @@
SetAdClickAttributionConversionURLForTesting(PAL::SessionID sessionID, URL url) -> () Async
MarkAdClickAttributionsAsExpiredForTesting(PAL::SessionID sessionID) -> () Async
RemoveCredential(WebCore::Credential credential, WebCore::ProtectionSpace protectionSpace) -> () Async
- OriginsWithPersistentCredentials() -> (Vector<WebCore::SecurityOriginData> persistentCredentials) Async
+ OriginsWithPersistentCredentials() -> (Vector<WebCore::SecurityOriginData> origins) Async
+ RemoveCredentialsWithOrigins(Vector<WebCore::SecurityOriginData> origins) -> () Async
}
Modified: trunk/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm (244882 => 244883)
--- trunk/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm 2019-05-02 20:46:40 UTC (rev 244882)
+++ trunk/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm 2019-05-02 20:50:54 UTC (rev 244883)
@@ -222,6 +222,26 @@
completionHandler(WebCore::CredentialStorage::originsWithPersistentCredentials());
}
+void NetworkProcess::removeCredentialsWithOrigins(const Vector<WebCore::SecurityOriginData>& origins, CompletionHandler<void()>&& completionHandler)
+{
+ for (auto& origin : origins) {
+ auto allCredentials = [[NSURLCredentialStorage sharedCredentialStorage] allCredentials];
+ for (NSURLProtectionSpace* space in allCredentials) {
+ if (origin.protocol == String(space.protocol)
+ && origin.host == String(space.host)
+ && origin.port
+ && *origin.port == space.port) {
+ auto credentials = allCredentials[space];
+ for (NSString* user in credentials) {
+ auto credential = credentials[user];
+ [[NSURLCredentialStorage sharedCredentialStorage] removeCredential:credential forProtectionSpace:space];
+ }
+ }
+ }
+ }
+ completionHandler();
+}
+
#if PLATFORM(MAC)
void NetworkProcess::setSharedHTTPCookieStorage(const Vector<uint8_t>& identifier)
{
Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp (244882 => 244883)
--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp 2019-05-02 20:46:40 UTC (rev 244882)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp 2019-05-02 20:50:54 UTC (rev 244883)
@@ -1181,6 +1181,19 @@
});
}
+ if (dataTypes.contains(WebsiteDataType::Credentials) && isPersistent()) {
+ for (auto& processPool : processPools()) {
+ if (!processPool->networkProcess())
+ continue;
+
+ callbackAggregator->addPendingCallback();
+ WTF::CompletionHandler<void()> completionHandler = [callbackAggregator]() mutable {
+ callbackAggregator->removePendingCallback();
+ };
+ processPool->networkProcess()->sendWithAsyncReply(Messages::NetworkProcess::RemoveCredentialsWithOrigins(origins), WTFMove(completionHandler));
+ }
+ }
+
#if ENABLE(NETSCAPE_PLUGIN_API)
if (dataTypes.contains(WebsiteDataType::PlugInData) && isPersistent()) {
Vector<String> hostNames;
Modified: trunk/Tools/ChangeLog (244882 => 244883)
--- trunk/Tools/ChangeLog 2019-05-02 20:46:40 UTC (rev 244882)
+++ trunk/Tools/ChangeLog 2019-05-02 20:50:54 UTC (rev 244883)
@@ -1,3 +1,13 @@
+2019-05-02 Per Arne Vollan <pvol...@apple.com>
+
+ -[WKWebsiteDataStore removeDataOfTypes:forDataRecords:completionHandler:] doesn't delete _WKWebsiteDataTypeCredentials
+ https://bugs.webkit.org/show_bug.cgi?id=197510
+
+ Reviewed by Alex Christensen.
+
+ * TestWebKitAPI/Tests/WebKitCocoa/WKWebsiteDatastore.mm:
+ (TestWebKitAPI::TEST):
+
2019-05-02 Don Olmstead <don.olmst...@sony.com>
[CMake] Refactor WEBKIT_MAKE_FORWARDING_HEADERS into WEBKIT_COPY_FILES
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebsiteDatastore.mm (244882 => 244883)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebsiteDatastore.mm 2019-05-02 20:46:40 UTC (rev 244882)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebsiteDatastore.mm 2019-05-02 20:50:54 UTC (rev 244883)
@@ -197,4 +197,55 @@
TestWebKitAPI::Util::run(&removedCredential);
}
+TEST(WKWebsiteDataStore, RemovePersistentCredentials)
+{
+ TCPServer server(respondWithChallengeThenOK);
+
+ usePersistentCredentialStorage = true;
+ auto websiteDataStore = [WKWebsiteDataStore defaultDataStore];
+ auto navigationDelegate = adoptNS([[NavigationTestDelegate alloc] init]);
+ auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
+ [webView setNavigationDelegate:navigationDelegate.get()];
+ [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://127.0.0.1:%d/", server.port()]]]];
+ [navigationDelegate waitForDidFinishNavigation];
+
+ __block bool done = false;
+ __block RetainPtr<WKWebsiteDataRecord> expectedRecord;
+ [websiteDataStore fetchDataRecordsOfTypes:[NSSet setWithObject:_WKWebsiteDataTypeCredentials] completionHandler:^(NSArray<WKWebsiteDataRecord *> *dataRecords) {
+ int credentialCount = dataRecords.count;
+ ASSERT_GT(credentialCount, 0);
+ for (WKWebsiteDataRecord *record in dataRecords) {
+ auto name = [record displayName];
+ if ([name isEqualToString:@"127.0.0.1"]) {
+ expectedRecord = record;
+ break;
+ }
+ }
+ EXPECT_TRUE(expectedRecord);
+ done = true;
+ }];
+ TestWebKitAPI::Util::run(&done);
+
+ done = false;
+ [websiteDataStore removeDataOfTypes:[NSSet setWithObject:_WKWebsiteDataTypeCredentials] forDataRecords:[NSArray arrayWithObject:expectedRecord.get()] completionHandler:^(void) {
+ done = true;
+ }];
+ TestWebKitAPI::Util::run(&done);
+
+ done = false;
+ [websiteDataStore fetchDataRecordsOfTypes:[NSSet setWithObject:_WKWebsiteDataTypeCredentials] completionHandler:^(NSArray<WKWebsiteDataRecord *> *dataRecords) {
+ bool foundLocalHostRecord = false;
+ for (WKWebsiteDataRecord *record in dataRecords) {
+ auto name = [record displayName];
+ if ([name isEqualToString:@"127.0.0.1"]) {
+ foundLocalHostRecord = true;
+ break;
+ }
+ }
+ EXPECT_FALSE(foundLocalHostRecord);
+ done = true;
+ }];
+ TestWebKitAPI::Util::run(&done);
}
+
+}