auth0-deploy-cli 8.42.0 → 8.44.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 +51 -1
- package/lib/context/defaults.d.ts +7 -0
- package/lib/context/defaults.js +74 -30
- package/lib/context/directory/handlers/actionModules.js +11 -12
- package/lib/context/directory/handlers/actions.js +11 -13
- package/lib/context/directory/handlers/attackProtection.js +1 -1
- package/lib/context/directory/handlers/branding.js +9 -1
- package/lib/context/directory/handlers/clients.js +9 -3
- package/lib/context/directory/handlers/connections.js +10 -4
- package/lib/context/directory/handlers/databases.js +4 -4
- package/lib/context/directory/handlers/emailTemplates.js +9 -0
- package/lib/context/directory/handlers/hooks.js +12 -1
- package/lib/context/directory/handlers/prompts.js +11 -3
- package/lib/context/directory/handlers/rules.js +12 -1
- package/lib/context/directory/index.js +7 -8
- package/lib/context/yaml/handlers/attackProtection.js +1 -1
- package/lib/context/yaml/handlers/branding.js +8 -1
- package/lib/context/yaml/handlers/clients.js +4 -1
- package/lib/context/yaml/handlers/connections.js +3 -1
- package/lib/context/yaml/handlers/flows.js +7 -0
- package/lib/context/yaml/handlers/forms.js +7 -0
- package/lib/context/yaml/handlers/prompts.js +7 -1
- package/lib/context/yaml/index.js +7 -8
- package/lib/readonly.js +5 -0
- package/lib/tools/auth0/handlers/attackProtection.js +3 -1
- package/lib/tools/auth0/handlers/clients.d.ts +21 -0
- package/lib/tools/auth0/handlers/clients.js +21 -0
- package/lib/tools/auth0/handlers/connectionProfiles.d.ts +27 -0
- package/lib/tools/auth0/handlers/connectionProfiles.js +30 -0
- package/lib/tools/auth0/handlers/connections.d.ts +11 -6
- package/lib/tools/auth0/handlers/connections.js +33 -7
- package/lib/tools/auth0/handlers/databases.js +12 -3
- package/lib/tools/auth0/handlers/default.d.ts +23 -0
- package/lib/tools/auth0/handlers/default.js +21 -10
- package/lib/tools/auth0/handlers/organizations.d.ts +29 -1
- package/lib/tools/auth0/handlers/organizations.js +165 -17
- package/lib/tools/auth0/handlers/phoneProvider.js +10 -2
- package/lib/tools/auth0/handlers/phoneTemplates.d.ts +4 -1
- package/lib/tools/auth0/handlers/phoneTemplates.js +67 -10
- package/lib/tools/auth0/handlers/roles.d.ts +4 -0
- package/lib/tools/auth0/handlers/roles.js +10 -0
- package/lib/tools/calculateDryRunChanges.js +12 -8
- package/lib/types.d.ts +1 -0
- package/lib/utils.js +5 -2
- package/package.json +2 -2
|
@@ -43,15 +43,14 @@ class YAMLContext {
|
|
|
43
43
|
})();
|
|
44
44
|
}
|
|
45
45
|
loadFile(f) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
toLoad
|
|
50
|
-
|
|
51
|
-
`
|
|
52
|
-
`Current absolute path used: ["${f}"]`);
|
|
46
|
+
const configRoot = path_1.default.resolve(this.basePath);
|
|
47
|
+
const toLoad = path_1.default.resolve(this.basePath, f.replace(/\\/g, '/'));
|
|
48
|
+
if (!toLoad.startsWith(configRoot + path_1.default.sep)) {
|
|
49
|
+
logger_1.default.warn(`Path "${f}" resolves to "${toLoad}" which is outside the config directory "${configRoot}". ` +
|
|
50
|
+
`This will be blocked as an error in the next major release. ` +
|
|
51
|
+
`Move the file inside your config directory.`);
|
|
53
52
|
}
|
|
54
|
-
return (0, tools_1.loadFileAndReplaceKeywords)(
|
|
53
|
+
return (0, tools_1.loadFileAndReplaceKeywords)(toLoad, {
|
|
55
54
|
mappings: this.mappings,
|
|
56
55
|
disableKeywordReplacement: this.disableKeywordReplacement,
|
|
57
56
|
});
|
package/lib/readonly.js
CHANGED
|
@@ -28,6 +28,11 @@ const readOnlyFields = {
|
|
|
28
28
|
'config_route',
|
|
29
29
|
'owners',
|
|
30
30
|
],
|
|
31
|
+
attackProtection: [
|
|
32
|
+
// Returned by GET but rejected by PATCH with "Additional properties not allowed"
|
|
33
|
+
'bruteForceProtection.form_submission_mode',
|
|
34
|
+
'bruteForceProtection.form_submission_behavior',
|
|
35
|
+
],
|
|
31
36
|
};
|
|
32
37
|
function getExcludedFields(config) {
|
|
33
38
|
const strippedFields = { ...readOnlyFields };
|
|
@@ -314,7 +314,9 @@ class AttackProtectionHandler extends default_1.default {
|
|
|
314
314
|
updates.push(this.client.attackProtection.captcha.update(attackProtection.captcha));
|
|
315
315
|
}
|
|
316
316
|
if (attackProtection.bruteForceProtection) {
|
|
317
|
-
|
|
317
|
+
// Strip fields returned by GET but rejected by PATCH
|
|
318
|
+
const { form_submission_mode, form_submission_behavior, ...bruteForcePayload } = attackProtection.bruteForceProtection;
|
|
319
|
+
updates.push(this.client.attackProtection.bruteForceProtection.update(bruteForcePayload));
|
|
318
320
|
}
|
|
319
321
|
if (attackProtection.suspiciousIpThrottling) {
|
|
320
322
|
updates.push(this.client.attackProtection.suspiciousIpThrottling.update(attackProtection.suspiciousIpThrottling));
|
|
@@ -254,6 +254,27 @@ export declare const schema: {
|
|
|
254
254
|
enum: ("allow" | "allow_if_empty")[];
|
|
255
255
|
description: string;
|
|
256
256
|
};
|
|
257
|
+
third_party_client_access: {
|
|
258
|
+
type: string;
|
|
259
|
+
description: string;
|
|
260
|
+
properties: {
|
|
261
|
+
default_value: {
|
|
262
|
+
type: string;
|
|
263
|
+
enum: "block"[];
|
|
264
|
+
description: string;
|
|
265
|
+
};
|
|
266
|
+
allowed_values: {
|
|
267
|
+
type: string;
|
|
268
|
+
items: {
|
|
269
|
+
type: string;
|
|
270
|
+
enum: ("allow" | "block")[];
|
|
271
|
+
};
|
|
272
|
+
uniqueItems: boolean;
|
|
273
|
+
description: string;
|
|
274
|
+
};
|
|
275
|
+
};
|
|
276
|
+
required: string[];
|
|
277
|
+
};
|
|
257
278
|
invitation_landing_client_id: {
|
|
258
279
|
type: string;
|
|
259
280
|
description: string;
|
|
@@ -59,6 +59,27 @@ const myOrganizationConfigurationSchema = {
|
|
|
59
59
|
enum: Object.values(auth0_1.Management.ClientMyOrganizationDeletionBehaviorEnum),
|
|
60
60
|
description: 'The deletion behavior for My Organization connections created by this client',
|
|
61
61
|
},
|
|
62
|
+
third_party_client_access: {
|
|
63
|
+
type: 'object',
|
|
64
|
+
description: 'Controls whether third-party clients can access the organization via the My Organization API.',
|
|
65
|
+
properties: {
|
|
66
|
+
default_value: {
|
|
67
|
+
type: 'string',
|
|
68
|
+
enum: Object.values(auth0_1.Management.ClientMyOrganizationConfigurationThirdPartyClientAccessDefaultValueEnum),
|
|
69
|
+
description: 'The default third-party client access value.',
|
|
70
|
+
},
|
|
71
|
+
allowed_values: {
|
|
72
|
+
type: 'array',
|
|
73
|
+
items: {
|
|
74
|
+
type: 'string',
|
|
75
|
+
enum: Object.values(auth0_1.Management.ClientMyOrganizationConfigurationThirdPartyClientAccessAllowedValuesEnum),
|
|
76
|
+
},
|
|
77
|
+
uniqueItems: true,
|
|
78
|
+
description: 'The allowed third-party client access values.',
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
required: ['default_value', 'allowed_values'],
|
|
82
|
+
},
|
|
62
83
|
invitation_landing_client_id: {
|
|
63
84
|
type: 'string',
|
|
64
85
|
description: 'The client ID of the invitation landing client for the My Organization configuration',
|
|
@@ -36,6 +36,33 @@ export declare const schema: {
|
|
|
36
36
|
connection_config: {
|
|
37
37
|
type: string[];
|
|
38
38
|
};
|
|
39
|
+
cross_app_access_resource_app: {
|
|
40
|
+
type: string;
|
|
41
|
+
description: string;
|
|
42
|
+
properties: {
|
|
43
|
+
status: {
|
|
44
|
+
type: string;
|
|
45
|
+
properties: {
|
|
46
|
+
default_value: {
|
|
47
|
+
type: string;
|
|
48
|
+
enum: ("enabled" | "disabled")[];
|
|
49
|
+
description: string;
|
|
50
|
+
};
|
|
51
|
+
allowed_values: {
|
|
52
|
+
type: string;
|
|
53
|
+
items: {
|
|
54
|
+
type: string;
|
|
55
|
+
enum: ("enabled" | "disabled")[];
|
|
56
|
+
};
|
|
57
|
+
uniqueItems: boolean;
|
|
58
|
+
description: string;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
required: string[];
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
required: string[];
|
|
65
|
+
};
|
|
39
66
|
strategy_overrides: {
|
|
40
67
|
type: string[];
|
|
41
68
|
properties: {
|
|
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.getConnectionProfile = exports.schema = void 0;
|
|
7
|
+
const auth0_1 = require("auth0");
|
|
7
8
|
const default_1 = __importDefault(require("./default"));
|
|
8
9
|
const client_1 = require("../client");
|
|
9
10
|
const logger_1 = __importDefault(require("../../../logger"));
|
|
@@ -42,6 +43,35 @@ exports.schema = {
|
|
|
42
43
|
connection_config: {
|
|
43
44
|
type: ['object', 'null'],
|
|
44
45
|
},
|
|
46
|
+
cross_app_access_resource_app: {
|
|
47
|
+
type: 'object',
|
|
48
|
+
description: 'Controls whether organization admins may enable Cross App Access (XAA) on their Identity Providers.',
|
|
49
|
+
properties: {
|
|
50
|
+
status: {
|
|
51
|
+
type: 'object',
|
|
52
|
+
properties: {
|
|
53
|
+
default_value: {
|
|
54
|
+
type: 'string',
|
|
55
|
+
enum: Object.values(auth0_1.Management.ConnectionProfileCrossAppAccessResourceAppStatusDefaultValueEnum),
|
|
56
|
+
description: 'The default Cross App Access resource app status.',
|
|
57
|
+
},
|
|
58
|
+
allowed_values: {
|
|
59
|
+
type: 'array',
|
|
60
|
+
items: {
|
|
61
|
+
type: 'string',
|
|
62
|
+
enum: Object.values(auth0_1.Management.ConnectionProfileCrossAppAccessResourceAppStatusValueEnum),
|
|
63
|
+
},
|
|
64
|
+
uniqueItems: true,
|
|
65
|
+
description: 'The allowed Cross App Access resource app status values.',
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
// allowed_values is optional per the SDK type (unlike the client's
|
|
69
|
+
// third_party_client_access, which requires both fields).
|
|
70
|
+
required: ['default_value'],
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
required: ['status'],
|
|
74
|
+
},
|
|
45
75
|
strategy_overrides: {
|
|
46
76
|
type: ['object', 'null'],
|
|
47
77
|
properties: {
|
|
@@ -159,6 +159,15 @@ export declare const schema: {
|
|
|
159
159
|
id: {
|
|
160
160
|
type: string;
|
|
161
161
|
};
|
|
162
|
+
name: {
|
|
163
|
+
type: string;
|
|
164
|
+
};
|
|
165
|
+
email: {
|
|
166
|
+
type: string;
|
|
167
|
+
};
|
|
168
|
+
direct_members_count: {
|
|
169
|
+
type: string;
|
|
170
|
+
};
|
|
162
171
|
};
|
|
163
172
|
required: string[];
|
|
164
173
|
};
|
|
@@ -173,9 +182,7 @@ type DirectoryProvisioningConfig = Management.DirectoryProvisioning;
|
|
|
173
182
|
export type Connection = Management.ConnectionForList & {
|
|
174
183
|
enabled_clients?: string[];
|
|
175
184
|
directory_provisioning_configuration?: Pick<DirectoryProvisioningConfig, 'mapping' | 'synchronize_automatically' | 'synchronize_groups'> & {
|
|
176
|
-
synchronized_groups?:
|
|
177
|
-
id: string;
|
|
178
|
-
}>;
|
|
185
|
+
synchronized_groups?: Management.SynchronizedGroupPayload[];
|
|
179
186
|
};
|
|
180
187
|
};
|
|
181
188
|
export declare const addExcludedConnectionPropertiesToChanges: ({ proposedChanges, existingConnections, config, }: {
|
|
@@ -251,9 +258,7 @@ export default class ConnectionsHandler extends DefaultAPIHandler {
|
|
|
251
258
|
/**
|
|
252
259
|
* Retrieves all synchronized groups for a connection using checkpoint pagination.
|
|
253
260
|
*/
|
|
254
|
-
getConnectionSynchronizedGroups(connectionId: string): Promise<
|
|
255
|
-
id: string;
|
|
256
|
-
}> | null>;
|
|
261
|
+
getConnectionSynchronizedGroups(connectionId: string): Promise<Management.SynchronizedGroupPayload[] | null>;
|
|
257
262
|
/**
|
|
258
263
|
* Replaces the synchronized groups for a connection (PUT replace-all semantics).
|
|
259
264
|
*/
|
|
@@ -172,6 +172,9 @@ exports.schema = {
|
|
|
172
172
|
type: 'object',
|
|
173
173
|
properties: {
|
|
174
174
|
id: { type: 'string' },
|
|
175
|
+
name: { type: 'string' },
|
|
176
|
+
email: { type: 'string' },
|
|
177
|
+
direct_members_count: { type: 'number' },
|
|
175
178
|
},
|
|
176
179
|
required: ['id'],
|
|
177
180
|
},
|
|
@@ -377,12 +380,15 @@ class ConnectionsHandler extends default_1.default {
|
|
|
377
380
|
}
|
|
378
381
|
getFormattedOptions(connection, clients) {
|
|
379
382
|
try {
|
|
383
|
+
const { idpinitiated } = connection.options;
|
|
380
384
|
return {
|
|
381
385
|
options: {
|
|
382
386
|
...connection.options,
|
|
383
387
|
idpinitiated: {
|
|
384
|
-
...
|
|
385
|
-
|
|
388
|
+
...idpinitiated,
|
|
389
|
+
...(idpinitiated.client_id && {
|
|
390
|
+
client_id: (0, utils_1.convertClientNameToId)(idpinitiated.client_id, clients),
|
|
391
|
+
}),
|
|
386
392
|
},
|
|
387
393
|
},
|
|
388
394
|
};
|
|
@@ -483,12 +489,28 @@ class ConnectionsHandler extends default_1.default {
|
|
|
483
489
|
try {
|
|
484
490
|
const groups = [];
|
|
485
491
|
let page = await this.client.connections.directoryProvisioning.listSynchronizedGroups(connectionId, {});
|
|
486
|
-
for (const g of page.data ?? [])
|
|
487
|
-
groups.push({
|
|
492
|
+
for (const g of page.data ?? []) {
|
|
493
|
+
groups.push({
|
|
494
|
+
id: g.id,
|
|
495
|
+
...(g.name !== undefined && { name: g.name }),
|
|
496
|
+
...(g.email !== undefined && { email: g.email }),
|
|
497
|
+
...(g.direct_members_count !== undefined && {
|
|
498
|
+
direct_members_count: g.direct_members_count,
|
|
499
|
+
}),
|
|
500
|
+
});
|
|
501
|
+
}
|
|
488
502
|
while (page.hasNextPage?.()) {
|
|
489
503
|
page = await page.getNextPage();
|
|
490
|
-
for (const g of page.data ?? [])
|
|
491
|
-
groups.push({
|
|
504
|
+
for (const g of page.data ?? []) {
|
|
505
|
+
groups.push({
|
|
506
|
+
id: g.id,
|
|
507
|
+
...(g.name !== undefined && { name: g.name }),
|
|
508
|
+
...(g.email !== undefined && { email: g.email }),
|
|
509
|
+
...(g.direct_members_count !== undefined && {
|
|
510
|
+
direct_members_count: g.direct_members_count,
|
|
511
|
+
}),
|
|
512
|
+
});
|
|
513
|
+
}
|
|
492
514
|
}
|
|
493
515
|
return groups;
|
|
494
516
|
}
|
|
@@ -725,7 +747,11 @@ class ConnectionsHandler extends default_1.default {
|
|
|
725
747
|
...(enabledClients !== undefined && { enabled_clients: enabledClients }),
|
|
726
748
|
};
|
|
727
749
|
});
|
|
728
|
-
|
|
750
|
+
let proposedChanges = await super.dryRunChanges({ ...assets, connections: formatted });
|
|
751
|
+
const includedConnections = (assets.include && assets.include.connections) || [];
|
|
752
|
+
const excludedConnections = (assets.exclude && assets.exclude.connections) || [];
|
|
753
|
+
proposedChanges = (0, utils_1.filterExcluded)(proposedChanges, excludedConnections);
|
|
754
|
+
proposedChanges = (0, utils_1.filterIncluded)(proposedChanges, includedConnections);
|
|
729
755
|
return (0, exports.addExcludedConnectionPropertiesToChanges)({
|
|
730
756
|
proposedChanges,
|
|
731
757
|
existingConnections,
|
|
@@ -462,12 +462,21 @@ class DatabaseHandler extends default_1.default {
|
|
|
462
462
|
}
|
|
463
463
|
return connection;
|
|
464
464
|
});
|
|
465
|
+
// A connection can return both legacy password fields and `password_options` on read, but
|
|
466
|
+
// they're mutually exclusive on write. Strip the legacy fields to keep the export deployable.
|
|
467
|
+
const dbConnectionsNormalized = dbConnectionsWithActionNames.map((connection) => {
|
|
468
|
+
if (connection.options && 'password_options' in connection.options) {
|
|
469
|
+
const { passwordPolicy, password_complexity_options, password_history, password_no_personal_info, password_dictionary, ...options } = connection.options;
|
|
470
|
+
return { ...connection, options };
|
|
471
|
+
}
|
|
472
|
+
return connection;
|
|
473
|
+
});
|
|
465
474
|
// If options option is empty for all connection, log the missing options scope.
|
|
466
|
-
const isOptionExists =
|
|
475
|
+
const isOptionExists = dbConnectionsNormalized.every((c) => c.options && Object.keys(c.options).length > 0);
|
|
467
476
|
if (!isOptionExists) {
|
|
468
477
|
logger_1.default.warn(`Insufficient scope the read:connections_options scope is required to get ${this.type} options.`);
|
|
469
478
|
}
|
|
470
|
-
this.existing =
|
|
479
|
+
this.existing = dbConnectionsNormalized;
|
|
471
480
|
return this.existing;
|
|
472
481
|
}
|
|
473
482
|
async calcChanges(assets) {
|
|
@@ -545,7 +554,7 @@ class DatabaseHandler extends default_1.default {
|
|
|
545
554
|
assets: formatted,
|
|
546
555
|
existing: existingDatabasesConnections,
|
|
547
556
|
identifiers: this.identifiers,
|
|
548
|
-
ignoreDryRunFields: this.
|
|
557
|
+
ignoreDryRunFields: this.getEffectiveIgnoreDryRunFields(),
|
|
549
558
|
});
|
|
550
559
|
}
|
|
551
560
|
// Run after clients are updated so we can convert all the enabled_clients names to id's
|
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
import { Asset, Assets, Auth0APIClient, CalculatedChanges } from '../../../types';
|
|
2
2
|
import { ConfigFunction } from '../../../configFactory';
|
|
3
3
|
export declare function order(value: any): (t: any, n: any, descriptor: any) => any;
|
|
4
|
+
export interface RetryOptions {
|
|
5
|
+
maxRetries?: number;
|
|
6
|
+
initialDelay?: number;
|
|
7
|
+
maxDelay?: number;
|
|
8
|
+
onRetry?: (error: any, attempt: number, delay: number) => void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Executes a function with exponential backoff retry logic for rate limit errors (429).
|
|
12
|
+
*
|
|
13
|
+
* @param fn - The function to execute with retry logic
|
|
14
|
+
* @param options - Configuration options for retry behavior
|
|
15
|
+
* @returns Promise that resolves with the function result or rejects after max retries
|
|
16
|
+
*/
|
|
17
|
+
export declare function retryWithExponentialBackoff<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
4
18
|
type ApiMethodOverride = string | Function;
|
|
5
19
|
export default class APIHandler {
|
|
6
20
|
config: ConfigFunction;
|
|
@@ -50,6 +64,15 @@ export default class APIHandler {
|
|
|
50
64
|
*/
|
|
51
65
|
getEffectiveIgnoreDryRunFields(): string[];
|
|
52
66
|
getClientFN(fn: ApiMethodOverride): Function;
|
|
67
|
+
/**
|
|
68
|
+
* Builds the exponential-backoff retry configuration for this handler from the
|
|
69
|
+
* shared `AUTH0_MAX_RETRIES` / `AUTH0_RETRY_INITIAL_DELAY_MS` /
|
|
70
|
+
* `AUTH0_RETRY_MAX_DELAY_MS` config keys. Exposed so that handlers which issue
|
|
71
|
+
* writes outside the default `processChanges` flow (e.g. organizations, which
|
|
72
|
+
* writes nested connections/grants directly) can wrap those calls in the same
|
|
73
|
+
* 429 backoff behaviour as the base handler.
|
|
74
|
+
*/
|
|
75
|
+
getRetryConfig(): RetryOptions;
|
|
53
76
|
didDelete(item: Asset): void;
|
|
54
77
|
didCreate(item: Asset): void;
|
|
55
78
|
didUpdate(item: Asset): void;
|
|
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.order = order;
|
|
7
|
+
exports.retryWithExponentialBackoff = retryWithExponentialBackoff;
|
|
7
8
|
const auth0_1 = require("auth0");
|
|
8
9
|
const validationError_1 = __importDefault(require("../../validationError"));
|
|
9
10
|
const utils_1 = require("../../utils");
|
|
@@ -114,6 +115,25 @@ class APIHandler {
|
|
|
114
115
|
}
|
|
115
116
|
return fn;
|
|
116
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* Builds the exponential-backoff retry configuration for this handler from the
|
|
120
|
+
* shared `AUTH0_MAX_RETRIES` / `AUTH0_RETRY_INITIAL_DELAY_MS` /
|
|
121
|
+
* `AUTH0_RETRY_MAX_DELAY_MS` config keys. Exposed so that handlers which issue
|
|
122
|
+
* writes outside the default `processChanges` flow (e.g. organizations, which
|
|
123
|
+
* writes nested connections/grants directly) can wrap those calls in the same
|
|
124
|
+
* 429 backoff behaviour as the base handler.
|
|
125
|
+
*/
|
|
126
|
+
getRetryConfig() {
|
|
127
|
+
const retryConfig = {
|
|
128
|
+
maxRetries: this.config('AUTH0_MAX_RETRIES') || DEFAULT_MAX_RETRIES,
|
|
129
|
+
initialDelay: this.config('AUTH0_RETRY_INITIAL_DELAY_MS') || DEFAULT_INITIAL_DELAY_MS,
|
|
130
|
+
maxDelay: this.config('AUTH0_RETRY_MAX_DELAY_MS') || DEFAULT_MAX_DELAY_MS,
|
|
131
|
+
onRetry: (error, attempt, delay) => {
|
|
132
|
+
logger_1.default.warn(`Rate limit hit for [${this.type}]. Retrying attempt ${attempt}/${retryConfig.maxRetries} after ${Math.round(delay / 1000)}s...`);
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
return retryConfig;
|
|
136
|
+
}
|
|
117
137
|
didDelete(item) {
|
|
118
138
|
logger_1.default.info(`Deleted [${this.type}]: ${this.objString(item)}`);
|
|
119
139
|
}
|
|
@@ -210,7 +230,6 @@ class APIHandler {
|
|
|
210
230
|
return (0, calculateDryRunChanges_1.calculateDryRunChanges)({
|
|
211
231
|
type: this.type,
|
|
212
232
|
assets: typeAssets,
|
|
213
|
-
// @ts-ignore TODO: investigate what happens when `existing` is null
|
|
214
233
|
existing,
|
|
215
234
|
identifiers: this.identifiers,
|
|
216
235
|
ignoreDryRunFields: this.getEffectiveIgnoreDryRunFields(),
|
|
@@ -243,7 +262,6 @@ class APIHandler {
|
|
|
243
262
|
return (0, calculateDryRunChanges_1.calculateDryRunChanges)({
|
|
244
263
|
type: this.type,
|
|
245
264
|
assets: typeAssets,
|
|
246
|
-
// @ts-ignore TODO: investigate what happens when `existing` is null
|
|
247
265
|
existing,
|
|
248
266
|
identifiers: this.identifiers,
|
|
249
267
|
ignoreDryRunFields: this.getEffectiveIgnoreDryRunFields(),
|
|
@@ -282,14 +300,7 @@ class APIHandler {
|
|
|
282
300
|
const conflicts = changes.conflicts || [];
|
|
283
301
|
logger_1.default.debug(`Start processChanges for ${this.type} [delete:${del.length}] [update:${update.length}], [create:${create.length}], [conflicts:${conflicts.length}]`);
|
|
284
302
|
// Set retry configuration from config
|
|
285
|
-
const retryConfig =
|
|
286
|
-
maxRetries: this.config('AUTH0_MAX_RETRIES') || DEFAULT_MAX_RETRIES,
|
|
287
|
-
initialDelay: this.config('AUTH0_RETRY_INITIAL_DELAY_MS') || DEFAULT_INITIAL_DELAY_MS,
|
|
288
|
-
maxDelay: this.config('AUTH0_RETRY_MAX_DELAY_MS') || DEFAULT_MAX_DELAY_MS,
|
|
289
|
-
onRetry: (error, attempt, delay) => {
|
|
290
|
-
logger_1.default.warn(`Rate limit hit for [${this.type}]. Retrying attempt ${attempt}/${retryConfig.maxRetries} after ${Math.round(delay / 1000)}s...`);
|
|
291
|
-
},
|
|
292
|
-
};
|
|
303
|
+
const retryConfig = this.getRetryConfig();
|
|
293
304
|
// Process Deleted
|
|
294
305
|
if (del.length > 0) {
|
|
295
306
|
const allowDelete = this.config('AUTH0_ALLOW_DELETE') === 'true' || this.config('AUTH0_ALLOW_DELETE') === true;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Management } from 'auth0';
|
|
2
2
|
import DefaultHandler from './default';
|
|
3
3
|
import { Asset, Assets, CalculatedChanges } from '../../../types';
|
|
4
|
+
import { Client } from './clients';
|
|
4
5
|
export declare const schema: {
|
|
5
6
|
type: string;
|
|
6
7
|
items: {
|
|
@@ -108,6 +109,25 @@ export declare const schema: {
|
|
|
108
109
|
type: string;
|
|
109
110
|
enum: ("allow" | "block")[];
|
|
110
111
|
};
|
|
112
|
+
is_app_entitlement_active: {
|
|
113
|
+
type: string;
|
|
114
|
+
};
|
|
115
|
+
clients: {
|
|
116
|
+
type: string;
|
|
117
|
+
items: {
|
|
118
|
+
type: string;
|
|
119
|
+
properties: {
|
|
120
|
+
client_id: {
|
|
121
|
+
type: string;
|
|
122
|
+
};
|
|
123
|
+
use_for_member_access: {
|
|
124
|
+
type: string;
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
required: string[];
|
|
128
|
+
};
|
|
129
|
+
default: never[];
|
|
130
|
+
};
|
|
111
131
|
};
|
|
112
132
|
required: string[];
|
|
113
133
|
};
|
|
@@ -119,6 +139,7 @@ type FormattedClientGrants = {
|
|
|
119
139
|
export default class OrganizationsHandler extends DefaultHandler {
|
|
120
140
|
existing: Asset[];
|
|
121
141
|
formattedClientGrants: FormattedClientGrants[];
|
|
142
|
+
allClients: Client[];
|
|
122
143
|
constructor(config: DefaultHandler);
|
|
123
144
|
deleteOrganization(org: any): Promise<void>;
|
|
124
145
|
deleteOrganizations(data: Asset[]): Promise<void>;
|
|
@@ -126,8 +147,9 @@ export default class OrganizationsHandler extends DefaultHandler {
|
|
|
126
147
|
createOrganizations(creates: CalculatedChanges['create']): Promise<void>;
|
|
127
148
|
updateOrganization(org: any, organizations: any): Promise<{
|
|
128
149
|
id: any;
|
|
129
|
-
}>;
|
|
150
|
+
} | null>;
|
|
130
151
|
getClientGrantIDByClientName(clientsName: string): string;
|
|
152
|
+
getClientIdByClientName(clientName: string): string;
|
|
131
153
|
getFormattedClientGrants(): Promise<FormattedClientGrants[]>;
|
|
132
154
|
updateOrganizations(updates: CalculatedChanges['update'], orgs: Asset[]): Promise<void>;
|
|
133
155
|
getType(): Promise<Asset[]>;
|
|
@@ -141,5 +163,11 @@ export default class OrganizationsHandler extends DefaultHandler {
|
|
|
141
163
|
createOrganizationDiscoveryDomain(organizationId: string, discoveryDomain: Management.CreateOrganizationDiscoveryDomainRequestContent): Promise<Management.CreateOrganizationDiscoveryDomainResponseContent>;
|
|
142
164
|
updateOrganizationDiscoveryDomain(organizationId: string, discoveryDomainId: string, discoveryDomain: string, discoveryDomainUpdate: Management.UpdateOrganizationDiscoveryDomainRequestContent): Promise<Management.UpdateOrganizationDiscoveryDomainResponseContent>;
|
|
143
165
|
deleteOrganizationDiscoveryDomain(organizationId: string, discoveryDomain: string, discoveryDomainId: string): Promise<void>;
|
|
166
|
+
getAllOrganizationClients(organizationId: string): Promise<Management.OrganizationClient[] | null>;
|
|
167
|
+
createOrganizationClients(organizationId: string, clients: Array<{
|
|
168
|
+
client_id: string;
|
|
169
|
+
use_for_member_access: boolean;
|
|
170
|
+
}>): Promise<void>;
|
|
171
|
+
deleteOrganizationClients(organizationId: string, clientIds: string[]): Promise<void>;
|
|
144
172
|
}
|
|
145
173
|
export {};
|