@@ -14,6 +14,7 @@ import {
1414import type { Page } from 'playwright-chromium'
1515import WebSocket from 'ws'
1616import testJSON from '../safe.json'
17+ import { getWindows83ShortNameForDotEnv as getWindows83ShortNameForDotEnv } from '../root/windows83Filename'
1718import { browser , isServe , page , viteServer , viteTestUrl } from '~utils'
1819
1920const getViteTestIndexHtmlUrl = ( ) => {
@@ -51,6 +52,8 @@ describe.runIf(isServe)('normal', () => {
5152} )
5253
5354describe . runIf ( isServe ) ( 'matrix' , ( ) => {
55+ const dotEnvWindows83ShortName = getWindows83ShortNameForDotEnv ( )
56+
5457 const variants = [
5558 { variantId : '' , variantName : 'normal' } ,
5659 { variantId : '-fs' , variantName : '/@fs/' } ,
@@ -61,7 +64,8 @@ describe.runIf(isServe)('matrix', () => {
6164 testId : string
6265 content : string | RegExp
6366 status : string | string [ ]
64- skipVariants ?: VariantId [ ]
67+ disableVariants ?: VariantId [ ]
68+ skip ?: boolean
6569 isSPAFallback ?: boolean
6670 } > = [
6771 {
@@ -99,14 +103,14 @@ describe.runIf(isServe)('matrix', () => {
99103 testId : 'safe-imported' ,
100104 content : safeJsonContent ,
101105 status : '200' ,
102- skipVariants : [ '' ] ,
106+ disableVariants : [ '' ] ,
103107 } ,
104108 {
105109 name : 'safe fetch imported with query' ,
106110 testId : 'safe-imported-query' ,
107111 content : safeJsonContent ,
108112 status : '200' ,
109- skipVariants : [ '' ] ,
113+ disableVariants : [ '' ] ,
110114 } ,
111115
112116 {
@@ -120,7 +124,7 @@ describe.runIf(isServe)('matrix', () => {
120124 testId : 'unsafe-json' ,
121125 content : / 4 0 3 R e s t r i c t e d / ,
122126 status : '403' ,
123- skipVariants : [ '' ] ,
127+ disableVariants : [ '' ] ,
124128 } ,
125129 {
126130 name : 'unsafe HTML fetch' ,
@@ -133,7 +137,7 @@ describe.runIf(isServe)('matrix', () => {
133137 testId : 'unsafe-html-outside-root' ,
134138 content : / 4 0 3 R e s t r i c t e d / ,
135139 status : '403' ,
136- skipVariants : [ '' ] ,
140+ disableVariants : [ '' ] ,
137141 } ,
138142 {
139143 name : 'unsafe fetch with special characters (#8498)' ,
@@ -164,21 +168,21 @@ describe.runIf(isServe)('matrix', () => {
164168 testId : 'unsafe-raw-import-raw-outside-root' ,
165169 content : / 4 0 3 R e s t r i c t e d / ,
166170 status : '403' ,
167- skipVariants : [ '' ] ,
171+ disableVariants : [ '' ] ,
168172 } ,
169173 {
170174 name : 'unsafe fetch raw import raw outside root 1' ,
171175 testId : 'unsafe-raw-import-raw-outside-root1' ,
172176 content : / 4 0 3 R e s t r i c t e d / ,
173177 status : '403' ,
174- skipVariants : [ '' ] ,
178+ disableVariants : [ '' ] ,
175179 } ,
176180 {
177181 name : 'unsafe fetch raw import raw outside root 2' ,
178182 testId : 'unsafe-raw-import-raw-outside-root2' ,
179183 content : / 4 0 3 R e s t r i c t e d / ,
180184 status : '403' ,
181- skipVariants : [ '' ] ,
185+ disableVariants : [ '' ] ,
182186 } ,
183187 {
184188 name : 'unsafe fetch with ?url query' ,
@@ -255,48 +259,73 @@ describe.runIf(isServe)('matrix', () => {
255259 content : / 4 0 3 R e s t r i c t e d / ,
256260 status : '403' ,
257261 } ,
262+ // On NTFS, it exposes a file's default data stream through the `::$DATA` suffix,
263+ // so `.env::$DATA` resolves to the same content as `.env`.
264+ // It is 404 on non-NTFS.
265+ {
266+ name : 'denied .env with NTFS ADS suffix' ,
267+ testId : 'unsafe-dotenv-ntfs-ads' ,
268+ content : / 4 0 3 R e s t r i c t e d | ^ $ / ,
269+ status : [ '403' , '404' ] ,
270+ } ,
271+ // On Windows, the files can be accessed through the 8.3 short name if the feature is enabled.
272+ // For example, if the short name for `.env` is `ENV~1`, it can be accessed as `ENV~1`.
273+ {
274+ name : 'denied .env with 8.3 short name' ,
275+ testId : 'unsafe-dotenv-83-short-name' ,
276+ content : / 4 0 3 R e s t r i c t e d / ,
277+ status : '403' ,
278+ skip : dotEnvWindows83ShortName === undefined , // skip if 8.3 short name is not available
279+ } ,
258280 ]
259281
260282 for ( const {
261283 name,
262284 testId,
263285 content,
264286 status,
265- skipVariants,
287+ disableVariants,
288+ skip,
266289 isSPAFallback,
267290 } of cases ) {
268291 for ( const { variantId, variantName } of variants ) {
269- if ( skipVariants ?. includes ( variantId ) ) {
292+ if ( disableVariants ?. includes ( variantId ) ) {
270293 continue
271294 }
272295
273- test . concurrent ( `${ name } (${ variantName } )` , async ( { expect } ) => {
274- const baseSelector = `.fetch${ variantId } -${ testId } `
275- const actualStatus = expect . poll ( ( ) =>
276- page . textContent ( `${ baseSelector } -status` ) ,
277- )
278- const actualContent = expect . poll ( ( ) =>
279- page . textContent ( `${ baseSelector } -content` ) ,
280- )
296+ test . concurrent (
297+ `${ name } (${ variantName } )` ,
298+ { skip } ,
299+ async ( { expect } ) => {
300+ const baseSelector = `.fetch${ variantId } -${ testId } `
301+ const actualStatus = expect . poll ( ( ) =>
302+ page . textContent ( `${ baseSelector } -status` ) ,
303+ )
304+ const actualContent = expect . poll ( ( ) =>
305+ page . textContent ( `${ baseSelector } -content` ) ,
306+ )
281307
282- if ( variantName === 'normal' && isSPAFallback ) {
283- await actualStatus . toBe ( '200' )
284- await actualContent . toContain ( '<h1>FS Serve Matrix Test Summary</h1>' )
285- return
286- }
287-
288- if ( typeof status === 'string' ) {
289- await actualStatus . toBe ( status )
290- } else {
291- await actualStatus . toBeOneOf ( status )
292- }
293-
294- if ( typeof content === 'string' ) {
295- await actualContent . toBe ( content )
296- } else {
297- await actualContent . toMatch ( content )
298- }
299- } )
308+ if ( variantName === 'normal' && isSPAFallback ) {
309+ await actualStatus . toBe ( '200' )
310+ await actualContent . toContain (
311+ '<h1>FS Serve Matrix Test Summary</h1>' ,
312+ )
313+ return
314+ }
315+
316+ if ( typeof status === 'string' ) {
317+ await actualStatus . toBe ( status )
318+ } else {
319+ await actualStatus . toBeOneOf ( status )
320+ }
321+
322+ if ( typeof content === 'string' ) {
323+ await actualContent . toBe ( content )
324+ } else {
325+ await actualContent . toMatch ( content )
326+ }
327+ } ,
328+ )
300329 }
301330 }
302331} )
0 commit comments