latchkey 3.2.2 → 3.4.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/README.md +2 -1
- package/dist/skills/generic/latchkey/SKILL.md +1 -1
- package/dist/skills/openclaw/latchkey/SKILL.md +1 -1
- package/dist/src/apiCredentials/serialization.d.ts +21 -0
- package/dist/src/apiCredentials/serialization.d.ts.map +1 -1
- package/dist/src/apiCredentials/serialization.js +7 -0
- package/dist/src/apiCredentials/serialization.js.map +1 -1
- package/dist/src/cliCommands.d.ts.map +1 -1
- package/dist/src/cliCommands.js +91 -7
- package/dist/src/cliCommands.js.map +1 -1
- package/dist/src/configDataStore.d.ts +18 -0
- package/dist/src/configDataStore.d.ts.map +1 -1
- package/dist/src/configDataStore.js +10 -0
- package/dist/src/configDataStore.js.map +1 -1
- package/dist/src/serviceRegistry.d.ts.map +1 -1
- package/dist/src/serviceRegistry.js +27 -3
- package/dist/src/serviceRegistry.js.map +1 -1
- package/dist/src/services/aws.d.ts.map +1 -1
- package/dist/src/services/aws.js +1 -2
- package/dist/src/services/aws.js.map +1 -1
- package/dist/src/services/core/base.d.ts +25 -3
- package/dist/src/services/core/base.d.ts.map +1 -1
- package/dist/src/services/core/base.js +32 -10
- package/dist/src/services/core/base.js.map +1 -1
- package/dist/src/services/core/loginFlows/base.d.ts +75 -0
- package/dist/src/services/core/loginFlows/base.d.ts.map +1 -0
- package/dist/src/services/core/loginFlows/base.js +47 -0
- package/dist/src/services/core/loginFlows/base.js.map +1 -0
- package/dist/src/services/core/loginFlows/cookieCapture.d.ts +55 -0
- package/dist/src/services/core/loginFlows/cookieCapture.d.ts.map +1 -0
- package/dist/src/services/core/loginFlows/cookieCapture.js +244 -0
- package/dist/src/services/core/loginFlows/cookieCapture.js.map +1 -0
- package/dist/src/services/core/loginFlows/registry.d.ts +30 -0
- package/dist/src/services/core/loginFlows/registry.d.ts.map +1 -0
- package/dist/src/services/core/loginFlows/registry.js +56 -0
- package/dist/src/services/core/loginFlows/registry.js.map +1 -0
- package/dist/src/services/core/registered.d.ts +38 -2
- package/dist/src/services/core/registered.d.ts.map +1 -1
- package/dist/src/services/core/registered.js +37 -2
- package/dist/src/services/core/registered.js.map +1 -1
- package/dist/src/services/index.d.ts +4 -0
- package/dist/src/services/index.d.ts.map +1 -1
- package/dist/src/services/index.js +4 -0
- package/dist/src/services/index.js.map +1 -1
- package/dist/src/services/ngrok.d.ts +38 -0
- package/dist/src/services/ngrok.d.ts.map +1 -0
- package/dist/src/services/ngrok.js +129 -0
- package/dist/src/services/ngrok.js.map +1 -0
- package/dist/src/services/zoom.d.ts +118 -5
- package/dist/src/services/zoom.d.ts.map +1 -1
- package/dist/src/services/zoom.js +692 -7
- package/dist/src/services/zoom.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/tests/apiCredentials.test.js +5 -0
- package/dist/tests/apiCredentials.test.js.map +1 -1
- package/dist/tests/cli.test.js +178 -2
- package/dist/tests/cli.test.js.map +1 -1
- package/dist/tests/cookieCapture.test.d.ts +10 -0
- package/dist/tests/cookieCapture.test.d.ts.map +1 -0
- package/dist/tests/cookieCapture.test.js +221 -0
- package/dist/tests/cookieCapture.test.js.map +1 -0
- package/dist/tests/serviceRegistry.test.js +29 -8
- package/dist/tests/serviceRegistry.test.js.map +1 -1
- package/dist/tests/servicesAgainstRecordings.test.js +13 -11
- package/dist/tests/servicesAgainstRecordings.test.js.map +1 -1
- package/dist/tests/zoom.test.d.ts +2 -0
- package/dist/tests/zoom.test.d.ts.map +1 -0
- package/dist/tests/zoom.test.js +110 -0
- package/dist/tests/zoom.test.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the generic cookie-capturing browser login used by registered
|
|
3
|
+
* services.
|
|
4
|
+
*
|
|
5
|
+
* Everything goes through the public path a real login takes — a flow, the
|
|
6
|
+
* service it is registered on, and the session that service hands out — with
|
|
7
|
+
* responses fed in by hand instead of by a browser.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect } from 'vitest';
|
|
10
|
+
import { CookieCaptureLoginFlow } from '../src/services/core/loginFlows/cookieCapture.js';
|
|
11
|
+
import { formatLoginFlowsHelp, LOGIN_FLOWS, resolveLoginFlow, UnknownLoginFlowError, } from '../src/services/core/loginFlows/registry.js';
|
|
12
|
+
import { LoginFlowParamsInvalidError } from '../src/services/core/loginFlows/base.js';
|
|
13
|
+
import { buildRegisteredServiceOptions, RegisteredService, } from '../src/services/core/registered.js';
|
|
14
|
+
import { ServiceSession, SimpleServiceSession, TELEGRAM } from '../src/services/index.js';
|
|
15
|
+
const LOGIN_URL = 'https://example.com/login';
|
|
16
|
+
/** A response carrying nothing but the `Set-Cookie` headers under test. */
|
|
17
|
+
function responseWith(setCookieHeaders, url) {
|
|
18
|
+
return {
|
|
19
|
+
url: () => url,
|
|
20
|
+
headersArray: () => Promise.resolve([
|
|
21
|
+
{ name: 'Content-Type', value: 'text/html' },
|
|
22
|
+
...setCookieHeaders.map((value) => ({ name: 'set-cookie', value })),
|
|
23
|
+
]),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
async function headerFrom(credentials) {
|
|
27
|
+
if (credentials === null) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const curlArguments = await credentials.injectIntoCurlCall([]);
|
|
31
|
+
return curlArguments[1] ?? null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A login in progress for a service registered with these parameters: responses
|
|
35
|
+
* go in, and out comes the `Cookie` header stored so far, or null.
|
|
36
|
+
*/
|
|
37
|
+
function startLogin(cookieKeys, cookieUrl) {
|
|
38
|
+
const service = new RegisteredService('my-service', 'https://example.com/api/', {
|
|
39
|
+
loginUrl: LOGIN_URL,
|
|
40
|
+
loginFlow: new CookieCaptureLoginFlow({ cookieKeys: [...cookieKeys], cookieUrl }),
|
|
41
|
+
});
|
|
42
|
+
const session = service.getSession('latchkey');
|
|
43
|
+
if (!(session instanceof SimpleServiceSession)) {
|
|
44
|
+
throw new TypeError('the cookie-capture flow should hand out a SimpleServiceSession');
|
|
45
|
+
}
|
|
46
|
+
return async (setCookieHeaders, responseUrl = LOGIN_URL) => {
|
|
47
|
+
await session.onResponse(responseWith(setCookieHeaders, responseUrl));
|
|
48
|
+
return headerFrom(session.capturedCredentials);
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
describe('cookie capture', () => {
|
|
52
|
+
it('is not complete before the cookie is set', async () => {
|
|
53
|
+
const respond = startLogin(['sessionid']);
|
|
54
|
+
expect(await respond([])).toBeNull();
|
|
55
|
+
});
|
|
56
|
+
it('captures a cookie from a Set-Cookie header', async () => {
|
|
57
|
+
const respond = startLogin(['sessionid']);
|
|
58
|
+
expect(await respond(['sessionid=abc123; Path=/; HttpOnly'])).toBe('Cookie: sessionid=abc123');
|
|
59
|
+
});
|
|
60
|
+
it('ignores unrelated names, empty values and other domains', async () => {
|
|
61
|
+
const respond = startLogin(['sessionid']);
|
|
62
|
+
expect(await respond(['sessionid=wrong-domain; Path=/'], 'https://identity-provider.example.net/sso')).toBeNull();
|
|
63
|
+
expect(await respond(['other=irrelevant; Path=/', 'sessionid=; Path=/'])).toBeNull();
|
|
64
|
+
});
|
|
65
|
+
it('waits for every requested cookie, across responses', async () => {
|
|
66
|
+
const respond = startLogin(['sessionid', 'csrftoken']);
|
|
67
|
+
expect(await respond(['sessionid=abc; Path=/'])).toBeNull();
|
|
68
|
+
expect(await respond(['csrftoken=xyz; Path=/'])).toBe('Cookie: sessionid=abc; csrftoken=xyz');
|
|
69
|
+
});
|
|
70
|
+
it('keeps every scope when one name is set for several domains', async () => {
|
|
71
|
+
const respond = startLogin(['sessionid'], 'https://app.example.com/');
|
|
72
|
+
// A browser would send both, so both are kept rather than one being guessed.
|
|
73
|
+
expect(await respond(['sessionid=host-only; Path=/', 'sessionid=domain-wide; Domain=example.com; Path=/'], 'https://app.example.com/login')).toBe('Cookie: sessionid=host-only; sessionid=domain-wide');
|
|
74
|
+
});
|
|
75
|
+
it('looks for the cookies at the login URL when the parameters name no other', async () => {
|
|
76
|
+
const respond = startLogin(['sessionid']);
|
|
77
|
+
expect(await respond(['sessionid=abc; Path=/'])).toBe('Cookie: sessionid=abc');
|
|
78
|
+
});
|
|
79
|
+
it('matches against an explicit cookie URL when given', async () => {
|
|
80
|
+
const respond = startLogin(['sessionid'], 'https://api.example.com/');
|
|
81
|
+
// Set on the SSO host: applies to the API host only via the Domain attribute.
|
|
82
|
+
expect(await respond(['sessionid=sso-only; Path=/'], 'https://sso.example.com/login')).toBeNull();
|
|
83
|
+
expect(await respond(['sessionid=shared; Domain=example.com; Path=/'], 'https://sso.example.com/login')).toBe('Cookie: sessionid=shared');
|
|
84
|
+
});
|
|
85
|
+
it('defaults a cookie without Path to the directory that set it', async () => {
|
|
86
|
+
const setAtLoginPage = ['sessionid=abc'];
|
|
87
|
+
// The login page is /login, so a cookie without Path applies to / only
|
|
88
|
+
// because that is its directory; one set deeper does not reach the root.
|
|
89
|
+
expect(await startLogin(['sessionid'])(setAtLoginPage)).toBe('Cookie: sessionid=abc');
|
|
90
|
+
expect(await startLogin(['sessionid'])(setAtLoginPage, 'https://example.com/account/settings')).toBeNull();
|
|
91
|
+
});
|
|
92
|
+
it('applies a Domain cookie to subdomains, with or without the leading dot', async () => {
|
|
93
|
+
for (const domainAttribute of ['Domain=example.com', 'Domain=.example.com']) {
|
|
94
|
+
const respond = startLogin(['sessionid'], 'https://api.example.com/');
|
|
95
|
+
expect(await respond([`sessionid=abc; ${domainAttribute}; Path=/`], 'https://sso.example.com/in')).toBe('Cookie: sessionid=abc');
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
it('ignores header values that are not a cookie assignment', async () => {
|
|
99
|
+
const respond = startLogin(['sessionid']);
|
|
100
|
+
expect(await respond(['not-a-cookie', '=orphan-value'])).toBeNull();
|
|
101
|
+
});
|
|
102
|
+
it('replaces a cookie set again before the login finishes', async () => {
|
|
103
|
+
const respond = startLogin(['sessionid', 'csrftoken']);
|
|
104
|
+
expect(await respond(['sessionid=first; Path=/'])).toBeNull();
|
|
105
|
+
expect(await respond(['sessionid=second; Path=/'])).toBeNull();
|
|
106
|
+
expect(await respond(['csrftoken=xyz; Path=/'])).toBe('Cookie: sessionid=second; csrftoken=xyz');
|
|
107
|
+
});
|
|
108
|
+
it('drops a cookie that is cleared again', async () => {
|
|
109
|
+
for (const clearingHeader of [
|
|
110
|
+
'sessionid=; Path=/',
|
|
111
|
+
'sessionid=abc; Max-Age=0; Path=/',
|
|
112
|
+
'sessionid=abc; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=/',
|
|
113
|
+
]) {
|
|
114
|
+
const respond = startLogin(['sessionid', 'csrftoken']);
|
|
115
|
+
await respond(['sessionid=abc; Path=/']);
|
|
116
|
+
await respond([clearingHeader]);
|
|
117
|
+
expect(await respond(['csrftoken=xyz; Path=/'])).toBeNull();
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
it('keeps a cookie whose expiry is still in the future', async () => {
|
|
121
|
+
const expires = new Date(Date.now() + 60_000).toUTCString();
|
|
122
|
+
const respond = startLogin(['sessionid']);
|
|
123
|
+
expect(await respond([`sessionid=abc; Expires=${expires}; Path=/`])).toBe('Cookie: sessionid=abc');
|
|
124
|
+
});
|
|
125
|
+
it('stops capturing once the login is complete', async () => {
|
|
126
|
+
const respond = startLogin(['sessionid']);
|
|
127
|
+
expect(await respond(['sessionid=first; Path=/'])).toBe('Cookie: sessionid=first');
|
|
128
|
+
// The session is done; a later response cannot change what was captured.
|
|
129
|
+
expect(await respond(['sessionid=second; Path=/'])).toBe('Cookie: sessionid=first');
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
describe('the login flow registry', () => {
|
|
133
|
+
it('builds the register help text from the registered flows', () => {
|
|
134
|
+
const help = formatLoginFlowsHelp();
|
|
135
|
+
// Generated, not hand-written: a flow added later documents itself.
|
|
136
|
+
for (const flow of LOGIN_FLOWS) {
|
|
137
|
+
expect(help).toContain(flow.flowName);
|
|
138
|
+
expect(help).toContain(flow.summary);
|
|
139
|
+
for (const detailLine of flow.details.split('\n').filter((line) => line !== '')) {
|
|
140
|
+
expect(help).toContain(detailLine);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
expect(help).toContain('--login-flow-params');
|
|
144
|
+
});
|
|
145
|
+
it('rejects an unknown flow', () => {
|
|
146
|
+
expect(() => resolveLoginFlow('nonexistent', {})).toThrow(UnknownLoginFlowError);
|
|
147
|
+
});
|
|
148
|
+
it('rejects parameters that do not match the flow schema', () => {
|
|
149
|
+
const invalidParameterSets = [
|
|
150
|
+
{},
|
|
151
|
+
{ cookieKeys: [] },
|
|
152
|
+
{ cookieKeys: 'sessionid' },
|
|
153
|
+
{ cookieKeys: ['sessionid'], cookieUrl: 'example.com' },
|
|
154
|
+
{ cookieKeys: ['sessionid'], typo: true },
|
|
155
|
+
];
|
|
156
|
+
for (const params of invalidParameterSets) {
|
|
157
|
+
expect(() => resolveLoginFlow('cookie-capture', params)).toThrow(LoginFlowParamsInvalidError);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
it('accepts valid cookie-capture parameters', () => {
|
|
161
|
+
const flow = resolveLoginFlow('cookie-capture', {
|
|
162
|
+
cookieKeys: ['sessionid'],
|
|
163
|
+
cookieUrl: 'https://api.example.com/',
|
|
164
|
+
});
|
|
165
|
+
expect(flow.describe(LOGIN_URL)).toContain(LOGIN_URL);
|
|
166
|
+
expect(flow.describe(LOGIN_URL)).toContain('sessionid');
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
describe('RegisteredService with a login flow', () => {
|
|
170
|
+
const cookieFlow = () => resolveLoginFlow('cookie-capture', { cookieKeys: ['sessionid'] });
|
|
171
|
+
it('exposes the flow as its browser login', () => {
|
|
172
|
+
const service = new RegisteredService('my-service', 'https://example.com/api/', {
|
|
173
|
+
loginUrl: LOGIN_URL,
|
|
174
|
+
loginFlow: cookieFlow(),
|
|
175
|
+
});
|
|
176
|
+
expect(service.getSession).toBeDefined(); // eslint-disable-line @typescript-eslint/unbound-method
|
|
177
|
+
expect(service.getSession('latchkey')).toBeInstanceOf(ServiceSession);
|
|
178
|
+
expect(service.info).toContain(LOGIN_URL);
|
|
179
|
+
expect(service.info).toContain('sessionid');
|
|
180
|
+
});
|
|
181
|
+
// The two combinations that used to be checked at runtime — a flow without a
|
|
182
|
+
// page to open, and a flow alongside a family service — are now rejected by
|
|
183
|
+
// the options type. These assertions fail the build if that stops being true,
|
|
184
|
+
// since an unused @ts-expect-error is itself an error.
|
|
185
|
+
it('rejects a login flow without a login URL at compile time', () => {
|
|
186
|
+
// @ts-expect-error -- a login flow requires a loginUrl to start from
|
|
187
|
+
const service = new RegisteredService('my-service', 'https://example.com/api/', {
|
|
188
|
+
loginFlow: cookieFlow(),
|
|
189
|
+
});
|
|
190
|
+
expect(service.getSession).toBeUndefined(); // eslint-disable-line @typescript-eslint/unbound-method
|
|
191
|
+
});
|
|
192
|
+
it('rejects a login flow combined with a family service at compile time', () => {
|
|
193
|
+
const service = new RegisteredService('my-service', 'https://example.com/api/', {
|
|
194
|
+
familyService: TELEGRAM,
|
|
195
|
+
loginUrl: LOGIN_URL,
|
|
196
|
+
// @ts-expect-error -- a family service brings its own login
|
|
197
|
+
loginFlow: cookieFlow(),
|
|
198
|
+
});
|
|
199
|
+
expect(service.getSession).toBeUndefined(); // eslint-disable-line @typescript-eslint/unbound-method
|
|
200
|
+
});
|
|
201
|
+
it('rejects a bare service in place of the options at compile time', () => {
|
|
202
|
+
// @ts-expect-error -- Service overlaps structurally, but is not options
|
|
203
|
+
const service = new RegisteredService('my-service', 'https://example.com/api/', TELEGRAM);
|
|
204
|
+
expect(service.getSession).toBeUndefined(); // eslint-disable-line @typescript-eslint/unbound-method
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
describe('buildRegisteredServiceOptions', () => {
|
|
208
|
+
const cookieFlow = () => resolveLoginFlow('cookie-capture', { cookieKeys: ['sessionid'] });
|
|
209
|
+
it('prefers the family service when both are somehow present', () => {
|
|
210
|
+
const options = buildRegisteredServiceOptions(TELEGRAM, LOGIN_URL, cookieFlow());
|
|
211
|
+
expect(options?.familyService).toBe(TELEGRAM);
|
|
212
|
+
expect(options?.loginFlow).toBeUndefined();
|
|
213
|
+
});
|
|
214
|
+
it('drops a login flow that has no login URL', () => {
|
|
215
|
+
expect(buildRegisteredServiceOptions(undefined, undefined, cookieFlow())).toBeUndefined();
|
|
216
|
+
});
|
|
217
|
+
it('returns no options when there is no login at all', () => {
|
|
218
|
+
expect(buildRegisteredServiceOptions(undefined, undefined, undefined)).toBeUndefined();
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
//# sourceMappingURL=cookieCapture.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookieCapture.test.js","sourceRoot":"","sources":["../../tests/cookieCapture.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -123,22 +123,30 @@ describe('ServiceRegistry', () => {
|
|
|
123
123
|
describe('addService', () => {
|
|
124
124
|
it('should add a service to the registry', () => {
|
|
125
125
|
const registry = new ServiceRegistry([SLACK]);
|
|
126
|
-
const registered = new RegisteredService('my-gitlab', 'https://gitlab.mycompany.com/api/',
|
|
126
|
+
const registered = new RegisteredService('my-gitlab', 'https://gitlab.mycompany.com/api/', {
|
|
127
|
+
familyService: GITLAB,
|
|
128
|
+
});
|
|
127
129
|
registry.addService(registered);
|
|
128
130
|
expect(registry.getByName('my-gitlab')).toBe(registered);
|
|
129
131
|
expect(primaryServiceForUrl(registry, 'https://gitlab.mycompany.com/api/v4/user')).toBe(registered);
|
|
130
132
|
});
|
|
131
133
|
it('should throw DuplicateServiceNameError for existing built-in name', () => {
|
|
132
134
|
const registry = new ServiceRegistry([SLACK]);
|
|
133
|
-
const duplicate = new RegisteredService('slack', 'https://slack.mycompany.com/api/',
|
|
135
|
+
const duplicate = new RegisteredService('slack', 'https://slack.mycompany.com/api/', {
|
|
136
|
+
familyService: SLACK,
|
|
137
|
+
});
|
|
134
138
|
expect(() => {
|
|
135
139
|
registry.addService(duplicate);
|
|
136
140
|
}).toThrow(DuplicateServiceNameError);
|
|
137
141
|
});
|
|
138
142
|
it('should throw DuplicateServiceNameError for existing registered name', () => {
|
|
139
143
|
const registry = new ServiceRegistry([GITLAB]);
|
|
140
|
-
const first = new RegisteredService('my-gitlab', 'https://gitlab.mycompany.com/api/',
|
|
141
|
-
|
|
144
|
+
const first = new RegisteredService('my-gitlab', 'https://gitlab.mycompany.com/api/', {
|
|
145
|
+
familyService: GITLAB,
|
|
146
|
+
});
|
|
147
|
+
const second = new RegisteredService('my-gitlab', 'https://gitlab.other.com/api/', {
|
|
148
|
+
familyService: GITLAB,
|
|
149
|
+
});
|
|
142
150
|
registry.addService(first);
|
|
143
151
|
expect(() => {
|
|
144
152
|
registry.addService(second);
|
|
@@ -191,12 +199,17 @@ describe('ServiceRegistry', () => {
|
|
|
191
199
|
});
|
|
192
200
|
describe('RegisteredService', () => {
|
|
193
201
|
it('should not expose getSession when no loginUrl is provided', () => {
|
|
194
|
-
const registered = new RegisteredService('my-gitlab', 'https://gitlab.mycompany.com/api/',
|
|
202
|
+
const registered = new RegisteredService('my-gitlab', 'https://gitlab.mycompany.com/api/', {
|
|
203
|
+
familyService: GITLAB,
|
|
204
|
+
});
|
|
195
205
|
expect(registered.getSession).toBeUndefined(); // eslint-disable-line @typescript-eslint/unbound-method
|
|
196
206
|
expect(registered.loginUrl).toBe('');
|
|
197
207
|
});
|
|
198
208
|
it('should expose getSession when loginUrl is provided and family supports it', () => {
|
|
199
|
-
const registered = new RegisteredService('my-slack', 'https://slack.mycompany.com/api/',
|
|
209
|
+
const registered = new RegisteredService('my-slack', 'https://slack.mycompany.com/api/', {
|
|
210
|
+
familyService: SLACK,
|
|
211
|
+
loginUrl: 'https://slack.mycompany.com/signin',
|
|
212
|
+
});
|
|
200
213
|
expect(registered.getSession).toBeDefined(); // eslint-disable-line @typescript-eslint/unbound-method
|
|
201
214
|
expect(registered.loginUrl).toBe('https://slack.mycompany.com/signin');
|
|
202
215
|
});
|
|
@@ -208,12 +221,20 @@ describe('ServiceRegistry', () => {
|
|
|
208
221
|
expect(registered.setCredentialsExample('my-api')).toContain('latchkey auth set my-api');
|
|
209
222
|
});
|
|
210
223
|
it('should not expose getSession when loginUrl is provided but no family', () => {
|
|
211
|
-
|
|
224
|
+
// A login URL on its own is not a login: the options type requires it to
|
|
225
|
+
// come with either a family service or a login flow.
|
|
226
|
+
// @ts-expect-error -- loginUrl alone is not a valid option
|
|
227
|
+
const registered = new RegisteredService('my-api', 'https://api.example.com/', {
|
|
228
|
+
loginUrl: 'https://api.example.com/login',
|
|
229
|
+
});
|
|
212
230
|
expect(registered.getSession).toBeUndefined(); // eslint-disable-line @typescript-eslint/unbound-method
|
|
213
231
|
});
|
|
214
232
|
it('should not expose getSession when loginUrl is provided but family lacks it', () => {
|
|
215
233
|
// TELEGRAM has no getSession
|
|
216
|
-
const registered = new RegisteredService('my-telegram', 'https://telegram.mycompany.com/bot',
|
|
234
|
+
const registered = new RegisteredService('my-telegram', 'https://telegram.mycompany.com/bot', {
|
|
235
|
+
familyService: TELEGRAM,
|
|
236
|
+
loginUrl: 'https://telegram.mycompany.com/login',
|
|
237
|
+
});
|
|
217
238
|
expect(registered.getSession).toBeUndefined(); // eslint-disable-line @typescript-eslint/unbound-method
|
|
218
239
|
});
|
|
219
240
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serviceRegistry.test.js","sourceRoot":"","sources":["../../tests/serviceRegistry.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"serviceRegistry.test.js","sourceRoot":"","sources":["../../tests/serviceRegistry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,8 +29,14 @@ const __dirname = dirname(__filename);
|
|
|
29
29
|
const RECORDINGS_DIRECTORY = resolve(__dirname, '..', 'scripts', 'recordings');
|
|
30
30
|
// Default recording filename (matches recordBrowserSession.ts)
|
|
31
31
|
const DEFAULT_RECORDING_NAME = 'login_session.json';
|
|
32
|
-
// Do not test services that require special followup steps
|
|
33
|
-
|
|
32
|
+
// Do not test services that require special followup steps: their credential is
|
|
33
|
+
// minted by an interactive browser action (a BrowserFollowupServiceSession) and
|
|
34
|
+
// is not present in the recorded login network traffic, so replaying a recording
|
|
35
|
+
// cannot reconstruct it. ngrok is such a service (its API key is created and read
|
|
36
|
+
// from the dashboard's "New API Key" dialog, exactly like linear).
|
|
37
|
+
// NOTE: todoist is also a BrowserFollowupServiceSession and arguably belongs here
|
|
38
|
+
// too; it predates this list and is left as-is to keep this change scoped.
|
|
39
|
+
const BLACKLIST = new Set(['dropbox', 'github', 'linear', 'ngrok']);
|
|
34
40
|
class InvalidRecordingError extends Error {
|
|
35
41
|
constructor(message) {
|
|
36
42
|
super(message);
|
|
@@ -98,16 +104,12 @@ async function testServiceWithRecording(service, recordingDirectory) {
|
|
|
98
104
|
for (const entry of recordingEntries) {
|
|
99
105
|
const mockRequest = createMockRequest(entry.request);
|
|
100
106
|
const mockResponse = createMockResponse(entry.response, mockRequest);
|
|
101
|
-
// Call onResponse which internally calls getApiCredentialsFromResponse
|
|
102
|
-
session
|
|
103
|
-
//
|
|
104
|
-
await
|
|
107
|
+
// Call onResponse which internally calls getApiCredentialsFromResponse.
|
|
108
|
+
// Awaiting it means no sleeping: the session is done with this entry before
|
|
109
|
+
// the next one goes in.
|
|
110
|
+
await session.onResponse(mockResponse);
|
|
105
111
|
}
|
|
106
|
-
|
|
107
|
-
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
108
|
-
// Access the apiCredentials via the session (it's protected but accessible for testing)
|
|
109
|
-
const apiCredentials = session
|
|
110
|
-
.apiCredentials;
|
|
112
|
+
const apiCredentials = session.capturedCredentials;
|
|
111
113
|
if (apiCredentials !== null) {
|
|
112
114
|
return apiCredentials;
|
|
113
115
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"servicesAgainstRecordings.test.js","sourceRoot":"","sources":["../../tests/servicesAgainstRecordings.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAG9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAW,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAE7E,iCAAiC;AACjC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,6CAA6C;AAC7C,MAAM,oBAAoB,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AAE/E,+DAA+D;AAC/D,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAEpD,
|
|
1
|
+
{"version":3,"file":"servicesAgainstRecordings.test.js","sourceRoot":"","sources":["../../tests/servicesAgainstRecordings.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAG9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAW,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAE7E,iCAAiC;AACjC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,6CAA6C;AAC7C,MAAM,oBAAoB,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AAE/E,+DAA+D;AAC/D,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAEpD,gFAAgF;AAChF,gFAAgF;AAChF,iFAAiF;AACjF,kFAAkF;AAClF,mEAAmE;AACnE,kFAAkF;AAClF,2EAA2E;AAC3E,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAEpE,MAAM,qBAAsB,SAAQ,KAAK;IACvC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,4BAA6B,SAAQ,KAAK;IAC9C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAC7C,CAAC;CACF;AAuBD,SAAS,oBAAoB,CAAC,YAAoB;IAChD,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAoB,CAAC;AAChD,CAAC;AAED,SAAS,iBAAiB,CAAC,WAAwB;IACjD,MAAM,WAAW,GAAG;QAClB,GAAG,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG;QAC1B,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM;QAChC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO;QAClC,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;QACtD,YAAY,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa;QAC7C,QAAQ,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,IAAI,IAAI;KACxB,CAAC;IAExB,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,kBAAkB,CAAC,YAA0B,EAAE,WAAoB;IAC1E,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC;IAErC,MAAM,YAAY,GAAG;QACnB,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM;QACjC,UAAU,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW;QAC1C,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO;QACnC,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC;QACvD,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW;QAC1B,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QACjC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACxB,CAAC;IAEzB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,wBAAwB,CACrC,OAAgB,EAChB,kBAA0B;IAE1B,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;IAEtE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,qBAAqB,CAAC,4BAA4B,YAAY,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;IAE5D,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,qBAAqB,CAAC,sBAAsB,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,qBAAqB,CAC7B,WAAW,OAAO,CAAC,IAAI,8DAA8D,CACtF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAE/C,IAAI,CAAC,CAAC,OAAO,YAAY,oBAAoB,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,qBAAqB,CAC7B,WAAW,OAAO,CAAC,IAAI,iEAAiE,CACzF,CAAC;IACJ,CAAC;IAED,0EAA0E;IAC1E,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAErE,wEAAwE;QACxE,4EAA4E;QAC5E,wBAAwB;QACxB,MAAM,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAEnD,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,MAAM,IAAI,4BAA4B,CACpC,8CAA8C,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,mBAAmB,CACjG,CAAC;AACJ,CAAC;AAOD,SAAS,kBAAkB;IACzB,MAAM,UAAU,GAA0B,EAAE,CAAC;IAE7C,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACtC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,oBAAoB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClF,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;YAEjE,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC7B,UAAU,CAAC,IAAI,CAAC;oBACd,WAAW,EAAE,IAAI,CAAC,IAAI;oBACtB,aAAa;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,0CAA0C;AAC1C,MAAM,oBAAoB,GAAG,kBAAkB,EAAE,CAAC;AAElD,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE;YAClC,8BAA8B;QAChC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,oBAAoB,EAAE,CAAC;QAClE,EAAE,CAAC,mCAAmC,WAAW,YAAY,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAExD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,wCAAwC;gBACxC,MAAM,CAAC,IAAI,CAAC,YAAY,WAAW,yBAAyB,CAAC,CAAC;gBAC9D,OAAO;YACT,CAAC;YAED,MAAM,cAAc,GAAG,MAAM,wBAAwB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAE9E,mCAAmC;YACnC,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAEtC,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;YAC7D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zoom.test.d.ts","sourceRoot":"","sources":["../../tests/zoom.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
+
import { ApiCredentialsUsageError, AuthorizationBearer } from '../src/apiCredentials/base.js';
|
|
3
|
+
import { resetAsyncSubprocessRunner, setAsyncSubprocessRunner } from '../src/curl.js';
|
|
4
|
+
import { isZoomSignedInHomeUrl, ZOOM, ZoomCredentialError, ZoomServerToServerCredentials, } from '../src/services/zoom.js';
|
|
5
|
+
const APP_CREDENTIALS = new ZoomServerToServerCredentials('account-id', 'client-id', 'client-secret');
|
|
6
|
+
function inOneHour() {
|
|
7
|
+
return new Date(Date.now() + 3600_000).toISOString();
|
|
8
|
+
}
|
|
9
|
+
afterEach(() => {
|
|
10
|
+
resetAsyncSubprocessRunner();
|
|
11
|
+
});
|
|
12
|
+
describe('ZoomServerToServerCredentials', () => {
|
|
13
|
+
it('injects the access token as a bearer token', async () => {
|
|
14
|
+
const credentials = APP_CREDENTIALS.withAccessToken('minted-token', inOneHour());
|
|
15
|
+
await expect(credentials.injectIntoCurlCall([])).resolves.toEqual([
|
|
16
|
+
'-H',
|
|
17
|
+
'Authorization: Bearer minted-token',
|
|
18
|
+
]);
|
|
19
|
+
});
|
|
20
|
+
it('refuses to be used before an access token has been minted', () => {
|
|
21
|
+
expect(() => APP_CREDENTIALS.injectIntoCurlCall([])).toThrow(ApiCredentialsUsageError);
|
|
22
|
+
});
|
|
23
|
+
it('counts a missing access token as expired, so one gets minted', () => {
|
|
24
|
+
expect(APP_CREDENTIALS.isExpired()).toBe(true);
|
|
25
|
+
});
|
|
26
|
+
it('counts a token close to its expiry as expired', () => {
|
|
27
|
+
const almostExpired = APP_CREDENTIALS.withAccessToken('minted-token', new Date(Date.now() + 10_000).toISOString());
|
|
28
|
+
expect(almostExpired.isExpired()).toBe(true);
|
|
29
|
+
expect(APP_CREDENTIALS.withAccessToken('minted-token', inOneHour()).isExpired()).toBe(false);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe('Zoom.refreshCredentials', () => {
|
|
33
|
+
it('mints an access token with the account_credentials grant', async () => {
|
|
34
|
+
let observedArguments = [];
|
|
35
|
+
setAsyncSubprocessRunner((args) => {
|
|
36
|
+
observedArguments = args;
|
|
37
|
+
return Promise.resolve({
|
|
38
|
+
returncode: 0,
|
|
39
|
+
stdout: Buffer.from('{"access_token":"minted-token","expires_in":3600}'),
|
|
40
|
+
stderr: '',
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
const refreshed = await ZOOM.refreshCredentials(APP_CREDENTIALS);
|
|
44
|
+
expect(refreshed).toBeInstanceOf(ZoomServerToServerCredentials);
|
|
45
|
+
expect(refreshed.accessToken).toBe('minted-token');
|
|
46
|
+
expect(refreshed?.isExpired()).toBe(false);
|
|
47
|
+
expect(observedArguments).toContain('https://zoom.us/oauth/token');
|
|
48
|
+
expect(observedArguments).toContain('client-id:client-secret');
|
|
49
|
+
expect(observedArguments).toContain('grant_type=account_credentials&account_id=account-id');
|
|
50
|
+
});
|
|
51
|
+
it('reports failure when Zoom refuses to issue a token', async () => {
|
|
52
|
+
setAsyncSubprocessRunner(() => Promise.resolve({
|
|
53
|
+
returncode: 0,
|
|
54
|
+
stdout: Buffer.from('{"reason":"Invalid client_id or client_secret"}'),
|
|
55
|
+
stderr: '',
|
|
56
|
+
}));
|
|
57
|
+
await expect(ZOOM.refreshCredentials(APP_CREDENTIALS)).resolves.toBeNull();
|
|
58
|
+
});
|
|
59
|
+
it('leaves other credential types alone', async () => {
|
|
60
|
+
await expect(ZOOM.refreshCredentials(new AuthorizationBearer('token'))).resolves.toBeNull();
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe('Zoom.getCredentialsNoCurl', () => {
|
|
64
|
+
it('accepts the app credential triple', () => {
|
|
65
|
+
const credentials = ZOOM.getCredentialsNoCurl(['account-id', 'client-id', 'client-secret']);
|
|
66
|
+
expect(credentials).toBeInstanceOf(ZoomServerToServerCredentials);
|
|
67
|
+
});
|
|
68
|
+
it('rejects an incomplete triple', () => {
|
|
69
|
+
expect(() => ZOOM.getCredentialsNoCurl(['account-id', 'client-id'])).toThrow(ZoomCredentialError);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe('isZoomSignedInHomeUrl', () => {
|
|
73
|
+
it('accepts the home page on any regional host, and as a bare redirect path', () => {
|
|
74
|
+
expect(isZoomSignedInHomeUrl('https://zoom.us/myhome')).toBe(true);
|
|
75
|
+
expect(isZoomSignedInHomeUrl('https://us05web.zoom.us/myhome')).toBe(true);
|
|
76
|
+
expect(isZoomSignedInHomeUrl('https://us05web.zoom.us/myhome?from=signin')).toBe(true);
|
|
77
|
+
expect(isZoomSignedInHomeUrl('https://us05web.zoom.us/myhome/setting')).toBe(true);
|
|
78
|
+
expect(isZoomSignedInHomeUrl('/myhome')).toBe(true);
|
|
79
|
+
});
|
|
80
|
+
it('rejects other pages, and other hosts borrowing the path', () => {
|
|
81
|
+
expect(isZoomSignedInHomeUrl('https://zoom.us/signin#/login')).toBe(false);
|
|
82
|
+
expect(isZoomSignedInHomeUrl('https://us05web.zoom.us/myhomepage')).toBe(false);
|
|
83
|
+
expect(isZoomSignedInHomeUrl('https://marketplace.zoom.us/user/build')).toBe(false);
|
|
84
|
+
expect(isZoomSignedInHomeUrl('https://not-zoom.example.com/myhome')).toBe(false);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe('Zoom.getAccount', () => {
|
|
88
|
+
function mockNoUserContext() {
|
|
89
|
+
setAsyncSubprocessRunner(() => Promise.resolve({
|
|
90
|
+
returncode: 0,
|
|
91
|
+
stdout: Buffer.from('{"code":124,"message":"Invalid access token."}'),
|
|
92
|
+
stderr: '',
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
it('names the account by the user the app was created by', async () => {
|
|
96
|
+
mockNoUserContext();
|
|
97
|
+
const credentials = new ZoomServerToServerCredentials('account-id', 'client-id', 'client-secret', 'minted-token', inOneHour(), 'admin@example.com');
|
|
98
|
+
await expect(ZOOM.getAccount(credentials)).resolves.toBe('admin@example.com');
|
|
99
|
+
});
|
|
100
|
+
it('falls back to the app account id when no user is known', async () => {
|
|
101
|
+
mockNoUserContext();
|
|
102
|
+
const credentials = APP_CREDENTIALS.withAccessToken('minted-token', inOneHour());
|
|
103
|
+
await expect(ZOOM.getAccount(credentials)).resolves.toBe('account-id');
|
|
104
|
+
});
|
|
105
|
+
it('keeps the account across a token refresh', () => {
|
|
106
|
+
const credentials = new ZoomServerToServerCredentials('account-id', 'client-id', 'client-secret', undefined, undefined, 'admin@example.com');
|
|
107
|
+
expect(credentials.withAccessToken('minted-token', inOneHour()).accountEmail).toBe('admin@example.com');
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
//# sourceMappingURL=zoom.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zoom.test.js","sourceRoot":"","sources":["../../tests/zoom.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAC9F,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EACL,qBAAqB,EACrB,IAAI,EACJ,mBAAmB,EACnB,6BAA6B,GAC9B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,eAAe,GAAG,IAAI,6BAA6B,CACvD,YAAY,EACZ,WAAW,EACX,eAAe,CAChB,CAAC;AAEF,SAAS,SAAS;IAChB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;AACvD,CAAC;AAED,SAAS,CAAC,GAAG,EAAE;IACb,0BAA0B,EAAE,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,WAAW,GAAG,eAAe,CAAC,eAAe,CAAC,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC;QACjF,MAAM,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YAChE,IAAI;YACJ,oCAAoC;SACrC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,aAAa,GAAG,eAAe,CAAC,eAAe,CACnD,cAAc,EACd,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE,CAC5C,CAAC;QACF,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,CAAC,eAAe,CAAC,eAAe,CAAC,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,IAAI,iBAAiB,GAAsB,EAAE,CAAC;QAC9C,wBAAwB,CAAC,CAAC,IAAI,EAAE,EAAE;YAChC,iBAAiB,GAAG,IAAI,CAAC;YACzB,OAAO,OAAO,CAAC,OAAO,CAAC;gBACrB,UAAU,EAAE,CAAC;gBACb,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC;gBACxE,MAAM,EAAE,EAAE;aACX,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;QAEjE,MAAM,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC;QAChE,MAAM,CAAE,SAA2C,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACtF,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;QACnE,MAAM,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QAC/D,MAAM,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,sDAAsD,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,wBAAwB,CAAC,GAAG,EAAE,CAC5B,OAAO,CAAC,OAAO,CAAC;YACd,UAAU,EAAE,CAAC;YACb,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC;YACtE,MAAM,EAAE,EAAE;SACX,CAAC,CACH,CAAC;QACF,MAAM,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC9F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;QAC5F,MAAM,CAAC,WAAW,CAAC,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAC1E,mBAAmB,CACpB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,CAAC,qBAAqB,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,MAAM,CAAC,qBAAqB,CAAC,gCAAgC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,MAAM,CAAC,qBAAqB,CAAC,4CAA4C,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvF,MAAM,CAAC,qBAAqB,CAAC,wCAAwC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnF,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,qBAAqB,CAAC,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3E,MAAM,CAAC,qBAAqB,CAAC,oCAAoC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChF,MAAM,CAAC,qBAAqB,CAAC,wCAAwC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpF,MAAM,CAAC,qBAAqB,CAAC,qCAAqC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,SAAS,iBAAiB;QACxB,wBAAwB,CAAC,GAAG,EAAE,CAC5B,OAAO,CAAC,OAAO,CAAC;YACd,UAAU,EAAE,CAAC;YACb,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC;YACrE,MAAM,EAAE,EAAE;SACX,CAAC,CACH,CAAC;IACJ,CAAC;IAED,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,iBAAiB,EAAE,CAAC;QACpB,MAAM,WAAW,GAAG,IAAI,6BAA6B,CACnD,YAAY,EACZ,WAAW,EACX,eAAe,EACf,cAAc,EACd,SAAS,EAAE,EACX,mBAAmB,CACpB,CAAC;QACF,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,iBAAiB,EAAE,CAAC;QACpB,MAAM,WAAW,GAAG,eAAe,CAAC,eAAe,CAAC,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC;QACjF,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,WAAW,GAAG,IAAI,6BAA6B,CACnD,YAAY,EACZ,WAAW,EACX,eAAe,EACf,SAAS,EACT,SAAS,EACT,mBAAmB,CACpB,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAChF,mBAAmB,CACpB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "latchkey",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.0",
|
|
4
4
|
"description": "A CLI tool that injects API credentials into curl requests to third-party services",
|
|
5
5
|
"author": "Imbue <hynek@imbue.com>",
|
|
6
6
|
"repository": {
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"node": ">=20"
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
|
-
"@imbue-ai/detent": "^1.
|
|
61
|
+
"@imbue-ai/detent": "^1.12.0",
|
|
62
62
|
"@napi-rs/keyring": "^1.2.0",
|
|
63
63
|
"commander": "^12.0.0",
|
|
64
64
|
"playwright": "~1.60.0",
|