@google/gemini-cli-core 0.59.0-nightly.20260902.g4963a4456 → 0.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/docs/reference/tools.md +4 -4
- package/dist/docs/tools/web-fetch.md +3 -7
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/generated/git-commit.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +0 -1
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/web-fetch.js +8 -12
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +11 -11
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/utils/fetch.d.ts +3 -61
- package/dist/src/utils/fetch.js +23 -223
- package/dist/src/utils/fetch.js.map +1 -1
- package/dist/src/utils/fetch.test.js +10 -42
- package/dist/src/utils/fetch.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/google-gemini-cli-core-0.59.0-nightly.20260825.g812f7a2bc.tgz +0 -0
- package/dist/src/utils/fetch.spec.d.ts +0 -6
- package/dist/src/utils/fetch.spec.js +0 -308
- package/dist/src/utils/fetch.spec.js.map +0 -1
package/package.json
CHANGED
|
Binary file
|
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2026 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
7
|
-
import * as http from 'node:http';
|
|
8
|
-
import * as net from 'node:net';
|
|
9
|
-
import ipaddr from 'ipaddr.js';
|
|
10
|
-
const { mockLookup } = vi.hoisted(() => ({
|
|
11
|
-
mockLookup: vi.fn(async (hostname) => {
|
|
12
|
-
if (hostname === 'test.localhost' || hostname === 'localhost') {
|
|
13
|
-
return [{ address: '127.0.0.1', family: 4 }];
|
|
14
|
-
}
|
|
15
|
-
if (hostname === 'dual-stack-test.example.com') {
|
|
16
|
-
return [
|
|
17
|
-
{ address: '93.184.216.34', family: 4 },
|
|
18
|
-
{ address: '10.0.0.1', family: 4 },
|
|
19
|
-
];
|
|
20
|
-
}
|
|
21
|
-
if (hostname === 'pinning-test.example.com') {
|
|
22
|
-
return [{ address: '93.184.216.34', family: 4 }];
|
|
23
|
-
}
|
|
24
|
-
if (hostname === 'failing-dns.example.com') {
|
|
25
|
-
throw new Error('getaddrinfo ENOTFOUND failing-dns.example.com');
|
|
26
|
-
}
|
|
27
|
-
if (hostname.endsWith('.nip.io')) {
|
|
28
|
-
const prefix = hostname.slice(0, -'.nip.io'.length);
|
|
29
|
-
if (ipaddr.isValid(prefix)) {
|
|
30
|
-
return [{ address: prefix, family: prefix.includes(':') ? 6 : 4 }];
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
if (ipaddr.isValid(hostname)) {
|
|
34
|
-
return [{ address: hostname, family: hostname.includes(':') ? 6 : 4 }];
|
|
35
|
-
}
|
|
36
|
-
return [{ address: '93.184.216.34', family: 4 }];
|
|
37
|
-
}),
|
|
38
|
-
}));
|
|
39
|
-
vi.mock('node:dns/promises', () => ({
|
|
40
|
-
lookup: mockLookup,
|
|
41
|
-
}));
|
|
42
|
-
const { fetchWithTimeout, isPrivateIp, validateUrlDestination, PrivateIpError, createSafeConnector, safeLookup, } = await import('./fetch.js');
|
|
43
|
-
describe('Destination IP Validation & Connection Pinning (fetch.spec.ts)', () => {
|
|
44
|
-
let server;
|
|
45
|
-
let serverPort;
|
|
46
|
-
let requestReceived;
|
|
47
|
-
beforeEach(async () => {
|
|
48
|
-
requestReceived = false;
|
|
49
|
-
server = http.createServer((_req, res) => {
|
|
50
|
-
requestReceived = true;
|
|
51
|
-
res.writeHead(200, { 'Content-Type': 'text/plain' });
|
|
52
|
-
res.end('CONFIDENTIAL_INTERNAL_DATA');
|
|
53
|
-
});
|
|
54
|
-
await new Promise((resolve) => {
|
|
55
|
-
server.listen(0, '127.0.0.1', () => {
|
|
56
|
-
const addr = server.address();
|
|
57
|
-
if (addr && typeof addr === 'object') {
|
|
58
|
-
serverPort = addr.port;
|
|
59
|
-
}
|
|
60
|
-
resolve();
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
afterEach(async () => {
|
|
65
|
-
await new Promise((resolve) => {
|
|
66
|
-
server.close(() => resolve());
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
describe('Cloud Metadata & Link-Local IP Protection', () => {
|
|
70
|
-
it('should block GCP Metadata (169.254.169.254) on default and custom ports', async () => {
|
|
71
|
-
const gcpMetadataUrls = [
|
|
72
|
-
'http://169.254.169.254/computeMetadata/v1/',
|
|
73
|
-
'http://169.254.169.254:8080/computeMetadata/v1/',
|
|
74
|
-
'http://169.254.169.254:443/computeMetadata/v1/',
|
|
75
|
-
'http://[::ffff:169.254.169.254]/computeMetadata/v1/',
|
|
76
|
-
'http://[::ffff:169.254.169.254]:8080/computeMetadata/v1/',
|
|
77
|
-
'http://169.254.1.1:9090/',
|
|
78
|
-
];
|
|
79
|
-
for (const url of gcpMetadataUrls) {
|
|
80
|
-
expect(await isPrivateIp(url)).toBe(true);
|
|
81
|
-
expect(await validateUrlDestination(url)).toBe(false);
|
|
82
|
-
await expect(fetchWithTimeout(url, 2000)).rejects.toThrow(PrivateIpError);
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
describe('Standard Private IP Blocks (RFC 1918 & Loopback)', () => {
|
|
87
|
-
it('should block 10.x.x.x private ranges with standard and custom ports', async () => {
|
|
88
|
-
const urls = [
|
|
89
|
-
'http://10.0.0.1/',
|
|
90
|
-
'http://10.0.0.1:8080/api',
|
|
91
|
-
'http://10.255.255.254:9000/',
|
|
92
|
-
'http://[::ffff:10.0.0.1]:8080/',
|
|
93
|
-
];
|
|
94
|
-
for (const url of urls) {
|
|
95
|
-
expect(await isPrivateIp(url)).toBe(true);
|
|
96
|
-
expect(await validateUrlDestination(url)).toBe(false);
|
|
97
|
-
await expect(fetchWithTimeout(url, 2000)).rejects.toThrow(PrivateIpError);
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
it('should block 172.16.x.x - 172.31.x.x private ranges with custom ports', async () => {
|
|
101
|
-
const urls = [
|
|
102
|
-
'http://172.16.0.1:3000/',
|
|
103
|
-
'http://172.20.10.1:8443/',
|
|
104
|
-
'http://172.31.255.255:9090/',
|
|
105
|
-
];
|
|
106
|
-
for (const url of urls) {
|
|
107
|
-
expect(await isPrivateIp(url)).toBe(true);
|
|
108
|
-
expect(await validateUrlDestination(url)).toBe(false);
|
|
109
|
-
await expect(fetchWithTimeout(url, 2000)).rejects.toThrow(PrivateIpError);
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
it('should block 192.168.x.x private ranges with standard and custom ports', async () => {
|
|
113
|
-
const urls = [
|
|
114
|
-
'http://192.168.0.1/',
|
|
115
|
-
'http://192.168.1.1:8080/',
|
|
116
|
-
'http://192.168.100.254:4000/admin',
|
|
117
|
-
'http://[::ffff:192.168.1.1]:8080/',
|
|
118
|
-
];
|
|
119
|
-
for (const url of urls) {
|
|
120
|
-
expect(await isPrivateIp(url)).toBe(true);
|
|
121
|
-
expect(await validateUrlDestination(url)).toBe(false);
|
|
122
|
-
await expect(fetchWithTimeout(url, 2000)).rejects.toThrow(PrivateIpError);
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
it('should block IPv6 loopback, link-local, and unique local addresses', async () => {
|
|
126
|
-
const urls = [
|
|
127
|
-
'http://[::1]:8080/',
|
|
128
|
-
'http://[fe80::1]:8080/',
|
|
129
|
-
'http://[fc00::1]:8080/',
|
|
130
|
-
'http://[fd00::1]:8080/',
|
|
131
|
-
];
|
|
132
|
-
for (const url of urls) {
|
|
133
|
-
expect(await isPrivateIp(url)).toBe(true);
|
|
134
|
-
expect(await validateUrlDestination(url)).toBe(false);
|
|
135
|
-
await expect(fetchWithTimeout(url, 2000)).rejects.toThrow(PrivateIpError);
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
describe('Internal TLDs & Domain Resolution', () => {
|
|
140
|
-
it('should identify internal TLDs (.internal, .local, .localhost) as private', async () => {
|
|
141
|
-
const internalUrls = [
|
|
142
|
-
'http://instance-data.internal',
|
|
143
|
-
'http://metadata.google.internal/computeMetadata/v1/',
|
|
144
|
-
'http://printer.local:631/',
|
|
145
|
-
'http://service.internal:8080/',
|
|
146
|
-
'http://myhost.localhost:3000/',
|
|
147
|
-
'http://localhost:8080/',
|
|
148
|
-
];
|
|
149
|
-
for (const url of internalUrls) {
|
|
150
|
-
expect(await isPrivateIp(url)).toBe(true);
|
|
151
|
-
expect(await validateUrlDestination(url)).toBe(false);
|
|
152
|
-
await expect(fetchWithTimeout(url, 2000)).rejects.toThrow(PrivateIpError);
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
it('should block fetching a domain that resolves to loopback IP (test.localhost)', async () => {
|
|
156
|
-
const targetUrl = `http://test.localhost:${serverPort}/secret`;
|
|
157
|
-
await expect(fetchWithTimeout(targetUrl, 5000)).rejects.toThrow(PrivateIpError);
|
|
158
|
-
// Verify the local loopback server was never contacted
|
|
159
|
-
expect(requestReceived).toBe(false);
|
|
160
|
-
});
|
|
161
|
-
it('should block Carrier-Grade NAT (100.64.0.0/10) and IANA benchmark range (198.18.0.0/15)', async () => {
|
|
162
|
-
const urls = [
|
|
163
|
-
'http://100.64.0.1:8080/',
|
|
164
|
-
'http://100.127.255.254/',
|
|
165
|
-
'http://198.18.0.1:8080/',
|
|
166
|
-
'http://198.19.255.254/',
|
|
167
|
-
];
|
|
168
|
-
for (const url of urls) {
|
|
169
|
-
expect(await isPrivateIp(url)).toBe(true);
|
|
170
|
-
expect(await validateUrlDestination(url)).toBe(false);
|
|
171
|
-
await expect(fetchWithTimeout(url, 2000)).rejects.toThrow(PrivateIpError);
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
it('should block wildcard DNS service (nip.io style) disguised domains pointing to private IPs', async () => {
|
|
175
|
-
const nipUrls = [
|
|
176
|
-
'http://127.0.0.1.nip.io:8080/admin',
|
|
177
|
-
'http://169.254.169.254.nip.io/computeMetadata/v1/',
|
|
178
|
-
'http://10.0.0.1.nip.io/',
|
|
179
|
-
'http://192.168.1.1.nip.io:3000/',
|
|
180
|
-
];
|
|
181
|
-
for (const url of nipUrls) {
|
|
182
|
-
expect(await isPrivateIp(url)).toBe(true);
|
|
183
|
-
expect(await validateUrlDestination(url)).toBe(false);
|
|
184
|
-
await expect(fetchWithTimeout(url, 2000)).rejects.toThrow(PrivateIpError);
|
|
185
|
-
}
|
|
186
|
-
// Allow public IP via nip.io
|
|
187
|
-
expect(await isPrivateIp('http://8.8.8.8.nip.io/')).toBe(false);
|
|
188
|
-
expect(await validateUrlDestination('http://8.8.8.8.nip.io/')).toBe(true);
|
|
189
|
-
});
|
|
190
|
-
it('should block domain if any of multiple resolved IPs is private (dual-stack validation)', async () => {
|
|
191
|
-
const testUrl = 'http://dual-stack-test.example.com/data';
|
|
192
|
-
expect(await isPrivateIp(testUrl)).toBe(true);
|
|
193
|
-
expect(await validateUrlDestination(testUrl)).toBe(false);
|
|
194
|
-
await expect(fetchWithTimeout(testUrl, 2000)).rejects.toThrow(PrivateIpError);
|
|
195
|
-
});
|
|
196
|
-
});
|
|
197
|
-
describe('Connection Pinning & Fail-Closed Safety', () => {
|
|
198
|
-
it('should forward connection options and preserve hostname/servername', async () => {
|
|
199
|
-
let passedOpts;
|
|
200
|
-
const mockDefaultConnector = (opts, callback) => {
|
|
201
|
-
passedOpts = opts;
|
|
202
|
-
callback(null, new net.Socket());
|
|
203
|
-
};
|
|
204
|
-
const connector = createSafeConnector(undefined, mockDefaultConnector);
|
|
205
|
-
await new Promise((resolve, reject) => {
|
|
206
|
-
connector({
|
|
207
|
-
hostname: 'pinning-test.example.com',
|
|
208
|
-
protocol: 'https:',
|
|
209
|
-
port: '443',
|
|
210
|
-
servername: 'pinning-test.example.com',
|
|
211
|
-
}, (...args) => {
|
|
212
|
-
const [err] = args;
|
|
213
|
-
if (err)
|
|
214
|
-
reject(err);
|
|
215
|
-
else
|
|
216
|
-
resolve();
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
expect(passedOpts?.hostname).toBe('pinning-test.example.com');
|
|
220
|
-
expect(passedOpts?.servername).toBe('pinning-test.example.com');
|
|
221
|
-
});
|
|
222
|
-
it('should block direct private IP literals and internal TLDs at connector level', async () => {
|
|
223
|
-
const mockDefaultConnector = (opts, callback) => {
|
|
224
|
-
callback(null, new net.Socket());
|
|
225
|
-
};
|
|
226
|
-
const connector = createSafeConnector(undefined, mockDefaultConnector);
|
|
227
|
-
await expect(new Promise((resolve, reject) => {
|
|
228
|
-
connector({ hostname: '127.0.0.1', protocol: 'http:', port: '80' }, (...args) => {
|
|
229
|
-
const [err] = args;
|
|
230
|
-
if (err)
|
|
231
|
-
reject(err);
|
|
232
|
-
else
|
|
233
|
-
resolve();
|
|
234
|
-
});
|
|
235
|
-
})).rejects.toThrow(PrivateIpError);
|
|
236
|
-
await expect(new Promise((resolve, reject) => {
|
|
237
|
-
connector({
|
|
238
|
-
hostname: 'metadata.google.internal',
|
|
239
|
-
protocol: 'http:',
|
|
240
|
-
port: '80',
|
|
241
|
-
}, (...args) => {
|
|
242
|
-
const [err] = args;
|
|
243
|
-
if (err)
|
|
244
|
-
reject(err);
|
|
245
|
-
else
|
|
246
|
-
resolve();
|
|
247
|
-
});
|
|
248
|
-
})).rejects.toThrow(PrivateIpError);
|
|
249
|
-
});
|
|
250
|
-
it('should configure safeLookup for dual-stack Happy Eyeballs resolution and validate IPs', async () => {
|
|
251
|
-
const addresses = await new Promise((resolve, reject) => {
|
|
252
|
-
safeLookup('pinning-test.example.com', { all: true }, (err, res) => {
|
|
253
|
-
if (err) {
|
|
254
|
-
reject(err);
|
|
255
|
-
}
|
|
256
|
-
else if (Array.isArray(res)) {
|
|
257
|
-
resolve(res);
|
|
258
|
-
}
|
|
259
|
-
else {
|
|
260
|
-
reject(new Error('Expected array of addresses'));
|
|
261
|
-
}
|
|
262
|
-
});
|
|
263
|
-
});
|
|
264
|
-
expect(addresses).toEqual([{ address: '93.184.216.34', family: 4 }]);
|
|
265
|
-
});
|
|
266
|
-
it('should block safeLookup when resolving to private IP or internal host', async () => {
|
|
267
|
-
await expect(new Promise((resolve, reject) => {
|
|
268
|
-
safeLookup('test.localhost', { all: true }, (err, res) => {
|
|
269
|
-
if (err)
|
|
270
|
-
reject(err);
|
|
271
|
-
else
|
|
272
|
-
resolve(res);
|
|
273
|
-
});
|
|
274
|
-
})).rejects.toThrow(PrivateIpError);
|
|
275
|
-
await expect(new Promise((resolve, reject) => {
|
|
276
|
-
safeLookup('169.254.169.254', { all: true }, (err, res) => {
|
|
277
|
-
if (err)
|
|
278
|
-
reject(err);
|
|
279
|
-
else
|
|
280
|
-
resolve(res);
|
|
281
|
-
});
|
|
282
|
-
})).rejects.toThrow(PrivateIpError);
|
|
283
|
-
});
|
|
284
|
-
it('should block safeLookup for dual-stack when any resolved IP is private', async () => {
|
|
285
|
-
await expect(new Promise((resolve, reject) => {
|
|
286
|
-
safeLookup('dual-stack-test.example.com', { all: true }, (err, res) => {
|
|
287
|
-
if (err)
|
|
288
|
-
reject(err);
|
|
289
|
-
else
|
|
290
|
-
resolve(res);
|
|
291
|
-
});
|
|
292
|
-
})).rejects.toThrow(PrivateIpError);
|
|
293
|
-
});
|
|
294
|
-
it('should fail closed when DNS resolution fails or times out', async () => {
|
|
295
|
-
const unresolvableUrl = 'http://failing-dns.example.com/path';
|
|
296
|
-
expect(await isPrivateIp(unresolvableUrl)).toBe(true);
|
|
297
|
-
expect(await validateUrlDestination(unresolvableUrl)).toBe(false);
|
|
298
|
-
await expect(fetchWithTimeout(unresolvableUrl, 2000)).rejects.toThrow();
|
|
299
|
-
});
|
|
300
|
-
it('should allow public domains and public IP addresses', async () => {
|
|
301
|
-
expect(await isPrivateIp('http://8.8.8.8/')).toBe(false);
|
|
302
|
-
expect(await validateUrlDestination('http://8.8.8.8/')).toBe(true);
|
|
303
|
-
expect(await isPrivateIp('http://93.184.216.34/')).toBe(false);
|
|
304
|
-
expect(await validateUrlDestination('http://93.184.216.34/')).toBe(true);
|
|
305
|
-
});
|
|
306
|
-
});
|
|
307
|
-
});
|
|
308
|
-
//# sourceMappingURL=fetch.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.spec.js","sourceRoot":"","sources":["../../../src/utils/fetch.spec.ts"],"names":[],"mappings":"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"}
|