Skip to content

Commit 4ff8b64

Browse files
committed
fix(core): validate basePath for raw Node.js requests
1 parent dd278ff commit 4ff8b64

4 files changed

Lines changed: 13 additions & 21 deletions

File tree

examples/node-http-server.js

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
const { createServer } = require('http');
2-
const { DiskStorage, Uploadx, cors } = require('@uploadx/core');
2+
const { DiskStorage, Uploadx } = require('@uploadx/core');
33

44
const PORT = process.env.PORT || 3002;
55

6-
const corsHandler = cors();
7-
86
const storage = new DiskStorage({
97
uploadDir: process.env.UPLOAD_DIR || 'upload',
108
basePath: '/files',
@@ -22,16 +20,7 @@ uploadx.on('completed', file => console.log('completed: ', file));
2220
uploadx.on('updated', file => console.log(' metadata updated: ', file));
2321

2422
const server = createServer((req, res) => {
25-
const { pathname } = new URL(req.url || '', 'http://localhost');
26-
if (pathname === '/files') {
27-
uploadx.upload(req, res, () => {
28-
uploadx.send(res, { body: req.body, statusCode: 200 });
29-
});
30-
} else {
31-
corsHandler(req, res, () => {
32-
uploadx.send(res, { body: 'Not Found', statusCode: 404 });
33-
});
34-
}
23+
uploadx.handle(req, res);
3524
});
3625

3726
server.listen(+PORT, () => console.log('listening on port:', PORT));

examples/server.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@ const { cors, DiskStorage, Multipart, Tus, Uploadx, fromEnv } = require('@upload
33
const { createServer } = require('http');
44

55
const PORT = process.env.PORT || 3002;
6-
const path = '/files';
7-
const pathRegexp = new RegExp(`^${path}([/?]|$)`);
86

97
const config = {
10-
basePath: path,
8+
basePath: '/files',
119
uploadDir: './upload',
1210
allowedMimeTypes: ['video/*', 'image/*'],
1311
maxFileSize: '2GB',
@@ -31,7 +29,7 @@ createServer((req, res) => {
3129
timestamp: Date.now()
3230
};
3331
corsHandler(req, res, () => uploadx.send(res, { body: healthcheck }));
34-
} else if (pathname && pathRegexp.test(pathname)) {
32+
} else {
3533
switch (searchParams.get('uploadType')) {
3634
case 'multipart':
3735
multipart.handle(req, res);
@@ -43,7 +41,5 @@ createServer((req, res) => {
4341
uploadx.handle(req, res);
4442
break;
4543
}
46-
} else {
47-
corsHandler(req, res, () => uploadx.send(res, { body: 'Not Found', statusCode: 404 }));
4844
}
4945
}).listen(PORT);

packages/core/src/handlers/base-handler.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,13 @@ export abstract class BaseHandler<TFile extends UploadxFile>
112112
res.writeHead(204, { 'Content-Length': 0 }).end();
113113
return;
114114
}
115+
if (!req.originalUrl) {
116+
const { pathname } = new URL(req.url || '', 'http://localhost');
117+
const basePath = this.storage.basePath;
118+
const match =
119+
basePath === '/' || pathname === basePath || pathname.startsWith(`${basePath}/`);
120+
if (!match) return this.sendError(res, new UploadxError(ERRORS.FILE_NOT_FOUND));
121+
}
115122
req.on('error', err => this.logger.error('Request error', { err }));
116123
this.logger.debug('Request {method} {url}', { method: req.method, url: req.url });
117124
const handler = this.registeredHandlers.get(req.method as string);

test/base-handler.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ describe('BaseHandler', () => {
1818
it('should check if storage not ready', () => {
1919
uploader.storage.isReady = false;
2020
const res = createResponse();
21-
uploader.handle(createRequest({ method: 'OPTIONS' }), res);
21+
uploader.handle(createRequest({ method: 'OPTIONS', url: '/files' }), res);
2222
expect(res.statusCode).toBe(503);
2323
});
2424

2525
it('should check http method', () => {
2626
const res = createResponse();
27-
uploader.handle(createRequest({ method: 'PATCH' }), res);
27+
uploader.handle(createRequest({ method: 'PATCH', url: '/files' }), res);
2828
expect(res.statusCode).toBe(405);
2929
});
3030

0 commit comments

Comments
 (0)