Title: [244883] trunk
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);
 }
+
+}
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to