diff --git a/server/index.js b/server/index.js index 44f807fbfe92d23a6e0f010816769bfee0e47c3e..a342cf19379494a39842a6b4a0a2557a17bd9478 100644 --- a/server/index.js +++ b/server/index.js @@ -8,7 +8,6 @@ import { renderErrorToHTML, sendHTML, serveStatic, - renderScript, renderScriptError } from './render' import Router from './router' @@ -201,9 +200,9 @@ export default class Server { '/_next/:buildId/page/:path*': async (req, res, params) => { const paths = params.path || [''] - // We need to remove `.js` from the page otherwise it won't work with - // page rewrites - // eg:- we re-write page/index.js into page.js + // URL is asks for ${page}.js (to support loading assets from static dirs) + // But there's no .js in the actual page. + // So, we need to remove .js to get the page name. const page = `/${paths.join('/')}`.replace('.js', '') if (!this.handleBuildId(params.buildId, res)) { @@ -227,7 +226,8 @@ export default class Server { } } - await renderScript(req, res, page, this.renderOpts) + const p = join(this.dir, this.dist, 'bundles', 'pages', paths.join('/')) + await this.serveStatic(req, res, p) }, // It's very important keep this route's param optional. diff --git a/test/integration/ondemand/test/index.test.js b/test/integration/ondemand/test/index.test.js index 8c051424e235085d4988fb87fd1b555597b2c786..9503b8083ff4bd4bac429403dd7d4952285ea993 100644 --- a/test/integration/ondemand/test/index.test.js +++ b/test/integration/ondemand/test/index.test.js @@ -30,7 +30,7 @@ describe('On Demand Entries', () => { }) it('should compile pages for JSON page requests', async () => { - const pageContent = await renderViaHTTP(context.appPort, '/_next/-/page/about') + const pageContent = await renderViaHTTP(context.appPort, '/_next/-/page/about.js') expect(pageContent.includes('About Page')).toBeTruthy() }) @@ -39,11 +39,11 @@ describe('On Demand Entries', () => { expect(existsSync(indexPagePath)).toBeTruthy() // Render two pages after the index, since the server keeps at least two pages - await renderViaHTTP(context.appPort, '/_next/-/page/about') + await renderViaHTTP(context.appPort, '/about') await renderViaHTTP(context.appPort, '/_next/on-demand-entries-ping', {page: '/about'}) const aboutPagePath = resolve(__dirname, '../.next/bundles/pages/about.js') - await renderViaHTTP(context.appPort, '/_next/-/page/third') + await renderViaHTTP(context.appPort, '/third') await renderViaHTTP(context.appPort, '/_next/on-demand-entries-ping', {page: '/third'}) const thirdPagePath = resolve(__dirname, '../.next/bundles/pages/third.js') diff --git a/test/integration/production/info.json b/test/integration/production/info.json new file mode 100644 index 0000000000000000000000000000000000000000..dbfa930f6f37929fc5ae57e922c13475376a1f49 --- /dev/null +++ b/test/integration/production/info.json @@ -0,0 +1,3 @@ +{ + "version": "cool-version" +} diff --git a/test/integration/production/test/index.test.js b/test/integration/production/test/index.test.js index 5128f7071452d5746f120f68f0007123943851fb..d6fd6eb21e5c986b461bbb236a1393386268fa09 100644 --- a/test/integration/production/test/index.test.js +++ b/test/integration/production/test/index.test.js @@ -13,6 +13,7 @@ import { import webdriver from 'next-webdriver' import fetch from 'node-fetch' import dynamicImportTests from '../../basic/test/dynamic' +import { readFileSync } from 'fs' const appDir = join(__dirname, '../') let appPort @@ -110,6 +111,21 @@ describe('Production Usage', () => { const data = await renderViaHTTP(appPort, '/static/data/item.txt') expect(data).toBe('item') }) + + it('should only access files inside .next directory', async () => { + const buildId = readFileSync(join(__dirname, '../.next/BUILD_ID'), 'utf8') + + const pathsToCheck = [ + `/_next/${buildId}/page/../../../info`, + `/_next/${buildId}/page/../../../info.js`, + `/_next/${buildId}/page/../../../info.json` + ] + + for (const path of pathsToCheck) { + const data = await renderViaHTTP(appPort, path) + expect(data.includes('cool-version')).toBeFalsy() + } + }) }) describe('X-Powered-By header', () => { diff --git a/yarn.lock b/yarn.lock index b124f16558fed3a0fd062e23abeb776b7a80674b..b9aa4c9ac8beded3ab2d8bbaf55219f8b52353df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1090,14 +1090,14 @@ babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.25.0, babel-tr invariant "^2.2.2" lodash "^4.17.4" -babel-types@6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf" +babel-types@6.26.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: - babel-runtime "^6.22.0" + babel-runtime "^6.26.0" esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" + lodash "^4.17.4" + to-fast-properties "^1.0.3" babel-types@7.0.0-beta.0: version "7.0.0-beta.0" @@ -1107,15 +1107,6 @@ babel-types@7.0.0-beta.0: lodash "^4.2.0" to-fast-properties "^2.0.0" -babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - babylon@7.0.0-beta.22: version "7.0.0-beta.22" resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.22.tgz#74f0ad82ed7c7c3cfeab74cf684f815104161b65" @@ -1693,9 +1684,9 @@ conventional-commits-parser@^2.0.0: through2 "^2.0.0" trim-off-newlines "^1.0.0" -convert-source-map@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" +convert-source-map@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" convert-source-map@^1.3.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0: version "1.5.0" @@ -5829,6 +5820,10 @@ source-map@0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" +source-map@0.6.1, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + source-map@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" @@ -5839,10 +5834,6 @@ source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3, sour version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" -source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - sourcemapped-stacktrace@^1.1.6: version "1.1.7" resolved "https://registry.yarnpkg.com/sourcemapped-stacktrace/-/sourcemapped-stacktrace-1.1.7.tgz#17e05374ff78b71a9d89ad3975a49f22725ba935" @@ -5977,9 +5968,9 @@ stream-to-observable@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.1.0.tgz#45bf1d9f2d7dc09bed81f1c307c430e68b84cffe" -string-hash@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.1.tgz#8e85bed291e0763b8f6809d9c3368fea048db3dc" +string-hash@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" string-length@^1.0.1: version "1.0.1" @@ -6031,18 +6022,18 @@ stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" -strip-ansi@4.0.0, strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: +strip-ansi@3.0.1, strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + strip-bom@3.0.0, strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -6071,25 +6062,25 @@ strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" -styled-jsx@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-2.1.1.tgz#e7481c7554df50d605cdc84a4e53c58fec3449b5" +styled-jsx@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-2.2.1.tgz#8b38b9e53e5d9767e392595ab1afdc8426b3ba5d" dependencies: babel-plugin-syntax-jsx "6.18.0" - babel-types "6.23.0" - convert-source-map "1.3.0" - source-map "0.5.6" - string-hash "1.1.1" - stylis "3.3.2" - stylis-rule-sheet "0.0.6" - -stylis-rule-sheet@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.6.tgz#059f89125a8e8db546e8adb0e07c4b4bcb81911b" + babel-types "6.26.0" + convert-source-map "1.5.1" + source-map "0.6.1" + string-hash "1.1.3" + stylis "3.4.5" + stylis-rule-sheet "0.0.7" + +stylis-rule-sheet@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.7.tgz#5c51dc879141a61821c2094ba91d2cbcf2469c6c" -stylis@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.3.2.tgz#95ef285836e98243f8b8f64a9a72706ea6c893ea" +stylis@3.4.5: + version "3.4.5" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.4.5.tgz#d7b9595fc18e7b9c8775eca8270a9a1d3e59806e" supports-color@^2.0.0: version "2.0.0" @@ -6245,7 +6236,7 @@ to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" -to-fast-properties@^1.0.1, to-fast-properties@^1.0.3: +to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"