Skip to content

Commit 3f20e0c

Browse files
committed
Merge remote-tracking branch 'upstream/alpha' into alpha
2 parents 6b96efe + 72e7707 commit 3f20e0c

File tree

2 files changed

+51
-5
lines changed

2 files changed

+51
-5
lines changed

spec/CloudCode.spec.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4452,6 +4452,21 @@ describe('Parse.File hooks', () => {
44524452
});
44534453
expect(response.headers['content-disposition']).toBe(`attachment;filename=${file._name}`);
44544454
});
4455+
4456+
it('beforeFind blocks metadata endpoint', async () => {
4457+
const file = new Parse.File('popeye.txt', [1, 2, 3], 'text/plain');
4458+
await file.save({ useMasterKey: true });
4459+
Parse.Cloud.beforeFind(Parse.File, () => {
4460+
throw 'unauthorized';
4461+
});
4462+
await expectAsync(
4463+
request({
4464+
url: `http://localhost:8378/1/files/test/metadata/${file._name}`,
4465+
}).catch(e => {
4466+
throw new Parse.Error(e.data.code, e.data.error);
4467+
})
4468+
).toBeRejectedWith(new Parse.Error(Parse.Error.SCRIPT_FAILED, 'unauthorized'));
4469+
});
44554470
});
44564471

44574472
describe('Cloud Config hooks', () => {

src/Routers/FilesRouter.js

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -717,14 +717,45 @@ export class FilesRouter {
717717
async metadataHandler(req, res) {
718718
try {
719719
const config = Config.get(req.params.appId);
720+
if (!config) {
721+
res.status(200);
722+
res.json({});
723+
return;
724+
}
720725
const { filesController } = config;
721-
const filename = FilesRouter._getFilenameFromParams(req);
722-
const data = await filesController.getMetadata(filename);
726+
let filename = FilesRouter._getFilenameFromParams(req);
727+
const file = new Parse.File(filename, { base64: '' });
728+
const triggerResult = await triggers.maybeRunFileTrigger(
729+
triggers.Types.beforeFind,
730+
{ file },
731+
config,
732+
req.auth
733+
);
734+
if (triggerResult?.file?._name) {
735+
filename = triggerResult.file._name;
736+
}
737+
const data = await filesController.getMetadata(filename).catch(() => {
738+
res.status(200);
739+
res.json({});
740+
});
741+
if (!data) {
742+
return;
743+
}
744+
await triggers.maybeRunFileTrigger(
745+
triggers.Types.afterFind,
746+
{ file },
747+
config,
748+
req.auth
749+
);
723750
res.status(200);
724751
res.json(data);
725-
} catch {
726-
res.status(200);
727-
res.json({});
752+
} catch (e) {
753+
const err = triggers.resolveError(e, {
754+
code: Parse.Error.SCRIPT_FAILED,
755+
message: 'Could not get file metadata.',
756+
});
757+
res.status(403);
758+
res.json({ code: err.code, error: err.message });
728759
}
729760
}
730761
}

0 commit comments

Comments
 (0)