Skip to content

Commit 3d6d50e

Browse files
fix: Parse Server option fileUpload.fileExtensions fails to determine file extension if filename contains multiple dots (#8754)
1 parent b70c2d9 commit 3d6d50e

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed

spec/ParseFile.spec.js

+68
Original file line numberDiff line numberDiff line change
@@ -1364,6 +1364,74 @@ describe('Parse.File testing', () => {
13641364
);
13651365
});
13661366

1367+
it('works with a period in the file name', async () => {
1368+
await reconfigureServer({
1369+
fileUpload: {
1370+
enableForPublic: true,
1371+
fileExtensions: ['^[^hH][^tT][^mM][^lL]?$'],
1372+
},
1373+
});
1374+
const headers = {
1375+
'X-Parse-Application-Id': 'test',
1376+
'X-Parse-REST-API-Key': 'rest',
1377+
};
1378+
1379+
const values = ['file.png.html', 'file.txt.png.html', 'file.png.txt.html'];
1380+
1381+
for (const value of values) {
1382+
await expectAsync(
1383+
request({
1384+
method: 'POST',
1385+
headers: headers,
1386+
url: `http://localhost:8378/1/files/${value}`,
1387+
body: '<html></html>\n',
1388+
}).catch(e => {
1389+
throw new Error(e.data.error);
1390+
})
1391+
).toBeRejectedWith(
1392+
new Parse.Error(Parse.Error.FILE_SAVE_ERROR, `File upload of extension html is disabled.`)
1393+
);
1394+
}
1395+
});
1396+
1397+
it('works to stop invalid filenames', async () => {
1398+
await reconfigureServer({
1399+
fileUpload: {
1400+
enableForPublic: true,
1401+
fileExtensions: ['^[^hH][^tT][^mM][^lL]?$'],
1402+
},
1403+
});
1404+
const headers = {
1405+
'X-Parse-Application-Id': 'test',
1406+
'X-Parse-REST-API-Key': 'rest',
1407+
};
1408+
1409+
const values = [
1410+
'!invalid.png',
1411+
'.png',
1412+
'.html',
1413+
' .html',
1414+
'.png.html',
1415+
'~invalid.png',
1416+
'-invalid.png',
1417+
];
1418+
1419+
for (const value of values) {
1420+
await expectAsync(
1421+
request({
1422+
method: 'POST',
1423+
headers: headers,
1424+
url: `http://localhost:8378/1/files/${value}`,
1425+
body: '<html></html>\n',
1426+
}).catch(e => {
1427+
throw new Error(e.data.error);
1428+
})
1429+
).toBeRejectedWith(
1430+
new Parse.Error(Parse.Error.INVALID_FILE_NAME, `Filename contains invalid characters.`)
1431+
);
1432+
}
1433+
});
1434+
13671435
it('works with array', async () => {
13681436
await reconfigureServer({
13691437
fileUpload: {

src/Routers/FilesRouter.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ export class FilesRouter {
155155
};
156156
let extension = contentType;
157157
if (filename && filename.includes('.')) {
158-
extension = filename.split('.')[1];
158+
extension = filename.substring(filename.lastIndexOf('.') + 1);
159159
} else if (contentType && contentType.includes('/')) {
160160
extension = contentType.split('/')[1];
161161
}

0 commit comments

Comments
 (0)