fix: Parse Server option fileUpload.fileExtensions fails to determine file extension if filename contains multiple dots (#8754)
This commit is contained in:
@@ -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: {
|
||||||
|
|||||||
@@ -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];
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user