Skip to content

Commit dcb41e3

Browse files
Miguel Jimenez Esunfacebook-github-bot
authored andcommitted
Perform security fixes
Reviewed By: jeanlauliac Differential Revision: D14241523 fbshipit-source-id: 87c2f75861ade08e0a37cc6bc01b22ba08b008ef
1 parent 08f41b7 commit dcb41e3

File tree

6 files changed

+50
-14
lines changed

6 files changed

+50
-14
lines changed

packages/metro-config/src/__tests__/__snapshots__/loadConfig-test.js.snap

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ Object {
3333
"mp3",
3434
"wav",
3535
"html",
36+
"json",
3637
"pdf",
38+
"yaml",
39+
"yml",
3740
"otf",
3841
"ttf",
3942
"zip",
@@ -161,7 +164,10 @@ Object {
161164
"mp3",
162165
"wav",
163166
"html",
167+
"json",
164168
"pdf",
169+
"yaml",
170+
"yml",
165171
"otf",
166172
"ttf",
167173
"zip",

packages/metro-config/src/defaults/defaults.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ exports.assetExts = [
3737
'wav',
3838
// Document formats
3939
'html',
40+
'json',
4041
'pdf',
42+
'yaml',
43+
'yml',
4144
// Font formats
4245
'otf',
4346
'ttf',

packages/metro/src/Assets.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ async function getAsset(
265265
projectRoot: string,
266266
watchFolders: $ReadOnlyArray<string>,
267267
platform: ?string = null,
268+
assetExts: $ReadOnlyArray<string>,
268269
): Promise<Buffer> {
269270
const assetData = AssetPaths.parse(
270271
relativePath,
@@ -273,6 +274,12 @@ async function getAsset(
273274

274275
const absolutePath = path.resolve(projectRoot, relativePath);
275276

277+
if (!assetExts.includes(assetData.type)) {
278+
throw new Error(
279+
`'${relativePath}' cannot be loaded as its extension is not registered in assetExts`,
280+
);
281+
}
282+
276283
if (!pathBelongsToRoots(absolutePath, [projectRoot, ...watchFolders])) {
277284
throw new Error(
278285
`'${relativePath}' could not be found, because it cannot be found in the project root or any watch folder`,

packages/metro/src/Server.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,7 @@ class Server {
364364
this._config.watchFolders,
365365
/* $FlowFixMe: query may be empty for invalid URLs */
366366
urlObj.query.platform,
367+
this._config.resolver.assetExts,
367368
);
368369
// Tell clients to cache this for 1 year.
369370
// This is safe as the asset url contains a hash of the asset.

packages/metro/src/Server/__tests__/Server-test.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,7 @@ describe('processRequest', () => {
630630
'/root',
631631
['/root'],
632632
'ios',
633+
expect.any(Array),
633634
);
634635
expect(value).toBe('i am image');
635636
done();
@@ -653,6 +654,7 @@ describe('processRequest', () => {
653654
'/root',
654655
['/root'],
655656
'ios',
657+
expect.any(Array),
656658
);
657659
expect(value).toBe(mockData.slice(0, 4));
658660
done();
@@ -674,6 +676,7 @@ describe('processRequest', () => {
674676
'/root',
675677
['/root'],
676678
undefined,
679+
expect.any(Array),
677680
);
678681
expect(value).toBe('i am image');
679682
done();

packages/metro/src/__tests__/Assets-test.js

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,20 @@ describe('getAsset', () => {
3333
mkdirp.sync('/root/imgs');
3434
});
3535

36+
it('should fail if the extension is not registerd', async () => {
37+
writeImages({'b.png': 'b image', 'b@2x.png': 'b2 image'});
38+
39+
expect(getAssetStr('imgs/b.png', '/root', [], ['jpg'])).rejects.toThrow(
40+
Error,
41+
);
42+
});
43+
3644
it('should work for the simple case', () => {
3745
writeImages({'b.png': 'b image', 'b@2x.png': 'b2 image'});
3846

3947
return Promise.all([
40-
getAssetStr('imgs/b.png', '/root', []),
41-
getAssetStr('imgs/b@1x.png', '/root', []),
48+
getAssetStr('imgs/b.png', '/root', [], null, ['png']),
49+
getAssetStr('imgs/b@1x.png', '/root', [], null, ['png']),
4250
]).then(resp => resp.forEach(data => expect(data).toBe('b image')));
4351
});
4452

@@ -52,11 +60,11 @@ describe('getAsset', () => {
5260

5361
expect(
5462
await Promise.all([
55-
getAssetStr('imgs/b.png', '/root', [], 'ios'),
56-
getAssetStr('imgs/b.png', '/root', [], 'android'),
57-
getAssetStr('imgs/c.png', '/root', [], 'android'),
58-
getAssetStr('imgs/c.png', '/root', [], 'ios'),
59-
getAssetStr('imgs/c.png', '/root', []),
63+
getAssetStr('imgs/b.png', '/root', [], 'ios', ['png']),
64+
getAssetStr('imgs/b.png', '/root', [], 'android', ['png']),
65+
getAssetStr('imgs/c.png', '/root', [], 'android', ['png']),
66+
getAssetStr('imgs/c.png', '/root', [], 'ios', ['png']),
67+
getAssetStr('imgs/c.png', '/root', [], null, ['png']),
6068
]),
6169
).toEqual([
6270
'b ios image',
@@ -74,8 +82,8 @@ describe('getAsset', () => {
7482
});
7583

7684
return Promise.all([
77-
getAssetStr('imgs/b.jpg', '/root', []),
78-
getAssetStr('imgs/b.png', '/root', []),
85+
getAssetStr('imgs/b.jpg', '/root', [], null, ['jpg']),
86+
getAssetStr('imgs/b.png', '/root', [], null, ['png']),
7987
]).then(data => expect(data).toEqual(['jpeg image', 'png image']));
8088
});
8189

@@ -87,7 +95,9 @@ describe('getAsset', () => {
8795
'b@4.5x.png': 'b4.5 image',
8896
});
8997

90-
expect(await getAssetStr('imgs/b@3x.png', '/root', [])).toBe('b4 image');
98+
expect(await getAssetStr('imgs/b@3x.png', '/root', [], null, ['png'])).toBe(
99+
'b4 image',
100+
);
91101
});
92102

93103
it('should pick the bigger one with platform ext', async () => {
@@ -104,8 +114,8 @@ describe('getAsset', () => {
104114

105115
expect(
106116
await Promise.all([
107-
getAssetStr('imgs/b@3x.png', '/root', []),
108-
getAssetStr('imgs/b@3x.png', '/root', [], 'ios'),
117+
getAssetStr('imgs/b@3x.png', '/root', [], null, ['png']),
118+
getAssetStr('imgs/b@3x.png', '/root', [], 'ios', ['png']),
109119
]),
110120
).toEqual(['b4 image', 'b4 ios image']);
111121
});
@@ -118,7 +128,13 @@ describe('getAsset', () => {
118128
});
119129

120130
expect(
121-
await getAssetStr('../anotherfolder/b.png', '/root', ['/anotherfolder']),
131+
await getAssetStr(
132+
'../anotherfolder/b.png',
133+
'/root',
134+
['/anotherfolder'],
135+
null,
136+
['png'],
137+
),
122138
).toBe('b image');
123139
});
124140

@@ -130,7 +146,7 @@ describe('getAsset', () => {
130146
});
131147

132148
await expect(
133-
getAssetStr('../anotherfolder/b.png', '/root', []),
149+
getAssetStr('../anotherfolder/b.png', '/root', [], null, ['png']),
134150
).rejects.toBeInstanceOf(Error);
135151
});
136152
});

0 commit comments

Comments
 (0)