@portaidentity/cli 1.7.3 → 1.9.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/CHANGELOG.md +18 -0
- package/README.md +125 -105
- package/dist/admin/admin-date-time.d.ts +6 -0
- package/dist/admin/admin-date-time.d.ts.map +1 -0
- package/dist/admin/admin-date-time.js +33 -0
- package/dist/admin/admin-date-time.js.map +1 -0
- package/dist/admin/application-client-features.d.ts +38 -0
- package/dist/admin/application-client-features.d.ts.map +1 -0
- package/dist/admin/application-client-features.js +545 -0
- package/dist/admin/application-client-features.js.map +1 -0
- package/dist/admin/application-controller.d.ts +58 -0
- package/dist/admin/application-controller.d.ts.map +1 -0
- package/dist/admin/application-controller.js +286 -0
- package/dist/admin/application-controller.js.map +1 -0
- package/dist/admin/application-dialogs.d.ts +91 -0
- package/dist/admin/application-dialogs.d.ts.map +1 -0
- package/dist/admin/application-dialogs.js +250 -0
- package/dist/admin/application-dialogs.js.map +1 -0
- package/dist/admin/application-rbac-controller.d.ts +56 -0
- package/dist/admin/application-rbac-controller.d.ts.map +1 -0
- package/dist/admin/application-rbac-controller.js +280 -0
- package/dist/admin/application-rbac-controller.js.map +1 -0
- package/dist/admin/application-rbac-features.d.ts +51 -0
- package/dist/admin/application-rbac-features.d.ts.map +1 -0
- package/dist/admin/application-rbac-features.js +175 -0
- package/dist/admin/application-rbac-features.js.map +1 -0
- package/dist/admin/application-rbac-workspace.d.ts +62 -0
- package/dist/admin/application-rbac-workspace.d.ts.map +1 -0
- package/dist/admin/application-rbac-workspace.js +344 -0
- package/dist/admin/application-rbac-workspace.js.map +1 -0
- package/dist/admin/application-runtime.d.ts +44 -0
- package/dist/admin/application-runtime.d.ts.map +1 -0
- package/dist/admin/application-runtime.js +183 -0
- package/dist/admin/application-runtime.js.map +1 -0
- package/dist/admin/application-service.d.ts +39 -0
- package/dist/admin/application-service.d.ts.map +1 -0
- package/dist/admin/application-service.js +248 -0
- package/dist/admin/application-service.js.map +1 -0
- package/dist/admin/application-state.d.ts +109 -0
- package/dist/admin/application-state.d.ts.map +1 -0
- package/dist/admin/application-state.js +3 -0
- package/dist/admin/application-state.js.map +1 -0
- package/dist/admin/application-workspace.d.ts +77 -0
- package/dist/admin/application-workspace.d.ts.map +1 -0
- package/dist/admin/application-workspace.js +302 -0
- package/dist/admin/application-workspace.js.map +1 -0
- package/dist/admin/application.d.ts +88 -0
- package/dist/admin/application.d.ts.map +1 -0
- package/dist/admin/application.js +932 -0
- package/dist/admin/application.js.map +1 -0
- package/dist/admin/client-authentication-dialog.d.ts +77 -0
- package/dist/admin/client-authentication-dialog.d.ts.map +1 -0
- package/dist/admin/client-authentication-dialog.js +217 -0
- package/dist/admin/client-authentication-dialog.js.map +1 -0
- package/dist/admin/client-controller.d.ts +58 -0
- package/dist/admin/client-controller.d.ts.map +1 -0
- package/dist/admin/client-controller.js +462 -0
- package/dist/admin/client-controller.js.map +1 -0
- package/dist/admin/client-credential-dialogs.d.ts +36 -0
- package/dist/admin/client-credential-dialogs.d.ts.map +1 -0
- package/dist/admin/client-credential-dialogs.js +145 -0
- package/dist/admin/client-credential-dialogs.js.map +1 -0
- package/dist/admin/client-dialogs.d.ts +64 -0
- package/dist/admin/client-dialogs.d.ts.map +1 -0
- package/dist/admin/client-dialogs.js +110 -0
- package/dist/admin/client-dialogs.js.map +1 -0
- package/dist/admin/client-form-scroller.d.ts +17 -0
- package/dist/admin/client-form-scroller.d.ts.map +1 -0
- package/dist/admin/client-form-scroller.js +67 -0
- package/dist/admin/client-form-scroller.js.map +1 -0
- package/dist/admin/client-registration-dialog.d.ts +27 -0
- package/dist/admin/client-registration-dialog.d.ts.map +1 -0
- package/dist/admin/client-registration-dialog.js +195 -0
- package/dist/admin/client-registration-dialog.js.map +1 -0
- package/dist/admin/client-service.d.ts +41 -0
- package/dist/admin/client-service.d.ts.map +1 -0
- package/dist/admin/client-service.js +486 -0
- package/dist/admin/client-service.js.map +1 -0
- package/dist/admin/client-state.d.ts +159 -0
- package/dist/admin/client-state.d.ts.map +1 -0
- package/dist/admin/client-state.js +3 -0
- package/dist/admin/client-state.js.map +1 -0
- package/dist/admin/client-workspace.d.ts +88 -0
- package/dist/admin/client-workspace.d.ts.map +1 -0
- package/dist/admin/client-workspace.js +491 -0
- package/dist/admin/client-workspace.js.map +1 -0
- package/dist/admin/delete-confirmation-layout.d.ts +38 -0
- package/dist/admin/delete-confirmation-layout.d.ts.map +1 -0
- package/dist/admin/delete-confirmation-layout.js +52 -0
- package/dist/admin/delete-confirmation-layout.js.map +1 -0
- package/dist/admin/index.d.ts +64 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +31 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/organization-controller.d.ts +77 -0
- package/dist/admin/organization-controller.d.ts.map +1 -0
- package/dist/admin/organization-controller.js +472 -0
- package/dist/admin/organization-controller.js.map +1 -0
- package/dist/admin/organization-dialogs.d.ts +63 -0
- package/dist/admin/organization-dialogs.d.ts.map +1 -0
- package/dist/admin/organization-dialogs.js +303 -0
- package/dist/admin/organization-dialogs.js.map +1 -0
- package/dist/admin/organization-service.d.ts +110 -0
- package/dist/admin/organization-service.d.ts.map +1 -0
- package/dist/admin/organization-service.js +548 -0
- package/dist/admin/organization-service.js.map +1 -0
- package/dist/admin/organization-workspace.d.ts +29 -0
- package/dist/admin/organization-workspace.d.ts.map +1 -0
- package/dist/admin/organization-workspace.js +421 -0
- package/dist/admin/organization-workspace.js.map +1 -0
- package/dist/admin/portability-controller.d.ts +83 -0
- package/dist/admin/portability-controller.d.ts.map +1 -0
- package/dist/admin/portability-controller.js +466 -0
- package/dist/admin/portability-controller.js.map +1 -0
- package/dist/admin/portability-service.d.ts +31 -0
- package/dist/admin/portability-service.d.ts.map +1 -0
- package/dist/admin/portability-service.js +51 -0
- package/dist/admin/portability-service.js.map +1 -0
- package/dist/admin/portability-state.d.ts +88 -0
- package/dist/admin/portability-state.d.ts.map +1 -0
- package/dist/admin/portability-state.js +3 -0
- package/dist/admin/portability-state.js.map +1 -0
- package/dist/admin/portability-workspace.d.ts +78 -0
- package/dist/admin/portability-workspace.d.ts.map +1 -0
- package/dist/admin/portability-workspace.js +337 -0
- package/dist/admin/portability-workspace.js.map +1 -0
- package/dist/admin/presentation.d.ts +46 -0
- package/dist/admin/presentation.d.ts.map +1 -0
- package/dist/admin/presentation.js +271 -0
- package/dist/admin/presentation.js.map +1 -0
- package/dist/admin/rbac-dialogs.d.ts +73 -0
- package/dist/admin/rbac-dialogs.d.ts.map +1 -0
- package/dist/admin/rbac-dialogs.js +345 -0
- package/dist/admin/rbac-dialogs.js.map +1 -0
- package/dist/admin/rbac-service.d.ts +47 -0
- package/dist/admin/rbac-service.d.ts.map +1 -0
- package/dist/admin/rbac-service.js +258 -0
- package/dist/admin/rbac-service.js.map +1 -0
- package/dist/admin/rbac-state.d.ts +129 -0
- package/dist/admin/rbac-state.d.ts.map +1 -0
- package/dist/admin/rbac-state.js +136 -0
- package/dist/admin/rbac-state.js.map +1 -0
- package/dist/admin/selectable-read-only-input.d.ts +18 -0
- package/dist/admin/selectable-read-only-input.d.ts.map +1 -0
- package/dist/admin/selectable-read-only-input.js +24 -0
- package/dist/admin/selectable-read-only-input.js.map +1 -0
- package/dist/admin/session-service.d.ts +169 -0
- package/dist/admin/session-service.d.ts.map +1 -0
- package/dist/admin/session-service.js +353 -0
- package/dist/admin/session-service.js.map +1 -0
- package/dist/admin/state.d.ts +301 -0
- package/dist/admin/state.d.ts.map +1 -0
- package/dist/admin/state.js +10 -0
- package/dist/admin/state.js.map +1 -0
- package/dist/admin/system-config-controller.d.ts +58 -0
- package/dist/admin/system-config-controller.d.ts.map +1 -0
- package/dist/admin/system-config-controller.js +218 -0
- package/dist/admin/system-config-controller.js.map +1 -0
- package/dist/admin/system-config-service.d.ts +54 -0
- package/dist/admin/system-config-service.d.ts.map +1 -0
- package/dist/admin/system-config-service.js +180 -0
- package/dist/admin/system-config-service.js.map +1 -0
- package/dist/admin/system-config-state.d.ts +77 -0
- package/dist/admin/system-config-state.d.ts.map +1 -0
- package/dist/admin/system-config-state.js +78 -0
- package/dist/admin/system-config-state.js.map +1 -0
- package/dist/admin/system-config-workspace.d.ts +47 -0
- package/dist/admin/system-config-workspace.d.ts.map +1 -0
- package/dist/admin/system-config-workspace.js +217 -0
- package/dist/admin/system-config-workspace.js.map +1 -0
- package/dist/admin/user-controller-types.d.ts +67 -0
- package/dist/admin/user-controller-types.d.ts.map +1 -0
- package/dist/admin/user-controller-types.js +3 -0
- package/dist/admin/user-controller-types.js.map +1 -0
- package/dist/admin/user-controller.d.ts +6 -0
- package/dist/admin/user-controller.d.ts.map +1 -0
- package/dist/admin/user-controller.js +674 -0
- package/dist/admin/user-controller.js.map +1 -0
- package/dist/admin/user-dialog-fields.d.ts +44 -0
- package/dist/admin/user-dialog-fields.d.ts.map +1 -0
- package/dist/admin/user-dialog-fields.js +130 -0
- package/dist/admin/user-dialog-fields.js.map +1 -0
- package/dist/admin/user-dialogs.d.ts +66 -0
- package/dist/admin/user-dialogs.d.ts.map +1 -0
- package/dist/admin/user-dialogs.js +374 -0
- package/dist/admin/user-dialogs.js.map +1 -0
- package/dist/admin/user-role-controller.d.ts +82 -0
- package/dist/admin/user-role-controller.d.ts.map +1 -0
- package/dist/admin/user-role-controller.js +337 -0
- package/dist/admin/user-role-controller.js.map +1 -0
- package/dist/admin/user-role-dialog.d.ts +94 -0
- package/dist/admin/user-role-dialog.d.ts.map +1 -0
- package/dist/admin/user-role-dialog.js +265 -0
- package/dist/admin/user-role-dialog.js.map +1 -0
- package/dist/admin/user-service-types.d.ts +100 -0
- package/dist/admin/user-service-types.d.ts.map +1 -0
- package/dist/admin/user-service-types.js +3 -0
- package/dist/admin/user-service-types.js.map +1 -0
- package/dist/admin/user-service.d.ts +14 -0
- package/dist/admin/user-service.d.ts.map +1 -0
- package/dist/admin/user-service.js +612 -0
- package/dist/admin/user-service.js.map +1 -0
- package/dist/admin/user-state.d.ts +158 -0
- package/dist/admin/user-state.d.ts.map +1 -0
- package/dist/admin/user-state.js +3 -0
- package/dist/admin/user-state.js.map +1 -0
- package/dist/admin/user-workspace.d.ts +65 -0
- package/dist/admin/user-workspace.d.ts.map +1 -0
- package/dist/admin/user-workspace.js +366 -0
- package/dist/admin/user-workspace.js.map +1 -0
- package/dist/auth/browser-flow.d.ts +27 -1
- package/dist/auth/browser-flow.d.ts.map +1 -1
- package/dist/auth/browser-flow.js +55 -33
- package/dist/auth/browser-flow.js.map +1 -1
- package/dist/auth/callback-server.d.ts.map +1 -1
- package/dist/auth/callback-server.js +5 -9
- package/dist/auth/callback-server.js.map +1 -1
- package/dist/auth/id-token-verifier.d.ts +39 -0
- package/dist/auth/id-token-verifier.d.ts.map +1 -0
- package/dist/auth/id-token-verifier.js +104 -0
- package/dist/auth/id-token-verifier.js.map +1 -0
- package/dist/auth/login-coordinator.d.ts +72 -0
- package/dist/auth/login-coordinator.d.ts.map +1 -0
- package/dist/auth/login-coordinator.js +190 -0
- package/dist/auth/login-coordinator.js.map +1 -0
- package/dist/auth/metadata.d.ts +2 -1
- package/dist/auth/metadata.d.ts.map +1 -1
- package/dist/auth/metadata.js +67 -6
- package/dist/auth/metadata.js.map +1 -1
- package/dist/auth/types.d.ts +14 -0
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/client-factory.d.ts.map +1 -1
- package/dist/client-factory.js +15 -2
- package/dist/client-factory.js.map +1 -1
- package/dist/commands/admin.d.ts +22 -0
- package/dist/commands/admin.d.ts.map +1 -0
- package/dist/commands/admin.js +112 -0
- package/dist/commands/admin.js.map +1 -0
- package/dist/commands/app-claim.d.ts.map +1 -1
- package/dist/commands/app-claim.js +11 -4
- package/dist/commands/app-claim.js.map +1 -1
- package/dist/commands/app-module.d.ts.map +1 -1
- package/dist/commands/app-module.js +61 -12
- package/dist/commands/app-module.js.map +1 -1
- package/dist/commands/app-permission.d.ts.map +1 -1
- package/dist/commands/app-permission.js +66 -24
- package/dist/commands/app-permission.js.map +1 -1
- package/dist/commands/app-role.d.ts.map +1 -1
- package/dist/commands/app-role.js +48 -27
- package/dist/commands/app-role.js.map +1 -1
- package/dist/commands/app.d.ts.map +1 -1
- package/dist/commands/app.js +37 -25
- package/dist/commands/app.js.map +1 -1
- package/dist/commands/bulk.d.ts.map +1 -1
- package/dist/commands/bulk.js +9 -2
- package/dist/commands/bulk.js.map +1 -1
- package/dist/commands/client-secret.d.ts.map +1 -1
- package/dist/commands/client-secret.js +12 -6
- package/dist/commands/client-secret.js.map +1 -1
- package/dist/commands/client.d.ts +3 -2
- package/dist/commands/client.d.ts.map +1 -1
- package/dist/commands/client.js +102 -43
- package/dist/commands/client.js.map +1 -1
- package/dist/commands/config.d.ts +4 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +68 -7
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/export.d.ts +6 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +182 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/import.d.ts +6 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +142 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/keys.d.ts.map +1 -1
- package/dist/commands/keys.js +11 -4
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +24 -10
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/org.d.ts +2 -4
- package/dist/commands/org.d.ts.map +1 -1
- package/dist/commands/org.js +16 -76
- package/dist/commands/org.js.map +1 -1
- package/dist/commands/user-role.d.ts.map +1 -1
- package/dist/commands/user-role.js +19 -14
- package/dist/commands/user-role.js.map +1 -1
- package/dist/commands/user.d.ts +3 -2
- package/dist/commands/user.d.ts.map +1 -1
- package/dist/commands/user.js +47 -71
- package/dist/commands/user.js.map +1 -1
- package/dist/commands/version.d.ts +1 -1
- package/dist/commands/version.js +1 -1
- package/dist/credential-lock.d.ts +20 -0
- package/dist/credential-lock.d.ts.map +1 -0
- package/dist/credential-lock.js +130 -0
- package/dist/credential-lock.js.map +1 -0
- package/dist/credential-store.d.ts +14 -0
- package/dist/credential-store.d.ts.map +1 -1
- package/dist/credential-store.js +114 -3
- package/dist/credential-store.js.map +1 -1
- package/dist/error-handler.d.ts.map +1 -1
- package/dist/error-handler.js +2 -0
- package/dist/error-handler.js.map +1 -1
- package/dist/global-options.d.ts +8 -0
- package/dist/global-options.d.ts.map +1 -1
- package/dist/global-options.js +19 -8
- package/dist/global-options.js.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/output.d.ts +11 -0
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +25 -6
- package/dist/output.js.map +1 -1
- package/dist/prompt.d.ts +2 -2
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +27 -7
- package/dist/prompt.js.map +1 -1
- package/package.json +7 -3
- package/dist/commands/gui.d.ts +0 -21
- package/dist/commands/gui.d.ts.map +0 -1
- package/dist/commands/gui.js +0 -67
- package/dist/commands/gui.js.map +0 -1
- package/dist/commands/provision.d.ts +0 -47
- package/dist/commands/provision.d.ts.map +0 -1
- package/dist/commands/provision.js +0 -444
- package/dist/commands/provision.js.map +0 -1
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/** UI-neutral coordination for the CLI Authorization Code + PKCE flow. */
|
|
2
|
+
import open from 'open';
|
|
3
|
+
import { MANUAL_REDIRECT_URI, startCallbackServer } from './callback-server.js';
|
|
4
|
+
import { exchangeAuthorizationCode } from './browser-flow.js';
|
|
5
|
+
import { fetchIssuerJwks, verifyCliIdToken } from './id-token-verifier.js';
|
|
6
|
+
import { fetchAdminMetadata } from './metadata.js';
|
|
7
|
+
import { generateCodeChallenge, generateCodeVerifier, generateState } from './pkce.js';
|
|
8
|
+
import { fetchVerifiedUserInfo } from '../admin/session-service.js';
|
|
9
|
+
const AUTHORIZATION_SCOPES = 'openid profile email offline_access';
|
|
10
|
+
/** Keeps a definite credential-write failure distinct from cancellation. */
|
|
11
|
+
class CredentialPersistenceError extends Error {
|
|
12
|
+
/** Creates a sanitized persistence failure while retaining its internal cause. */
|
|
13
|
+
constructor(cause) {
|
|
14
|
+
super('Unable to save credentials.', { cause });
|
|
15
|
+
this.name = 'CredentialPersistenceError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/** Creates fresh state, PKCE, and nonce values for one browser request. */
|
|
19
|
+
export async function createAuthorizationRequest(options) {
|
|
20
|
+
const state = generateState();
|
|
21
|
+
const nonce = generateState();
|
|
22
|
+
const codeVerifier = generateCodeVerifier();
|
|
23
|
+
const redirectUri = options.redirectUri ?? MANUAL_REDIRECT_URI;
|
|
24
|
+
const url = new URL(`${options.issuer.replace(/\/+$/, '')}/auth`);
|
|
25
|
+
url.searchParams.set('response_type', 'code');
|
|
26
|
+
url.searchParams.set('client_id', options.clientId);
|
|
27
|
+
url.searchParams.set('redirect_uri', redirectUri);
|
|
28
|
+
url.searchParams.set('scope', AUTHORIZATION_SCOPES);
|
|
29
|
+
url.searchParams.set('code_challenge', generateCodeChallenge(codeVerifier));
|
|
30
|
+
url.searchParams.set('code_challenge_method', 'S256');
|
|
31
|
+
url.searchParams.set('state', state);
|
|
32
|
+
url.searchParams.set('nonce', nonce);
|
|
33
|
+
url.searchParams.set('prompt', 'login consent');
|
|
34
|
+
return { url, state, nonce, codeVerifier, redirectUri };
|
|
35
|
+
}
|
|
36
|
+
/** Validates one callback URL against its exact request state. */
|
|
37
|
+
export function validateAuthorizationCallback(callbackUrl, request) {
|
|
38
|
+
try {
|
|
39
|
+
const url = new URL(callbackUrl);
|
|
40
|
+
const expected = new URL(request.redirectUri);
|
|
41
|
+
const code = url.searchParams.get('code');
|
|
42
|
+
if (url.origin !== expected.origin ||
|
|
43
|
+
url.pathname !== expected.pathname ||
|
|
44
|
+
url.username ||
|
|
45
|
+
url.password ||
|
|
46
|
+
url.hash ||
|
|
47
|
+
url.searchParams.get('state') !== request.state ||
|
|
48
|
+
!code ||
|
|
49
|
+
code.length > 4_096) {
|
|
50
|
+
throw new Error('Invalid callback');
|
|
51
|
+
}
|
|
52
|
+
return code;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
throw new Error('Authentication failed');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** Returns true only for cancellation raised by a caller-owned signal. */
|
|
59
|
+
function isAbortError(error) {
|
|
60
|
+
return error instanceof DOMException && error.name === 'AbortError';
|
|
61
|
+
}
|
|
62
|
+
/** Ignores late UI completions once the owning operation is cancelled. */
|
|
63
|
+
async function waitForInteraction(operation, signal) {
|
|
64
|
+
if (signal.aborted)
|
|
65
|
+
throw new DOMException('The operation was aborted', 'AbortError');
|
|
66
|
+
return new Promise((resolveInteraction, rejectInteraction) => {
|
|
67
|
+
const abort = () => rejectInteraction(new DOMException('The operation was aborted', 'AbortError'));
|
|
68
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
69
|
+
operation.then(resolveInteraction, rejectInteraction).finally(() => {
|
|
70
|
+
signal.removeEventListener('abort', abort);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/** Waits for a callback while ensuring cancellation closes its listener. */
|
|
75
|
+
async function waitForBrowserCallback(callback, close, signal) {
|
|
76
|
+
if (signal.aborted) {
|
|
77
|
+
close();
|
|
78
|
+
throw new DOMException('The operation was aborted', 'AbortError');
|
|
79
|
+
}
|
|
80
|
+
return new Promise((resolveCallback, rejectCallback) => {
|
|
81
|
+
const abort = () => {
|
|
82
|
+
close();
|
|
83
|
+
rejectCallback(new DOMException('The operation was aborted', 'AbortError'));
|
|
84
|
+
};
|
|
85
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
86
|
+
callback.then(resolveCallback, rejectCallback).finally(() => {
|
|
87
|
+
signal.removeEventListener('abort', abort);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/** Completes one authentication attempt and persists only verified credentials. */
|
|
92
|
+
export async function authenticateCliSession(request, interaction, options) {
|
|
93
|
+
if (options.signal.aborted)
|
|
94
|
+
return { status: 'cancelled' };
|
|
95
|
+
try {
|
|
96
|
+
const server = request.server.toString().replace(/\/$/, '');
|
|
97
|
+
const metadata = await fetchAdminMetadata(server, options);
|
|
98
|
+
let authorization = await createAuthorizationRequest({
|
|
99
|
+
issuer: metadata.issuer,
|
|
100
|
+
clientId: request.clientId ?? metadata.clientId,
|
|
101
|
+
});
|
|
102
|
+
let code;
|
|
103
|
+
if (request.noBrowser) {
|
|
104
|
+
await waitForInteraction(interaction.presentAuthorizationUrl(authorization.url, options.signal), options.signal);
|
|
105
|
+
code = validateAuthorizationCallback(await waitForInteraction(interaction.requestManualCallback(options.signal), options.signal), authorization);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const callbackServer = await startCallbackServer(authorization.state);
|
|
109
|
+
const redirectUri = `http://127.0.0.1:${callbackServer.port}/callback`;
|
|
110
|
+
authorization.url.searchParams.set('redirect_uri', redirectUri);
|
|
111
|
+
authorization = { ...authorization, redirectUri };
|
|
112
|
+
const openBrowser = request.openBrowser ?? (async (url) => open(url.toString()));
|
|
113
|
+
try {
|
|
114
|
+
await waitForInteraction(openBrowser(authorization.url), options.signal);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
callbackServer.close();
|
|
118
|
+
if (isAbortError(error) || options.signal.aborted)
|
|
119
|
+
throw error;
|
|
120
|
+
await waitForInteraction(interaction.presentAuthorizationUrl(authorization.url, options.signal), options.signal);
|
|
121
|
+
code = validateAuthorizationCallback(await waitForInteraction(interaction.requestManualCallback(options.signal), options.signal), authorization);
|
|
122
|
+
return await finishAuthentication(request, interaction, options, metadata, authorization, code, server);
|
|
123
|
+
}
|
|
124
|
+
code = await waitForBrowserCallback(callbackServer.authCode, callbackServer.close, options.signal);
|
|
125
|
+
}
|
|
126
|
+
return await finishAuthentication(request, interaction, options, metadata, authorization, code, server);
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
if (error instanceof CredentialPersistenceError)
|
|
130
|
+
throw error;
|
|
131
|
+
if (options.signal.aborted || isAbortError(error))
|
|
132
|
+
return { status: 'cancelled' };
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/** Completes token verification, replacement approval, and persistence. */
|
|
137
|
+
async function finishAuthentication(request, interaction, options, metadata, authorization, code, server) {
|
|
138
|
+
const clientId = request.clientId ?? metadata.clientId;
|
|
139
|
+
const tokens = await exchangeAuthorizationCode({
|
|
140
|
+
tokenEndpoint: `${metadata.issuer.replace(/\/+$/, '')}/token`,
|
|
141
|
+
clientId,
|
|
142
|
+
code,
|
|
143
|
+
codeVerifier: authorization.codeVerifier,
|
|
144
|
+
redirectUri: authorization.redirectUri,
|
|
145
|
+
}, options);
|
|
146
|
+
const jwks = await fetchIssuerJwks(`${metadata.issuer.replace(/\/+$/, '')}/jwks`, options);
|
|
147
|
+
const idTokenIdentity = await verifyCliIdToken({
|
|
148
|
+
token: tokens.id_token,
|
|
149
|
+
issuer: metadata.issuer,
|
|
150
|
+
clientId,
|
|
151
|
+
nonce: authorization.nonce,
|
|
152
|
+
jwks,
|
|
153
|
+
});
|
|
154
|
+
const profile = await fetchVerifiedUserInfo({
|
|
155
|
+
selectedServer: request.server,
|
|
156
|
+
orgSlug: metadata.orgSlug,
|
|
157
|
+
accessToken: tokens.access_token,
|
|
158
|
+
originalSubject: idTokenIdentity.sub,
|
|
159
|
+
}, options);
|
|
160
|
+
const { identity } = profile;
|
|
161
|
+
const credentials = {
|
|
162
|
+
server,
|
|
163
|
+
orgSlug: metadata.orgSlug,
|
|
164
|
+
clientId,
|
|
165
|
+
accessToken: tokens.access_token,
|
|
166
|
+
refreshToken: tokens.refresh_token,
|
|
167
|
+
idToken: tokens.id_token,
|
|
168
|
+
expiresAt: new Date(Date.now() + tokens.expires_in * 1000).toISOString(),
|
|
169
|
+
userInfo: {
|
|
170
|
+
sub: identity.sub,
|
|
171
|
+
email: identity.email ?? '',
|
|
172
|
+
name: identity.name,
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
if (request.currentServer && request.currentServer.origin !== request.server.origin) {
|
|
176
|
+
const approved = await waitForInteraction(interaction.confirmCredentialReplacement(request.currentServer, request.server, options.signal), options.signal);
|
|
177
|
+
if (!approved)
|
|
178
|
+
return { status: 'cancelled' };
|
|
179
|
+
}
|
|
180
|
+
if (options.signal.aborted)
|
|
181
|
+
return { status: 'cancelled' };
|
|
182
|
+
try {
|
|
183
|
+
await request.persistCredentials?.(credentials);
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
throw new CredentialPersistenceError(error);
|
|
187
|
+
}
|
|
188
|
+
return { status: 'authenticated', identity, capabilities: profile.capabilities, credentials };
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=login-coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-coordinator.js","sourceRoot":"","sources":["../../src/auth/login-coordinator.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/metadata.d.ts
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* @module auth/metadata
|
|
11
11
|
*/
|
|
12
12
|
import type { AdminMetadata } from './types.js';
|
|
13
|
+
import type { CliAuthOperationOptions } from './types.js';
|
|
13
14
|
/**
|
|
14
15
|
* Fetch admin metadata from the Porta server.
|
|
15
16
|
*
|
|
@@ -20,7 +21,7 @@ import type { AdminMetadata } from './types.js';
|
|
|
20
21
|
* @returns Admin metadata (issuer, clientId, orgSlug)
|
|
21
22
|
* @throws Error if the server is not reachable or not initialized
|
|
22
23
|
*/
|
|
23
|
-
export declare function fetchAdminMetadata(server: string): Promise<AdminMetadata>;
|
|
24
|
+
export declare function fetchAdminMetadata(server: string, options?: CliAuthOperationOptions): Promise<AdminMetadata>;
|
|
24
25
|
/**
|
|
25
26
|
* Health check response from `GET /health`.
|
|
26
27
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/auth/metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/auth/metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAkD1D;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,aAAa,CAAC,CAuCxB;AAMD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAatF"}
|
package/dist/auth/metadata.js
CHANGED
|
@@ -9,6 +9,45 @@
|
|
|
9
9
|
*
|
|
10
10
|
* @module auth/metadata
|
|
11
11
|
*/
|
|
12
|
+
const ORGANIZATION_SLUG = /^[a-z0-9][a-z0-9-]{1,98}[a-z0-9]$/;
|
|
13
|
+
/** Returns true for a bounded, non-empty discovery string. */
|
|
14
|
+
function isDiscoveryString(value, maximumLength) {
|
|
15
|
+
return typeof value === 'string' && value.length > 0 && value.length <= maximumLength;
|
|
16
|
+
}
|
|
17
|
+
/** Validates metadata and binds its issuer to the selected Porta origin. */
|
|
18
|
+
function parseAdminMetadata(value, server) {
|
|
19
|
+
if (!value || typeof value !== 'object')
|
|
20
|
+
throw new Error('Authentication failed');
|
|
21
|
+
const candidate = value;
|
|
22
|
+
if (!isDiscoveryString(candidate.clientId, 256) ||
|
|
23
|
+
!isDiscoveryString(candidate.orgSlug, 100) ||
|
|
24
|
+
!ORGANIZATION_SLUG.test(candidate.orgSlug) ||
|
|
25
|
+
!isDiscoveryString(candidate.issuer, 2_048)) {
|
|
26
|
+
throw new Error('Authentication failed');
|
|
27
|
+
}
|
|
28
|
+
let issuer;
|
|
29
|
+
try {
|
|
30
|
+
issuer = new URL(candidate.issuer);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
throw new Error('Authentication failed');
|
|
34
|
+
}
|
|
35
|
+
const expectedPath = `/${candidate.orgSlug}`;
|
|
36
|
+
if (issuer.protocol !== 'https:' ||
|
|
37
|
+
issuer.username ||
|
|
38
|
+
issuer.password ||
|
|
39
|
+
issuer.origin !== server.origin ||
|
|
40
|
+
issuer.pathname.replace(/\/+$/, '') !== expectedPath ||
|
|
41
|
+
issuer.search ||
|
|
42
|
+
issuer.hash) {
|
|
43
|
+
throw new Error('Authentication failed');
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
issuer: issuer.toString().replace(/\/$/, ''),
|
|
47
|
+
clientId: candidate.clientId,
|
|
48
|
+
orgSlug: candidate.orgSlug,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
12
51
|
// ---------------------------------------------------------------------------
|
|
13
52
|
// Metadata Fetch
|
|
14
53
|
// ---------------------------------------------------------------------------
|
|
@@ -22,15 +61,32 @@
|
|
|
22
61
|
* @returns Admin metadata (issuer, clientId, orgSlug)
|
|
23
62
|
* @throws Error if the server is not reachable or not initialized
|
|
24
63
|
*/
|
|
25
|
-
export async function fetchAdminMetadata(server) {
|
|
64
|
+
export async function fetchAdminMetadata(server, options) {
|
|
65
|
+
let selectedServer;
|
|
66
|
+
try {
|
|
67
|
+
selectedServer = new URL(server);
|
|
68
|
+
if (selectedServer.protocol !== 'https:' ||
|
|
69
|
+
selectedServer.username ||
|
|
70
|
+
selectedServer.password ||
|
|
71
|
+
!/^\/*$/.test(selectedServer.pathname) ||
|
|
72
|
+
selectedServer.search ||
|
|
73
|
+
selectedServer.hash) {
|
|
74
|
+
throw new Error('invalid server');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
throw new Error('Authentication failed');
|
|
79
|
+
}
|
|
26
80
|
let response;
|
|
27
81
|
try {
|
|
28
|
-
response = await fetch(`${
|
|
29
|
-
signal: AbortSignal.timeout(10_000),
|
|
82
|
+
response = await fetch(`${selectedServer.origin}/api/admin/metadata`, {
|
|
83
|
+
signal: options?.signal ?? AbortSignal.timeout(10_000),
|
|
30
84
|
});
|
|
31
85
|
}
|
|
32
|
-
catch {
|
|
33
|
-
|
|
86
|
+
catch (error) {
|
|
87
|
+
if (error instanceof DOMException && error.name === 'AbortError')
|
|
88
|
+
throw error;
|
|
89
|
+
throw new Error('Cannot connect to the Porta server. Is it running?', { cause: error });
|
|
34
90
|
}
|
|
35
91
|
if (!response.ok) {
|
|
36
92
|
if (response.status === 503) {
|
|
@@ -38,7 +94,12 @@ export async function fetchAdminMetadata(server) {
|
|
|
38
94
|
}
|
|
39
95
|
throw new Error(`Cannot fetch admin metadata: HTTP ${response.status}`);
|
|
40
96
|
}
|
|
41
|
-
|
|
97
|
+
try {
|
|
98
|
+
return parseAdminMetadata(await response.json(), selectedServer);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
throw new Error('Authentication failed');
|
|
102
|
+
}
|
|
42
103
|
}
|
|
43
104
|
/**
|
|
44
105
|
* Check server health via `GET /health`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/auth/metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/auth/metadata.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/types.d.ts
CHANGED
|
@@ -80,4 +80,18 @@ export interface AuthFlowResult {
|
|
|
80
80
|
name?: string;
|
|
81
81
|
};
|
|
82
82
|
}
|
|
83
|
+
/** Allowlisted identity claims accepted from a verified OIDC ID token. */
|
|
84
|
+
export interface VerifiedIdentity {
|
|
85
|
+
/** Stable, non-empty OIDC subject identifier. */
|
|
86
|
+
readonly sub: string;
|
|
87
|
+
/** Optional verified display email. */
|
|
88
|
+
readonly email?: string;
|
|
89
|
+
/** Optional verified display name. */
|
|
90
|
+
readonly name?: string;
|
|
91
|
+
}
|
|
92
|
+
/** Cancellation boundary shared by authentication network operations. */
|
|
93
|
+
export interface CliAuthOperationOptions {
|
|
94
|
+
/** Aborts the active request without accepting late results. */
|
|
95
|
+
readonly signal: AbortSignal;
|
|
96
|
+
}
|
|
83
97
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/auth/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,QAAQ,EAAE;QACR,wCAAwC;QACxC,GAAG,EAAE,MAAM,CAAC;QACZ,yBAAyB;QACzB,KAAK,EAAE,MAAM,CAAC;QACd,mCAAmC;QACnC,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,QAAQ,EAAE;QACR,wCAAwC;QACxC,GAAG,EAAE,MAAM,CAAC;QACZ,yBAAyB;QACzB,KAAK,EAAE,MAAM,CAAC;QACd,mCAAmC;QACnC,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,sCAAsC;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,yEAAyE;AACzE,MAAM,WAAW,uBAAuB;IACtC,gEAAgE;IAChE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-factory.d.ts","sourceRoot":"","sources":["../src/client-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,
|
|
1
|
+
{"version":3,"file":"client-factory.d.ts","sourceRoot":"","sources":["../src/client-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAA2C,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAWlG;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,WAAW,CA2BhE"}
|
package/dist/client-factory.js
CHANGED
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { createPortaClient } from '@portaidentity/sdk';
|
|
15
15
|
import { createNodeTransport, createCliAuth } from '@portaidentity/sdk/node';
|
|
16
|
-
import { resolveServerUrl } from './global-options.js';
|
|
16
|
+
import { normalizeServerOrigin, resolveServerUrl } from './global-options.js';
|
|
17
|
+
import { createCliCredentialPersistence, getCredentialsPath, loadCredentials, } from './credential-store.js';
|
|
17
18
|
// ---------------------------------------------------------------------------
|
|
18
19
|
// Client Creation
|
|
19
20
|
// ---------------------------------------------------------------------------
|
|
@@ -31,12 +32,24 @@ import { resolveServerUrl } from './global-options.js';
|
|
|
31
32
|
*/
|
|
32
33
|
export function createClient(options) {
|
|
33
34
|
const baseUrl = resolveServerUrl(options);
|
|
35
|
+
const credentials = loadCredentials();
|
|
36
|
+
if (credentials &&
|
|
37
|
+
normalizeServerOrigin(credentials.server).origin !== normalizeServerOrigin(baseUrl).origin) {
|
|
38
|
+
throw new Error('Stored credentials belong to a different Porta server. Run porta login.');
|
|
39
|
+
}
|
|
34
40
|
// Handle --insecure flag for self-signed certificates
|
|
35
41
|
// This must be set before creating the transport so fetch() picks it up
|
|
36
42
|
if (options.insecure) {
|
|
37
43
|
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
|
|
38
44
|
}
|
|
39
|
-
const
|
|
45
|
+
const credentialsPath = getCredentialsPath();
|
|
46
|
+
const auth = createCliAuth({
|
|
47
|
+
credentialsPath,
|
|
48
|
+
credentialPersistence: createCliCredentialPersistence({
|
|
49
|
+
credentialsPath,
|
|
50
|
+
lockTimeoutMs: 5_000,
|
|
51
|
+
}),
|
|
52
|
+
});
|
|
40
53
|
const transport = createNodeTransport({ baseUrl, auth });
|
|
41
54
|
return createPortaClient({ transport });
|
|
42
55
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-factory.js","sourceRoot":"","sources":["../src/client-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7E,OAAO,EAAE,gBAAgB,EAAsB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"client-factory.js","sourceRoot":"","sources":["../src/client-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7E,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAsB,MAAM,qBAAqB,CAAC;AAClG,OAAO,EACL,8BAA8B,EAC9B,kBAAkB,EAClB,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAAC,OAAsB;IACjD,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,IACE,WAAW;QACX,qBAAqB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,qBAAqB,CAAC,OAAO,CAAC,CAAC,MAAM,EAC1F,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC7F,CAAC;IAED,sDAAsD;IACtD,wEAAwE;IACxE,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,GAAG,CAAC;IACjD,CAAC;IAED,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,aAAa,CAAC;QACzB,eAAe;QACf,qBAAqB,EAAE,8BAA8B,CAAC;YACpD,eAAe;YACf,aAAa,EAAE,KAAK;SACrB,CAAC;KACH,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,mBAAmB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzD,OAAO,iBAAiB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Thin command adapter for the embedded terminal administration application. */
|
|
2
|
+
import type { CommandModule } from 'yargs';
|
|
3
|
+
import type { AdminApplicationOptions, AdminExitCode } from '../admin/index.js';
|
|
4
|
+
import { type GlobalOptions } from '../global-options.js';
|
|
5
|
+
/** Parsed arguments accepted by `porta admin`. */
|
|
6
|
+
export type AdminArguments = GlobalOptions;
|
|
7
|
+
/** Injectable command boundaries used by focused preflight tests. */
|
|
8
|
+
export interface AdminCommandDependencies {
|
|
9
|
+
/** Whether standard input is attached to an interactive terminal. */
|
|
10
|
+
readonly stdinIsTTY: boolean;
|
|
11
|
+
/** Whether standard output is attached to an interactive terminal. */
|
|
12
|
+
readonly stdoutIsTTY: boolean;
|
|
13
|
+
/** Writes a concise preflight failure after no screen has been constructed. */
|
|
14
|
+
readonly writeStderr: (message: string) => void;
|
|
15
|
+
/** Starts the embedded application after all local checks pass. */
|
|
16
|
+
readonly runApplication: (options: AdminApplicationOptions) => Promise<AdminExitCode>;
|
|
17
|
+
}
|
|
18
|
+
/** Runs the command preflight and starts the application only when it is safe. */
|
|
19
|
+
export declare function runAdminCommand(arguments_: AdminArguments, dependencies?: AdminCommandDependencies): Promise<AdminExitCode>;
|
|
20
|
+
/** Registers the interactive administration application. */
|
|
21
|
+
export declare const adminCommand: CommandModule<GlobalOptions, AdminArguments>;
|
|
22
|
+
//# sourceMappingURL=admin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/commands/admin.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,OAAO,KAAK,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGhF,OAAO,EAA2C,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEnG,kDAAkD;AAClD,MAAM,MAAM,cAAc,GAAG,aAAa,CAAC;AAE3C,qEAAqE;AACrE,MAAM,WAAW,wBAAwB;IACvC,qEAAqE;IACrE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,sEAAsE;IACtE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,+EAA+E;IAC/E,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,mEAAmE;IACnE,QAAQ,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;CACvF;AAgDD,kFAAkF;AAClF,wBAAsB,eAAe,CACnC,UAAU,EAAE,cAAc,EAC1B,YAAY,GAAE,wBAA+C,GAC5D,OAAO,CAAC,aAAa,CAAC,CAiExB;AAED,4DAA4D;AAC5D,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,aAAa,EAAE,cAAc,CAMrE,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/** Thin command adapter for the embedded terminal administration application. */
|
|
2
|
+
import { runAdminApplication } from '../admin/index.js';
|
|
3
|
+
import { prepareAdminSession } from '../admin/session-service.js';
|
|
4
|
+
import { createClient } from '../client-factory.js';
|
|
5
|
+
import { normalizeServerOrigin, resolveServerUrl } from '../global-options.js';
|
|
6
|
+
/** Production process and application boundaries. */
|
|
7
|
+
const DEFAULT_DEPENDENCIES = {
|
|
8
|
+
stdinIsTTY: process.stdin.isTTY === true,
|
|
9
|
+
stdoutIsTTY: process.stdout.isTTY === true,
|
|
10
|
+
writeStderr: (message) => process.stderr.write(`${message}\n`),
|
|
11
|
+
runApplication: runAdminApplication,
|
|
12
|
+
};
|
|
13
|
+
const INSECURE_TLS_RUNTIME_WARNING = "Setting the NODE_TLS_REJECT_UNAUTHORIZED environment variable to '0' makes TLS connections and HTTPS requests insecure by disabling certificate verification.";
|
|
14
|
+
/**
|
|
15
|
+
* Prevents Node's redundant insecure-TLS warning from writing outside JSVision's frame renderer.
|
|
16
|
+
*
|
|
17
|
+
* The application retains its own persistent insecure-mode warning. Every unrelated process warning
|
|
18
|
+
* still reaches Node's original warning handler, and the process hook is restored after the TUI exits.
|
|
19
|
+
*/
|
|
20
|
+
async function withoutInsecureTlsRuntimeWarning(operation) {
|
|
21
|
+
const originalEmitWarning = process.emitWarning;
|
|
22
|
+
const filteredEmitWarning = (warning, ...metadata) => {
|
|
23
|
+
const message = typeof warning === 'string' ? warning : warning.message;
|
|
24
|
+
if (message === INSECURE_TLS_RUNTIME_WARNING)
|
|
25
|
+
return;
|
|
26
|
+
Reflect.apply(originalEmitWarning, process, [warning, ...metadata]);
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(process, 'emitWarning', {
|
|
29
|
+
configurable: true,
|
|
30
|
+
value: filteredEmitWarning,
|
|
31
|
+
writable: true,
|
|
32
|
+
});
|
|
33
|
+
try {
|
|
34
|
+
return await operation();
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
Object.defineProperty(process, 'emitWarning', {
|
|
38
|
+
configurable: true,
|
|
39
|
+
value: originalEmitWarning,
|
|
40
|
+
writable: true,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Reports one bounded usage failure without constructing terminal state. */
|
|
45
|
+
function rejectUsage(dependencies, message) {
|
|
46
|
+
dependencies.writeStderr(message);
|
|
47
|
+
return 2;
|
|
48
|
+
}
|
|
49
|
+
/** Runs the command preflight and starts the application only when it is safe. */
|
|
50
|
+
export async function runAdminCommand(arguments_, dependencies = DEFAULT_DEPENDENCIES) {
|
|
51
|
+
if (!dependencies.stdinIsTTY || !dependencies.stdoutIsTTY) {
|
|
52
|
+
return rejectUsage(dependencies, 'porta admin requires an interactive input and output TTY.');
|
|
53
|
+
}
|
|
54
|
+
if (arguments_.json || arguments_.force) {
|
|
55
|
+
return rejectUsage(dependencies, 'porta admin cannot be used with --json or --force.');
|
|
56
|
+
}
|
|
57
|
+
let server;
|
|
58
|
+
try {
|
|
59
|
+
server = arguments_.server
|
|
60
|
+
? normalizeServerOrigin(arguments_.server)
|
|
61
|
+
: normalizeServerOrigin(resolveServerUrl(arguments_));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
if (arguments_.server) {
|
|
65
|
+
return rejectUsage(dependencies, 'Select a valid HTTPS Porta server origin.');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (arguments_.insecure)
|
|
69
|
+
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
|
|
70
|
+
try {
|
|
71
|
+
const runApplication = () => {
|
|
72
|
+
let client;
|
|
73
|
+
const selectedClient = (selectedServer) => {
|
|
74
|
+
client ??= createClient({
|
|
75
|
+
...arguments_,
|
|
76
|
+
server: selectedServer.origin,
|
|
77
|
+
});
|
|
78
|
+
return client;
|
|
79
|
+
};
|
|
80
|
+
return dependencies.runApplication({
|
|
81
|
+
server,
|
|
82
|
+
insecure: arguments_.insecure,
|
|
83
|
+
showInsecureWarning: arguments_.insecure,
|
|
84
|
+
prepareSession: (selectedServer, interaction) => prepareAdminSession(selectedServer, interaction, () => selectedClient(selectedServer).organizations, () => selectedClient(selectedServer).users, () => selectedClient(selectedServer).applications, () => selectedClient(selectedServer).clients, () => ({
|
|
85
|
+
roles: selectedClient(selectedServer).roles,
|
|
86
|
+
permissions: selectedClient(selectedServer).permissions,
|
|
87
|
+
userRoles: selectedClient(selectedServer).userRoles,
|
|
88
|
+
}), {
|
|
89
|
+
organizations: () => selectedClient(selectedServer).organizations,
|
|
90
|
+
branding: () => selectedClient(selectedServer).branding,
|
|
91
|
+
twoFactor: () => selectedClient(selectedServer).twoFactor,
|
|
92
|
+
}, () => selectedClient(selectedServer).exports, () => selectedClient(selectedServer).imports, () => selectedClient(selectedServer).config),
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
return await (arguments_.insecure
|
|
96
|
+
? withoutInsecureTlsRuntimeWarning(runApplication)
|
|
97
|
+
: runApplication());
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
dependencies.writeStderr('Unable to start Porta administration.');
|
|
101
|
+
return 1;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** Registers the interactive administration application. */
|
|
105
|
+
export const adminCommand = {
|
|
106
|
+
command: 'admin',
|
|
107
|
+
describe: 'Open the interactive Porta administration application',
|
|
108
|
+
handler: async (arguments_) => {
|
|
109
|
+
process.exitCode = await runAdminCommand(arguments_);
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
//# sourceMappingURL=admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/commands/admin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-claim.d.ts","sourceRoot":"","sources":["../../src/commands/app-claim.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"app-claim.d.ts","sourceRoot":"","sources":["../../src/commands/app-claim.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAwC1D,eAAO,MAAM,eAAe,EAAE,aAAa,CAAC,aAAa,EAAE,aAAa,CAoLvE,CAAC"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { createClient } from '../client-factory.js';
|
|
7
7
|
import { handleError } from '../error-handler.js';
|
|
8
8
|
import { printTable, printJson, success, warn, info, formatDate } from '../output.js';
|
|
9
|
+
import { confirm } from '../prompt.js';
|
|
9
10
|
// ---------------------------------------------------------------------------
|
|
10
11
|
// Command definition
|
|
11
12
|
// ---------------------------------------------------------------------------
|
|
@@ -125,7 +126,7 @@ export const appClaimCommand = {
|
|
|
125
126
|
handleError(err, argv.verbose);
|
|
126
127
|
}
|
|
127
128
|
})
|
|
128
|
-
.command('
|
|
129
|
+
.command('delete <app-id> <claim-id>', 'Permanently delete a claim definition and its values', (y) => y
|
|
129
130
|
.positional('app-id', {
|
|
130
131
|
type: 'string',
|
|
131
132
|
demandOption: true,
|
|
@@ -138,14 +139,20 @@ export const appClaimCommand = {
|
|
|
138
139
|
}), async (argv) => {
|
|
139
140
|
try {
|
|
140
141
|
const client = createClient(argv);
|
|
141
|
-
await client.customClaims.
|
|
142
|
-
|
|
142
|
+
const claim = await client.customClaims.get(argv['app-id'], argv['claim-id']);
|
|
143
|
+
const confirmed = await confirm(`Keep claim "${claim.name}" (${claim.slug}), or Delete ${claim.name}? This permanently deletes its user values.`);
|
|
144
|
+
if (!confirmed) {
|
|
145
|
+
warn('Operation cancelled');
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
await client.customClaims.delete(argv['app-id'], argv['claim-id']);
|
|
149
|
+
success(`Claim definition deleted: ${claim.name} (${claim.slug})`);
|
|
143
150
|
}
|
|
144
151
|
catch (err) {
|
|
145
152
|
handleError(err, argv.verbose);
|
|
146
153
|
}
|
|
147
154
|
})
|
|
148
|
-
.demandCommand(1, 'Specify a claim subcommand: create, list, show,
|
|
155
|
+
.demandCommand(1, 'Specify a claim subcommand: create, list, show, delete');
|
|
149
156
|
},
|
|
150
157
|
handler: () => { },
|
|
151
158
|
};
|