@atlasauth/backend 0.25.0 → 0.27.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.
Files changed (115) hide show
  1. package/CHANGELOG.md +42 -1
  2. package/dist/client/abac.d.ts +454 -0
  3. package/dist/client/abac.js +123 -0
  4. package/dist/client/abac.js.map +1 -1
  5. package/dist/client/access-policies.d.ts +84 -2
  6. package/dist/client/access-policies.js +8 -0
  7. package/dist/client/access-policies.js.map +1 -1
  8. package/dist/client/actions.d.ts +1 -1
  9. package/dist/client/actions.js.map +1 -1
  10. package/dist/client/agent-platform.d.ts +294 -0
  11. package/dist/client/agent-platform.js +132 -0
  12. package/dist/client/agent-platform.js.map +1 -0
  13. package/dist/client/analytics-reports.d.ts +1 -1
  14. package/dist/client/app-catalog.d.ts +60 -1
  15. package/dist/client/app-catalog.js +32 -2
  16. package/dist/client/app-catalog.js.map +1 -1
  17. package/dist/client/authz-decisions.d.ts +154 -0
  18. package/dist/client/authz-decisions.js +53 -0
  19. package/dist/client/authz-decisions.js.map +1 -0
  20. package/dist/client/connections.d.ts +519 -0
  21. package/dist/client/connections.js +171 -0
  22. package/dist/client/connections.js.map +1 -0
  23. package/dist/client/custom-oauth-providers.d.ts +15 -0
  24. package/dist/client/custom-oauth-providers.js.map +1 -1
  25. package/dist/client/desktop-mfa.d.ts +141 -0
  26. package/dist/client/desktop-mfa.js +58 -0
  27. package/dist/client/desktop-mfa.js.map +1 -0
  28. package/dist/client/devices.d.ts +130 -0
  29. package/dist/client/devices.js +54 -0
  30. package/dist/client/devices.js.map +1 -1
  31. package/dist/client/email-templates.d.ts +1 -1
  32. package/dist/client/email-templates.js.map +1 -1
  33. package/dist/client/fga.d.ts +301 -5
  34. package/dist/client/fga.js +81 -1
  35. package/dist/client/fga.js.map +1 -1
  36. package/dist/client/iga.d.ts +436 -0
  37. package/dist/client/iga.js +82 -0
  38. package/dist/client/iga.js.map +1 -0
  39. package/dist/client/index.d.ts +3767 -2443
  40. package/dist/client/index.js +51 -0
  41. package/dist/client/index.js.map +1 -1
  42. package/dist/client/least-privilege.d.ts +95 -0
  43. package/dist/client/least-privilege.js +28 -0
  44. package/dist/client/least-privilege.js.map +1 -0
  45. package/dist/client/log-streams.d.ts +1 -1
  46. package/dist/client/managed-grants.d.ts +52 -0
  47. package/dist/client/managed-grants.js +28 -0
  48. package/dist/client/managed-grants.js.map +1 -0
  49. package/dist/client/mcp-gateways.d.ts +220 -2
  50. package/dist/client/mcp-gateways.js +74 -0
  51. package/dist/client/mcp-gateways.js.map +1 -1
  52. package/dist/client/messaging.d.ts +11 -2
  53. package/dist/client/messaging.js.map +1 -1
  54. package/dist/client/oauth-clients.d.ts +4 -0
  55. package/dist/client/oauth-clients.js.map +1 -1
  56. package/dist/client/oauth-protocols.d.ts +116 -0
  57. package/dist/client/oauth-protocols.js +54 -0
  58. package/dist/client/oauth-protocols.js.map +1 -0
  59. package/dist/client/oauth-providers.d.ts +4 -4
  60. package/dist/client/openfga.d.ts +90 -3
  61. package/dist/client/openfga.js +27 -1
  62. package/dist/client/openfga.js.map +1 -1
  63. package/dist/client/org-ldap-connections.d.ts +3 -0
  64. package/dist/client/org-ldap-connections.js.map +1 -1
  65. package/dist/client/organizations.d.ts +14 -0
  66. package/dist/client/organizations.js.map +1 -1
  67. package/dist/client/policy-bundles.d.ts +105 -0
  68. package/dist/client/policy-bundles.js +38 -0
  69. package/dist/client/policy-bundles.js.map +1 -0
  70. package/dist/client/resources.d.ts +1 -0
  71. package/dist/client/resources.js.map +1 -1
  72. package/dist/client/risk-containment.d.ts +244 -0
  73. package/dist/client/risk-containment.js +120 -0
  74. package/dist/client/risk-containment.js.map +1 -0
  75. package/dist/client/saml-idp.d.ts +183 -0
  76. package/dist/client/saml-idp.js +71 -0
  77. package/dist/client/saml-idp.js.map +1 -0
  78. package/dist/client/scim-provisioning.d.ts +100 -4
  79. package/dist/client/scim-provisioning.js +30 -0
  80. package/dist/client/scim-provisioning.js.map +1 -1
  81. package/dist/client/scim-tokens.d.ts +34 -0
  82. package/dist/client/scim-tokens.js +17 -0
  83. package/dist/client/scim-tokens.js.map +1 -1
  84. package/dist/client/service-connectors.d.ts +1 -1
  85. package/dist/client/ssf.d.ts +31 -1
  86. package/dist/client/ssf.js +17 -0
  87. package/dist/client/ssf.js.map +1 -1
  88. package/dist/client/users.d.ts +9 -0
  89. package/dist/client/users.js +9 -0
  90. package/dist/client/users.js.map +1 -1
  91. package/dist/client/vault.d.ts +54 -0
  92. package/dist/client/vault.js +30 -0
  93. package/dist/client/vault.js.map +1 -1
  94. package/dist/client/vc.d.ts +62 -2
  95. package/dist/client/vc.js +15 -0
  96. package/dist/client/vc.js.map +1 -1
  97. package/dist/client/workflows.d.ts +182 -3
  98. package/dist/client/workflows.js +34 -0
  99. package/dist/client/workflows.js.map +1 -1
  100. package/dist/index.d.ts +5 -2
  101. package/dist/index.js +6 -1
  102. package/dist/index.js.map +1 -1
  103. package/dist/oauth-resource.d.ts +30 -3
  104. package/dist/oauth-resource.js +43 -2
  105. package/dist/oauth-resource.js.map +1 -1
  106. package/dist/policy-bundle.d.ts +110 -0
  107. package/dist/policy-bundle.js +289 -0
  108. package/dist/policy-bundle.js.map +1 -0
  109. package/dist/txn-token.d.ts +36 -0
  110. package/dist/txn-token.js +30 -0
  111. package/dist/txn-token.js.map +1 -0
  112. package/dist/uma.d.ts +77 -0
  113. package/dist/uma.js +95 -0
  114. package/dist/uma.js.map +1 -0
  115. package/package.json +2 -2
@@ -0,0 +1,244 @@
1
+ import { type RequestFn } from './request';
2
+ import type { ListPage } from './types';
3
+ export type RiskyUserState = 'none' | 'at_risk' | 'confirmed_compromised' | 'dismissed' | 'remediated';
4
+ export interface RiskyUser {
5
+ object: 'risky_user';
6
+ user_id: string;
7
+ state: RiskyUserState;
8
+ level: 'low' | 'medium' | 'high';
9
+ /** Cumulative score; halves every 72 hours. */
10
+ score: number;
11
+ reasons: string[];
12
+ last_event_at: number | null;
13
+ resolved_by: string | null;
14
+ resolved_at: number | null;
15
+ updated_at: number;
16
+ }
17
+ export interface UserContainment {
18
+ object: 'user_containment';
19
+ id: string;
20
+ user_id: string;
21
+ state: 'contained' | 'released';
22
+ reason: string | null;
23
+ source: string;
24
+ /** What containment revoked: sessions, api_tokens, api_keys, agent_grants, device_keys, desktop_devices, remembered_devices, temporary_passes. */
25
+ revoked: Record<string, number>;
26
+ contained_by: string | null;
27
+ released_by: string | null;
28
+ created_at: number;
29
+ released_at: number | null;
30
+ already_contained?: boolean;
31
+ }
32
+ export interface MfaFactorQuarantine {
33
+ object: 'mfa_factor_quarantine';
34
+ id: string;
35
+ user_id: string;
36
+ factor_type: string;
37
+ factor_id: string;
38
+ reason: string | null;
39
+ until: number;
40
+ released_at: number | null;
41
+ created_at: number;
42
+ }
43
+ export interface TemporaryAccessPass {
44
+ object: 'temporary_access_pass';
45
+ id: string;
46
+ user_id: string;
47
+ expires_at: number;
48
+ uses_left: number;
49
+ require_enrolment: boolean;
50
+ bound_ip: string | null;
51
+ issued_by: string | null;
52
+ reason: string | null;
53
+ last_used_at: number | null;
54
+ created_at: number;
55
+ }
56
+ export interface CreateTemporaryAccessBody {
57
+ /** 60 to 604800; default 3600. */
58
+ lifetime_seconds?: number;
59
+ /** Default true (one use). */
60
+ one_time?: boolean;
61
+ /** 1 to 100 uses when `one_time` is false; default 5. */
62
+ uses?: number;
63
+ /** Make the user register a passkey or second factor after signing in; default true. */
64
+ require_enrolment?: boolean;
65
+ bound_ip?: string;
66
+ reason?: string;
67
+ }
68
+ /** Risky-user lifecycle, one-action account containment and risky-factor quarantine. */
69
+ export declare function riskResource(request: RequestFn): {
70
+ riskyUsers: {
71
+ list(query?: {
72
+ state?: Exclude<RiskyUserState, "none">;
73
+ limit?: number;
74
+ }): Promise<ListPage<RiskyUser>>;
75
+ get(userId: string): Promise<RiskyUser>;
76
+ dismiss(userId: string): Promise<RiskyUser>;
77
+ confirm(userId: string): Promise<RiskyUser>;
78
+ remediate(userId: string): Promise<RiskyUser>;
79
+ forcePasswordChange(userId: string): Promise<{
80
+ object: "risk_remediation";
81
+ user_id: string;
82
+ action: string;
83
+ sessions_revoked: number;
84
+ }>;
85
+ forceReauth(userId: string): Promise<{
86
+ object: "risk_remediation";
87
+ user_id: string;
88
+ action: string;
89
+ sessions_revoked: number;
90
+ }>;
91
+ };
92
+ containment: {
93
+ /** Contain an account: sign-in disabled, password invalidated, sessions, tokens, keys and devices revoked. */
94
+ contain(userId: string, body?: {
95
+ reason?: string;
96
+ }): Promise<UserContainment>;
97
+ release(userId: string): Promise<UserContainment>;
98
+ list(query?: {
99
+ user_id?: string;
100
+ }): Promise<ListPage<UserContainment>>;
101
+ };
102
+ factorQuarantines: {
103
+ list(query?: {
104
+ user_id?: string;
105
+ active?: boolean;
106
+ }): Promise<ListPage<MfaFactorQuarantine>>;
107
+ release(id: string): Promise<MfaFactorQuarantine>;
108
+ };
109
+ };
110
+ /** Temporary access passes (`users.createTemporaryAccess`). */
111
+ export declare function temporaryAccessResource(request: RequestFn): {
112
+ /** Issue a pass. The `code` is in this response only. */
113
+ create(userId: string, body?: CreateTemporaryAccessBody): Promise<TemporaryAccessPass & {
114
+ code: string;
115
+ }>;
116
+ list(userId: string): Promise<ListPage<TemporaryAccessPass>>;
117
+ revoke(userId: string, passId: string): Promise<{
118
+ object: "temporary_access_pass";
119
+ id: string;
120
+ deleted: true;
121
+ }>;
122
+ };
123
+ export interface EmailRiskResult {
124
+ object: 'email_risk';
125
+ verdict: 'allow' | 'review' | 'block';
126
+ score: number;
127
+ reasons: string[];
128
+ email_domain: string;
129
+ mode: string;
130
+ checks: {
131
+ syntax: boolean;
132
+ disposable: boolean;
133
+ role_account: boolean;
134
+ mx: boolean | null;
135
+ suppressed: boolean;
136
+ mailbox: Record<string, unknown> | null;
137
+ };
138
+ }
139
+ export interface EmailRiskSettings {
140
+ object: 'email_risk_settings';
141
+ mode: 'off' | 'mx' | 'provider';
142
+ provider: 'zerobounce' | 'kickbox' | null;
143
+ has_credentials: boolean;
144
+ block_disposable: boolean;
145
+ block_suppressed: boolean;
146
+ block_undeliverable: boolean;
147
+ block_role: boolean;
148
+ gate_sign_up: boolean;
149
+ updated_at: number | null;
150
+ }
151
+ export interface EmailSuppression {
152
+ object: 'email_suppression';
153
+ id: string;
154
+ email: string;
155
+ reason: string;
156
+ source: string;
157
+ detail: string | null;
158
+ created_at: number;
159
+ }
160
+ /** Email risk (`POST /v1/fraud/email_risk`) and the suppression list. */
161
+ export declare function emailRiskResource(request: RequestFn): {
162
+ check(body: {
163
+ email: string;
164
+ ip?: string;
165
+ verify_mailbox?: boolean;
166
+ }): Promise<EmailRiskResult>;
167
+ settings(): Promise<EmailRiskSettings>;
168
+ updateSettings(body: {
169
+ mode?: "off" | "mx" | "provider";
170
+ provider?: "zerobounce" | "kickbox" | null;
171
+ /** Write-only: `{ apiKey, region? }` for your own account, or null to clear. */
172
+ credentials?: {
173
+ apiKey: string;
174
+ region?: "us" | "eu";
175
+ } | null;
176
+ block_disposable?: boolean;
177
+ block_suppressed?: boolean;
178
+ block_undeliverable?: boolean;
179
+ block_role?: boolean;
180
+ gate_sign_up?: boolean;
181
+ }): Promise<EmailRiskSettings>;
182
+ suppressions: {
183
+ list(query?: {
184
+ email?: string;
185
+ limit?: number;
186
+ after?: string;
187
+ }): Promise<ListPage<EmailSuppression>>;
188
+ add(body: {
189
+ email?: string;
190
+ emails?: string[];
191
+ reason?: "hard_bounce" | "complaint" | "unsubscribe" | "manual" | "invalid";
192
+ source?: string;
193
+ detail?: string;
194
+ }): Promise<ListPage<EmailSuppression>>;
195
+ remove(email: string): Promise<{
196
+ object: "email_suppression";
197
+ email: string;
198
+ deleted: true;
199
+ }>;
200
+ };
201
+ };
202
+ export interface AuthenticatorPolicy {
203
+ object: 'authenticator_policy';
204
+ id: string;
205
+ name: string;
206
+ group: string;
207
+ enabled: boolean;
208
+ required_factors: Array<'totp' | 'sms' | 'passkey' | 'push'>;
209
+ grace_until: number | null;
210
+ passkey: {
211
+ requireUserVerification?: boolean;
212
+ attestation?: 'none' | 'indirect' | 'direct' | null;
213
+ attachment?: 'any' | 'platform' | 'cross-platform' | null;
214
+ allowlist?: string[];
215
+ blocklist?: string[];
216
+ };
217
+ created_at: number;
218
+ updated_at: number;
219
+ }
220
+ export type AuthenticatorPolicyBody = Partial<Pick<AuthenticatorPolicy, 'name' | 'group' | 'enabled' | 'required_factors' | 'grace_until' | 'passkey'>>;
221
+ /** Group-targeted authenticator policies: required factors with an enrolment grace window and passkey profiles. */
222
+ export declare function authenticatorPoliciesResource(request: RequestFn): {
223
+ list(): Promise<ListPage<AuthenticatorPolicy>>;
224
+ get(id: string): Promise<AuthenticatorPolicy>;
225
+ create(body: AuthenticatorPolicyBody & {
226
+ name: string;
227
+ group: string;
228
+ }): Promise<AuthenticatorPolicy>;
229
+ update(id: string, body: AuthenticatorPolicyBody): Promise<AuthenticatorPolicy>;
230
+ delete(id: string): Promise<{
231
+ object: "authenticator_policy";
232
+ id: string;
233
+ deleted: true;
234
+ }>;
235
+ /** The combined rules that apply to one user through their groups. */
236
+ effective(userId: string): Promise<{
237
+ object: "effective_authenticator_rules";
238
+ user_id: string;
239
+ required_factors: string[];
240
+ in_grace: boolean;
241
+ passkey: Record<string, unknown>;
242
+ matched_policies: string[];
243
+ }>;
244
+ };
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.riskResource = riskResource;
4
+ exports.temporaryAccessResource = temporaryAccessResource;
5
+ exports.emailRiskResource = emailRiskResource;
6
+ exports.authenticatorPoliciesResource = authenticatorPoliciesResource;
7
+ const request_1 = require("./request");
8
+ /** Risky-user lifecycle, one-action account containment and risky-factor quarantine. */
9
+ function riskResource(request) {
10
+ return {
11
+ riskyUsers: {
12
+ list(query = {}) {
13
+ return request({ method: 'GET', path: '/v1/risky_users', query });
14
+ },
15
+ get(userId) {
16
+ return request({ method: 'GET', path: `/v1/risky_users/${(0, request_1.enc)(userId)}` });
17
+ },
18
+ dismiss(userId) {
19
+ return request({ method: 'POST', path: `/v1/risky_users/${(0, request_1.enc)(userId)}/dismiss`, body: {} });
20
+ },
21
+ confirm(userId) {
22
+ return request({ method: 'POST', path: `/v1/risky_users/${(0, request_1.enc)(userId)}/confirm`, body: {} });
23
+ },
24
+ remediate(userId) {
25
+ return request({ method: 'POST', path: `/v1/risky_users/${(0, request_1.enc)(userId)}/remediate`, body: {} });
26
+ },
27
+ forcePasswordChange(userId) {
28
+ return request({ method: 'POST', path: `/v1/risky_users/${(0, request_1.enc)(userId)}/force_password_change`, body: {} });
29
+ },
30
+ forceReauth(userId) {
31
+ return request({ method: 'POST', path: `/v1/risky_users/${(0, request_1.enc)(userId)}/force_reauth`, body: {} });
32
+ },
33
+ },
34
+ containment: {
35
+ /** Contain an account: sign-in disabled, password invalidated, sessions, tokens, keys and devices revoked. */
36
+ contain(userId, body = {}) {
37
+ return request({ method: 'POST', path: `/v1/users/${(0, request_1.enc)(userId)}/contain`, body });
38
+ },
39
+ release(userId) {
40
+ return request({ method: 'POST', path: `/v1/users/${(0, request_1.enc)(userId)}/release`, body: {} });
41
+ },
42
+ list(query = {}) {
43
+ return request({ method: 'GET', path: `/v1/containments${query.user_id ? `?user_id=${(0, request_1.enc)(query.user_id)}` : ''}` });
44
+ },
45
+ },
46
+ factorQuarantines: {
47
+ list(query = {}) {
48
+ return request({ method: 'GET', path: '/v1/mfa_factor_quarantines', query });
49
+ },
50
+ release(id) {
51
+ return request({ method: 'POST', path: `/v1/mfa_factor_quarantines/${(0, request_1.enc)(id)}/release`, body: {} });
52
+ },
53
+ },
54
+ };
55
+ }
56
+ /** Temporary access passes (`users.createTemporaryAccess`). */
57
+ function temporaryAccessResource(request) {
58
+ return {
59
+ /** Issue a pass. The `code` is in this response only. */
60
+ create(userId, body = {}) {
61
+ return request({ method: 'POST', path: `/v1/users/${(0, request_1.enc)(userId)}/temporary_access`, body });
62
+ },
63
+ list(userId) {
64
+ return request({ method: 'GET', path: `/v1/users/${(0, request_1.enc)(userId)}/temporary_access` });
65
+ },
66
+ revoke(userId, passId) {
67
+ return request({ method: 'DELETE', path: `/v1/users/${(0, request_1.enc)(userId)}/temporary_access/${(0, request_1.enc)(passId)}` });
68
+ },
69
+ };
70
+ }
71
+ /** Email risk (`POST /v1/fraud/email_risk`) and the suppression list. */
72
+ function emailRiskResource(request) {
73
+ return {
74
+ check(body) {
75
+ return request({ method: 'POST', path: '/v1/fraud/email_risk', body });
76
+ },
77
+ settings() {
78
+ return request({ method: 'GET', path: '/v1/fraud/email_risk/settings' });
79
+ },
80
+ updateSettings(body) {
81
+ return request({ method: 'PUT', path: '/v1/fraud/email_risk/settings', body });
82
+ },
83
+ suppressions: {
84
+ list(query = {}) {
85
+ return request({ method: 'GET', path: '/v1/messaging/suppressions', query });
86
+ },
87
+ add(body) {
88
+ return request({ method: 'POST', path: '/v1/messaging/suppressions', body });
89
+ },
90
+ remove(email) {
91
+ return request({ method: 'DELETE', path: `/v1/messaging/suppressions/${(0, request_1.enc)(email)}` });
92
+ },
93
+ },
94
+ };
95
+ }
96
+ /** Group-targeted authenticator policies: required factors with an enrolment grace window and passkey profiles. */
97
+ function authenticatorPoliciesResource(request) {
98
+ return {
99
+ list() {
100
+ return request({ method: 'GET', path: '/v1/authenticator_policies' });
101
+ },
102
+ get(id) {
103
+ return request({ method: 'GET', path: `/v1/authenticator_policies/${(0, request_1.enc)(id)}` });
104
+ },
105
+ create(body) {
106
+ return request({ method: 'POST', path: '/v1/authenticator_policies', body });
107
+ },
108
+ update(id, body) {
109
+ return request({ method: 'PATCH', path: `/v1/authenticator_policies/${(0, request_1.enc)(id)}`, body });
110
+ },
111
+ delete(id) {
112
+ return request({ method: 'DELETE', path: `/v1/authenticator_policies/${(0, request_1.enc)(id)}` });
113
+ },
114
+ /** The combined rules that apply to one user through their groups. */
115
+ effective(userId) {
116
+ return request({ method: 'GET', path: `/v1/authenticator_policies/effective/${(0, request_1.enc)(userId)}` });
117
+ },
118
+ };
119
+ }
120
+ //# sourceMappingURL=risk-containment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-containment.js","sourceRoot":"","sources":["../../src/client/risk-containment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,183 @@
1
+ import { type RequestFn } from './request';
2
+ export type SamlNameIdFormat = 'emailAddress' | 'persistent' | 'transient' | 'unspecified';
3
+ /** A SAML service provider Atlas issues assertions to, with its depth settings. */
4
+ export interface SamlIdpServiceProvider {
5
+ object: 'saml_idp_service_provider';
6
+ id: string;
7
+ name: string;
8
+ entity_id: string;
9
+ acs_url: string;
10
+ acs_urls: string[];
11
+ name_id_format: SamlNameIdFormat;
12
+ name_id_field: 'email' | 'user_id';
13
+ attributes: Record<string, string>;
14
+ encrypt_assertions: boolean;
15
+ has_encryption_cert: boolean;
16
+ signing_cert_count: number;
17
+ require_signed_requests: boolean;
18
+ signature_algorithm: 'rsa-sha256' | 'rsa-sha384' | 'rsa-sha512';
19
+ digest_algorithm: 'sha256' | 'sha384' | 'sha512';
20
+ sign_response: boolean;
21
+ artifact_binding: boolean;
22
+ ecp: boolean;
23
+ attribute_query: boolean;
24
+ slo_url: string | null;
25
+ slo_binding: 'redirect' | 'post' | 'soap' | null;
26
+ authn_context_class_ref: string | null;
27
+ assertion_lifetime_seconds: number;
28
+ }
29
+ /** Any of these; `null` clears an optional setting. */
30
+ export interface UpdateSamlIdpServiceProviderBody {
31
+ name?: string;
32
+ acs_urls?: string[];
33
+ name_id_format?: SamlNameIdFormat;
34
+ name_id_field?: 'email' | 'user_id';
35
+ attributes?: Record<string, string>;
36
+ encrypt_assertions?: boolean;
37
+ encryption_cert?: string | null;
38
+ signing_certs?: string[];
39
+ require_signed_requests?: boolean;
40
+ signature_algorithm?: 'rsa-sha256' | 'rsa-sha384' | 'rsa-sha512';
41
+ digest_algorithm?: 'sha256' | 'sha384' | 'sha512';
42
+ sign_response?: boolean;
43
+ artifact_binding?: boolean;
44
+ ecp?: boolean;
45
+ attribute_query?: boolean;
46
+ slo_url?: string | null;
47
+ slo_binding?: 'redirect' | 'post' | 'soap';
48
+ authn_context_class_ref?: string | null;
49
+ assertion_lifetime_seconds?: number | null;
50
+ }
51
+ export interface SamlIdpSpMetadata {
52
+ object: 'saml_idp_sp_metadata';
53
+ saved: boolean;
54
+ entity_id: string;
55
+ acs_url: string;
56
+ acs_urls: string[];
57
+ name_id_format: SamlNameIdFormat;
58
+ signing_certs: string[];
59
+ encryption_cert: string | null;
60
+ slo_url: string | null;
61
+ slo_binding: string | null;
62
+ authn_requests_signed: boolean;
63
+ want_assertions_signed: boolean;
64
+ requested_attributes: string[];
65
+ service_provider?: SamlIdpServiceProvider | null;
66
+ }
67
+ /** Atlas as a SAML identity provider: service-provider settings and metadata import. */
68
+ export declare function samlIdpResource(request: RequestFn): {
69
+ /** `GET /v1/saml_idp/service_providers` */
70
+ list(): Promise<{
71
+ object: "list";
72
+ data: SamlIdpServiceProvider[];
73
+ }>;
74
+ /** `GET /v1/saml_idp/service_providers/:id` */
75
+ get(id: string): Promise<SamlIdpServiceProvider>;
76
+ /** `PATCH /v1/saml_idp/service_providers/:id` — NameID format, encryption, request signing, algorithms, logout. */
77
+ update(id: string, body: UpdateSamlIdpServiceProviderBody): Promise<SamlIdpServiceProvider>;
78
+ /** `POST /v1/saml_idp/service_providers/import_metadata` — preview, or save with `save_as`. */
79
+ importMetadata(body: {
80
+ metadata_xml?: string;
81
+ metadata_url?: string;
82
+ mdq_base_url?: string;
83
+ entity_id?: string;
84
+ federation_certificate?: string;
85
+ save_as?: string;
86
+ name?: string;
87
+ }): Promise<SamlIdpSpMetadata>;
88
+ };
89
+ export type CloudProvider = 'aws' | 'gcp' | 'azure';
90
+ /** A cloud access target: an AWS account and role, a Google Cloud workforce pool, or an Azure trust. */
91
+ export interface CloudAccessTarget {
92
+ object: 'cloud_access_target';
93
+ id: string;
94
+ provider: CloudProvider;
95
+ name: string;
96
+ config: Record<string, unknown>;
97
+ assignment: Record<string, unknown> | null;
98
+ launch_url: string | null;
99
+ created_at: number;
100
+ updated_at: number;
101
+ }
102
+ export interface CloudAccessSetup {
103
+ object: 'cloud_access_setup';
104
+ target_id: string;
105
+ provider: CloudProvider;
106
+ steps: string[];
107
+ snippets: Record<string, string>;
108
+ sources: string[];
109
+ }
110
+ /** Cloud access portal: account and role tiles for the launcher. */
111
+ export declare function cloudAccessResource(request: RequestFn): {
112
+ list(provider?: CloudProvider): Promise<{
113
+ object: "list";
114
+ data: CloudAccessTarget[];
115
+ }>;
116
+ get(id: string): Promise<CloudAccessTarget>;
117
+ create(body: {
118
+ provider: CloudProvider;
119
+ name: string;
120
+ config: Record<string, unknown>;
121
+ assignment?: Record<string, unknown>;
122
+ }): Promise<CloudAccessTarget>;
123
+ update(id: string, body: {
124
+ name?: string;
125
+ config?: Record<string, unknown>;
126
+ assignment?: Record<string, unknown>;
127
+ }): Promise<CloudAccessTarget>;
128
+ delete(id: string): Promise<{
129
+ object: "cloud_access_target";
130
+ id: string;
131
+ deleted: true;
132
+ }>;
133
+ /** The commands and policy to apply on the cloud side. */
134
+ setup(id: string): Promise<CloudAccessSetup>;
135
+ };
136
+ /** A WS-Federation relying-party connection (sign people in through AD FS or another WS-Federation provider). */
137
+ export interface WsFedConnection {
138
+ object: 'wsfed_connection';
139
+ id: string;
140
+ organization_id: string | null;
141
+ status: 'draft' | 'active' | 'disabled';
142
+ issuer: string | null;
143
+ passive_endpoint: string | null;
144
+ realm: string | null;
145
+ signing_certificate_count: number;
146
+ allowed_domains: string[];
147
+ attribute_mapping: Record<string, string>;
148
+ freshness_minutes: number | null;
149
+ auth_method: string | null;
150
+ /** Enter as the reply URL of the provider's relying-party trust. */
151
+ acs_url: string;
152
+ logout_start_url: string;
153
+ created_at: number;
154
+ updated_at: number;
155
+ }
156
+ export interface WsFedConnectionBody {
157
+ organization_id?: string | null;
158
+ status?: 'draft' | 'active' | 'disabled';
159
+ metadata_url?: string;
160
+ metadata_xml?: string;
161
+ issuer?: string;
162
+ passive_endpoint?: string;
163
+ signing_certificates?: string;
164
+ realm?: string;
165
+ allowed_domains?: string[];
166
+ attribute_mapping?: Record<string, string> | null;
167
+ freshness_minutes?: number | null;
168
+ auth_method?: string | null;
169
+ }
170
+ export declare function wsfedConnectionsResource(request: RequestFn): {
171
+ list(): Promise<{
172
+ object: "list";
173
+ data: WsFedConnection[];
174
+ }>;
175
+ get(id: string): Promise<WsFedConnection>;
176
+ create(body: WsFedConnectionBody): Promise<WsFedConnection>;
177
+ update(id: string, body: WsFedConnectionBody): Promise<WsFedConnection>;
178
+ delete(id: string): Promise<{
179
+ object: "wsfed_connection";
180
+ id: string;
181
+ deleted: true;
182
+ }>;
183
+ };
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.samlIdpResource = samlIdpResource;
4
+ exports.cloudAccessResource = cloudAccessResource;
5
+ exports.wsfedConnectionsResource = wsfedConnectionsResource;
6
+ const request_1 = require("./request");
7
+ /** Atlas as a SAML identity provider: service-provider settings and metadata import. */
8
+ function samlIdpResource(request) {
9
+ return {
10
+ /** `GET /v1/saml_idp/service_providers` */
11
+ list() {
12
+ return request({ method: 'GET', path: '/v1/saml_idp/service_providers' });
13
+ },
14
+ /** `GET /v1/saml_idp/service_providers/:id` */
15
+ get(id) {
16
+ return request({ method: 'GET', path: `/v1/saml_idp/service_providers/${(0, request_1.enc)(id)}` });
17
+ },
18
+ /** `PATCH /v1/saml_idp/service_providers/:id` — NameID format, encryption, request signing, algorithms, logout. */
19
+ update(id, body) {
20
+ return request({ method: 'PATCH', path: `/v1/saml_idp/service_providers/${(0, request_1.enc)(id)}`, body });
21
+ },
22
+ /** `POST /v1/saml_idp/service_providers/import_metadata` — preview, or save with `save_as`. */
23
+ importMetadata(body) {
24
+ return request({ method: 'POST', path: '/v1/saml_idp/service_providers/import_metadata', body });
25
+ },
26
+ };
27
+ }
28
+ /** Cloud access portal: account and role tiles for the launcher. */
29
+ function cloudAccessResource(request) {
30
+ return {
31
+ list(provider) {
32
+ return request({ method: 'GET', path: `/v1/cloud_access/targets${provider ? `?provider=${provider}` : ''}` });
33
+ },
34
+ get(id) {
35
+ return request({ method: 'GET', path: `/v1/cloud_access/targets/${(0, request_1.enc)(id)}` });
36
+ },
37
+ create(body) {
38
+ return request({ method: 'POST', path: '/v1/cloud_access/targets', body });
39
+ },
40
+ update(id, body) {
41
+ return request({ method: 'PATCH', path: `/v1/cloud_access/targets/${(0, request_1.enc)(id)}`, body });
42
+ },
43
+ delete(id) {
44
+ return request({ method: 'DELETE', path: `/v1/cloud_access/targets/${(0, request_1.enc)(id)}` });
45
+ },
46
+ /** The commands and policy to apply on the cloud side. */
47
+ setup(id) {
48
+ return request({ method: 'GET', path: `/v1/cloud_access/targets/${(0, request_1.enc)(id)}/setup` });
49
+ },
50
+ };
51
+ }
52
+ function wsfedConnectionsResource(request) {
53
+ return {
54
+ list() {
55
+ return request({ method: 'GET', path: '/v1/wsfed_connections' });
56
+ },
57
+ get(id) {
58
+ return request({ method: 'GET', path: `/v1/wsfed_connections/${(0, request_1.enc)(id)}` });
59
+ },
60
+ create(body) {
61
+ return request({ method: 'POST', path: '/v1/wsfed_connections', body });
62
+ },
63
+ update(id, body) {
64
+ return request({ method: 'PATCH', path: `/v1/wsfed_connections/${(0, request_1.enc)(id)}`, body });
65
+ },
66
+ delete(id) {
67
+ return request({ method: 'DELETE', path: `/v1/wsfed_connections/${(0, request_1.enc)(id)}` });
68
+ },
69
+ };
70
+ }
71
+ //# sourceMappingURL=saml-idp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saml-idp.js","sourceRoot":"","sources":["../../src/client/saml-idp.ts"],"names":[],"mappings":"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"}