fix: Default HTML pages for password reset, email verification not found (#10041)

This commit is contained in:
Manuel
2026-02-06 16:30:13 +00:00
committed by GitHub
parent c1f1800cad
commit a4265bb124
5 changed files with 35 additions and 11 deletions

View File

@@ -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({

View File

@@ -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) {

View File

@@ -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',

View File

@@ -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.
*/ */

View File

@@ -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 */