[Mac] WebKit fails to receive file promises when the embedding app is sandboxed
authoraestes@apple.com <aestes@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 9 Mar 2018 15:11:01 +0000 (15:11 +0000)
committeraestes@apple.com <aestes@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 9 Mar 2018 15:11:01 +0000 (15:11 +0000)
commitd8ca6b6abc3e585f5df996482c96006517e5195a
tree24522ea422440d4c03758b8f87c3a767cb10a399
parenteb2674d22c3b20e2c1e02b9c8d026ca6fcba8bff
[Mac] WebKit fails to receive file promises when the embedding app is sandboxed
https://bugs.webkit.org/show_bug.cgi?id=183489
<rdar://problem/38267517>

Source/WebKit:

WebKit calls -[NSFilePromiseReceiver receivePromisedFilesAtDestination:...] with
NSTemporaryDirectory() as the destination for receiving file promise drops. AppKit attempts
to issue a sandbox extension for this directory, but for security reasons App Sandbox
refuses to do so for NSTemporaryDirectory() itself. As a result, AppKit will call our reader
block with a nil error and a valid file URL, but no file will actually exist at that URL.

In order for App Sandbox to grant issuing the sandbox extension needed by AppKit, we need to
use some other destination directory. This patch uses FileSystem::createTemporaryDirectory()
to securely create a unique temporary directory inside NSTemporaryDirectory() for use as the
drop destination.

Reviewed by Wenson Hsieh.

* UIProcess/Cocoa/WebViewImpl.mm:
(WebKit::WebViewImpl::performDragOperation):

Source/WebKitLegacy/mac:

WebKitLegacy calls -[NSFilePromiseReceiver receivePromisedFilesAtDestination:...] with
NSTemporaryDirectory() as the destination for receiving file promise drops. AppKit attempts
to issue a sandbox extension for this directory, but for security reasons App Sandbox
refuses to do so for NSTemporaryDirectory() itself. As a result, AppKit will call our reader
block with a nil error and a valid file URL, but no file will actually exist at that URL.

In order for App Sandbox to grant issuing the sandbox extension needed by AppKit, we need to
use some other destination directory. This patch uses FileSystem::createTemporaryDirectory()
to securely create a unique temporary directory inside NSTemporaryDirectory() for use as the
drop destination.

Reviewed by Wenson Hsieh.

* WebView/WebView.mm:
(-[WebView performDragOperation:]):

LayoutTests:

Reviewed by Wenson Hsieh.

Now that we create a unique temporary directory per drop, this test no longer encounters a
name conflict for apple.gif.

* editing/pasteboard/file-input-files-access-promise-expected.txt:
* editing/pasteboard/file-input-files-access-promise.html:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@229462 268f45cc-cd09-0410-ab3c-d52691b4dbfc
LayoutTests/ChangeLog
LayoutTests/editing/pasteboard/file-input-files-access-promise-expected.txt
LayoutTests/editing/pasteboard/file-input-files-access-promise.html
Source/WebKit/ChangeLog
Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm
Source/WebKitLegacy/mac/ChangeLog
Source/WebKitLegacy/mac/WebView/WebView.mm