<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[211763] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/211763">211763</a></dd>
<dt>Author</dt> <dd>bfulgham@apple.com</dd>
<dt>Date</dt> <dd>2017-02-06 17:48:22 -0800 (Mon, 06 Feb 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Correct File Path Handling in SecurityOrigin and FileSystem
https://bugs.webkit.org/show_bug.cgi?id=167894
&lt;rdar://problem/30380080&gt;

Reviewed by Alexey Proskuryakov.

Source/WebCore:

Roll out the URL decoding being done in the FileSystem class (added in Bug 167894), and instead ensure that
SecurityOrigin properly handles file URLs, and only passes valid file strings to the FileSystem interface.

Tested by FileSystemTests and SecurityOriginTests in TestWebKitAPI.

* page/SecurityOrigin.cpp:
(WebCore::SecurityOrigin::SecurityOrigin): Initialize m_filePath using the url's fileSystemPath, not
the %-encoded 'path' property.
(WebCore::SecurityOrigin::canDisplay): Pass the 'fileSystemPath' to 'filesHaveSameVolume', rather than
the %-encoded 'path' property.
* page/SecurityOrigin.h:
* platform/FileSystem.cpp:
(WebCore::filesHaveSameVolume): Do not use 'decodeURLEscapeSequences' in 'filesHaveSameVolume'.

Tools:

* TestWebKitAPI/Tests/WebCore/FileSystem.cpp: Don't encode the temporary files,
and perform same-volume checks using filesystem-compatible paths.        
* TestWebKitAPI/Tests/WebCore/SecurityOrigin.cpp: Create SecurityOrigins from
filesystem paths, and perform validation of same-volume checks.
(TestWebKitAPI::SecurityOriginTest::tempFilePath): Added.
(TestWebKitAPI::SecurityOriginTest::spaceContainingFilePath): Added.
(TestWebKitAPI::SecurityOriginTest::bangContainingFilePath): Added.
(TestWebKitAPI::SecurityOriginTest::quoteContainingFilePath): Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorepageSecurityOrigincpp">trunk/Source/WebCore/page/SecurityOrigin.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformFileSystemcpp">trunk/Source/WebCore/platform/FileSystem.cpp</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebCoreFileSystemcpp">trunk/Tools/TestWebKitAPI/Tests/WebCore/FileSystem.cpp</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebCoreSecurityOrigincpp">trunk/Tools/TestWebKitAPI/Tests/WebCore/SecurityOrigin.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (211762 => 211763)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-02-07 01:39:45 UTC (rev 211762)
+++ trunk/Source/WebCore/ChangeLog        2017-02-07 01:48:22 UTC (rev 211763)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2017-02-06  Brent Fulgham  &lt;bfulgham@apple.com&gt;
+
+        Correct File Path Handling in SecurityOrigin and FileSystem
+        https://bugs.webkit.org/show_bug.cgi?id=167894
+        &lt;rdar://problem/30380080&gt;
+
+        Reviewed by Alexey Proskuryakov.
+
+        Roll out the URL decoding being done in the FileSystem class (added in Bug 167894), and instead ensure that
+        SecurityOrigin properly handles file URLs, and only passes valid file strings to the FileSystem interface.
+
+        Tested by FileSystemTests and SecurityOriginTests in TestWebKitAPI.
+
+        * page/SecurityOrigin.cpp:
+        (WebCore::SecurityOrigin::SecurityOrigin): Initialize m_filePath using the url's fileSystemPath, not
+        the %-encoded 'path' property.
+        (WebCore::SecurityOrigin::canDisplay): Pass the 'fileSystemPath' to 'filesHaveSameVolume', rather than
+        the %-encoded 'path' property.
+        * page/SecurityOrigin.h:
+        * platform/FileSystem.cpp:
+        (WebCore::filesHaveSameVolume): Do not use 'decodeURLEscapeSequences' in 'filesHaveSameVolume'.
+
</ins><span class="cx"> 2017-02-06  Andy Estes  &lt;aestes@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Cocoa] Split FileSystemMac.mm into Mac and Cocoa parts
</span></span></pre></div>
<a id="trunkSourceWebCorepageSecurityOrigincpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/SecurityOrigin.cpp (211762 => 211763)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/SecurityOrigin.cpp        2017-02-07 01:39:45 UTC (rev 211762)
+++ trunk/Source/WebCore/page/SecurityOrigin.cpp        2017-02-07 01:48:22 UTC (rev 211763)
</span><span class="lines">@@ -114,7 +114,7 @@
</span><span class="cx">     m_canLoadLocalResources = isLocal();
</span><span class="cx"> 
</span><span class="cx">     if (m_canLoadLocalResources)
</span><del>-        m_filePath = url.path(); // In case enforceFilePathSeparation() is called.
</del><ins>+        m_filePath = url.fileSystemPath(); // In case enforceFilePathSeparation() is called.
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> SecurityOrigin::SecurityOrigin()
</span><span class="lines">@@ -305,7 +305,7 @@
</span><span class="cx">         return true;
</span><span class="cx"> 
</span><span class="cx"> #if !PLATFORM(IOS)
</span><del>-    if (m_protocol == &quot;file&quot; &amp;&amp; url.isLocalFile() &amp;&amp; !filesHaveSameVolume(m_filePath, url.path()))
</del><ins>+    if (m_protocol == &quot;file&quot; &amp;&amp; url.isLocalFile() &amp;&amp; !filesHaveSameVolume(m_filePath, url.fileSystemPath()))
</ins><span class="cx">         return false;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformFileSystemcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/FileSystem.cpp (211762 => 211763)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/FileSystem.cpp        2017-02-07 01:39:45 UTC (rev 211762)
+++ trunk/Source/WebCore/platform/FileSystem.cpp        2017-02-07 01:48:22 UTC (rev 211763)
</span><span class="lines">@@ -28,7 +28,6 @@
</span><span class="cx"> #include &quot;FileSystem.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;ScopeGuard.h&quot;
</span><del>-#include &quot;URL.h&quot;
</del><span class="cx"> #include &lt;wtf/HexNumber.h&gt;
</span><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</span><span class="cx"> #include &lt;wtf/text/StringBuilder.h&gt;
</span><span class="lines">@@ -237,8 +236,8 @@
</span><span class="cx">     
</span><span class="cx"> bool filesHaveSameVolume(const String&amp; fileA, const String&amp; fileB)
</span><span class="cx"> {
</span><del>-    auto fsRepFileA = fileSystemRepresentation(decodeURLEscapeSequences(fileA));
-    auto fsRepFileB = fileSystemRepresentation(decodeURLEscapeSequences(fileB));
</del><ins>+    auto fsRepFileA = fileSystemRepresentation(fileA);
+    auto fsRepFileB = fileSystemRepresentation(fileB);
</ins><span class="cx">     
</span><span class="cx">     if (fsRepFileA.isNull() || fsRepFileB.isNull())
</span><span class="cx">         return false;
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (211762 => 211763)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2017-02-07 01:39:45 UTC (rev 211762)
+++ trunk/Tools/ChangeLog        2017-02-07 01:48:22 UTC (rev 211763)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2017-02-06  Brent Fulgham  &lt;bfulgham@apple.com&gt;
+
+        Correct File Path Handling in SecurityOrigin and FileSystem
+        https://bugs.webkit.org/show_bug.cgi?id=167894
+        &lt;rdar://problem/30380080&gt;
+
+        Reviewed by Alexey Proskuryakov.
+
+        * TestWebKitAPI/Tests/WebCore/FileSystem.cpp: Don't encode the temporary files,
+        and perform same-volume checks using filesystem-compatible paths.        
+        * TestWebKitAPI/Tests/WebCore/SecurityOrigin.cpp: Create SecurityOrigins from
+        filesystem paths, and perform validation of same-volume checks.
+        (TestWebKitAPI::SecurityOriginTest::tempFilePath): Added.
+        (TestWebKitAPI::SecurityOriginTest::spaceContainingFilePath): Added.
+        (TestWebKitAPI::SecurityOriginTest::bangContainingFilePath): Added.
+        (TestWebKitAPI::SecurityOriginTest::quoteContainingFilePath): Added.
+
</ins><span class="cx"> 2017-02-06  Jer Noble  &lt;jer.noble@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Playback stalls when a SourceBuffer append causes frame eviction
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebCoreFileSystemcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebCore/FileSystem.cpp (211762 => 211763)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebCore/FileSystem.cpp        2017-02-07 01:39:45 UTC (rev 211762)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/FileSystem.cpp        2017-02-07 01:48:22 UTC (rev 211763)
</span><span class="lines">@@ -28,7 +28,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Test.h&quot;
</span><span class="cx"> #include &lt;WebCore/FileSystem.h&gt;
</span><del>-#include &lt;WebCore/URL.h&gt;
</del><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="cx"> #include &lt;wtf/StringExtras.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -54,15 +53,15 @@
</span><span class="cx">         m_tempEmptyFilePath = openTemporaryFile(&quot;tempEmptyTestFile&quot;, handle);
</span><span class="cx">         closeFile(handle);
</span><span class="cx"> 
</span><del>-        m_spaceContainingFilePath = encodeWithURLEscapeSequences(openTemporaryFile(&quot;temp Empty Test File&quot;, handle));
</del><ins>+        m_spaceContainingFilePath = openTemporaryFile(&quot;temp Empty Test File&quot;, handle);
</ins><span class="cx">         closeFile(handle);
</span><span class="cx"> 
</span><del>-        m_bangContainingFilePath = encodeWithURLEscapeSequences(openTemporaryFile(&quot;temp!Empty!Test!File&quot;, handle));
</del><ins>+        m_bangContainingFilePath = openTemporaryFile(&quot;temp!Empty!Test!File&quot;, handle);
</ins><span class="cx">         closeFile(handle);
</span><span class="cx"> 
</span><del>-        m_quoteContainingFilePath = encodeWithURLEscapeSequences(openTemporaryFile(&quot;temp\&quot;Empty\&quot;TestFile&quot;, handle));
</del><ins>+        m_quoteContainingFilePath = openTemporaryFile(&quot;temp\&quot;Empty\&quot;TestFile&quot;, handle);
</ins><span class="cx">         closeFile(handle);
</span><del>-}
</del><ins>+    }
</ins><span class="cx"> 
</span><span class="cx">     void TearDown() override
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebCoreSecurityOrigincpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebCore/SecurityOrigin.cpp (211762 => 211763)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebCore/SecurityOrigin.cpp        2017-02-07 01:39:45 UTC (rev 211762)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/SecurityOrigin.cpp        2017-02-07 01:48:22 UTC (rev 211763)
</span><span class="lines">@@ -25,6 +25,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;WTFStringUtilities.h&quot;
</span><ins>+#include &lt;WebCore/FileSystem.h&gt;
</ins><span class="cx"> #include &lt;WebCore/SecurityOrigin.h&gt;
</span><span class="cx"> #include &lt;WebCore/URL.h&gt;
</span><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="lines">@@ -37,7 +38,40 @@
</span><span class="cx"> public:
</span><span class="cx">     void SetUp() final {
</span><span class="cx">         WTF::initializeMainThread();
</span><ins>+
+        // create temp file
+        PlatformFileHandle handle;
+        m_tempFilePath = openTemporaryFile(&quot;tempTestFile&quot;, handle);
+        closeFile(handle);
+        
+        m_spaceContainingFilePath = openTemporaryFile(&quot;temp Empty Test File&quot;, handle);
+        closeFile(handle);
+        
+        m_bangContainingFilePath = openTemporaryFile(&quot;temp!Empty!Test!File&quot;, handle);
+        closeFile(handle);
+        
+        m_quoteContainingFilePath = openTemporaryFile(&quot;temp\&quot;Empty\&quot;TestFile&quot;, handle);
+        closeFile(handle);
</ins><span class="cx">     }
</span><ins>+
+    void TearDown() override
+    {
+        deleteFile(m_tempFilePath);
+        deleteFile(m_spaceContainingFilePath);
+        deleteFile(m_bangContainingFilePath);
+        deleteFile(m_quoteContainingFilePath);
+    }
+    
+    const String&amp; tempFilePath() { return m_tempFilePath; }
+    const String&amp; spaceContainingFilePath() { return m_spaceContainingFilePath; }
+    const String&amp; bangContainingFilePath() { return m_bangContainingFilePath; }
+    const String&amp; quoteContainingFilePath() { return m_quoteContainingFilePath; }
+    
+private:
+    String m_tempFilePath;
+    String m_spaceContainingFilePath;
+    String m_bangContainingFilePath;
+    String m_quoteContainingFilePath;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> TEST_F(SecurityOriginTest, SecurityOriginConstructors)
</span><span class="lines">@@ -84,4 +118,29 @@
</span><span class="cx">     EXPECT_TRUE(o1-&gt;isSameOriginAs(o6.get()));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TEST_F(SecurityOriginTest, SecurityOriginFileBasedConstructors)
+{
+    auto tempFileOrigin = SecurityOrigin::create(URL(URL(), &quot;file:///&quot; + tempFilePath()));
+    auto spaceContainingOrigin = SecurityOrigin::create(URL(URL(), &quot;file:///&quot; + spaceContainingFilePath()));
+    auto bangContainingOrigin = SecurityOrigin::create(URL(URL(), &quot;file:///&quot; + bangContainingFilePath()));
+    auto quoteContainingOrigin = SecurityOrigin::create(URL(URL(), &quot;file:///&quot; + quoteContainingFilePath()));
+    
+    EXPECT_EQ(String(&quot;file&quot;), tempFileOrigin-&gt;protocol());
+    EXPECT_EQ(String(&quot;file&quot;), spaceContainingOrigin-&gt;protocol());
+    EXPECT_EQ(String(&quot;file&quot;), bangContainingOrigin-&gt;protocol());
+    EXPECT_EQ(String(&quot;file&quot;), quoteContainingOrigin-&gt;protocol());
+
+    EXPECT_TRUE(tempFileOrigin-&gt;isSameOriginAs(spaceContainingOrigin.get()));
+    EXPECT_TRUE(tempFileOrigin-&gt;isSameOriginAs(bangContainingOrigin.get()));
+    EXPECT_TRUE(tempFileOrigin-&gt;isSameOriginAs(quoteContainingOrigin.get()));
+    
+    EXPECT_TRUE(tempFileOrigin-&gt;isSameSchemeHostPort(spaceContainingOrigin.get()));
+    EXPECT_TRUE(tempFileOrigin-&gt;isSameSchemeHostPort(bangContainingOrigin.get()));
+    EXPECT_TRUE(tempFileOrigin-&gt;isSameSchemeHostPort(quoteContainingOrigin.get()));
+
+    EXPECT_TRUE(tempFileOrigin-&gt;canAccess(spaceContainingOrigin.get()));
+    EXPECT_TRUE(tempFileOrigin-&gt;canAccess(bangContainingOrigin.get()));
+    EXPECT_TRUE(tempFileOrigin-&gt;canAccess(quoteContainingOrigin.get()));
+}
+
</ins><span class="cx"> } // namespace TestWebKitAPI
</span></span></pre>
</div>
</div>

</body>
</html>