fix: Default HTML pages for password reset, email verification not found (#10041)
This commit is contained in:
@@ -225,9 +225,7 @@ describe('Pages Router', () => {
|
|||||||
expect(Config.get(Parse.applicationId).pages.forceRedirect).toBe(
|
expect(Config.get(Parse.applicationId).pages.forceRedirect).toBe(
|
||||||
Definitions.PagesOptions.forceRedirect.default
|
Definitions.PagesOptions.forceRedirect.default
|
||||||
);
|
);
|
||||||
expect(Config.get(Parse.applicationId).pages.pagesPath).toBe(
|
expect(Config.get(Parse.applicationId).pages.pagesPath).toBeUndefined();
|
||||||
Definitions.PagesOptions.pagesPath.default
|
|
||||||
);
|
|
||||||
expect(Config.get(Parse.applicationId).pages.pagesEndpoint).toBe(
|
expect(Config.get(Parse.applicationId).pages.pagesEndpoint).toBe(
|
||||||
Definitions.PagesOptions.pagesEndpoint.default
|
Definitions.PagesOptions.pagesEndpoint.default
|
||||||
);
|
);
|
||||||
@@ -1236,6 +1234,36 @@ describe('Pages Router', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('pagesPath resolution', () => {
|
||||||
|
it('should serve pages when current working directory differs from module directory', async () => {
|
||||||
|
const originalCwd = process.cwd();
|
||||||
|
const os = require('os');
|
||||||
|
process.chdir(os.tmpdir());
|
||||||
|
|
||||||
|
try {
|
||||||
|
await reconfigureServer({
|
||||||
|
appId: 'test',
|
||||||
|
appName: 'exampleAppname',
|
||||||
|
publicServerURL: 'http://localhost:8378/1',
|
||||||
|
pages: { enableRouter: true },
|
||||||
|
});
|
||||||
|
|
||||||
|
// Request the password reset page with an invalid token;
|
||||||
|
// even with an invalid token, the server should serve the
|
||||||
|
// "invalid link" page (200), not a 404. A 404 indicates the
|
||||||
|
// HTML template files could not be found because pagesPath
|
||||||
|
// resolved to the wrong directory.
|
||||||
|
const response = await request({
|
||||||
|
url: 'http://localhost:8378/1/apps/test/request_password_reset?token=invalidToken',
|
||||||
|
}).catch(e => e);
|
||||||
|
expect(response.status).toBe(200);
|
||||||
|
expect(response.text).toContain('Invalid password reset link');
|
||||||
|
} finally {
|
||||||
|
process.chdir(originalCwd);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('XSS Protection', () => {
|
describe('XSS Protection', () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await reconfigureServer({
|
await reconfigureServer({
|
||||||
|
|||||||
@@ -326,9 +326,7 @@ export class Config {
|
|||||||
} else if (!isBoolean(pages.forceRedirect)) {
|
} else if (!isBoolean(pages.forceRedirect)) {
|
||||||
throw 'Parse Server option pages.forceRedirect must be a boolean.';
|
throw 'Parse Server option pages.forceRedirect must be a boolean.';
|
||||||
}
|
}
|
||||||
if (pages.pagesPath === undefined) {
|
if (pages.pagesPath !== undefined && !isString(pages.pagesPath)) {
|
||||||
pages.pagesPath = PagesOptions.pagesPath.default;
|
|
||||||
} else if (!isString(pages.pagesPath)) {
|
|
||||||
throw 'Parse Server option pages.pagesPath must be a string.';
|
throw 'Parse Server option pages.pagesPath must be a string.';
|
||||||
}
|
}
|
||||||
if (pages.pagesEndpoint === undefined) {
|
if (pages.pagesEndpoint === undefined) {
|
||||||
|
|||||||
@@ -772,8 +772,7 @@ module.exports.PagesOptions = {
|
|||||||
pagesPath: {
|
pagesPath: {
|
||||||
env: 'PARSE_SERVER_PAGES_PAGES_PATH',
|
env: 'PARSE_SERVER_PAGES_PAGES_PATH',
|
||||||
help:
|
help:
|
||||||
"The path to the pages directory; this also defines where the static endpoint '/apps' points to. Default is the './public/' directory.",
|
"The path to the pages directory; this also defines where the static endpoint '/apps' points to. Default is the './public/' directory of the parse-server module.",
|
||||||
default: './public',
|
|
||||||
},
|
},
|
||||||
placeholders: {
|
placeholders: {
|
||||||
env: 'PARSE_SERVER_PAGES_PLACEHOLDERS',
|
env: 'PARSE_SERVER_PAGES_PLACEHOLDERS',
|
||||||
|
|||||||
@@ -142,7 +142,7 @@
|
|||||||
* @property {String} localizationFallbackLocale The fallback locale for localization if no matching translation is provided for the given locale. This is only relevant when providing translation resources via JSON file.
|
* @property {String} localizationFallbackLocale The fallback locale for localization if no matching translation is provided for the given locale. This is only relevant when providing translation resources via JSON file.
|
||||||
* @property {String} localizationJsonPath The path to the JSON file for localization; the translations will be used to fill template placeholders according to the locale.
|
* @property {String} localizationJsonPath The path to the JSON file for localization; the translations will be used to fill template placeholders according to the locale.
|
||||||
* @property {String} pagesEndpoint The API endpoint for the pages. Default is 'apps'.
|
* @property {String} pagesEndpoint The API endpoint for the pages. Default is 'apps'.
|
||||||
* @property {String} pagesPath The path to the pages directory; this also defines where the static endpoint '/apps' points to. Default is the './public/' directory.
|
* @property {String} pagesPath The path to the pages directory; this also defines where the static endpoint '/apps' points to. Default is the './public/' directory of the parse-server module.
|
||||||
* @property {Object} placeholders The placeholder keys and values which will be filled in pages; this can be a simple object or a callback function.
|
* @property {Object} placeholders The placeholder keys and values which will be filled in pages; this can be a simple object or a callback function.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -437,8 +437,7 @@ export interface PagesOptions {
|
|||||||
/* Is true if responses should always be redirects and never content, false if the response type should depend on the request type (GET request -> content response; POST request -> redirect response).
|
/* Is true if responses should always be redirects and never content, false if the response type should depend on the request type (GET request -> content response; POST request -> redirect response).
|
||||||
:DEFAULT: false */
|
:DEFAULT: false */
|
||||||
forceRedirect: ?boolean;
|
forceRedirect: ?boolean;
|
||||||
/* The path to the pages directory; this also defines where the static endpoint '/apps' points to. Default is the './public/' directory.
|
/* The path to the pages directory; this also defines where the static endpoint '/apps' points to. Default is the './public/' directory of the parse-server module. */
|
||||||
:DEFAULT: ./public */
|
|
||||||
pagesPath: ?string;
|
pagesPath: ?string;
|
||||||
/* The API endpoint for the pages. Default is 'apps'.
|
/* The API endpoint for the pages. Default is 'apps'.
|
||||||
:DEFAULT: apps */
|
:DEFAULT: apps */
|
||||||
|
|||||||
Reference in New Issue
Block a user