fix: Parse Server option fileUpload.fileExtensions fails to determine file extension if filename contains multiple dots (#8754)

This commit is contained in:
Marc Derhammer
2023-09-23 16:43:34 -04:00
committed by GitHub
parent b70c2d9027
commit 3d6d50e0af
2 changed files with 69 additions and 1 deletions

View File

@@ -1364,6 +1364,74 @@ describe('Parse.File testing', () => {
); );
}); });
it('works with a period in the file name', async () => {
await reconfigureServer({
fileUpload: {
enableForPublic: true,
fileExtensions: ['^[^hH][^tT][^mM][^lL]?$'],
},
});
const headers = {
'X-Parse-Application-Id': 'test',
'X-Parse-REST-API-Key': 'rest',
};
const values = ['file.png.html', 'file.txt.png.html', 'file.png.txt.html'];
for (const value of values) {
await expectAsync(
request({
method: 'POST',
headers: headers,
url: `http://localhost:8378/1/files/${value}`,
body: '<html></html>\n',
}).catch(e => {
throw new Error(e.data.error);
})
).toBeRejectedWith(
new Parse.Error(Parse.Error.FILE_SAVE_ERROR, `File upload of extension html is disabled.`)
);
}
});
it('works to stop invalid filenames', async () => {
await reconfigureServer({
fileUpload: {
enableForPublic: true,
fileExtensions: ['^[^hH][^tT][^mM][^lL]?$'],
},
});
const headers = {
'X-Parse-Application-Id': 'test',
'X-Parse-REST-API-Key': 'rest',
};
const values = [
'!invalid.png',
'.png',
'.html',
' .html',
'.png.html',
'~invalid.png',
'-invalid.png',
];
for (const value of values) {
await expectAsync(
request({
method: 'POST',
headers: headers,
url: `http://localhost:8378/1/files/${value}`,
body: '<html></html>\n',
}).catch(e => {
throw new Error(e.data.error);
})
).toBeRejectedWith(
new Parse.Error(Parse.Error.INVALID_FILE_NAME, `Filename contains invalid characters.`)
);
}
});
it('works with array', async () => { it('works with array', async () => {
await reconfigureServer({ await reconfigureServer({
fileUpload: { fileUpload: {

View File

@@ -155,7 +155,7 @@ export class FilesRouter {
}; };
let extension = contentType; let extension = contentType;
if (filename && filename.includes('.')) { if (filename && filename.includes('.')) {
extension = filename.split('.')[1]; extension = filename.substring(filename.lastIndexOf('.') + 1);
} else if (contentType && contentType.includes('/')) { } else if (contentType && contentType.includes('/')) {
extension = contentType.split('/')[1]; extension = contentType.split('/')[1];
} }