Title: [199708] trunk/Source
Revision
199708
Author
beid...@apple.com
Date
2016-04-18 23:02:04 -0700 (Mon, 18 Apr 2016)

Log Message

Modern IDB (Blob support): When reading Blobs from the database, grant the Networking process sandbox access to the files.
https://bugs.webkit.org/show_bug.cgi?id=156640

Reviewed by Alex Christensen.

Source/WebCore:

No new tests (No change in behavior, as blobs in IDB are not yet enabled,
              but when they are enabled testing will cover this).

* Modules/indexeddb/shared/IDBResultData.h: Export some stuff

* fileapi/ThreadableBlobRegistry.cpp:
(WebCore::ThreadableBlobRegistry::registerBlobURLOptionallyFileBacked): Account for
  BlobRegistry change described below.

* platform/network/BlobRegistry.h: Change registerBlobURLOptionallyFileBacked to take a
  BlobDataFileReference instead of a raw path, to allow WK2 to include a sandbox extension.

* platform/network/BlobRegistryImpl.cpp:
(WebCore::BlobRegistryImpl::registerBlobURL): Account for BlobRegistry change described above.
(WebCore::BlobRegistryImpl::registerBlobURLOptionallyFileBacked): Use the passed in
  BlobDataFileHandle, and also register the BlobResourceHandle constructor.
* platform/network/BlobRegistryImpl.h:

Source/WebKit2:

* DatabaseProcess/DatabaseProcess.cpp:
(WebKit::DatabaseProcess::getSandboxExtensionsForBlobFiles): Utility function to ask the UI process for
  SandboxExtensions for a list of files.
(WebKit::DatabaseProcess::didGetSandboxExtensionsForBlobFiles): Take the SandboxExtensions from the UI process
  and pass them along to the completion handler.
* DatabaseProcess/DatabaseProcess.h:
* DatabaseProcess/DatabaseProcess.messages.in:

* DatabaseProcess/IndexedDB/WebIDBConnectionToClient.cpp:
(WebKit::WebIDBConnectionToClient::didGetRecord): If the value returned from the database doesn't have Blob files,
  pass the result directly on to WebCore. If it does, ask the UI process for SandboxExtensions first.

* NetworkProcess/FileAPI/NetworkBlobRegistry.cpp:
(WebKit::NetworkBlobRegistry::registerBlobURLOptionallyFileBacked): Grab the BlobDataFileReference from the
  NetworkConnectionToWebProcess to pass along to the BlobRegistry.

* NetworkProcess/NetworkConnectionToWebProcess.cpp:
(WebKit::NetworkConnectionToWebProcess::preregisterSandboxExtensionsForOptionallyFileBackedBlob): Add this message
  so the WebProcess can preflight the creation of some blob URLs by passing along the SandboxExtensions for their files.
(WebKit::NetworkConnectionToWebProcess::takeBlobDataFileReferenceForPath):
* NetworkProcess/NetworkConnectionToWebProcess.h:
* NetworkProcess/NetworkConnectionToWebProcess.messages.in:

* UIProcess/Databases/DatabaseProcessProxy.cpp:
(WebKit::DatabaseProcessProxy::getSandboxExtensionsForBlobFiles): Create SandboxExtensions for the passed in files and
  return them to the DatabaseProcess.
* UIProcess/Databases/DatabaseProcessProxy.h:
* UIProcess/Databases/DatabaseProcessProxy.messages.in:

* WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp:
(WebKit::WebIDBConnectionToServer::didGetRecordWithSandboxExtensions): New form of "didGetRecord" that handles passing
  the SandboxExtensions to the Networking process before they are needed.
* WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h:
* WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.messages.in:

* WebProcess/FileAPI/BlobRegistryProxy.cpp:
(WebKit::BlobRegistryProxy::registerBlobURLOptionallyFileBacked):
* WebProcess/FileAPI/BlobRegistryProxy.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (199707 => 199708)


--- trunk/Source/WebCore/ChangeLog	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebCore/ChangeLog	2016-04-19 06:02:04 UTC (rev 199708)
@@ -1,3 +1,28 @@
+2016-04-18  Brady Eidson  <beid...@apple.com>
+
+        Modern IDB (Blob support): When reading Blobs from the database, grant the Networking process sandbox access to the files.
+        https://bugs.webkit.org/show_bug.cgi?id=156640
+
+        Reviewed by Alex Christensen.
+
+        No new tests (No change in behavior, as blobs in IDB are not yet enabled,
+                      but when they are enabled testing will cover this).
+
+        * Modules/indexeddb/shared/IDBResultData.h: Export some stuff
+        
+        * fileapi/ThreadableBlobRegistry.cpp:
+        (WebCore::ThreadableBlobRegistry::registerBlobURLOptionallyFileBacked): Account for 
+          BlobRegistry change described below.
+        
+        * platform/network/BlobRegistry.h: Change registerBlobURLOptionallyFileBacked to take a 
+          BlobDataFileReference instead of a raw path, to allow WK2 to include a sandbox extension.
+        
+        * platform/network/BlobRegistryImpl.cpp:
+        (WebCore::BlobRegistryImpl::registerBlobURL): Account for BlobRegistry change described above.
+        (WebCore::BlobRegistryImpl::registerBlobURLOptionallyFileBacked): Use the passed in 
+          BlobDataFileHandle, and also register the BlobResourceHandle constructor.
+        * platform/network/BlobRegistryImpl.h:
+
 2016-04-18  Alex Christensen  <achristen...@webkit.org>
 
         Fix iOS build after r199701

Modified: trunk/Source/WebCore/Modules/indexeddb/shared/IDBResultData.h (199707 => 199708)


--- trunk/Source/WebCore/Modules/indexeddb/shared/IDBResultData.h	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebCore/Modules/indexeddb/shared/IDBResultData.h	2016-04-19 06:02:04 UTC (rev 199708)
@@ -82,7 +82,7 @@
     static IDBResultData openCursorSuccess(const IDBResourceIdentifier&, const IDBGetResult&);
     static IDBResultData iterateCursorSuccess(const IDBResourceIdentifier&, const IDBGetResult&);
 
-    IDBResultData(const IDBResultData&);
+    WEBCORE_EXPORT IDBResultData(const IDBResultData&);
 
     IDBResultType type() const { return m_type; }
     IDBResourceIdentifier requestIdentifier() const { return m_requestIdentifier; }
@@ -96,7 +96,7 @@
     const IDBKeyData* resultKey() const { return m_resultKey.get(); }
     uint64_t resultInteger() const { return m_resultInteger; }
 
-    const IDBGetResult& getResult() const;
+    WEBCORE_EXPORT const IDBGetResult& getResult() const;
 
     WEBCORE_EXPORT IDBResultData();
     template<class Encoder> void encode(Encoder&) const;

Modified: trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp (199707 => 199708)


--- trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp	2016-04-19 06:02:04 UTC (rev 199708)
@@ -160,7 +160,7 @@
 void ThreadableBlobRegistry::registerBlobURLOptionallyFileBacked(const URL& url, const URL& srcURL, const String& fileBackedPath)
 {
     if (isMainThread())
-        blobRegistry().registerBlobURLOptionallyFileBacked(url, srcURL, fileBackedPath);
+        blobRegistry().registerBlobURLOptionallyFileBacked(url, srcURL, BlobDataFileReference::create(fileBackedPath));
     else {
         threadableQueue().append(createCrossThreadTask(ThreadableBlobRegistry::registerBlobURLOptionallyFileBacked, url, srcURL, fileBackedPath));
 

Modified: trunk/Source/WebCore/platform/network/BlobRegistry.h (199707 => 199708)


--- trunk/Source/WebCore/platform/network/BlobRegistry.h	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebCore/platform/network/BlobRegistry.h	2016-04-19 06:02:04 UTC (rev 199708)
@@ -58,7 +58,7 @@
     virtual void registerBlobURL(const URL&, const URL& srcURL) = 0;
 
     // Registers a new blob URL referring to the blob data identified by the specified srcURL or, if none found, referring to the file found at the given path.
-    virtual void registerBlobURLOptionallyFileBacked(const URL&, const URL& srcURL, const String& fileBackedPath) = 0;
+    virtual void registerBlobURLOptionallyFileBacked(const URL&, const URL& srcURL, RefPtr<BlobDataFileReference>&&) = 0;
 
     // Negative start and end values select from the end.
     virtual void registerBlobURLForSlice(const URL&, const URL& srcURL, long long start, long long end) = 0;

Modified: trunk/Source/WebCore/platform/network/BlobRegistryImpl.cpp (199707 => 199708)


--- trunk/Source/WebCore/platform/network/BlobRegistryImpl.cpp	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebCore/platform/network/BlobRegistryImpl.cpp	2016-04-19 06:02:04 UTC (rev 199708)
@@ -160,12 +160,13 @@
 
 void BlobRegistryImpl::registerBlobURL(const URL& url, const URL& srcURL)
 {
-    registerBlobURLOptionallyFileBacked(url, srcURL, { });
+    registerBlobURLOptionallyFileBacked(url, srcURL, nullptr);
 }
 
-void BlobRegistryImpl::registerBlobURLOptionallyFileBacked(const URL& url, const URL& srcURL, const String& fileBackedPath)
+void BlobRegistryImpl::registerBlobURLOptionallyFileBacked(const URL& url, const URL& srcURL, RefPtr<BlobDataFileReference>&& file)
 {
     ASSERT(isMainThread());
+    registerBlobResourceHandleConstructor();
 
     BlobData* src = ""
     if (src) {
@@ -173,11 +174,11 @@
         return;
     }
 
-    if (fileBackedPath.isEmpty())
+    if (file == nullptr || file->path().isEmpty())
         return;
 
     RefPtr<BlobData> backingFile = BlobData::create({ });
-    backingFile->appendFile(BlobDataFileReference::create(fileBackedPath));
+    backingFile->appendFile(WTFMove(file));
 
     m_blobs.set(url.string(), backingFile.release());
 }

Modified: trunk/Source/WebCore/platform/network/BlobRegistryImpl.h (199707 => 199708)


--- trunk/Source/WebCore/platform/network/BlobRegistryImpl.h	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebCore/platform/network/BlobRegistryImpl.h	2016-04-19 06:02:04 UTC (rev 199708)
@@ -61,7 +61,7 @@
     void registerFileBlobURL(const URL&, RefPtr<BlobDataFileReference>&&, const String& contentType) override;
     void registerBlobURL(const URL&, Vector<BlobPart>, const String& contentType) override;
     void registerBlobURL(const URL&, const URL& srcURL) override;
-    void registerBlobURLOptionallyFileBacked(const URL&, const URL& srcURL, const String& fileBackedPath) override;
+    void registerBlobURLOptionallyFileBacked(const URL&, const URL& srcURL, RefPtr<BlobDataFileReference>&&) override;
     void registerBlobURLForSlice(const URL&, const URL& srcURL, long long start, long long end) override;
     void unregisterBlobURL(const URL&) override;
     bool isBlobRegistryImpl() const override { return true; }

Modified: trunk/Source/WebKit2/ChangeLog (199707 => 199708)


--- trunk/Source/WebKit2/ChangeLog	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebKit2/ChangeLog	2016-04-19 06:02:04 UTC (rev 199708)
@@ -1,3 +1,49 @@
+2016-04-18  Brady Eidson  <beid...@apple.com>
+
+        Modern IDB (Blob support): When reading Blobs from the database, grant the Networking process sandbox access to the files.
+        https://bugs.webkit.org/show_bug.cgi?id=156640
+
+        Reviewed by Alex Christensen.
+
+        * DatabaseProcess/DatabaseProcess.cpp:
+        (WebKit::DatabaseProcess::getSandboxExtensionsForBlobFiles): Utility function to ask the UI process for
+          SandboxExtensions for a list of files.
+        (WebKit::DatabaseProcess::didGetSandboxExtensionsForBlobFiles): Take the SandboxExtensions from the UI process
+          and pass them along to the completion handler.
+        * DatabaseProcess/DatabaseProcess.h:
+        * DatabaseProcess/DatabaseProcess.messages.in:
+
+        * DatabaseProcess/IndexedDB/WebIDBConnectionToClient.cpp:
+        (WebKit::WebIDBConnectionToClient::didGetRecord): If the value returned from the database doesn't have Blob files,
+          pass the result directly on to WebCore. If it does, ask the UI process for SandboxExtensions first.
+
+        * NetworkProcess/FileAPI/NetworkBlobRegistry.cpp:
+        (WebKit::NetworkBlobRegistry::registerBlobURLOptionallyFileBacked): Grab the BlobDataFileReference from the 
+          NetworkConnectionToWebProcess to pass along to the BlobRegistry.
+
+        * NetworkProcess/NetworkConnectionToWebProcess.cpp:
+        (WebKit::NetworkConnectionToWebProcess::preregisterSandboxExtensionsForOptionallyFileBackedBlob): Add this message
+          so the WebProcess can preflight the creation of some blob URLs by passing along the SandboxExtensions for their files.
+        (WebKit::NetworkConnectionToWebProcess::takeBlobDataFileReferenceForPath):
+        * NetworkProcess/NetworkConnectionToWebProcess.h:
+        * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
+
+        * UIProcess/Databases/DatabaseProcessProxy.cpp:
+        (WebKit::DatabaseProcessProxy::getSandboxExtensionsForBlobFiles): Create SandboxExtensions for the passed in files and
+          return them to the DatabaseProcess.
+        * UIProcess/Databases/DatabaseProcessProxy.h:
+        * UIProcess/Databases/DatabaseProcessProxy.messages.in:
+
+        * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp:
+        (WebKit::WebIDBConnectionToServer::didGetRecordWithSandboxExtensions): New form of "didGetRecord" that handles passing
+          the SandboxExtensions to the Networking process before they are needed.
+        * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h:
+        * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.messages.in:
+
+        * WebProcess/FileAPI/BlobRegistryProxy.cpp:
+        (WebKit::BlobRegistryProxy::registerBlobURLOptionallyFileBacked):
+        * WebProcess/FileAPI/BlobRegistryProxy.h:
+
 2016-04-18  Dean Jackson  <d...@apple.com>
 
         New SPI to export a dictionary of runtime features

Modified: trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.cpp (199707 => 199708)


--- trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.cpp	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.cpp	2016-04-19 06:02:04 UTC (rev 199708)
@@ -32,6 +32,7 @@
 #include "DatabaseProcessMessages.h"
 #include "DatabaseProcessProxyMessages.h"
 #include "DatabaseToWebProcessConnection.h"
+#include "WebCoreArgumentCoders.h"
 #include "WebCrossThreadCopier.h"
 #include "WebsiteData.h"
 #include <WebCore/CrossThreadTask.h>
@@ -348,9 +349,7 @@
 
     return securityOrigins;
 }
-#endif
 
-#if ENABLE(INDEXED_DATABASE)
 static void removeAllDatabasesForOriginPath(const String& originPath, std::chrono::system_clock::time_point modifiedSince)
 {
     // FIXME: We should also close/invalidate any live handles to the database files we are about to delete.
@@ -406,6 +405,21 @@
 }
 #endif
 
+void DatabaseProcess::getSandboxExtensionsForBlobFiles(const Vector<String>& filenames, std::function<void (const SandboxExtension::HandleArray&)> completionHandler)
+{
+    static uint64_t lastRequestID;
+
+    uint64_t requestID = ++lastRequestID;
+    m_sandboxExtensionForBlobsCompletionHandlers.set(requestID, completionHandler);
+    parentProcessConnection()->send(Messages::DatabaseProcessProxy::GetSandboxExtensionsForBlobFiles(requestID, filenames), 0);
+}
+
+void DatabaseProcess::didGetSandboxExtensionsForBlobFiles(uint64_t requestID, const SandboxExtension::HandleArray& handles)
+{
+    if (auto handler = m_sandboxExtensionForBlobsCompletionHandlers.take(requestID))
+        handler(handles);
+}
+
 #if !PLATFORM(COCOA)
 void DatabaseProcess::initializeProcess(const ChildProcessInitializationParameters&)
 {

Modified: trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.h (199707 => 199708)


--- trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.h	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.h	2016-04-19 06:02:04 UTC (rev 199708)
@@ -77,6 +77,8 @@
     void accessToTemporaryFileComplete(const String& path) final;
 #endif
 
+    void getSandboxExtensionsForBlobFiles(const Vector<String>& filenames, std::function<void (const SandboxExtension::HandleArray&)> completionHandler);
+
 private:
     DatabaseProcess();
 
@@ -104,6 +106,8 @@
     void deleteWebsiteDataForOrigins(WebCore::SessionID, OptionSet<WebsiteDataType> websiteDataTypes, const Vector<WebCore::SecurityOriginData>& origins, uint64_t callbackID);
     void grantSandboxExtensionsForBlobs(const Vector<String>& paths, const SandboxExtension::HandleArray&);
 
+    void didGetSandboxExtensionsForBlobFiles(uint64_t requestID, const SandboxExtension::HandleArray&);
+
 #if ENABLE(INDEXED_DATABASE)
     Vector<RefPtr<WebCore::SecurityOrigin>> indexedDatabaseOrigins();
     void deleteIndexedDatabaseEntriesForOrigins(const Vector<RefPtr<WebCore::SecurityOrigin>>&);
@@ -123,6 +127,7 @@
     RefPtr<WebCore::IDBServer::IDBServer> m_idbServer;
 #endif
     HashMap<String, RefPtr<SandboxExtension>> m_blobTemporaryFileSandboxExtensions;
+    HashMap<uint64_t, std::function<void (const SandboxExtension::HandleArray&)>> m_sandboxExtensionForBlobsCompletionHandlers;
 
     Deque<std::unique_ptr<WebCore::CrossThreadTask>> m_databaseTasks;
     Lock m_databaseTaskMutex;

Modified: trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.messages.in (199707 => 199708)


--- trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.messages.in	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.messages.in	2016-04-19 06:02:04 UTC (rev 199708)
@@ -33,6 +33,8 @@
     DeleteWebsiteData(WebCore::SessionID sessionID, OptionSet<WebKit::WebsiteDataType> websiteDataTypes, std::chrono::system_clock::time_point modifiedSince, uint64_t callbackID)
     DeleteWebsiteDataForOrigins(WebCore::SessionID sessionID, OptionSet<WebKit::WebsiteDataType> websiteDataTypes, Vector<WebCore::SecurityOriginData> origins, uint64_t callbackID)
     GrantSandboxExtensionsForBlobs(Vector<String> paths, WebKit::SandboxExtension::HandleArray extensions)
+
+    DidGetSandboxExtensionsForBlobFiles(uint64_t requestID, WebKit::SandboxExtension::HandleArray extensions)
 }
 
 #endif // ENABLE(DATABASE_PROCESS)

Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/WebIDBConnectionToClient.cpp (199707 => 199708)


--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/WebIDBConnectionToClient.cpp	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/WebIDBConnectionToClient.cpp	2016-04-19 06:02:04 UTC (rev 199708)
@@ -127,7 +127,16 @@
 
 void WebIDBConnectionToClient::didGetRecord(const WebCore::IDBResultData& resultData)
 {
-    send(Messages::WebIDBConnectionToServer::DidGetRecord(resultData));
+    auto& blobFilePaths = resultData.getResult().value().blobFilePaths();
+    if (blobFilePaths.isEmpty()) {
+        send(Messages::WebIDBConnectionToServer::DidGetRecord(resultData));
+        return;
+    }
+
+    RefPtr<WebIDBConnectionToClient> protector(this);
+    DatabaseProcess::singleton().getSandboxExtensionsForBlobFiles(blobFilePaths, [protector, this, resultData](const SandboxExtension::HandleArray& handles) {
+        send(Messages::WebIDBConnectionToServer::DidGetRecordWithSandboxExtensions(resultData, handles));
+    });
 }
 
 void WebIDBConnectionToClient::didGetCount(const WebCore::IDBResultData& resultData)

Modified: trunk/Source/WebKit2/NetworkProcess/FileAPI/NetworkBlobRegistry.cpp (199707 => 199708)


--- trunk/Source/WebKit2/NetworkProcess/FileAPI/NetworkBlobRegistry.cpp	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebKit2/NetworkProcess/FileAPI/NetworkBlobRegistry.cpp	2016-04-19 06:02:04 UTC (rev 199708)
@@ -27,6 +27,7 @@
 #include "NetworkBlobRegistry.h"
 
 #include "BlobDataFileReferenceWithSandboxExtension.h"
+#include "NetworkConnectionToWebProcess.h"
 #include "SandboxExtension.h"
 #include <WebCore/BlobPart.h>
 #include <WebCore/BlobRegistryImpl.h>
@@ -85,8 +86,11 @@
 
 void NetworkBlobRegistry::registerBlobURLOptionallyFileBacked(NetworkConnectionToWebProcess* connection, const URL& url, const URL& srcURL, const String& fileBackedPath)
 {
-    blobRegistry().registerBlobURLOptionallyFileBacked(url, srcURL, fileBackedPath);
+    auto fileReference = connection->takeBlobDataFileReferenceForPath(fileBackedPath);
+    ASSERT(fileReference);
 
+    blobRegistry().registerBlobURLOptionallyFileBacked(url, srcURL, WTFMove(fileReference));
+
     ASSERT(!m_blobsForConnection.get(connection).contains(url));
     BlobForConnectionMap::iterator mapIterator = m_blobsForConnection.find(connection);
     if (mapIterator == m_blobsForConnection.end())

Modified: trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp (199707 => 199708)


--- trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp	2016-04-19 06:02:04 UTC (rev 199708)
@@ -26,6 +26,7 @@
 #include "config.h"
 #include "NetworkConnectionToWebProcess.h"
 
+#include "BlobDataFileReferenceWithSandboxExtension.h"
 #include "NetworkBlobRegistry.h"
 #include "NetworkConnectionToWebProcessMessages.h"
 #include "NetworkLoad.h"
@@ -271,6 +272,23 @@
     NetworkBlobRegistry::singleton().registerBlobURL(this, url, srcURL);
 }
 
+void NetworkConnectionToWebProcess::preregisterSandboxExtensionsForOptionallyFileBackedBlob(const Vector<String>& filePaths, const SandboxExtension::HandleArray& handles)
+{
+    ASSERT(filePaths.size() == handles.size());
+
+    for (size_t i = 0; i < filePaths.size(); ++i) {
+        auto result = m_blobDataFileReferences.add(filePaths[i], BlobDataFileReferenceWithSandboxExtension::create(filePaths[i], SandboxExtension::create(handles[i])));
+        ASSERT_UNUSED(result, result.isNewEntry);
+    }
+}
+
+RefPtr<WebCore::BlobDataFileReference> NetworkConnectionToWebProcess::takeBlobDataFileReferenceForPath(const String& path)
+{
+    auto fileReference = m_blobDataFileReferences.take(path);
+    ASSERT(fileReference);
+    return fileReference;
+}
+
 void NetworkConnectionToWebProcess::registerBlobURLOptionallyFileBacked(const URL& url, const URL& srcURL, const String& fileBackedPath)
 {
     NetworkBlobRegistry::singleton().registerBlobURLOptionallyFileBacked(this, url, srcURL, fileBackedPath);

Modified: trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.h (199707 => 199708)


--- trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.h	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.h	2016-04-19 06:02:04 UTC (rev 199708)
@@ -35,6 +35,7 @@
 #include <wtf/RefCounted.h>
 
 namespace WebCore {
+class BlobDataFileReference;
 class ResourceRequest;
 }
 
@@ -54,6 +55,8 @@
 
     void didCleanupResourceLoader(NetworkResourceLoader&);
 
+    RefPtr<WebCore::BlobDataFileReference> takeBlobDataFileReferenceForPath(const String& path);
+
 private:
     NetworkConnectionToWebProcess(IPC::Connection::Identifier);
 
@@ -91,6 +94,7 @@
     void registerFileBlobURL(const WebCore::URL&, const String& path, const SandboxExtension::Handle&, const String& contentType);
     void registerBlobURL(const WebCore::URL&, Vector<WebCore::BlobPart>, const String& contentType);
     void registerBlobURLFromURL(const WebCore::URL&, const WebCore::URL& srcURL);
+    void preregisterSandboxExtensionsForOptionallyFileBackedBlob(const Vector<String>& fileBackedPath, const SandboxExtension::HandleArray&);
     void registerBlobURLOptionallyFileBacked(const WebCore::URL&, const WebCore::URL& srcURL, const String& fileBackedPath);
     void registerBlobURLForSlice(const WebCore::URL&, const WebCore::URL& srcURL, int64_t start, int64_t end);
     void blobSize(const WebCore::URL&, uint64_t& resultSize);
@@ -102,6 +106,7 @@
     RefPtr<IPC::Connection> m_connection;
 
     HashMap<ResourceLoadIdentifier, RefPtr<NetworkResourceLoader>> m_networkResourceLoaders;
+    HashMap<String, RefPtr<WebCore::BlobDataFileReference>> m_blobDataFileReferences;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.messages.in (199707 => 199708)


--- trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.messages.in	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.messages.in	2016-04-19 06:02:04 UTC (rev 199708)
@@ -43,6 +43,7 @@
     RegisterFileBlobURL(WebCore::URL url, String path, WebKit::SandboxExtension::Handle extensionHandle, String contentType)
     RegisterBlobURL(WebCore::URL url, Vector<WebCore::BlobPart> blobParts, String contentType)
     RegisterBlobURLFromURL(WebCore::URL url, WebCore::URL srcURL)
+    PreregisterSandboxExtensionsForOptionallyFileBackedBlob(Vector<String> filePaths, WebKit::SandboxExtension::HandleArray extensionHandles)
     RegisterBlobURLOptionallyFileBacked(WebCore::URL url, WebCore::URL srcURL, String fileBackedPath)
     RegisterBlobURLForSlice(WebCore::URL url, WebCore::URL srcURL, int64_t start, int64_t end)
     UnregisterBlobURL(WebCore::URL url)

Modified: trunk/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.cpp (199707 => 199708)


--- trunk/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.cpp	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.cpp	2016-04-19 06:02:04 UTC (rev 199708)
@@ -28,6 +28,7 @@
 
 #include "DatabaseProcessMessages.h"
 #include "DatabaseProcessProxyMessages.h"
+#include "NetworkProcessMessages.h"
 #include "WebProcessPool.h"
 #include "WebsiteData.h"
 #include <WebCore/NotImplemented.h>
@@ -195,6 +196,18 @@
     callback();
 }
 
+void DatabaseProcessProxy::getSandboxExtensionsForBlobFiles(uint64_t requestID, const Vector<String>& paths)
+{
+    SandboxExtension::HandleArray extensions;
+    extensions.allocate(paths.size());
+    for (size_t i = 0; i < paths.size(); ++i) {
+        // ReadWrite is required for creating hard links, which is something that might be done with these extensions.
+        SandboxExtension::createHandle(paths[i], SandboxExtension::ReadWrite, extensions[i]);
+    }
+
+    send(Messages::DatabaseProcess::DidGetSandboxExtensionsForBlobFiles(requestID, extensions), 0);
+}
+
 void DatabaseProcessProxy::didFinishLaunching(ProcessLauncher* launcher, IPC::Connection::Identifier connectionIdentifier)
 {
     ChildProcessProxy::didFinishLaunching(launcher, connectionIdentifier);

Modified: trunk/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.h (199707 => 199708)


--- trunk/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.h	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.h	2016-04-19 06:02:04 UTC (rev 199708)
@@ -76,6 +76,7 @@
     void didFetchWebsiteData(uint64_t callbackID, const WebsiteData&);
     void didDeleteWebsiteData(uint64_t callbackID);
     void didDeleteWebsiteDataForOrigins(uint64_t callbackID);
+    void getSandboxExtensionsForBlobFiles(uint64_t requestID, const Vector<String>& paths);
 
     // ProcessLauncher::Client
     void didFinishLaunching(ProcessLauncher*, IPC::Connection::Identifier) override;

Modified: trunk/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.messages.in (199707 => 199708)


--- trunk/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.messages.in	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.messages.in	2016-04-19 06:02:04 UTC (rev 199708)
@@ -28,6 +28,8 @@
     DidFetchWebsiteData(uint64_t callbackID, struct WebKit::WebsiteData websiteData)
     DidDeleteWebsiteData(uint64_t callbackID)
     DidDeleteWebsiteDataForOrigins(uint64_t callbackID)
+
+    GetSandboxExtensionsForBlobFiles(uint64_t requestID, Vector<String> paths)
 }
 
 #endif // ENABLE(DATABASE_PROCESS)

Modified: trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp (199707 => 199708)


--- trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp	2016-04-19 06:02:04 UTC (rev 199708)
@@ -30,6 +30,8 @@
 
 #include "DataReference.h"
 #include "DatabaseToWebProcessConnectionMessages.h"
+#include "NetworkConnectionToWebProcessMessages.h"
+#include "NetworkProcessConnection.h"
 #include "WebIDBConnectionToClientMessages.h"
 #include "WebProcess.h"
 #include "WebToDatabaseProcessConnection.h"
@@ -235,6 +237,17 @@
     m_connectionToServer->didGetRecord(result);
 }
 
+void WebIDBConnectionToServer::didGetRecordWithSandboxExtensions(const WebCore::IDBResultData& result, const SandboxExtension::HandleArray& handles)
+{
+    const auto& filePaths = result.getResult().value().blobFilePaths();
+
+    ASSERT(filePaths.size() == handles.size());
+
+    WebProcess::singleton().networkConnection()->connection()->send(Messages::NetworkConnectionToWebProcess::PreregisterSandboxExtensionsForOptionallyFileBackedBlob(filePaths, handles), 0);
+
+    m_connectionToServer->didGetRecord(result);
+}
+
 void WebIDBConnectionToServer::didGetCount(const IDBResultData& result)
 {
     m_connectionToServer->didGetCount(result);

Modified: trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h (199707 => 199708)


--- trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h	2016-04-19 06:02:04 UTC (rev 199708)
@@ -29,6 +29,7 @@
 #if ENABLE(INDEXED_DATABASE)
 
 #include "MessageSender.h"
+#include "SandboxExtension.h"
 #include <WebCore/IDBConnectionToServer.h>
 
 namespace WebKit {
@@ -80,6 +81,7 @@
     void didDeleteIndex(const WebCore::IDBResultData&);
     void didPutOrAdd(const WebCore::IDBResultData&);
     void didGetRecord(const WebCore::IDBResultData&);
+    void didGetRecordWithSandboxExtensions(const WebCore::IDBResultData&, const SandboxExtension::HandleArray&);
     void didGetCount(const WebCore::IDBResultData&);
     void didDeleteRecord(const WebCore::IDBResultData&);
     void didOpenCursor(const WebCore::IDBResultData&);

Modified: trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.messages.in (199707 => 199708)


--- trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.messages.in	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.messages.in	2016-04-19 06:02:04 UTC (rev 199708)
@@ -34,6 +34,7 @@
     DidDeleteIndex(WebCore::IDBResultData result)
     DidPutOrAdd(WebCore::IDBResultData result)
     DidGetRecord(WebCore::IDBResultData result)
+    DidGetRecordWithSandboxExtensions(WebCore::IDBResultData result, WebKit::SandboxExtension::HandleArray extensions)
     DidGetCount(WebCore::IDBResultData result)
     DidDeleteRecord(WebCore::IDBResultData result)
     DidOpenCursor(WebCore::IDBResultData result)

Modified: trunk/Source/WebKit2/WebProcess/FileAPI/BlobRegistryProxy.cpp (199707 => 199708)


--- trunk/Source/WebKit2/WebProcess/FileAPI/BlobRegistryProxy.cpp	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebKit2/WebProcess/FileAPI/BlobRegistryProxy.cpp	2016-04-19 06:02:04 UTC (rev 199708)
@@ -57,9 +57,10 @@
     WebProcess::singleton().networkConnection()->connection()->send(Messages::NetworkConnectionToWebProcess::RegisterBlobURLFromURL(url, srcURL), 0);
 }
 
-void BlobRegistryProxy::registerBlobURLOptionallyFileBacked(const URL& url, const URL& srcURL, const String& fileBackedPath)
+void BlobRegistryProxy::registerBlobURLOptionallyFileBacked(const URL& url, const URL& srcURL, RefPtr<WebCore::BlobDataFileReference>&& file)
 {
-    WebProcess::singleton().networkConnection()->connection()->send(Messages::NetworkConnectionToWebProcess::RegisterBlobURLOptionallyFileBacked(url, srcURL, fileBackedPath), 0);
+    ASSERT(file);
+    WebProcess::singleton().networkConnection()->connection()->send(Messages::NetworkConnectionToWebProcess::RegisterBlobURLOptionallyFileBacked(url, srcURL, file->path()), 0);
 }
 
 void BlobRegistryProxy::unregisterBlobURL(const URL& url)

Modified: trunk/Source/WebKit2/WebProcess/FileAPI/BlobRegistryProxy.h (199707 => 199708)


--- trunk/Source/WebKit2/WebProcess/FileAPI/BlobRegistryProxy.h	2016-04-19 05:08:53 UTC (rev 199707)
+++ trunk/Source/WebKit2/WebProcess/FileAPI/BlobRegistryProxy.h	2016-04-19 06:02:04 UTC (rev 199708)
@@ -35,7 +35,7 @@
     void registerFileBlobURL(const WebCore::URL&, RefPtr<WebCore::BlobDataFileReference>&&, const String& contentType) override;
     void registerBlobURL(const WebCore::URL&, Vector<WebCore::BlobPart>, const String& contentType) override;
     void registerBlobURL(const WebCore::URL&, const WebCore::URL& srcURL) override;
-    void registerBlobURLOptionallyFileBacked(const WebCore::URL&, const WebCore::URL& srcURL, const String& fileBackedPath) override;
+    void registerBlobURLOptionallyFileBacked(const WebCore::URL&, const WebCore::URL& srcURL, RefPtr<WebCore::BlobDataFileReference>&&) override;
     void unregisterBlobURL(const WebCore::URL&) override;
     void registerBlobURLForSlice(const WebCore::URL&, const WebCore::URL& srcURL, long long start, long long end) override;
     unsigned long long blobSize(const WebCore::URL&) override;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to