latchkey 3.16.2 → 3.18.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 +9 -3
- package/dist/src/cliCommands.d.ts.map +1 -1
- package/dist/src/cliCommands.js +8 -3
- package/dist/src/cliCommands.js.map +1 -1
- package/dist/src/gateway/latchkeyEndpoint.d.ts +5 -0
- package/dist/src/gateway/latchkeyEndpoint.d.ts.map +1 -1
- package/dist/src/gateway/latchkeyEndpoint.js +2 -1
- package/dist/src/gateway/latchkeyEndpoint.js.map +1 -1
- package/dist/src/oauthUtils.d.ts +12 -0
- package/dist/src/oauthUtils.d.ts.map +1 -1
- package/dist/src/oauthUtils.js +12 -0
- package/dist/src/oauthUtils.js.map +1 -1
- package/dist/src/pluginSdk.d.ts +5 -3
- package/dist/src/pluginSdk.d.ts.map +1 -1
- package/dist/src/pluginSdk.js +4 -2
- package/dist/src/pluginSdk.js.map +1 -1
- package/dist/src/services/core/base.d.ts +20 -1
- package/dist/src/services/core/base.d.ts.map +1 -1
- package/dist/src/services/core/base.js +20 -1
- package/dist/src/services/core/base.js.map +1 -1
- package/dist/src/services/core/loginFlows/cookieCapture.d.ts +2 -1
- package/dist/src/services/core/loginFlows/cookieCapture.d.ts.map +1 -1
- package/dist/src/services/core/loginFlows/cookieCapture.js +94 -5
- package/dist/src/services/core/loginFlows/cookieCapture.js.map +1 -1
- package/dist/src/services/google/base.d.ts +2 -2
- package/dist/src/services/google/base.d.ts.map +1 -1
- package/dist/src/services/google/base.js +15 -5
- package/dist/src/services/google/base.js.map +1 -1
- package/dist/src/sharedOperations.d.ts +12 -2
- package/dist/src/sharedOperations.d.ts.map +1 -1
- package/dist/src/sharedOperations.js +15 -12
- package/dist/src/sharedOperations.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/tests/cli.test.js +42 -1
- package/dist/tests/cli.test.js.map +1 -1
- package/dist/tests/cookieCapture.test.js +140 -8
- package/dist/tests/cookieCapture.test.js.map +1 -1
- package/dist/tests/googleStrictLogin.test.d.ts +2 -0
- package/dist/tests/googleStrictLogin.test.d.ts.map +1 -0
- package/dist/tests/googleStrictLogin.test.js +83 -0
- package/dist/tests/googleStrictLogin.test.js.map +1 -0
- package/dist/tests/latchkeyEndpoint.test.js +14 -0
- package/dist/tests/latchkeyEndpoint.test.js.map +1 -1
- package/dist/tests/oauthUtils.test.js +36 -1
- package/dist/tests/oauthUtils.test.js.map +1 -1
- package/dist/tests/sharedOperations.test.js +38 -0
- package/dist/tests/sharedOperations.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -60,7 +60,7 @@ function buildAccountNotFoundMessage(serviceName, account, storedAccounts) {
|
|
|
60
60
|
* The message spells out what `--account` does here, because the short version
|
|
61
61
|
* ("no credentials stored for account X") read to users and agents as an
|
|
62
62
|
* instruction to go and create that account — which is the one thing that
|
|
63
|
-
* cannot help, since a service that
|
|
63
|
+
* cannot help, since a service that detects the login account assigns it after
|
|
64
64
|
* the login rather than being told one up front.
|
|
65
65
|
*/
|
|
66
66
|
export class AccountNotFoundError extends Error {
|
|
@@ -134,6 +134,13 @@ async function computeAccountStatuses(registry, apiCredentialStore, config, serv
|
|
|
134
134
|
function formatBaseApiUrl(baseApiUrl) {
|
|
135
135
|
return typeof baseApiUrl === 'string' ? baseApiUrl : String(baseApiUrl);
|
|
136
136
|
}
|
|
137
|
+
// A service that implements getAccount detects who a browser login signed in
|
|
138
|
+
// as, and that is where the credentials go. A service that does not has no
|
|
139
|
+
// identity to report, so the user names the account with --account — which is
|
|
140
|
+
// what lets such a service hold more than one set of credentials.
|
|
141
|
+
function detectsLoginAccount(service) {
|
|
142
|
+
return service.getAccount !== undefined;
|
|
143
|
+
}
|
|
137
144
|
export async function servicesInfo(registry, apiCredentialStore, config, serviceName, offline = false) {
|
|
138
145
|
const service = lookupService(registry, serviceName);
|
|
139
146
|
const supportsBrowser = service.getSession !== undefined && !config.browserDisabled;
|
|
@@ -145,6 +152,7 @@ export async function servicesInfo(registry, apiCredentialStore, config, service
|
|
|
145
152
|
type: serviceType,
|
|
146
153
|
baseApiUrls: service.baseApiUrls.map(formatBaseApiUrl),
|
|
147
154
|
authOptions,
|
|
155
|
+
capabilities: { detectsLoginAccount: detectsLoginAccount(service) },
|
|
148
156
|
credentials,
|
|
149
157
|
setCredentialsExample: service.setCredentialsExample(serviceName),
|
|
150
158
|
developerNotes: service.info,
|
|
@@ -160,18 +168,13 @@ export async function authList(registry, apiCredentialStore, config, offline = f
|
|
|
160
168
|
}));
|
|
161
169
|
return Object.fromEntries(entries);
|
|
162
170
|
}
|
|
163
|
-
export async function authBrowser(registry, apiCredentialStore, encryptedStorage, config, serviceName, account) {
|
|
171
|
+
export async function authBrowser(registry, apiCredentialStore, encryptedStorage, config, serviceName, account, loginOptions = {}) {
|
|
164
172
|
const service = lookupService(registry, serviceName);
|
|
165
173
|
const session = service.getSession?.(config.appNamePrefix);
|
|
166
174
|
if (!session) {
|
|
167
175
|
throw new BrowserFlowsNotSupportedError(serviceName);
|
|
168
176
|
}
|
|
169
|
-
|
|
170
|
-
// reports who the user signed in as, and that is where the credentials go.
|
|
171
|
-
// A service that does not has no identity to report, so the user names the
|
|
172
|
-
// account with --account — which is what lets such a service hold more than
|
|
173
|
-
// one set of credentials.
|
|
174
|
-
const namesItsOwnAccounts = service.getAccount !== undefined;
|
|
177
|
+
const serviceDetectsLoginAccount = detectsLoginAccount(service);
|
|
175
178
|
// Login reuses previously stored credentials only for service-level
|
|
176
179
|
// artifacts (e.g. an OAuth client), which all of a service's accounts can
|
|
177
180
|
// share. By default the service's preparation (created by `auth prepare` or
|
|
@@ -183,7 +186,7 @@ export async function authBrowser(registry, apiCredentialStore, encryptedStorage
|
|
|
183
186
|
// When the user names the account, naming one that does not exist yet is
|
|
184
187
|
// how a second account is created, so the client falls back to the
|
|
185
188
|
// preparation below instead of being an error.
|
|
186
|
-
if (oldCredentials === null &&
|
|
189
|
+
if (oldCredentials === null && serviceDetectsLoginAccount) {
|
|
187
190
|
throw new AccountNotFoundError(serviceName, account, apiCredentialStore.listAccounts(service.name));
|
|
188
191
|
}
|
|
189
192
|
}
|
|
@@ -192,14 +195,14 @@ export async function authBrowser(registry, apiCredentialStore, encryptedStorage
|
|
|
192
195
|
throw new PreparationRequiredError(serviceName);
|
|
193
196
|
}
|
|
194
197
|
const launchOptions = getBrowserLaunchOptions(config);
|
|
195
|
-
const { credentials, account: loggedInAccount } = await session.login(encryptedStorage, launchOptions, oldCredentials ?? undefined);
|
|
196
|
-
// A service that
|
|
198
|
+
const { credentials, account: loggedInAccount } = await session.login(encryptedStorage, launchOptions, oldCredentials ?? undefined, loginOptions);
|
|
199
|
+
// A service that detects the login account decides where the login goes. For
|
|
197
200
|
// one that does not, the account the login reported means nothing: a
|
|
198
201
|
// registered service built on a family runs the family's session, so the
|
|
199
202
|
// name comes from the family's own public API host rather than from the
|
|
200
203
|
// instance that was actually logged into. So the user's --account decides,
|
|
201
204
|
// and without one the credentials go to the default account.
|
|
202
|
-
const targetAccount =
|
|
205
|
+
const targetAccount = serviceDetectsLoginAccount ? loggedInAccount : (account ?? DEFAULT_ACCOUNT);
|
|
203
206
|
apiCredentialStore.save(service.name, credentials, targetAccount);
|
|
204
207
|
return { account: targetAccount };
|
|
205
208
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharedOperations.js","sourceRoot":"","sources":["../../src/sharedOperations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAuB,MAAM,0BAA0B,CAAC;AAEpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAC7B,iCAAiC,EACjC,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,oBAAoB,EACpB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"sharedOperations.js","sourceRoot":"","sources":["../../src/sharedOperations.ts"],"names":[],"mappings":"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"}
|
package/dist/src/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "3.
|
|
1
|
+
export declare const VERSION = "3.18.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/src/version.js
CHANGED
package/dist/tests/cli.test.js
CHANGED
|
@@ -17,13 +17,14 @@ import { Service } from '../src/services/core/base.js';
|
|
|
17
17
|
import { createMockService, MockService } from './mockService.js';
|
|
18
18
|
import { RegisteredService } from '../src/services/core/registered.js';
|
|
19
19
|
import { GITLAB } from '../src/services/gitlab.js';
|
|
20
|
+
import { SlackApiCredentials } from '../src/services/slack.js';
|
|
20
21
|
import { GITHUB } from '../src/services/github.js';
|
|
21
22
|
import { derivePermissionsOverrideSigningKey, verifyPermissionsOverrideJwt, } from '../src/gateway/permissionsOverride.js';
|
|
22
23
|
import { TELEGRAM } from '../src/services/telegram.js';
|
|
23
24
|
import { GOOGLE_GMAIL } from '../src/services/google/gmail.js';
|
|
24
25
|
import { GOOGLE_DRIVE } from '../src/services/google/drive.js';
|
|
25
26
|
import { GOOGLE_DOCS } from '../src/services/google/docs.js';
|
|
26
|
-
import { deleteRegisteredService, loadRegisteredServices, saveRegisteredService, } from '../src/configDataStore.js';
|
|
27
|
+
import { deleteRegisteredService, loadRegisteredServices, saveRegisteredService, saveBrowserConfig, } from '../src/configDataStore.js';
|
|
27
28
|
import { loadRegisteredServicesIntoServiceRegistry } from '../src/serviceRegistry.js';
|
|
28
29
|
// Use a fixed test key for deterministic test behavior (32 bytes = 256 bits, base64 encoded)
|
|
29
30
|
const TEST_ENCRYPTION_KEY = 'dGVzdGtleXRlc3RrZXl0ZXN0a2V5dGVzdGtleXRlc3Q=';
|
|
@@ -638,6 +639,7 @@ describe('CLI commands with dependency injection', () => {
|
|
|
638
639
|
expect(info.type).toBe('built-in');
|
|
639
640
|
expect(info.baseApiUrls).toEqual(['https://slack.com/api/']);
|
|
640
641
|
expect(info.authOptions).toEqual(['browser', 'set']);
|
|
642
|
+
expect(info.capabilities).toEqual({ detectsLoginAccount: true });
|
|
641
643
|
expect(info.credentials).toEqual({});
|
|
642
644
|
expect(info.setCredentialsExample).toBe('latchkey auth set slack -H "Authorization: Bearer xoxb-your-token"');
|
|
643
645
|
expect(info.developerNotes).toBe('Test info for Slack service.');
|
|
@@ -1932,6 +1934,33 @@ describe('CLI commands with dependency injection', () => {
|
|
|
1932
1934
|
}
|
|
1933
1935
|
}
|
|
1934
1936
|
});
|
|
1937
|
+
it.each([
|
|
1938
|
+
['--strict asks the session for a strict login', ['--strict'], { strict: true }],
|
|
1939
|
+
['logs in leniently without --strict', [], { strict: false }],
|
|
1940
|
+
])('%s', async (_name, extraArguments, expectedLoginOptions) => {
|
|
1941
|
+
const originalPlatform = process.platform;
|
|
1942
|
+
Object.defineProperty(process, 'platform', { value: 'darwin' });
|
|
1943
|
+
try {
|
|
1944
|
+
const login = vi.fn().mockResolvedValue({
|
|
1945
|
+
credentials: new SlackApiCredentials('xoxc-token', 'cookie'),
|
|
1946
|
+
account: 'user@example.com',
|
|
1947
|
+
});
|
|
1948
|
+
const service = createMockService({ getSession: vi.fn().mockReturnValue({ login }) });
|
|
1949
|
+
const deps = createMockDependencies({ registry: new ServiceRegistry([service]) });
|
|
1950
|
+
saveBrowserConfig(deps.config.configPath, {
|
|
1951
|
+
executablePath: process.execPath,
|
|
1952
|
+
source: 'system',
|
|
1953
|
+
discoveredAt: new Date().toISOString(),
|
|
1954
|
+
});
|
|
1955
|
+
await runCommand(['auth', 'browser', 'slack', ...extraArguments], deps);
|
|
1956
|
+
expect(exitCode).toBeNull();
|
|
1957
|
+
expect(login.mock.calls[0]?.[3]).toEqual(expectedLoginOptions);
|
|
1958
|
+
expect(logs).toContain("Done. Stored credentials for account 'user@example.com'.");
|
|
1959
|
+
}
|
|
1960
|
+
finally {
|
|
1961
|
+
Object.defineProperty(process, 'platform', { value: originalPlatform });
|
|
1962
|
+
}
|
|
1963
|
+
});
|
|
1935
1964
|
it('should suggest set-nocurl when service supports nocurl credentials', async () => {
|
|
1936
1965
|
const nocurlService = createMockService({
|
|
1937
1966
|
name: 'nocurl-only',
|
|
@@ -2739,6 +2768,18 @@ describe('CLI commands with dependency injection', () => {
|
|
|
2739
2768
|
});
|
|
2740
2769
|
expect(logs).toContain('Done');
|
|
2741
2770
|
});
|
|
2771
|
+
it('forwards `auth browser --strict` to the gateway as a strict login', async () => {
|
|
2772
|
+
const fetchMock = makeFetchMock(new Response(JSON.stringify({ result: null }), { status: 200 }));
|
|
2773
|
+
const deps = createMockDependencies({
|
|
2774
|
+
config: createMockConfig({ gatewayUrl: GATEWAY_URL }),
|
|
2775
|
+
});
|
|
2776
|
+
await runCommand(['auth', 'browser', 'slack', '--strict'], deps);
|
|
2777
|
+
const [, init] = fetchMock.mock.calls[0];
|
|
2778
|
+
expect(JSON.parse(init.body)).toEqual({
|
|
2779
|
+
command: 'auth browser',
|
|
2780
|
+
params: { serviceName: 'slack', strict: true },
|
|
2781
|
+
});
|
|
2782
|
+
});
|
|
2742
2783
|
it('reports the account returned by the gateway for `auth browser`', async () => {
|
|
2743
2784
|
makeFetchMock(new Response(JSON.stringify({ result: { account: 'user@example.com' } }), { status: 200 }));
|
|
2744
2785
|
const deps = createMockDependencies({
|