Changeset 103516 in webkit


Ignore:
Timestamp:
Dec 22, 2011 3:03:29 AM (12 years ago)
Author:
ericu@chromium.org
Message:

[filesystem] Remove old filesystem naming restrictions
https://bugs.webkit.org/show_bug.cgi?id=62813

Reviewed by David Levin.

Source/WebCore:

  • fileapi/DOMFilePath.cpp:

(WebCore::DOMFilePath::isValidPath): Replace strict restrictions with
minimal safety [no files named "." or "..", no use of '
' or '\0' in
paths, no use of '/' in file names].

LayoutTests:

Replace strict restrictions with minimal safety [no files named "." or
"..", no use of '
' or '\0' in paths, no use of '/' in file names].
Update various tests to ensure that lots of old banned names/paths are
now legal, but make sure the remaining restrictions are respected.

  • fast/filesystem/op-get-entry-expected.txt:
  • fast/filesystem/op-restricted-chars-expected.txt:
  • fast/filesystem/op-restricted-names-expected.txt:
  • fast/filesystem/op-restricted-unicode-expected.txt:
  • fast/filesystem/resources/op-get-entry.js:

():

  • fast/filesystem/resources/op-restricted-chars.js:

(testCases.tests):
(testCases):

  • fast/filesystem/resources/op-restricted-names.js:

(testCases.tests):
(testCases):

  • fast/filesystem/resources/op-restricted-unicode.js:

(testCases):

Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r103514 r103516  
     12011-12-22  Eric Uhrhane  <ericu@chromium.org>
     2
     3        [filesystem] Remove old filesystem naming restrictions
     4        https://bugs.webkit.org/show_bug.cgi?id=62813
     5
     6        Reviewed by David Levin.
     7
     8        Replace strict restrictions with minimal safety [no files named "." or
     9        "..", no use of '\\' or '\0' in paths, no use of '/' in file names].
     10        Update various tests to ensure that lots of old banned names/paths are
     11        now legal, but make sure the remaining restrictions are respected.
     12        * fast/filesystem/op-get-entry-expected.txt:
     13        * fast/filesystem/op-restricted-chars-expected.txt:
     14        * fast/filesystem/op-restricted-names-expected.txt:
     15        * fast/filesystem/op-restricted-unicode-expected.txt:
     16        * fast/filesystem/resources/op-get-entry.js:
     17        ():
     18        * fast/filesystem/resources/op-restricted-chars.js:
     19        (testCases.tests):
     20        (testCases):
     21        * fast/filesystem/resources/op-restricted-names.js:
     22        (testCases.tests):
     23        (testCases):
     24        * fast/filesystem/resources/op-restricted-unicode.js:
     25        (testCases):
     26
    1272011-12-22  Nikolas Zimmermann  <nzimmermann@rim.com>
    228
  • trunk/LayoutTests/fast/filesystem/op-get-entry-expected.txt

    r79797 r103516  
    2121* Running: CreateNestedWithRelativePath
    2222PASS Succeeded: "/a".getDirectory("./b")
     23PASS Succeeded: "/a".getDirectory("./...")
    2324PASS Succeeded: "/a".getDirectory("../b")
    2425PASS Succeeded: "/a".getDirectory("../../b/c")
    2526PASS Succeeded: "/a".getDirectory("/a/../../d")
    2627PASS Succeeded: "/a".getDirectory("/a/../../b/./c/../../../../../e")
    27 PASS this.expectedErrorCode + "" is "9"
    28 PASS this.expectedErrorCode + "" is "9"
     28PASS Succeeded: "/a".getDirectory(".../f")
     29PASS this.expectedErrorCode + "" is "1"
    2930PASS Succeeded: "/a".getFile("./b.txt")
    3031PASS Succeeded: "/a".getFile("../b.txt")
     
    3233PASS Succeeded: "/a".getFile("/a/../../d.txt")
    3334PASS Succeeded: "/a".getFile("/a/../../b/./c/../../../../../e.txt")
    34 PASS this.expectedErrorCode + "" is "9"
    35 PASS this.expectedErrorCode + "" is "9"
     35PASS Succeeded: "/a".getFile(".../f.txt")
     36PASS this.expectedErrorCode + "" is "1"
    3637PASS Verified entry: ENTRY {path:/a name:a type:DIRECTORY}
    3738PASS Verified entry: ENTRY {path:/a/b name:b type:DIRECTORY}
  • trunk/LayoutTests/fast/filesystem/op-restricted-chars-expected.txt

    r70438 r103516  
    11* Running: RestrictedChars
     2PASS Succeeded: "/".getFile("a<b")
     3PASS Succeeded: "/".getFile("a>b")
     4PASS Succeeded: "/".getFile("a:b")
     5PASS Succeeded: "/".getFile("a?b")
     6PASS Succeeded: "/".getFile("a*b")
     7PASS Succeeded: "/".getFile("a"b")
     8PASS Succeeded: "/".getFile("a|b")
     9PASS Succeeded: "/".getFile("<ab")
     10PASS Succeeded: "/".getFile(":ab")
     11PASS Succeeded: "/".getFile("?ab")
     12PASS Succeeded: "/".getFile("*ab")
     13PASS Succeeded: "/".getFile(""ab")
     14PASS Succeeded: "/".getFile("|ab")
     15PASS Succeeded: "/".getFile("ab<")
     16PASS Succeeded: "/".getFile("ab:")
     17PASS Succeeded: "/".getFile("ab?")
     18PASS Succeeded: "/".getFile("ab*")
     19PASS Succeeded: "/".getFile("ab"")
     20PASS Succeeded: "/".getFile("ab|")
     21PASS this.expectedErrorCode + "" is "9"
     22PASS Succeeded: "/ab".copyTo("/", " a<b")
     23PASS Succeeded: "/ab".copyTo("/", " a:b")
     24PASS Succeeded: "/ab".copyTo("/", " a?b")
     25PASS Succeeded: "/ab".copyTo("/", " a*b")
     26PASS Succeeded: "/ab".copyTo("/", " a"b")
     27PASS Succeeded: "/ab".copyTo("/", " a|b")
    228PASS this.expectedErrorCode + "" is "9"
    329PASS this.expectedErrorCode + "" is "9"
    4 PASS this.expectedErrorCode + "" is "9"
    5 PASS this.expectedErrorCode + "" is "9"
    6 PASS this.expectedErrorCode + "" is "9"
    7 PASS this.expectedErrorCode + "" is "9"
    8 PASS this.expectedErrorCode + "" is "9"
    9 PASS this.expectedErrorCode + "" is "9"
    10 PASS this.expectedErrorCode + "" is "9"
    11 PASS this.expectedErrorCode + "" is "9"
    12 PASS this.expectedErrorCode + "" is "9"
    13 PASS this.expectedErrorCode + "" is "9"
    14 PASS this.expectedErrorCode + "" is "9"
    15 PASS this.expectedErrorCode + "" is "9"
    16 PASS this.expectedErrorCode + "" is "9"
    17 PASS this.expectedErrorCode + "" is "9"
    18 PASS this.expectedErrorCode + "" is "9"
    19 PASS this.expectedErrorCode + "" is "9"
    20 PASS this.expectedErrorCode + "" is "9"
    21 PASS this.expectedErrorCode + "" is "9"
    22 PASS this.expectedErrorCode + "" is "9"
    23 PASS this.expectedErrorCode + "" is "9"
    24 PASS Succeeded: "/".getFile("ab")
    25 PASS this.expectedErrorCode + "" is "9"
    26 PASS this.expectedErrorCode + "" is "9"
    27 PASS this.expectedErrorCode + "" is "9"
    28 PASS this.expectedErrorCode + "" is "9"
    29 PASS this.expectedErrorCode + "" is "9"
    30 PASS this.expectedErrorCode + "" is "9"
    31 PASS this.expectedErrorCode + "" is "9"
    32 PASS this.expectedErrorCode + "" is "9"
    33 PASS Verified entry: ENTRY {path:/ab name:ab type:FILE}
     30PASS Verified entry: ENTRY {path:/ab name:ab type:DIRECTORY}
     31PASS Verified entry: ENTRY {path:/a<b name:a<b type:FILE}
     32PASS Verified entry: ENTRY {path:/ a|b name: a|b type:DIRECTORY}
    3433Finished running tests.
    3534PASS successfullyParsed is true
  • trunk/LayoutTests/fast/filesystem/op-restricted-names-expected.txt

    r70438 r103516  
    1 * Running: RestrictedChars
    2 PASS this.expectedErrorCode + "" is "9"
    3 PASS this.expectedErrorCode + "" is "9"
    4 PASS this.expectedErrorCode + "" is "9"
    5 PASS this.expectedErrorCode + "" is "9"
    6 PASS this.expectedErrorCode + "" is "9"
    7 PASS this.expectedErrorCode + "" is "9"
    8 PASS this.expectedErrorCode + "" is "9"
    9 PASS this.expectedErrorCode + "" is "9"
    10 PASS this.expectedErrorCode + "" is "9"
    11 PASS this.expectedErrorCode + "" is "9"
    12 PASS this.expectedErrorCode + "" is "9"
    13 PASS this.expectedErrorCode + "" is "9"
    14 PASS this.expectedErrorCode + "" is "9"
    15 PASS this.expectedErrorCode + "" is "9"
    16 PASS this.expectedErrorCode + "" is "9"
    17 PASS this.expectedErrorCode + "" is "9"
    18 PASS this.expectedErrorCode + "" is "9"
    19 PASS this.expectedErrorCode + "" is "9"
    20 PASS this.expectedErrorCode + "" is "9"
    21 PASS this.expectedErrorCode + "" is "9"
    22 PASS this.expectedErrorCode + "" is "9"
    23 PASS this.expectedErrorCode + "" is "9"
    24 PASS this.expectedErrorCode + "" is "9"
    25 PASS this.expectedErrorCode + "" is "9"
    26 PASS this.expectedErrorCode + "" is "9"
    27 PASS this.expectedErrorCode + "" is "9"
    28 PASS this.expectedErrorCode + "" is "9"
    29 PASS this.expectedErrorCode + "" is "9"
    30 PASS this.expectedErrorCode + "" is "9"
    31 PASS this.expectedErrorCode + "" is "9"
    32 PASS this.expectedErrorCode + "" is "9"
    33 PASS this.expectedErrorCode + "" is "9"
    34 PASS this.expectedErrorCode + "" is "9"
    35 PASS this.expectedErrorCode + "" is "9"
    36 PASS this.expectedErrorCode + "" is "9"
    37 PASS this.expectedErrorCode + "" is "9"
    38 PASS this.expectedErrorCode + "" is "9"
    39 PASS this.expectedErrorCode + "" is "9"
    40 PASS this.expectedErrorCode + "" is "9"
    41 PASS Verified entry: ENTRY {path:/a name:a type:DIRECTORY}
     1* Running: RestrictedNames
     2PASS this.expectedErrorCode + "" is "2"
     3PASS this.expectedErrorCode + "" is "2"
     4PASS Succeeded: "/".getFile("con")
     5PASS Succeeded: "/".getFile("CON")
     6PASS Succeeded: "/".getFile("Con")
     7PASS Succeeded: "/".getFile("cOn.txt")
     8PASS Succeeded: "/".getFile("a/coN")
     9PASS Succeeded: "/".getFile("prn")
     10PASS Succeeded: "/".getFile("PRN")
     11PASS Succeeded: "/".getFile("Prn")
     12PASS Succeeded: "/".getFile("pRn.txt")
     13PASS Succeeded: "/".getFile("a/prN")
     14PASS Succeeded: "/".getFile("aux")
     15PASS Succeeded: "/".getFile("AUX")
     16PASS Succeeded: "/".getFile("Aux")
     17PASS Succeeded: "/".getFile("aUx.txt")
     18PASS Succeeded: "/".getFile("a/auX")
     19PASS Succeeded: "/".getFile("nul")
     20PASS Succeeded: "/".getFile("NUL")
     21PASS Succeeded: "/".getFile("Nul")
     22PASS Succeeded: "/".getFile("nUl.txt")
     23PASS Succeeded: "/".getFile("a/nuL")
     24PASS Succeeded: "/".getFile("com1")
     25PASS Succeeded: "/".getFile("COM2")
     26PASS Succeeded: "/".getFile("Com4")
     27PASS Succeeded: "/".getFile("cOM7.foo")
     28PASS Succeeded: "/".getFile("a/coM9")
     29PASS Succeeded: "/".getFile("lpt1")
     30PASS Succeeded: "/".getFile("LPT2")
     31PASS Succeeded: "/".getFile("Lpt4")
     32PASS Succeeded: "/".getFile("lPT7.foo")
     33PASS Succeeded: "/".getFile("a/lpT9")
     34PASS Succeeded: "/".getFile("foo ")
     35PASS Succeeded: "/".getFile("foo
     36")
     37PASS Succeeded: "/".getFile("foo.")
     38PASS Succeeded: "/a".copyTo("/", "foo  ")
     39PASS Succeeded: "/a".copyTo("/", "foo   ")
     40PASS Succeeded: "/a".copyTo("/", "foo..")
     41PASS Succeeded: "/a".moveTo("/", "foo    ")
     42PASS Succeeded: "/b".moveTo("/", "foo           ")
     43PASS Succeeded: "/c".moveTo("/", "foo.....")
     44PASS Verified entry: ENTRY {path:/foo     name:foo     type:DIRECTORY}
     45PASS Verified entry: ENTRY {path:/foo            name:foo                type:DIRECTORY}
     46PASS Verified entry: ENTRY {path:/foo..... name:foo..... type:DIRECTORY}
    4247Finished running tests.
    4348PASS successfullyParsed is true
  • trunk/LayoutTests/fast/filesystem/op-restricted-unicode-expected.txt

    r97541 r103516  
    22PASS Succeeded: "/".getFile("ab")
    33PASS this.expectedErrorCode + "" is "9"
    4 PASS this.expectedErrorCode + "" is "9"
    5 PASS this.expectedErrorCode + "" is "9"
    6 PASS this.expectedErrorCode + "" is "9"
    7 PASS this.expectedErrorCode + "" is "9"
    8 PASS this.expectedErrorCode + "" is "9"
    9 PASS this.expectedErrorCode + "" is "9"
    10 PASS this.expectedErrorCode + "" is "9"
    11 PASS this.expectedErrorCode + "" is "9"
    12 PASS this.expectedErrorCode + "" is "9"
    13 PASS this.expectedErrorCode + "" is "9"
    14 PASS this.expectedErrorCode + "" is "9"
    15 PASS this.expectedErrorCode + "" is "9"
    16 PASS this.expectedErrorCode + "" is "9"
    17 PASS this.expectedErrorCode + "" is "9"
    18 PASS this.expectedErrorCode + "" is "9"
    19 PASS this.expectedErrorCode + "" is "9"
    20 PASS this.expectedErrorCode + "" is "9"
    21 PASS this.expectedErrorCode + "" is "9"
    22 PASS this.expectedErrorCode + "" is "9"
    23 PASS this.expectedErrorCode + "" is "9"
    24 PASS this.expectedErrorCode + "" is "9"
    25 PASS this.expectedErrorCode + "" is "9"
    26 PASS this.expectedErrorCode + "" is "9"
    27 PASS this.expectedErrorCode + "" is "9"
    28 PASS this.expectedErrorCode + "" is "9"
    29 PASS this.expectedErrorCode + "" is "9"
    30 PASS this.expectedErrorCode + "" is "9"
    31 PASS this.expectedErrorCode + "" is "9"
    32 PASS this.expectedErrorCode + "" is "9"
    33 PASS this.expectedErrorCode + "" is "9"
     4PASS Succeeded: "/".getFile("ab")
     5PASS Succeeded: "/".getFile("ab")
     6PASS Succeeded: "/".getFile("ab")
     7PASS Succeeded: "/".getFile("ab")
     8PASS Succeeded: "/".getFile("ab")
     9PASS Succeeded: "/".getFile("ab")
     10PASS Succeeded: "/".getFile("ab")
     11PASS Succeeded: "/".getFile("ab")
     12PASS Succeeded: "/".getFile("a  b")
     13PASS Succeeded: "/".getFile("a
     14b")
     15PASS Succeeded: "/".getFile("a
     16b")
     17PASS Succeeded: "/".getFile("a
     18b")
     19PASS Succeeded: "/".getFile("a
     20b")
     21PASS Succeeded: "/".getFile("ab")
     22PASS Succeeded: "/".getFile("ab")
     23PASS Succeeded: "/".getFile("ab")
     24PASS Succeeded: "/".getFile("ab")
     25PASS Succeeded: "/".getFile("ab")
     26PASS Succeeded: "/".getFile("ab")
     27PASS Succeeded: "/".getFile("ab")
     28PASS Succeeded: "/".getFile("ab")
     29PASS Succeeded: "/".getFile("ab")
     30PASS Succeeded: "/".getFile("ab")
     31PASS Succeeded: "/".getFile("ab")
     32PASS Succeeded: "/".getFile("ab")
     33PASS Succeeded: "/".getFile("ab")
     34PASS Succeeded: "/".getFile("ab")
     35PASS Succeeded: "/".getFile("a
     36b")
     37PASS Succeeded: "/".getFile("a
     38b")
     39PASS Succeeded: "/".getFile("a
     40b")
    3441PASS Verified entry: ENTRY {path:/ab name:ab type:FILE}
    3542Finished running tests.
  • trunk/LayoutTests/fast/filesystem/resources/op-get-entry.js

    r79797 r103516  
    5050        tests: [
    5151            function(helper) { helper.getDirectory('/a', './b', {create:true}); },
     52            function(helper) { helper.getDirectory('/a', './...', {create:true}); },
    5253            function(helper) { helper.getDirectory('/a', '../b', {create:true}); },
    5354            function(helper) { helper.getDirectory('/a', '../../b/c', {create:true}); },
    5455            function(helper) { helper.getDirectory('/a', '/a/../../d', {create:true}); },
    5556            function(helper) { helper.getDirectory('/a', '/a/../../b/./c/../../../../../e', {create:true}); },
    56             function(helper) { helper.getDirectory('/a', '.../f', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    57             function(helper) { helper.getDirectory('/a', '/a/../.../g', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
     57            function(helper) { helper.getDirectory('/a', '.../f', {create:true}); },
     58            function(helper) { helper.getDirectory('/a', '/a/../.../g', {create:true}, FileError.NOT_FOUND_ERR); },
    5859            function(helper) { helper.getFile('/a', './b.txt', {create:true}); },
    5960            function(helper) { helper.getFile('/a', '../b.txt', {create:true}); },
     
    6162            function(helper) { helper.getFile('/a', '/a/../../d.txt', {create:true}); },
    6263            function(helper) { helper.getFile('/a', '/a/../../b/./c/../../../../../e.txt', {create:true}); },
    63             function(helper) { helper.getFile('/a', '.../f.txt', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    64             function(helper) { helper.getFile('/a', '/a/../.../g.txt', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
     64            function(helper) { helper.getFile('/a', '.../f.txt', {create:true}); },
     65            function(helper) { helper.getFile('/a', '/a/../.../g.txt', {create:true}, FileError.NOT_FOUND_ERR); },
    6566        ],
    6667        postcondition: [
  • trunk/LayoutTests/fast/filesystem/resources/op-restricted-chars.js

    r69339 r103516  
    22    {
    33        name: 'RestrictedChars',
    4         precondition: [ ],
     4        precondition: [
     5            {fullPath:'/ab', isDirectory:true},
     6        ],
    57        tests: [
    6             // Restricted character in 'path' parameter.
     8            // Test for difficult characters in 'path' parameters.
     9            function(helper) { helper.getFile('/', 'a<b', {create:true}, 0); },
     10            function(helper) { helper.getFile('/', 'a>b', {create:true}, 0); },
     11            function(helper) { helper.getFile('/', 'a:b', {create:true}, 0); },
     12            function(helper) { helper.getFile('/', 'a?b', {create:true}, 0); },
     13            function(helper) { helper.getFile('/', 'a*b', {create:true}, 0); },
     14            function(helper) { helper.getFile('/', 'a"b', {create:true}, 0); },
     15            function(helper) { helper.getFile('/', 'a|b', {create:true}, 0); },
     16
     17            function(helper) { helper.getFile('/', '<ab', {create:true}, 0); },
     18            function(helper) { helper.getFile('/', ':ab', {create:true}, 0); },
     19            function(helper) { helper.getFile('/', '?ab', {create:true}, 0); },
     20            function(helper) { helper.getFile('/', '*ab', {create:true}, 0); },
     21            function(helper) { helper.getFile('/', '"ab', {create:true}, 0); },
     22            function(helper) { helper.getFile('/', '|ab', {create:true}, 0); },
     23
     24            function(helper) { helper.getFile('/', 'ab<', {create:true}, 0); },
     25            function(helper) { helper.getFile('/', 'ab:', {create:true}, 0); },
     26            function(helper) { helper.getFile('/', 'ab?', {create:true}, 0); },
     27            function(helper) { helper.getFile('/', 'ab*', {create:true}, 0); },
     28            function(helper) { helper.getFile('/', 'ab"', {create:true}, 0); },
     29            function(helper) { helper.getFile('/', 'ab|', {create:true}, 0); },
     30
     31            // Only '\\' is disallowed.
    732            function(helper) { helper.getFile('/', 'a\\b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    8             function(helper) { helper.getFile('/', 'a<b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    9             function(helper) { helper.getFile('/', 'a>b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    10             function(helper) { helper.getFile('/', 'a:b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    11             function(helper) { helper.getFile('/', 'a?b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    12             function(helper) { helper.getFile('/', 'a*b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    13             function(helper) { helper.getFile('/', 'a"b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    14             function(helper) { helper.getFile('/', 'a|b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    1533
    16             function(helper) { helper.getFile('/', '\\ab', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    17             function(helper) { helper.getFile('/', '<ab', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    18             function(helper) { helper.getFile('/', ':ab', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    19             function(helper) { helper.getFile('/', '?ab', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    20             function(helper) { helper.getFile('/', '*ab', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    21             function(helper) { helper.getFile('/', '"ab', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    22             function(helper) { helper.getFile('/', '|ab', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
     34            // Test for difficult characters in 'name' parameters.
     35            function(helper) { helper.copy('/ab', '/', ' a<b', 0); },
     36            function(helper) { helper.copy('/ab', '/', ' a:b', 0); },
     37            function(helper) { helper.copy('/ab', '/', ' a?b', 0); },
     38            function(helper) { helper.copy('/ab', '/', ' a*b', 0); },
     39            function(helper) { helper.copy('/ab', '/', ' a"b', 0); },
     40            function(helper) { helper.copy('/ab', '/', ' a|b', 0); },
    2341
    24             function(helper) { helper.getFile('/', 'ab\\', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    25             function(helper) { helper.getFile('/', 'ab<', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    26             function(helper) { helper.getFile('/', 'ab:', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    27             function(helper) { helper.getFile('/', 'ab?', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    28             function(helper) { helper.getFile('/', 'ab*', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    29             function(helper) { helper.getFile('/', 'ab"', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    30             function(helper) { helper.getFile('/', 'ab|', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    31 
    32             // This should succeed.
    33             function(helper) { helper.getFile('/', 'ab', {create:true}); },
    34 
    35             // Restricted character in 'name' parameters.
    36             function(helper) { helper.copy('/ab', '/', 'a\\b',FileError.INVALID_MODIFICATION_ERR); },
    37             function(helper) { helper.copy('/ab', '/', 'a<b', FileError.INVALID_MODIFICATION_ERR); },
    38             function(helper) { helper.copy('/ab', '/', 'a:b', FileError.INVALID_MODIFICATION_ERR); },
    39             function(helper) { helper.copy('/ab', '/', 'a?b', FileError.INVALID_MODIFICATION_ERR); },
    40             function(helper) { helper.copy('/ab', '/', 'a*b', FileError.INVALID_MODIFICATION_ERR); },
    41             function(helper) { helper.copy('/ab', '/', 'a"b', FileError.INVALID_MODIFICATION_ERR); },
    42             function(helper) { helper.copy('/ab', '/', 'a|b', FileError.INVALID_MODIFICATION_ERR); },
    43 
    44             // 'Name' parameter cannot contain '/'.
     42            // 'Name' parameter cannot contain '/' or '\\'.
    4543            function(helper) { helper.copy('/ab', '/', 'a/b', FileError.INVALID_MODIFICATION_ERR); },
     44            function(helper) { helper.copy('/ab', '/', 'a\\b', FileError.INVALID_MODIFICATION_ERR); },
    4645        ],
    4746        postcondition: [
    48             {fullPath:'/ab'},
     47            {fullPath:'/ab', isDirectory:true},
     48            {fullPath:'a<b', isDirectory:false},
     49            {fullPath:' a|b', isDirectory:true}
    4950        ],
    5051    },
  • trunk/LayoutTests/fast/filesystem/resources/op-restricted-names.js

    r69339 r103516  
    11var testCases = [
    22    {
    3         name: 'RestrictedChars',
     3        name: 'RestrictedNames',
    44        precondition: [
    5             {fullPath:'/a', isDirectory:true}
     5            {fullPath:'/a', isDirectory:true},
     6            {fullPath:'/b', isDirectory:true},
     7            {fullPath:'/c', isDirectory:true}
    68        ],
    79        tests: [
    8             function(helper) { helper.getFile('/', 'con', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    9             function(helper) { helper.getFile('/', 'CON', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    10             function(helper) { helper.getFile('/', 'Con', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    11             function(helper) { helper.getFile('/', 'cOn.txt', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    12             function(helper) { helper.getFile('/', 'a/coN', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
     10            function(helper) { helper.getFile('/', '.', {create:true}, FileError.SECURITY_ERR); },
     11            function(helper) { helper.getFile('/', '..', {create:true}, FileError.SECURITY_ERR); },
     12            function(helper) { helper.getFile('/', 'con', {create:true}, 0); },
     13            function(helper) { helper.getFile('/', 'CON', {create:true}, 0); },
     14            function(helper) { helper.getFile('/', 'Con', {create:true}, 0); },
     15            function(helper) { helper.getFile('/', 'cOn.txt', {create:true}, 0); },
     16            function(helper) { helper.getFile('/', 'a/coN', {create:true}, 0); },
    1317
    14             function(helper) { helper.getFile('/', 'prn', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    15             function(helper) { helper.getFile('/', 'PRN', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    16             function(helper) { helper.getFile('/', 'Prn', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    17             function(helper) { helper.getFile('/', 'pRn.txt', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    18             function(helper) { helper.getFile('/', 'a/prN', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
     18            function(helper) { helper.getFile('/', 'prn', {create:true}, 0); },
     19            function(helper) { helper.getFile('/', 'PRN', {create:true}, 0); },
     20            function(helper) { helper.getFile('/', 'Prn', {create:true}, 0); },
     21            function(helper) { helper.getFile('/', 'pRn.txt', {create:true}, 0); },
     22            function(helper) { helper.getFile('/', 'a/prN', {create:true}, 0); },
    1923
    20             function(helper) { helper.getFile('/', 'aux', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    21             function(helper) { helper.getFile('/', 'AUX', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    22             function(helper) { helper.getFile('/', 'Aux', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    23             function(helper) { helper.getFile('/', 'aUx.txt', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    24             function(helper) { helper.getFile('/', 'a/auX', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
     24            function(helper) { helper.getFile('/', 'aux', {create:true}, 0); },
     25            function(helper) { helper.getFile('/', 'AUX', {create:true}, 0); },
     26            function(helper) { helper.getFile('/', 'Aux', {create:true}, 0); },
     27            function(helper) { helper.getFile('/', 'aUx.txt', {create:true}, 0); },
     28            function(helper) { helper.getFile('/', 'a/auX', {create:true}, 0); },
    2529
    26             function(helper) { helper.getFile('/', 'nul', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    27             function(helper) { helper.getFile('/', 'NUL', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    28             function(helper) { helper.getFile('/', 'Nul', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    29             function(helper) { helper.getFile('/', 'nUl.txt', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    30             function(helper) { helper.getFile('/', 'a/nuL', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
     30            function(helper) { helper.getFile('/', 'nul', {create:true}, 0); },
     31            function(helper) { helper.getFile('/', 'NUL', {create:true}, 0); },
     32            function(helper) { helper.getFile('/', 'Nul', {create:true}, 0); },
     33            function(helper) { helper.getFile('/', 'nUl.txt', {create:true}, 0); },
     34            function(helper) { helper.getFile('/', 'a/nuL', {create:true}, 0); },
    3135
    32             function(helper) { helper.getFile('/', 'com1', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    33             function(helper) { helper.getFile('/', 'COM2', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    34             function(helper) { helper.getFile('/', 'Com4', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    35             function(helper) { helper.getFile('/', 'cOM7.foo', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    36             function(helper) { helper.getFile('/', 'b/coM9', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
     36            function(helper) { helper.getFile('/', 'com1', {create:true}, 0); },
     37            function(helper) { helper.getFile('/', 'COM2', {create:true}, 0); },
     38            function(helper) { helper.getFile('/', 'Com4', {create:true}, 0); },
     39            function(helper) { helper.getFile('/', 'cOM7.foo', {create:true}, 0); },
     40            function(helper) { helper.getFile('/', 'a/coM9', {create:true}, 0); },
    3741
    38             function(helper) { helper.getFile('/', 'lpt1', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    39             function(helper) { helper.getFile('/', 'LPT2', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    40             function(helper) { helper.getFile('/', 'Lpt4', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    41             function(helper) { helper.getFile('/', 'lPT7.foo', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    42             function(helper) { helper.getFile('/', 'b/lpT9', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
     42            function(helper) { helper.getFile('/', 'lpt1', {create:true}, 0); },
     43            function(helper) { helper.getFile('/', 'LPT2', {create:true}, 0); },
     44            function(helper) { helper.getFile('/', 'Lpt4', {create:true}, 0); },
     45            function(helper) { helper.getFile('/', 'lPT7.foo', {create:true}, 0); },
     46            function(helper) { helper.getFile('/', 'a/lpT9', {create:true}, 0); },
    4347
    44             // Names should not end with period or whitespace.
    45             function(helper) { helper.getFile('/', 'foo ', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    46             function(helper) { helper.getFile('/', 'foo\n', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    47             function(helper) { helper.getFile('/', 'foo.', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    48             function(helper) { helper.copy('/a', '/', 'foo ', FileError.INVALID_MODIFICATION_ERR); },
    49             function(helper) { helper.copy('/a', '/', 'foo\t', FileError.INVALID_MODIFICATION_ERR); },
    50             function(helper) { helper.copy('/a', '/', 'foo.', FileError.INVALID_MODIFICATION_ERR); },
    51             function(helper) { helper.move('/a', '/', 'foo ', FileError.INVALID_MODIFICATION_ERR); },
    52             function(helper) { helper.move('/a', '/', 'foo\t', FileError.INVALID_MODIFICATION_ERR); },
    53             function(helper) { helper.move('/a', '/', 'foo.', FileError.INVALID_MODIFICATION_ERR); },
     48            function(helper) { helper.getFile('/', 'foo ', {create:true}, 0); },
     49            function(helper) { helper.getFile('/', 'foo\n', {create:true}, 0); },
     50            function(helper) { helper.getFile('/', 'foo.', {create:true}, 0); },
     51            function(helper) { helper.copy('/a', '/', 'foo  ', 0); },
     52            function(helper) { helper.copy('/a', '/', 'foo\t', 0); },
     53            function(helper) { helper.copy('/a', '/', 'foo..', 0); },
     54            function(helper) { helper.move('/a', '/', 'foo    ', 0); },
     55            function(helper) { helper.move('/b', '/', 'foo\t\t', 0); },
     56            function(helper) { helper.move('/c', '/', 'foo.....', 0); },
    5457        ],
    5558        postcondition: [
    56             {fullPath:'/a', isDirectory:true}
     59            {fullPath:'/foo    ', isDirectory:true},
     60            {fullPath:'/foo\t\t', isDirectory:true},
     61            {fullPath:'/foo.....', isDirectory:true}
    5762        ],
    5863    },
  • trunk/LayoutTests/fast/filesystem/resources/op-restricted-unicode.js

    r97541 r103516  
    66            function(helper) { helper.getFile('/', 'ab', {create:true}); },
    77
    8             // Restricted character in 'path' parameter.
     8            // Embedded NULs aren't allowed; anything else in the first 32 is fair game.
    99            function(helper) { helper.getFile('/', 'a\u0000b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    10             function(helper) { helper.getFile('/', 'a\u0001b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    11             function(helper) { helper.getFile('/', 'a\u0002b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    12             function(helper) { helper.getFile('/', 'a\u0003b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    13             function(helper) { helper.getFile('/', 'a\u0004b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    14             function(helper) { helper.getFile('/', 'a\u0005b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    15             function(helper) { helper.getFile('/', 'a\u0006b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    16             function(helper) { helper.getFile('/', 'a\u0007b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    17             function(helper) { helper.getFile('/', 'a\u0008b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    18             function(helper) { helper.getFile('/', 'a\u0009b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    19             function(helper) { helper.getFile('/', 'a\u000ab', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    20             function(helper) { helper.getFile('/', 'a\u000bb', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    21             function(helper) { helper.getFile('/', 'a\u000cb', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    22             function(helper) { helper.getFile('/', 'a\u000db', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    23             function(helper) { helper.getFile('/', 'a\u000eb', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    24             function(helper) { helper.getFile('/', 'a\u000fb', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    25             function(helper) { helper.getFile('/', 'a\u0010b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    26             function(helper) { helper.getFile('/', 'a\u0011b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    27             function(helper) { helper.getFile('/', 'a\u0012b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    28             function(helper) { helper.getFile('/', 'a\u0013b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    29             function(helper) { helper.getFile('/', 'a\u0014b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    30             function(helper) { helper.getFile('/', 'a\u0015b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    31             function(helper) { helper.getFile('/', 'a\u0016b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    32             function(helper) { helper.getFile('/', 'a\u0017b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    33             function(helper) { helper.getFile('/', 'a\u0018b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    34             function(helper) { helper.getFile('/', 'a\u0019b', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    35             function(helper) { helper.getFile('/', 'a\u001ab', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    36             function(helper) { helper.getFile('/', 'a\u001bb', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    37             function(helper) { helper.getFile('/', 'a\u001cb', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    38             function(helper) { helper.getFile('/', 'a\u001db', {create:true}, FileError.INVALID_MODIFICATION_ERR); },
    39             function(helper) { helper.getFile('/', 'a\u001eb', {create:true}, FileError.INVALID_MODIFICATION_ERR); }
     10            function(helper) { helper.getFile('/', 'a\u0001b', {create:true}, 0); },
     11            function(helper) { helper.getFile('/', 'a\u0002b', {create:true}, 0); },
     12            function(helper) { helper.getFile('/', 'a\u0003b', {create:true}, 0); },
     13            function(helper) { helper.getFile('/', 'a\u0004b', {create:true}, 0); },
     14            function(helper) { helper.getFile('/', 'a\u0005b', {create:true}, 0); },
     15            function(helper) { helper.getFile('/', 'a\u0006b', {create:true}, 0); },
     16            function(helper) { helper.getFile('/', 'a\u0007b', {create:true}, 0); },
     17            function(helper) { helper.getFile('/', 'a\u0008b', {create:true}, 0); },
     18            function(helper) { helper.getFile('/', 'a\u0009b', {create:true}, 0); },
     19            function(helper) { helper.getFile('/', 'a\u000ab', {create:true}, 0); },
     20            function(helper) { helper.getFile('/', 'a\u000bb', {create:true}, 0); },
     21            function(helper) { helper.getFile('/', 'a\u000cb', {create:true}, 0); },
     22            function(helper) { helper.getFile('/', 'a\u000db', {create:true}, 0); },
     23            function(helper) { helper.getFile('/', 'a\u000eb', {create:true}, 0); },
     24            function(helper) { helper.getFile('/', 'a\u000fb', {create:true}, 0); },
     25            function(helper) { helper.getFile('/', 'a\u0010b', {create:true}, 0); },
     26            function(helper) { helper.getFile('/', 'a\u0011b', {create:true}, 0); },
     27            function(helper) { helper.getFile('/', 'a\u0012b', {create:true}, 0); },
     28            function(helper) { helper.getFile('/', 'a\u0013b', {create:true}, 0); },
     29            function(helper) { helper.getFile('/', 'a\u0014b', {create:true}, 0); },
     30            function(helper) { helper.getFile('/', 'a\u0015b', {create:true}, 0); },
     31            function(helper) { helper.getFile('/', 'a\u0016b', {create:true}, 0); },
     32            function(helper) { helper.getFile('/', 'a\u0017b', {create:true}, 0); },
     33            function(helper) { helper.getFile('/', 'a\u0018b', {create:true}, 0); },
     34            function(helper) { helper.getFile('/', 'a\u0019b', {create:true}, 0); },
     35            function(helper) { helper.getFile('/', 'a\u001ab', {create:true}, 0); },
     36            function(helper) { helper.getFile('/', 'a\u001bb', {create:true}, 0); },
     37            function(helper) { helper.getFile('/', 'a\u001cb', {create:true}, 0); },
     38            function(helper) { helper.getFile('/', 'a\u001db', {create:true}, 0); },
     39            function(helper) { helper.getFile('/', 'a\u001eb', {create:true}, 0); }
    4040        ],
    4141        postcondition: [
  • trunk/Source/WebCore/ChangeLog

    r103513 r103516  
     12011-12-22  Eric Uhrhane  <ericu@chromium.org>
     2
     3        [filesystem] Remove old filesystem naming restrictions
     4        https://bugs.webkit.org/show_bug.cgi?id=62813
     5
     6        Reviewed by David Levin.
     7
     8        * fileapi/DOMFilePath.cpp:
     9        (WebCore::DOMFilePath::isValidPath): Replace strict restrictions with
     10        minimal safety [no files named "." or "..", no use of '\\' or '\0' in
     11        paths, no use of '/' in file names].
     12
    1132011-12-22  Greg Billock  <gbillock@google.com>
    214
  • trunk/Source/WebCore/fileapi/DOMFilePath.cpp

    r95901 r103516  
    115115}
    116116
    117 // Check the naming restrictions defined in FileSystem API 8.3.
    118 // http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#naming-restrictions
    119117bool DOMFilePath::isValidPath(const String& path)
    120118{
     
    122120        return true;
    123121
    124     // Chars 0-31 in UTF-8 prepresentation are not allowed.
    125     for (size_t i = 0; i < path.length(); ++i)
    126         if (path[i] < 32)
    127             return false;
    128 
    129     // Unallowed names.
    130     DEFINE_STATIC_LOCAL(RegularExpression, unallowedNamesRegExp1, ("(/|^)(CON|PRN|AUX|NUL)([\\./]|$)", TextCaseInsensitive));
    131     DEFINE_STATIC_LOCAL(RegularExpression, unallowedNamesRegExp2, ("(/|^)(COM|LPT)[1-9]([\\./]|$)", TextCaseInsensitive));
    132 
    133     if (unallowedNamesRegExp1.match(path) >= 0)
    134         return false;
    135     if (unallowedNamesRegExp2.match(path) >= 0)
     122    // Embedded NULs are not allowed.
     123    if (path.find(static_cast<UChar>(0)) != WTF::notFound)
    136124        return false;
    137125
    138     // Names must not end with period or whitespace.
    139     DEFINE_STATIC_LOCAL(RegularExpression, endingRegExp, ("[\\.\\s](/|$)", TextCaseInsensitive));
    140 
    141     if (endingRegExp.match(path) >= 0)
     126    // While not [yet] restricted by the spec, '\\' complicates implementation for Chromium.
     127    if (path.find('\\') != WTF::notFound)
    142128        return false;
    143129
    144     // Unallowed chars: '\', '<', '>', ':', '?', '*', '"', '|'
    145     // (We don't check '/' here as this method takes paths as its argument.)
    146     DEFINE_STATIC_LOCAL(RegularExpression, unallowedCharsRegExp, ("[\\\\<>:\\?\\*\"|]", TextCaseInsensitive));
    147 
    148     if (unallowedCharsRegExp.match(path) >= 0)
    149         return false;
    150 
     130    // This method is only called on fully-evaluated absolute paths. Any sign of ".." or "." is likely an attempt to break out of the sandbox.
     131    Vector<String> components;
     132    path.split(DOMFilePath::separator, components);
     133    for (size_t i = 0; i < components.size(); ++i) {
     134        if (components[i] == ".")
     135            return false;
     136        if (components[i] == "..")
     137            return false;
     138    }
    151139    return true;
    152140}
Note: See TracChangeset for help on using the changeset viewer.