@cosmocoder/mcp-web-docs 2.0.8 → 2.0.9
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/build/crawler/auth.js +117 -7
- package/build/crawler/auth.js.map +1 -1
- package/build/crawler/auth.test.js +333 -83
- package/build/crawler/auth.test.js.map +1 -1
- package/build/crawler/browser-config.d.ts +1 -1
- package/build/crawler/browser-config.js +7 -1
- package/build/crawler/browser-config.js.map +1 -1
- package/build/crawler/browser-config.test.js +21 -25
- package/build/crawler/browser-config.test.js.map +1 -1
- package/build/crawler/crawlee-crawler.d.ts +3 -0
- package/build/crawler/crawlee-crawler.js +155 -12
- package/build/crawler/crawlee-crawler.js.map +1 -1
- package/build/crawler/crawlee-crawler.test.js +190 -143
- package/build/crawler/crawlee-crawler.test.js.map +1 -1
- package/build/crawler/github.js +3 -2
- package/build/crawler/github.js.map +1 -1
- package/build/crawler/llms-txt.js +2 -1
- package/build/crawler/llms-txt.js.map +1 -1
- package/build/index.js +13 -8
- package/build/index.js.map +1 -1
- package/build/setupTests.js +44 -0
- package/build/setupTests.js.map +1 -1
- package/build/util/favicon.js +2 -1
- package/build/util/favicon.js.map +1 -1
- package/build/util/favicon.test.js +27 -37
- package/build/util/favicon.test.js.map +1 -1
- package/build/util/outbound-request.d.ts +33 -0
- package/build/util/outbound-request.integration.test.d.ts +1 -0
- package/build/util/outbound-request.integration.test.js +149 -0
- package/build/util/outbound-request.integration.test.js.map +1 -0
- package/build/util/outbound-request.js +367 -0
- package/build/util/outbound-request.js.map +1 -0
- package/build/util/outbound-request.test.d.ts +1 -0
- package/build/util/outbound-request.test.js +224 -0
- package/build/util/outbound-request.test.js.map +1 -0
- package/build/util/security.js +1 -1
- package/build/util/security.js.map +1 -1
- package/build/util/security.test.js +1 -0
- package/build/util/security.test.js.map +1 -1
- package/package.json +8 -6
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { lookup } from 'node:dns/promises';
|
|
2
2
|
import { encryptData } from '../util/security.js';
|
|
3
|
+
import { detectDefaultBrowser, AuthManager } from './auth.js';
|
|
3
4
|
const { mockDefaultBrowser, mockMkdir, mockReadFile, mockWriteFile, mockAccess, mockChmod, mockUnlink, mockChromiumLaunch } = vi.hoisted(() => ({
|
|
4
5
|
mockDefaultBrowser: vi.fn(),
|
|
5
6
|
mockMkdir: vi.fn(),
|
|
@@ -32,42 +33,64 @@ vi.mock('playwright', () => ({
|
|
|
32
33
|
launch: vi.fn(),
|
|
33
34
|
},
|
|
34
35
|
}));
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
function deferred() {
|
|
37
|
+
let resolve;
|
|
38
|
+
let reject;
|
|
39
|
+
const promise = new Promise((resolvePromise, rejectPromise) => {
|
|
40
|
+
resolve = resolvePromise;
|
|
41
|
+
reject = rejectPromise;
|
|
42
|
+
});
|
|
43
|
+
return { promise, resolve, reject };
|
|
44
|
+
}
|
|
45
|
+
function mockStoredSession(cookies, domain = 'example.com') {
|
|
46
|
+
mockReadFile.mockResolvedValue(JSON.stringify({
|
|
42
47
|
domain,
|
|
43
|
-
storageState:
|
|
48
|
+
storageState: encryptData(JSON.stringify({ cookies })),
|
|
44
49
|
createdAt: new Date().toISOString(),
|
|
45
50
|
browser: 'chromium',
|
|
46
51
|
version: 2,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Mock the file system to return a stored session
|
|
51
|
-
*/
|
|
52
|
-
function mockStoredSession(cookies, domain = 'example.com') {
|
|
53
|
-
const storedSession = createStoredSession(cookies, domain);
|
|
54
|
-
mockReadFile.mockResolvedValue(JSON.stringify(storedSession));
|
|
52
|
+
}));
|
|
55
53
|
}
|
|
56
|
-
/**
|
|
57
|
-
* Create browser mocks for session validation tests
|
|
58
|
-
*/
|
|
59
54
|
function setupBrowserMock(options = {}) {
|
|
60
|
-
const { status = 200, url = 'https://example.com', content = '<html><body>Welcome!</body></html>', bodyText = 'Welcome to the site', } = options;
|
|
55
|
+
const { status = 200, blocked = false, url = 'https://example.com', content = '<html><body>Welcome!</body></html>', bodyText = 'Welcome to the site', } = options;
|
|
56
|
+
const mainFrame = {};
|
|
57
|
+
const responseListeners = new Set();
|
|
58
|
+
const requestFailedListeners = new Set();
|
|
61
59
|
const mockPage = {
|
|
62
|
-
goto: vi.fn().mockResolvedValue({
|
|
60
|
+
goto: vi.fn().mockResolvedValue({
|
|
61
|
+
status: () => status,
|
|
62
|
+
headerValue: vi.fn().mockImplementation(async (name) => (blocked && name === 'x-mcp-web-docs-blocked' ? '1' : null)),
|
|
63
|
+
}),
|
|
63
64
|
url: vi.fn().mockReturnValue(url),
|
|
64
65
|
waitForLoadState: vi.fn().mockResolvedValue(undefined),
|
|
65
66
|
waitForTimeout: vi.fn().mockResolvedValue(undefined),
|
|
67
|
+
waitForURL: vi.fn().mockResolvedValue(undefined),
|
|
66
68
|
content: vi.fn().mockResolvedValue(content),
|
|
67
69
|
evaluate: vi.fn().mockResolvedValue(bodyText),
|
|
70
|
+
close: vi.fn().mockResolvedValue(undefined),
|
|
71
|
+
mainFrame: vi.fn().mockReturnValue(mainFrame),
|
|
72
|
+
on: vi.fn((event, listener) => {
|
|
73
|
+
if (event === 'response') {
|
|
74
|
+
responseListeners.add(listener);
|
|
75
|
+
}
|
|
76
|
+
else if (event === 'requestfailed') {
|
|
77
|
+
requestFailedListeners.add(listener);
|
|
78
|
+
}
|
|
79
|
+
}),
|
|
80
|
+
off: vi.fn((event, listener) => {
|
|
81
|
+
if (event === 'response') {
|
|
82
|
+
responseListeners.delete(listener);
|
|
83
|
+
}
|
|
84
|
+
else if (event === 'requestfailed') {
|
|
85
|
+
requestFailedListeners.delete(listener);
|
|
86
|
+
}
|
|
87
|
+
}),
|
|
68
88
|
};
|
|
69
89
|
const mockContext = {
|
|
70
90
|
newPage: vi.fn().mockResolvedValue(mockPage),
|
|
91
|
+
route: vi.fn().mockResolvedValue(undefined),
|
|
92
|
+
routeWebSocket: vi.fn().mockResolvedValue(undefined),
|
|
93
|
+
storageState: vi.fn().mockResolvedValue({ cookies: [], origins: [] }),
|
|
71
94
|
close: vi.fn().mockResolvedValue(undefined),
|
|
72
95
|
};
|
|
73
96
|
const mockBrowser = {
|
|
@@ -75,11 +98,49 @@ function setupBrowserMock(options = {}) {
|
|
|
75
98
|
close: vi.fn().mockResolvedValue(undefined),
|
|
76
99
|
};
|
|
77
100
|
mockChromiumLaunch.mockResolvedValue(mockBrowser);
|
|
78
|
-
return {
|
|
101
|
+
return {
|
|
102
|
+
mockPage,
|
|
103
|
+
mockContext,
|
|
104
|
+
mockBrowser,
|
|
105
|
+
emitResponse: (response) => responseListeners.forEach((listener) => listener(response)),
|
|
106
|
+
emitRequestFailed: (request) => requestFailedListeners.forEach((listener) => listener(request)),
|
|
107
|
+
navigationResponse: ({ headerValue = '1', navigation = true } = {}) => ({
|
|
108
|
+
status: () => 403,
|
|
109
|
+
headerValue: vi.fn().mockReturnValue(headerValue),
|
|
110
|
+
request: () => ({ isNavigationRequest: () => navigation, frame: () => mainFrame }),
|
|
111
|
+
}),
|
|
112
|
+
failedNavigation: ({ errorText = 'net::ERR_TUNNEL_CONNECTION_FAILED', navigation = true, url = 'https://8.8.8.8/login', } = {}) => ({
|
|
113
|
+
isNavigationRequest: () => navigation,
|
|
114
|
+
frame: () => mainFrame,
|
|
115
|
+
failure: () => ({ errorText }),
|
|
116
|
+
url: () => url,
|
|
117
|
+
}),
|
|
118
|
+
expectPinnedProxy: (expected = {}, exact = false) => {
|
|
119
|
+
const contextOptions = {
|
|
120
|
+
...expected,
|
|
121
|
+
proxy: {
|
|
122
|
+
server: expect.stringMatching(/^http:\/\/127\.0\.0\.1:\d+$/),
|
|
123
|
+
bypass: '<-loopback>',
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
expect(mockBrowser.newContext).toHaveBeenCalledWith(exact ? contextOptions : expect.objectContaining(contextOptions));
|
|
127
|
+
expect(mockBrowser.newContext.mock.calls[0][0]).not.toHaveProperty('serviceWorkers');
|
|
128
|
+
expect(mockContext.route).not.toHaveBeenCalled();
|
|
129
|
+
expect(mockContext.routeWebSocket).not.toHaveBeenCalled();
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function performLogin(authManager) {
|
|
134
|
+
return authManager.performInteractiveLogin('https://example.com', {
|
|
135
|
+
browser: 'chromium',
|
|
136
|
+
loginSuccessPattern: 'example',
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
function trackSettlement(promise) {
|
|
140
|
+
let settled = false;
|
|
141
|
+
void promise.then(() => (settled = true), () => (settled = true));
|
|
142
|
+
return () => settled;
|
|
79
143
|
}
|
|
80
|
-
/**
|
|
81
|
-
* Create test cookie with common defaults
|
|
82
|
-
*/
|
|
83
144
|
function createCookie(overrides = {}) {
|
|
84
145
|
return {
|
|
85
146
|
name: 'session_id',
|
|
@@ -118,9 +179,6 @@ describe('Auth Module', () => {
|
|
|
118
179
|
let authManager;
|
|
119
180
|
beforeEach(() => {
|
|
120
181
|
authManager = new AuthManager('/tmp/test-data');
|
|
121
|
-
mockMkdir.mockResolvedValue(undefined);
|
|
122
|
-
mockWriteFile.mockResolvedValue(undefined);
|
|
123
|
-
mockChmod.mockResolvedValue(undefined);
|
|
124
182
|
});
|
|
125
183
|
describe('initialize', () => {
|
|
126
184
|
it('should create sessions directory', async () => {
|
|
@@ -129,37 +187,191 @@ describe('Auth Module', () => {
|
|
|
129
187
|
});
|
|
130
188
|
});
|
|
131
189
|
describe('hasSession', () => {
|
|
132
|
-
it('should return true when session file exists', async () => {
|
|
190
|
+
it('should return true and use the URL domain when the session file exists', async () => {
|
|
133
191
|
mockAccess.mockResolvedValue(undefined);
|
|
134
|
-
const result = await authManager.hasSession('https://example.com/
|
|
192
|
+
const result = await authManager.hasSession('https://docs.example.com/path/page');
|
|
135
193
|
expect(result).toBe(true);
|
|
194
|
+
expect(mockAccess).toHaveBeenCalledWith(expect.stringContaining('docs.example.com'));
|
|
136
195
|
});
|
|
137
196
|
it('should return false when session file does not exist', async () => {
|
|
138
197
|
mockAccess.mockRejectedValue(new Error('ENOENT'));
|
|
139
|
-
|
|
140
|
-
expect(result).toBe(false);
|
|
141
|
-
});
|
|
142
|
-
it('should use domain for session path', async () => {
|
|
143
|
-
mockAccess.mockResolvedValue(undefined);
|
|
144
|
-
await authManager.hasSession('https://docs.example.com/path/page');
|
|
145
|
-
expect(mockAccess).toHaveBeenCalledWith(expect.stringContaining('docs.example.com'));
|
|
198
|
+
await expect(authManager.hasSession('https://example.com/docs')).resolves.toBe(false);
|
|
146
199
|
});
|
|
147
200
|
});
|
|
148
201
|
describe('loadSession', () => {
|
|
149
|
-
it(
|
|
202
|
+
it.each([
|
|
203
|
+
{ label: 'missing file', input: new Error('ENOENT') },
|
|
204
|
+
{ label: 'invalid JSON', input: 'invalid json' },
|
|
205
|
+
{ label: 'invalid structure', input: JSON.stringify({ invalid: 'structure' }) },
|
|
206
|
+
])('should return null for $label', async ({ input }) => {
|
|
207
|
+
if (input instanceof Error) {
|
|
208
|
+
mockReadFile.mockRejectedValue(input);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
mockReadFile.mockResolvedValue(input);
|
|
212
|
+
}
|
|
213
|
+
await expect(authManager.loadSession('https://example.com')).resolves.toBeNull();
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
describe('createAuthenticatedContext', () => {
|
|
217
|
+
it('returns null without DNS or browser setup when no saved session exists', async () => {
|
|
150
218
|
mockReadFile.mockRejectedValue(new Error('ENOENT'));
|
|
151
|
-
|
|
152
|
-
expect(
|
|
219
|
+
await expect(authManager.createAuthenticatedContext('https://example.com')).resolves.toBeNull();
|
|
220
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
221
|
+
expect(mockChromiumLaunch).not.toHaveBeenCalled();
|
|
222
|
+
});
|
|
223
|
+
it('uses the pinned proxy without changing service workers or registering routes', async () => {
|
|
224
|
+
mockStoredSession([]);
|
|
225
|
+
const { mockBrowser, mockContext, expectPinnedProxy } = setupBrowserMock();
|
|
226
|
+
await expect(authManager.createAuthenticatedContext('https://example.com')).resolves.toEqual({
|
|
227
|
+
browser: mockBrowser,
|
|
228
|
+
context: mockContext,
|
|
229
|
+
});
|
|
230
|
+
expectPinnedProxy();
|
|
231
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
describe('performInteractiveLogin', () => {
|
|
235
|
+
it('uses the pinned proxy without changing service workers or registering routes', async () => {
|
|
236
|
+
const { expectPinnedProxy } = setupBrowserMock();
|
|
237
|
+
await performLogin(authManager);
|
|
238
|
+
expectPinnedProxy({ viewport: { width: 1280, height: 800 } }, true);
|
|
239
|
+
});
|
|
240
|
+
it('does not wait for login when the proxy blocks the destination', async () => {
|
|
241
|
+
const { mockPage } = setupBrowserMock({ status: 403, blocked: true });
|
|
242
|
+
await expect(performLogin(authManager)).rejects.toThrow('Blocked outbound destination');
|
|
243
|
+
expect(mockPage.waitForURL).not.toHaveBeenCalled();
|
|
244
|
+
});
|
|
245
|
+
it.each([
|
|
246
|
+
['tagged response', 'Blocked outbound destination'],
|
|
247
|
+
['tunnel failure', 'Outbound destination unavailable'],
|
|
248
|
+
])('rejects a main-frame %s emitted during goto', async (failureKind, expectedError) => {
|
|
249
|
+
const { mockPage, emitResponse, emitRequestFailed, navigationResponse, failedNavigation } = setupBrowserMock();
|
|
250
|
+
mockPage.goto.mockImplementation(async () => {
|
|
251
|
+
if (failureKind === 'tagged response') {
|
|
252
|
+
emitResponse(navigationResponse());
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
emitRequestFailed(failedNavigation());
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
status: () => 200,
|
|
259
|
+
headerValue: vi.fn().mockResolvedValue(null),
|
|
260
|
+
};
|
|
261
|
+
});
|
|
262
|
+
await expect(performLogin(authManager)).rejects.toThrow(expectedError);
|
|
263
|
+
expect(mockPage.waitForURL).not.toHaveBeenCalled();
|
|
264
|
+
expect(mockWriteFile).not.toHaveBeenCalled();
|
|
265
|
+
expect(mockPage.off).toHaveBeenCalledWith('response', expect.any(Function));
|
|
266
|
+
expect(mockPage.off).toHaveBeenCalledWith('requestfailed', expect.any(Function));
|
|
267
|
+
});
|
|
268
|
+
it.each([
|
|
269
|
+
['blocked', 'http://127.0.0.1/login', 'Blocked outbound destination'],
|
|
270
|
+
['failed', 'https://8.8.8.8/login', 'Outbound destination unavailable'],
|
|
271
|
+
])('classifies an async %s requestfailed URL', async (_kind, failedUrl, expectedError) => {
|
|
272
|
+
const { mockPage, emitRequestFailed, failedNavigation } = setupBrowserMock();
|
|
273
|
+
mockPage.goto.mockImplementation(async () => {
|
|
274
|
+
emitRequestFailed(failedNavigation({ url: failedUrl }));
|
|
275
|
+
return { status: () => 200, headerValue: vi.fn().mockResolvedValue(null) };
|
|
276
|
+
});
|
|
277
|
+
await expect(performLogin(authManager)).rejects.toThrow(expectedError);
|
|
278
|
+
expect(mockPage.waitForURL).not.toHaveBeenCalled();
|
|
279
|
+
expect(mockWriteFile).not.toHaveBeenCalled();
|
|
280
|
+
});
|
|
281
|
+
it('awaits asynchronous requestfailed classification before continuing login', async () => {
|
|
282
|
+
const pendingLookup = deferred();
|
|
283
|
+
vi.mocked(lookup).mockImplementationOnce(() => pendingLookup.promise);
|
|
284
|
+
const { mockPage, emitRequestFailed, failedNavigation } = setupBrowserMock();
|
|
285
|
+
mockPage.goto.mockImplementation(async () => {
|
|
286
|
+
emitRequestFailed(failedNavigation({ url: 'https://redirected.example.com/login' }));
|
|
287
|
+
return { status: () => 200, headerValue: vi.fn().mockResolvedValue(null) };
|
|
288
|
+
});
|
|
289
|
+
const login = performLogin(authManager);
|
|
290
|
+
const isSettled = trackSettlement(login);
|
|
291
|
+
await vi.waitFor(() => expect(lookup).toHaveBeenCalled());
|
|
292
|
+
expect(isSettled()).toBe(false);
|
|
293
|
+
pendingLookup.resolve([{ address: '127.0.0.1', family: 4 }]);
|
|
294
|
+
await expect(login).rejects.toThrow('Blocked outbound destination');
|
|
295
|
+
});
|
|
296
|
+
it('awaits a deferred response marker before saving a successful login', async () => {
|
|
297
|
+
const { mockPage, emitResponse, navigationResponse } = setupBrowserMock();
|
|
298
|
+
const wait = deferred();
|
|
299
|
+
mockPage.waitForURL.mockImplementation(() => wait.promise);
|
|
300
|
+
const header = deferred();
|
|
301
|
+
const login = performLogin(authManager);
|
|
302
|
+
await vi.waitFor(() => expect(mockPage.waitForURL).toHaveBeenCalled());
|
|
303
|
+
emitResponse(navigationResponse({ headerValue: header.promise }));
|
|
304
|
+
wait.resolve();
|
|
305
|
+
await Promise.resolve();
|
|
306
|
+
await Promise.resolve();
|
|
307
|
+
expect(mockWriteFile).not.toHaveBeenCalled();
|
|
308
|
+
header.resolve('1');
|
|
309
|
+
await expect(login).rejects.toThrow('Blocked outbound destination');
|
|
310
|
+
expect(mockWriteFile).not.toHaveBeenCalled();
|
|
153
311
|
});
|
|
154
|
-
it('
|
|
155
|
-
|
|
156
|
-
const
|
|
157
|
-
|
|
312
|
+
it('fails closed when a login response marker cannot be inspected', async () => {
|
|
313
|
+
const { mockPage, emitResponse, navigationResponse } = setupBrowserMock();
|
|
314
|
+
const wait = deferred();
|
|
315
|
+
mockPage.waitForURL.mockImplementation(() => wait.promise);
|
|
316
|
+
const login = performLogin(authManager);
|
|
317
|
+
await vi.waitFor(() => expect(mockPage.waitForURL).toHaveBeenCalled());
|
|
318
|
+
emitResponse(navigationResponse({ headerValue: Promise.reject(new Error('headers unavailable')) }));
|
|
319
|
+
wait.resolve();
|
|
320
|
+
await expect(login).rejects.toThrow('Failed to inspect outbound response: headers unavailable');
|
|
321
|
+
expect(mockWriteFile).not.toHaveBeenCalled();
|
|
158
322
|
});
|
|
159
|
-
it('
|
|
160
|
-
|
|
161
|
-
const
|
|
162
|
-
|
|
323
|
+
it('stops an OAuth wait when a later main-frame navigation is blocked', async () => {
|
|
324
|
+
const { mockPage, emitResponse, navigationResponse } = setupBrowserMock();
|
|
325
|
+
const wait = deferred();
|
|
326
|
+
mockPage.waitForURL.mockImplementation(() => wait.promise);
|
|
327
|
+
mockPage.close.mockImplementation(async () => wait.reject(new Error('Page closed')));
|
|
328
|
+
const login = performLogin(authManager);
|
|
329
|
+
await vi.waitFor(() => expect(mockPage.waitForURL).toHaveBeenCalled());
|
|
330
|
+
const isSettled = trackSettlement(login);
|
|
331
|
+
emitResponse(navigationResponse({ navigation: false }));
|
|
332
|
+
await Promise.resolve();
|
|
333
|
+
await Promise.resolve();
|
|
334
|
+
expect(isSettled()).toBe(false);
|
|
335
|
+
emitResponse(navigationResponse());
|
|
336
|
+
await expect(login).rejects.toThrow('Blocked outbound destination');
|
|
337
|
+
expect(mockPage.off).toHaveBeenCalledWith('response', expect.any(Function));
|
|
338
|
+
});
|
|
339
|
+
it('checks navigation policy after capturing storage state and before saving', async () => {
|
|
340
|
+
const { mockPage, mockContext, emitResponse, navigationResponse } = setupBrowserMock();
|
|
341
|
+
const blockedHeader = deferred();
|
|
342
|
+
mockContext.storageState.mockImplementation(async () => {
|
|
343
|
+
emitResponse(navigationResponse({ headerValue: blockedHeader.promise }));
|
|
344
|
+
return { cookies: [], origins: [] };
|
|
345
|
+
});
|
|
346
|
+
const login = performLogin(authManager);
|
|
347
|
+
await vi.waitFor(() => expect(mockContext.storageState).toHaveBeenCalled());
|
|
348
|
+
await Promise.resolve();
|
|
349
|
+
expect(mockWriteFile).not.toHaveBeenCalled();
|
|
350
|
+
blockedHeader.resolve('1');
|
|
351
|
+
await expect(login).rejects.toThrow('Blocked outbound destination');
|
|
352
|
+
expect(mockWriteFile).not.toHaveBeenCalled();
|
|
353
|
+
expect(mockPage.off).toHaveBeenCalledWith('response', expect.any(Function));
|
|
354
|
+
});
|
|
355
|
+
it('ignores an aborted OAuth navigation but stops on a later fatal tunnel failure', async () => {
|
|
356
|
+
const { mockPage, emitRequestFailed, failedNavigation } = setupBrowserMock();
|
|
357
|
+
const wait = deferred();
|
|
358
|
+
mockPage.waitForURL.mockImplementation(() => wait.promise);
|
|
359
|
+
mockPage.close.mockImplementation(async () => wait.reject(new Error('Page closed')));
|
|
360
|
+
const login = performLogin(authManager);
|
|
361
|
+
await vi.waitFor(() => expect(mockPage.waitForURL).toHaveBeenCalled());
|
|
362
|
+
const isSettled = trackSettlement(login);
|
|
363
|
+
emitRequestFailed(failedNavigation({ errorText: 'net::ERR_CONNECTION_REFUSED', navigation: false }));
|
|
364
|
+
await Promise.resolve();
|
|
365
|
+
expect(isSettled()).toBe(false);
|
|
366
|
+
for (const errorText of ['net::ERR_ABORTED', 'NS_BINDING_ABORTED', 'Load request cancelled']) {
|
|
367
|
+
emitRequestFailed(failedNavigation({ errorText }));
|
|
368
|
+
await Promise.resolve();
|
|
369
|
+
expect(isSettled()).toBe(false);
|
|
370
|
+
}
|
|
371
|
+
emitRequestFailed(failedNavigation());
|
|
372
|
+
await expect(login).rejects.toThrow('Outbound destination unavailable');
|
|
373
|
+
expect(mockPage.off).toHaveBeenCalledWith('response', expect.any(Function));
|
|
374
|
+
expect(mockPage.off).toHaveBeenCalledWith('requestfailed', expect.any(Function));
|
|
163
375
|
});
|
|
164
376
|
});
|
|
165
377
|
describe('clearSession', () => {
|
|
@@ -199,19 +411,15 @@ describe('Auth Module', () => {
|
|
|
199
411
|
});
|
|
200
412
|
});
|
|
201
413
|
});
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
expect(typeof type).toBe('string');
|
|
207
|
-
});
|
|
208
|
-
});
|
|
414
|
+
it.each(['http://127.0.0.1/login', 'http://[::1]/login'])('rejects private custom login URL %s before launching a browser', async (loginUrl) => {
|
|
415
|
+
const authManager = new AuthManager('/tmp/test-data');
|
|
416
|
+
await expect(authManager.performInteractiveLogin('https://example.com', { loginUrl })).rejects.toThrow('not allowed');
|
|
417
|
+
expect(mockChromiumLaunch).not.toHaveBeenCalled();
|
|
209
418
|
});
|
|
210
419
|
describe('validateSession', () => {
|
|
211
420
|
let authManager;
|
|
212
421
|
beforeEach(() => {
|
|
213
422
|
authManager = new AuthManager('/tmp/test-data');
|
|
214
|
-
mockMkdir.mockResolvedValue(undefined);
|
|
215
423
|
});
|
|
216
424
|
it('should return isValid=false when no session exists', async () => {
|
|
217
425
|
mockReadFile.mockRejectedValue(new Error('ENOENT'));
|
|
@@ -222,31 +430,28 @@ describe('Auth Module', () => {
|
|
|
222
430
|
describe('cookie expiration detection', () => {
|
|
223
431
|
const expiredTimestamp = () => Math.floor(Date.now() / 1000) - 3600; // 1 hour ago
|
|
224
432
|
const validTimestamp = () => Math.floor(Date.now() / 1000) + 3600; // 1 hour from now
|
|
225
|
-
it(
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
// Auth cookies on different domain (e.g., github.com for github.io)
|
|
248
|
-
mockStoredSession([createCookie({ name: 'user_session', domain: 'github.com', expires: expiredTimestamp() })], 'user.github.io');
|
|
249
|
-
const result = await authManager.validateSession('https://user.github.io');
|
|
433
|
+
it.each([
|
|
434
|
+
{
|
|
435
|
+
label: 'an unrelated cookie is still valid',
|
|
436
|
+
cookies: () => [
|
|
437
|
+
createCookie({ name: 'tracking_cookie', expires: validTimestamp() }),
|
|
438
|
+
createCookie({ name: 'auth_token', expires: expiredTimestamp() }),
|
|
439
|
+
],
|
|
440
|
+
domain: 'example.com',
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
label: 'the cookie belongs to a parent domain',
|
|
444
|
+
cookies: () => [createCookie({ name: 'auth_token', domain: '.example.com', expires: expiredTimestamp() })],
|
|
445
|
+
domain: 'sub.example.com',
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
label: 'no target-domain cookie exists',
|
|
449
|
+
cookies: () => [createCookie({ name: 'user_session', domain: 'github.com', expires: expiredTimestamp() })],
|
|
450
|
+
domain: 'user.github.io',
|
|
451
|
+
},
|
|
452
|
+
])('should detect expired auth cookies when $label', async ({ cookies, domain }) => {
|
|
453
|
+
mockStoredSession(cookies(), domain);
|
|
454
|
+
const result = await authManager.validateSession(`https://${domain}`);
|
|
250
455
|
expect(result.isValid).toBe(false);
|
|
251
456
|
expect(result.reason).toContain('expired');
|
|
252
457
|
});
|
|
@@ -286,6 +491,50 @@ describe('Auth Module', () => {
|
|
|
286
491
|
expect(result.isValid).toBe(false);
|
|
287
492
|
expect(result.reason).toContain(String(statusCode));
|
|
288
493
|
});
|
|
494
|
+
it('does not classify a proxy policy rejection as expired credentials', async () => {
|
|
495
|
+
setupBrowserMock({ status: 403, blocked: true });
|
|
496
|
+
await expect(authManager.validateSession('https://example.com')).rejects.toThrow('Blocked outbound destination');
|
|
497
|
+
});
|
|
498
|
+
it('preserves the session when a post-load main-frame response is proxy-blocked', async () => {
|
|
499
|
+
const { mockPage, emitResponse, navigationResponse } = setupBrowserMock();
|
|
500
|
+
mockPage.waitForLoadState.mockImplementation(async () => {
|
|
501
|
+
emitResponse(navigationResponse());
|
|
502
|
+
});
|
|
503
|
+
await expect(authManager.validateSessionOrThrow('https://example.com')).rejects.toThrow('Blocked outbound destination');
|
|
504
|
+
expect(mockUnlink).not.toHaveBeenCalled();
|
|
505
|
+
expect(mockPage.off).toHaveBeenCalledWith('response', expect.any(Function));
|
|
506
|
+
});
|
|
507
|
+
it('preserves the session when a post-load main-frame request fails', async () => {
|
|
508
|
+
const { mockPage, emitRequestFailed, failedNavigation } = setupBrowserMock();
|
|
509
|
+
mockPage.waitForLoadState.mockImplementation(async () => {
|
|
510
|
+
emitRequestFailed(failedNavigation());
|
|
511
|
+
});
|
|
512
|
+
await expect(authManager.validateSessionOrThrow('https://example.com')).rejects.toThrow('Outbound destination unavailable');
|
|
513
|
+
expect(mockUnlink).not.toHaveBeenCalled();
|
|
514
|
+
expect(mockPage.off).toHaveBeenCalledWith('requestfailed', expect.any(Function));
|
|
515
|
+
});
|
|
516
|
+
it('fails closed without deleting the session when a validation marker cannot be inspected', async () => {
|
|
517
|
+
const { mockPage, emitResponse, navigationResponse } = setupBrowserMock();
|
|
518
|
+
mockPage.waitForLoadState.mockImplementation(async () => {
|
|
519
|
+
emitResponse(navigationResponse({ headerValue: Promise.reject(new Error('headers unavailable')) }));
|
|
520
|
+
});
|
|
521
|
+
await expect(authManager.validateSessionOrThrow('https://example.com')).rejects.toThrow('Failed to inspect outbound response: headers unavailable');
|
|
522
|
+
expect(mockUnlink).not.toHaveBeenCalled();
|
|
523
|
+
});
|
|
524
|
+
it('preserves the session when a blocked marker resolves during content inspection', async () => {
|
|
525
|
+
const { mockPage, emitResponse, navigationResponse } = setupBrowserMock();
|
|
526
|
+
const header = deferred();
|
|
527
|
+
mockPage.content.mockImplementation(async () => {
|
|
528
|
+
emitResponse(navigationResponse({ headerValue: header.promise }));
|
|
529
|
+
return '<html><body>Welcome!</body></html>';
|
|
530
|
+
});
|
|
531
|
+
mockPage.evaluate.mockImplementation(async () => {
|
|
532
|
+
header.resolve('1');
|
|
533
|
+
return 'Welcome to the site';
|
|
534
|
+
});
|
|
535
|
+
await expect(authManager.validateSessionOrThrow('https://example.com')).rejects.toThrow('Blocked outbound destination');
|
|
536
|
+
expect(mockUnlink).not.toHaveBeenCalled();
|
|
537
|
+
});
|
|
289
538
|
it('should detect redirect to external login page as expired session', async () => {
|
|
290
539
|
setupBrowserMock({
|
|
291
540
|
url: 'https://company.okta.com/login',
|
|
@@ -328,9 +577,10 @@ describe('Auth Module', () => {
|
|
|
328
577
|
expect(result.reason).toContain('Validation failed');
|
|
329
578
|
});
|
|
330
579
|
it('should consider session valid when page loads successfully', async () => {
|
|
331
|
-
setupBrowserMock();
|
|
580
|
+
const { expectPinnedProxy } = setupBrowserMock();
|
|
332
581
|
const result = await authManager.validateSession('https://example.com');
|
|
333
582
|
expect(result.isValid).toBe(true);
|
|
583
|
+
expectPinnedProxy();
|
|
334
584
|
});
|
|
335
585
|
});
|
|
336
586
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../src/crawler/auth.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../src/crawler/auth.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { PlaywrightCrawlerOptions } from 'crawlee';
|
|
2
|
-
export declare const getBrowserConfig: (requestQueue: PlaywrightCrawlerOptions["requestQueue"]) => Partial<PlaywrightCrawlerOptions
|
|
2
|
+
export declare const getBrowserConfig: (requestQueue: PlaywrightCrawlerOptions["requestQueue"]) => Promise<Partial<PlaywrightCrawlerOptions>>;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { log } from 'crawlee';
|
|
2
|
+
import { getOutboundProxyUrl } from '../util/outbound-request.js';
|
|
2
3
|
// Suppress Crawlee's stdout logging for MCP compatibility
|
|
3
4
|
// MCP servers must only output JSON-RPC messages to stdout
|
|
4
5
|
log.setLevel(log.LEVELS.OFF);
|
|
5
|
-
export const getBrowserConfig = (requestQueue) => ({
|
|
6
|
+
export const getBrowserConfig = async (requestQueue) => ({
|
|
6
7
|
maxRequestsPerCrawl: 1000,
|
|
7
8
|
requestQueue,
|
|
8
9
|
maxConcurrency: 5,
|
|
@@ -10,6 +11,11 @@ export const getBrowserConfig = (requestQueue) => ({
|
|
|
10
11
|
maxRequestRetries: 2,
|
|
11
12
|
navigationTimeoutSecs: 30,
|
|
12
13
|
requestHandlerTimeoutSecs: 60,
|
|
14
|
+
launchContext: {
|
|
15
|
+
launchOptions: {
|
|
16
|
+
proxy: { server: await getOutboundProxyUrl(), bypass: '<-loopback>' },
|
|
17
|
+
},
|
|
18
|
+
},
|
|
13
19
|
browserPoolOptions: {
|
|
14
20
|
maxOpenPagesPerBrowser: 3,
|
|
15
21
|
useFingerprints: true,
|