Title: [246530] trunk
Revision
246530
Author
[email protected]
Date
2019-06-17 18:43:39 -0700 (Mon, 17 Jun 2019)

Log Message

-[WKWebsiteDataStore removeDataOfTypes:modifiedSince:completionHandler:] doesn't delete _WKWebsiteDataTypeCredentials
https://bugs.webkit.org/show_bug.cgi?id=198854
<rdar://problem/51386058>

Reviewed by Geoffrey Garen.

Source/WebCore:

Add option NSURLCredentialStorageRemoveSynchronizableCredentials when removing persistent credential so
credentials from same account will be removed from all devices.

Test: WKWebsiteDataStore.RemoveAllPersistentCredentials

* platform/network/CredentialStorage.cpp:
(WebCore::CredentialStorage::originsWithPersistentCredentials):
(WebCore::CredentialStorage::removePersistentCredentialsWithOrigins):
(WebCore::CredentialStorage::clearPersistentCredentials):
* platform/network/CredentialStorage.h:
* platform/network/mac/CredentialStorageMac.mm:
(WebCore::CredentialStorage::originsWithPersistentCredentials):
(WebCore::CredentialStorage::removePersistentCredentialsWithOrigins):
(WebCore::CredentialStorage::clearPersistentCredentials):

Source/WebKit:

Clear persistent credentials in deleteWebsiteData of network process.

Also, merge originsWithPersistentCredentials and removeCredentialsWithOrigins into fetchWebsiteData and
deleteWebsiteData, and move credentials handling to WebCore.

* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::fetchWebsiteData):
(WebKit::NetworkProcess::deleteWebsiteData):
(WebKit::NetworkProcess::deleteWebsiteDataForOrigins):
(WebKit::NetworkProcess::originsWithPersistentCredentials): Deleted.
(WebKit::NetworkProcess::removeCredentialsWithOrigins): Deleted.
* NetworkProcess/NetworkProcess.h:
* NetworkProcess/NetworkProcess.messages.in:
* NetworkProcess/cocoa/NetworkProcessCocoa.mm:
(WebKit::NetworkProcess::originsWithPersistentCredentials): Deleted.
(WebKit::NetworkProcess::removeCredentialsWithOrigins): Deleted.
* UIProcess/WebsiteData/WebsiteDataStore.cpp:
(WebKit::WebsiteDataStore::fetchDataAndApply):
(WebKit::computeWebProcessAccessTypeForDataRemoval):
(WebKit::WebsiteDataStore::removeData):

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/WKWebsiteDatastore.mm:
(TestWebKitAPI::TEST):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (246529 => 246530)


--- trunk/Source/WebCore/ChangeLog	2019-06-18 01:41:01 UTC (rev 246529)
+++ trunk/Source/WebCore/ChangeLog	2019-06-18 01:43:39 UTC (rev 246530)
@@ -1,3 +1,26 @@
+2019-06-17  Sihui Liu  <[email protected]>
+
+        -[WKWebsiteDataStore removeDataOfTypes:modifiedSince:completionHandler:] doesn't delete _WKWebsiteDataTypeCredentials
+        https://bugs.webkit.org/show_bug.cgi?id=198854
+        <rdar://problem/51386058>
+
+        Reviewed by Geoffrey Garen.
+
+        Add option NSURLCredentialStorageRemoveSynchronizableCredentials when removing persistent credential so 
+        credentials from same account will be removed from all devices.
+
+        Test: WKWebsiteDataStore.RemoveAllPersistentCredentials
+
+        * platform/network/CredentialStorage.cpp:
+        (WebCore::CredentialStorage::originsWithPersistentCredentials):
+        (WebCore::CredentialStorage::removePersistentCredentialsWithOrigins):
+        (WebCore::CredentialStorage::clearPersistentCredentials):
+        * platform/network/CredentialStorage.h:
+        * platform/network/mac/CredentialStorageMac.mm:
+        (WebCore::CredentialStorage::originsWithPersistentCredentials):
+        (WebCore::CredentialStorage::removePersistentCredentialsWithOrigins):
+        (WebCore::CredentialStorage::clearPersistentCredentials):
+
 2019-06-17  Ryosuke Niwa  <[email protected]>
 
         m_disconnectedFrame can be null in DOMWindowExtension::willDestroyGlobalObjectInCachedFrame()

Modified: trunk/Source/WebCore/platform/network/CredentialStorage.cpp (246529 => 246530)


--- trunk/Source/WebCore/platform/network/CredentialStorage.cpp	2019-06-18 01:41:01 UTC (rev 246529)
+++ trunk/Source/WebCore/platform/network/CredentialStorage.cpp	2019-06-18 01:43:39 UTC (rev 246530)
@@ -187,4 +187,21 @@
     m_pathToDefaultProtectionSpaceMap.clear();
 }
 
+#if !PLATFORM(COCOA)
+Vector<SecurityOriginData> CredentialStorage::originsWithPersistentCredentials()
+{
+    return { };
+}
+
+void CredentialStorage::removePersistentCredentialsWithOrigins(const Vector<SecurityOriginData>&)
+{
+    return;
+}
+
+void CredentialStorage::clearPersistentCredentials()
+{
+    return;
+}
+#endif
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/network/CredentialStorage.h (246529 => 246530)


--- trunk/Source/WebCore/platform/network/CredentialStorage.h	2019-06-18 01:41:01 UTC (rev 246529)
+++ trunk/Source/WebCore/platform/network/CredentialStorage.h	2019-06-18 01:43:39 UTC (rev 246530)
@@ -48,6 +48,8 @@
     // OS persistent storage.
     WEBCORE_EXPORT static Credential getFromPersistentStorage(const ProtectionSpace&);
     WEBCORE_EXPORT static Vector<SecurityOriginData> originsWithPersistentCredentials();
+    WEBCORE_EXPORT static void removePersistentCredentialsWithOrigins(const Vector<SecurityOriginData>& origins);
+    WEBCORE_EXPORT static void clearPersistentCredentials();
 
     WEBCORE_EXPORT void clearCredentials();
 

Modified: trunk/Source/WebCore/platform/network/mac/CredentialStorageMac.mm (246529 => 246530)


--- trunk/Source/WebCore/platform/network/mac/CredentialStorageMac.mm	2019-06-18 01:41:01 UTC (rev 246529)
+++ trunk/Source/WebCore/platform/network/mac/CredentialStorageMac.mm	2019-06-18 01:43:39 UTC (rev 246530)
@@ -38,13 +38,46 @@
     return credential ? Credential(credential) : Credential();
 }
 
-Vector<WebCore::SecurityOriginData> CredentialStorage::originsWithPersistentCredentials()
+Vector<SecurityOriginData> CredentialStorage::originsWithPersistentCredentials()
 {
-    Vector<WebCore::SecurityOriginData> origins;
+    Vector<SecurityOriginData> origins;
     auto allCredentials = [[NSURLCredentialStorage sharedCredentialStorage] allCredentials];
     for (NSURLProtectionSpace* key in allCredentials.keyEnumerator)
-        origins.append(WebCore::SecurityOriginData { String(key.protocol), String(key.host), key.port });
+        origins.append(SecurityOriginData { String(key.protocol), String(key.host), key.port });
     return origins;
 }
 
+void CredentialStorage::removePersistentCredentialsWithOrigins(const Vector<SecurityOriginData>& origins)
+{
+    auto sharedStorage = [NSURLCredentialStorage sharedCredentialStorage];
+    auto allCredentials = [sharedStorage allCredentials];
+    for (auto& origin : origins) {
+        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];
+                    [sharedStorage removeCredential:credential forProtectionSpace:space options:@{ NSURLCredentialStorageRemoveSynchronizableCredentials : @YES }];
+                }
+            }
+        }
+    }
+}
+
+void CredentialStorage::clearPersistentCredentials()
+{
+    auto sharedStorage = [NSURLCredentialStorage sharedCredentialStorage];
+    auto allCredentials = [sharedStorage allCredentials];
+    for (NSURLProtectionSpace* space in allCredentials.keyEnumerator) {
+        auto credentials = allCredentials[space];
+        for (NSString* user in credentials) {
+            auto credential = credentials[user];
+            [sharedStorage removeCredential:credential forProtectionSpace:space options:@{ NSURLCredentialStorageRemoveSynchronizableCredentials : @YES }];
+        }
+    }
+}
+
 } // namespace WebCore

Modified: trunk/Source/WebKit/ChangeLog (246529 => 246530)


--- trunk/Source/WebKit/ChangeLog	2019-06-18 01:41:01 UTC (rev 246529)
+++ trunk/Source/WebKit/ChangeLog	2019-06-18 01:43:39 UTC (rev 246530)
@@ -1,3 +1,32 @@
+2019-06-17  Sihui Liu  <[email protected]>
+
+        -[WKWebsiteDataStore removeDataOfTypes:modifiedSince:completionHandler:] doesn't delete _WKWebsiteDataTypeCredentials
+        https://bugs.webkit.org/show_bug.cgi?id=198854
+        <rdar://problem/51386058>
+
+        Reviewed by Geoffrey Garen.
+
+        Clear persistent credentials in deleteWebsiteData of network process.
+
+        Also, merge originsWithPersistentCredentials and removeCredentialsWithOrigins into fetchWebsiteData and
+        deleteWebsiteData, and move credentials handling to WebCore.
+
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::fetchWebsiteData):
+        (WebKit::NetworkProcess::deleteWebsiteData):
+        (WebKit::NetworkProcess::deleteWebsiteDataForOrigins):
+        (WebKit::NetworkProcess::originsWithPersistentCredentials): Deleted.
+        (WebKit::NetworkProcess::removeCredentialsWithOrigins): Deleted.
+        * NetworkProcess/NetworkProcess.h:
+        * NetworkProcess/NetworkProcess.messages.in:
+        * NetworkProcess/cocoa/NetworkProcessCocoa.mm:
+        (WebKit::NetworkProcess::originsWithPersistentCredentials): Deleted.
+        (WebKit::NetworkProcess::removeCredentialsWithOrigins): Deleted.
+        * UIProcess/WebsiteData/WebsiteDataStore.cpp:
+        (WebKit::WebsiteDataStore::fetchDataAndApply):
+        (WebKit::computeWebProcessAccessTypeForDataRemoval):
+        (WebKit::WebsiteDataStore::removeData):
+
 2019-06-17  Tim Horton  <[email protected]>
 
         Fix the build with case-sensitive includes

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (246529 => 246530)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2019-06-18 01:41:01 UTC (rev 246529)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2019-06-18 01:43:39 UTC (rev 246530)
@@ -1282,6 +1282,11 @@
             for (auto& securityOrigin : securityOrigins)
                 callbackAggregator->m_websiteData.entries.append({ securityOrigin, WebsiteDataType::Credentials, 0 });
         }
+        if (!sessionID.isEphemeral()) {
+            auto securityOrigins = WebCore::CredentialStorage::originsWithPersistentCredentials();
+            for (auto& securityOrigin : securityOrigins)
+                callbackAggregator->m_websiteData.entries.append({ securityOrigin, WebsiteDataType::Credentials, 0 });
+        }
     }
 
     if (websiteDataTypes.contains(WebsiteDataType::DOMCache)) {
@@ -1359,6 +1364,8 @@
     if (websiteDataTypes.contains(WebsiteDataType::Credentials)) {
         if (auto* session = storageSession(sessionID))
             session->credentialStorage().clearCredentials();
+        if (!sessionID.isEphemeral())
+            WebCore::CredentialStorage::clearPersistentCredentials();
     }
 
     auto clearTasksHandler = WTF::CallbackAggregator::create([this, callbackID] {
@@ -1496,6 +1503,8 @@
             for (auto& originData : originDatas)
                 session->credentialStorage().removeCredentialsWithOrigin(originData);
         }
+        if (!sessionID.isEphemeral())
+            WebCore::CredentialStorage::removePersistentCredentialsWithOrigins(originDatas);
     }
 
     // FIXME: Implement storage quota clearing for these origins.
@@ -2541,16 +2550,6 @@
 }
 
 #if !PLATFORM(COCOA)
-void NetworkProcess::originsWithPersistentCredentials(CompletionHandler<void(Vector<WebCore::SecurityOriginData>)>&& completionHandler)
-{
-    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 (246529 => 246530)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2019-06-18 01:41:01 UTC (rev 246529)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2019-06-18 01:43:39 UTC (rev 246530)
@@ -436,9 +436,6 @@
 #endif
 
     void platformSyncAllCookies(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 (246529 => 246530)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in	2019-06-18 01:41:01 UTC (rev 246529)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in	2019-06-18 01:43:39 UTC (rev 246530)
@@ -168,7 +168,5 @@
     SetAdClickAttributionOverrideTimerForTesting(PAL::SessionID sessionID, bool value) -> () Async
     SetAdClickAttributionConversionURLForTesting(PAL::SessionID sessionID, URL url) -> () Async
     MarkAdClickAttributionsAsExpiredForTesting(PAL::SessionID sessionID) -> () Async
-    OriginsWithPersistentCredentials() -> (Vector<WebCore::SecurityOriginData> origins) Async
-    RemoveCredentialsWithOrigins(Vector<WebCore::SecurityOriginData> origins) -> () Async
     GetLocalStorageOriginDetails(PAL::SessionID sessionID) -> (Vector<WebKit::LocalStorageDatabaseTracker::OriginDetails> details) Async
 }

Modified: trunk/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm (246529 => 246530)


--- trunk/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm	2019-06-18 01:41:01 UTC (rev 246529)
+++ trunk/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm	2019-06-18 01:43:39 UTC (rev 246530)
@@ -212,31 +212,6 @@
     }).get());
 }
 
-void NetworkProcess::originsWithPersistentCredentials(CompletionHandler<void(Vector<WebCore::SecurityOriginData>)>&& completionHandler)
-{
-    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 (246529 => 246530)


--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp	2019-06-18 01:41:01 UTC (rev 246529)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp	2019-06-18 01:43:39 UTC (rev 246530)
@@ -516,24 +516,6 @@
         });
     }
 
-#if PLATFORM(COCOA)
-    if (dataTypes.contains(WebsiteDataType::Credentials) && isPersistent()) {
-        for (auto& processPool : processPools()) {
-            if (!processPool->networkProcess())
-                continue;
-            
-            callbackAggregator->addPendingCallback();
-            WTF::CompletionHandler<void(Vector<WebCore::SecurityOriginData>&&)> completionHandler = [callbackAggregator](Vector<WebCore::SecurityOriginData>&& origins) mutable {
-                WebsiteData websiteData;
-                for (auto& origin : origins)
-                    websiteData.entries.append(WebsiteData::Entry { origin, WebsiteDataType::Credentials, 0 });
-                callbackAggregator->removePendingCallback(WTFMove(websiteData));
-            };
-            processPool->networkProcess()->sendWithAsyncReply(Messages::NetworkProcess::OriginsWithPersistentCredentials(), WTFMove(completionHandler));
-        }
-    }
-#endif
-
 #if ENABLE(NETSCAPE_PLUGIN_API)
     if (dataTypes.contains(WebsiteDataType::PlugInData) && isPersistent()) {
         class State {
@@ -640,9 +622,6 @@
     if (dataTypes.contains(WebsiteDataType::MemoryCache))
         processAccessType = std::max(processAccessType, ProcessAccessType::OnlyIfLaunched);
 
-    if (dataTypes.contains(WebsiteDataType::Credentials))
-        processAccessType = std::max(processAccessType, ProcessAccessType::OnlyIfLaunched);
-
     return processAccessType;
 }
 
@@ -1089,19 +1068,6 @@
         });
     }
 
-    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 (246529 => 246530)


--- trunk/Tools/ChangeLog	2019-06-18 01:41:01 UTC (rev 246529)
+++ trunk/Tools/ChangeLog	2019-06-18 01:43:39 UTC (rev 246530)
@@ -1,3 +1,14 @@
+2019-06-17  Sihui Liu  <[email protected]>
+
+        -[WKWebsiteDataStore removeDataOfTypes:modifiedSince:completionHandler:] doesn't delete _WKWebsiteDataTypeCredentials
+        https://bugs.webkit.org/show_bug.cgi?id=198854
+        <rdar://problem/51386058>
+
+        Reviewed by Geoffrey Garen.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/WKWebsiteDatastore.mm:
+        (TestWebKitAPI::TEST):
+
 2019-06-17  Adrian Perez de Castro  <[email protected]>
 
         [Flatpak][JHBuild] Update build environments to use WPEBackend-fdo 1.3.1

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebsiteDatastore.mm (246529 => 246530)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebsiteDatastore.mm	2019-06-18 01:41:01 UTC (rev 246529)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebsiteDatastore.mm	2019-06-18 01:43:39 UTC (rev 246530)
@@ -252,6 +252,51 @@
     TestWebKitAPI::Util::run(&done);
 }
 
+TEST(WKWebsiteDataStore, RemoveAllPersistentCredentials)
+{
+    usePersistentCredentialStorage = true;
+
+    TCPServer server(respondWithChallengeThenOK);
+    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];
+
+    readyToContinue = false;
+    [websiteDataStore fetchDataRecordsOfTypes:[NSSet setWithObject:_WKWebsiteDataTypeCredentials] completionHandler:^(NSArray<WKWebsiteDataRecord *> *dataRecords) {
+        bool foundRecord = false;
+        for (WKWebsiteDataRecord *record in dataRecords) {
+            auto name = [record displayName];
+            if ([name isEqualToString:@"127.0.0.1"])
+                foundRecord = true;
+        }
+        EXPECT_TRUE(foundRecord);
+        readyToContinue = true;
+    }];
+    TestWebKitAPI::Util::run(&readyToContinue);
+
+    readyToContinue = false;
+    [websiteDataStore removeDataOfTypes:[NSSet setWithObject:_WKWebsiteDataTypeCredentials] modifiedSince:[NSDate distantPast] completionHandler:^() {
+        readyToContinue = true;
+    }];
+    TestWebKitAPI::Util::run(&readyToContinue);
+    
+    readyToContinue = false;
+    [websiteDataStore fetchDataRecordsOfTypes:[NSSet setWithObject:_WKWebsiteDataTypeCredentials] completionHandler:^(NSArray<WKWebsiteDataRecord *> *dataRecords) {
+        bool foundRecord = false;
+        for (WKWebsiteDataRecord *record in dataRecords) {
+            auto name = [record displayName];
+            if ([name isEqualToString:@"127.0.0.1"])
+                foundRecord = true;
+        }
+        EXPECT_FALSE(foundRecord);
+        readyToContinue = true;
+    }];
+    TestWebKitAPI::Util::run(&readyToContinue);
+}
+
 TEST(WKWebsiteDataStore, RemoveNonPersistentCredentials)
 {
     TCPServer server(respondWithChallengeThenOK);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to