auth0-deploy-cli 7.9.0 → 7.11.1
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 +37 -1
- package/README.md +1 -1
- package/lib/context/directory/handlers/actions.d.ts +2 -3
- package/lib/context/directory/handlers/actions.js +4 -4
- package/lib/context/directory/handlers/attackProtection.d.ts +6 -7
- package/lib/context/directory/handlers/attackProtection.js +3 -1
- package/lib/context/directory/handlers/branding.d.ts +2 -3
- package/lib/context/directory/handlers/branding.js +45 -21
- package/lib/context/directory/handlers/clientGrants.d.ts +2 -3
- package/lib/context/directory/handlers/clientGrants.js +3 -2
- package/lib/context/directory/handlers/clients.d.ts +2 -3
- package/lib/context/directory/handlers/clients.js +1 -1
- package/lib/context/directory/handlers/connections.d.ts +2 -3
- package/lib/context/directory/handlers/connections.js +3 -3
- package/lib/context/directory/handlers/databases.d.ts +2 -3
- package/lib/context/directory/handlers/databases.js +2 -2
- package/lib/context/directory/handlers/emailProvider.d.ts +2 -3
- package/lib/context/directory/handlers/emailProvider.js +12 -10
- package/lib/context/directory/handlers/emailTemplates.d.ts +2 -3
- package/lib/context/directory/handlers/emailTemplates.js +2 -2
- package/lib/context/directory/handlers/guardianFactorProviders.d.ts +2 -3
- package/lib/context/directory/handlers/guardianFactorProviders.js +1 -1
- package/lib/context/directory/handlers/guardianFactorTemplates.d.ts +2 -3
- package/lib/context/directory/handlers/guardianFactorTemplates.js +1 -1
- package/lib/context/directory/handlers/guardianFactors.d.ts +2 -3
- package/lib/context/directory/handlers/guardianFactors.js +1 -1
- package/lib/context/directory/handlers/guardianPhoneFactorMessageTypes.d.ts +2 -3
- package/lib/context/directory/handlers/guardianPhoneFactorMessageTypes.js +6 -6
- package/lib/context/directory/handlers/guardianPhoneFactorSelectedProvider.d.ts +2 -3
- package/lib/context/directory/handlers/guardianPhoneFactorSelectedProvider.js +6 -6
- package/lib/context/directory/handlers/guardianPolicies.d.ts +2 -3
- package/lib/context/directory/handlers/guardianPolicies.js +6 -6
- package/lib/context/directory/handlers/hooks.d.ts +2 -3
- package/lib/context/directory/handlers/hooks.js +3 -3
- package/lib/context/directory/handlers/index.d.ts +2 -2
- package/lib/context/directory/handlers/logStreams.d.ts +2 -4
- package/lib/context/directory/handlers/logStreams.js +2 -2
- package/lib/context/directory/handlers/migrations.d.ts +2 -3
- package/lib/context/directory/handlers/migrations.js +2 -2
- package/lib/context/directory/handlers/organizations.d.ts +2 -3
- package/lib/context/directory/handlers/organizations.js +1 -1
- package/lib/context/directory/handlers/pages.d.ts +2 -3
- package/lib/context/directory/handlers/pages.js +2 -2
- package/lib/context/directory/handlers/resourceServers.d.ts +2 -3
- package/lib/context/directory/handlers/resourceServers.js +1 -1
- package/lib/context/directory/handlers/roles.d.ts +2 -3
- package/lib/context/directory/handlers/roles.js +1 -1
- package/lib/context/directory/handlers/rules.d.ts +2 -3
- package/lib/context/directory/handlers/rules.js +2 -2
- package/lib/context/directory/handlers/rulesConfigs.d.ts +2 -3
- package/lib/context/directory/handlers/rulesConfigs.js +1 -1
- package/lib/context/directory/handlers/tenant.d.ts +7 -7
- package/lib/context/directory/handlers/tenant.js +11 -10
- package/lib/context/directory/handlers/triggers.d.ts +2 -3
- package/lib/context/directory/handlers/triggers.js +1 -1
- package/lib/context/yaml/handlers/actions.d.ts +2 -3
- package/lib/context/yaml/handlers/actions.js +6 -8
- package/lib/context/yaml/handlers/attackProtection.d.ts +6 -3
- package/lib/context/yaml/handlers/attackProtection.js +9 -1
- package/lib/context/yaml/handlers/branding.d.ts +9 -2
- package/lib/context/yaml/handlers/branding.js +33 -11
- package/lib/context/yaml/handlers/clientGrants.d.ts +2 -3
- package/lib/context/yaml/handlers/clientGrants.js +7 -6
- package/lib/context/yaml/handlers/clients.d.ts +2 -3
- package/lib/context/yaml/handlers/clients.js +6 -3
- package/lib/context/yaml/handlers/connections.d.ts +2 -3
- package/lib/context/yaml/handlers/connections.js +6 -9
- package/lib/context/yaml/handlers/databases.d.ts +3 -4
- package/lib/context/yaml/handlers/databases.js +7 -7
- package/lib/context/yaml/handlers/emailProvider.d.ts +2 -3
- package/lib/context/yaml/handlers/emailProvider.js +17 -10
- package/lib/context/yaml/handlers/emailTemplates.d.ts +2 -3
- package/lib/context/yaml/handlers/emailTemplates.js +16 -13
- package/lib/context/yaml/handlers/guardianFactorProviders.d.ts +2 -3
- package/lib/context/yaml/handlers/guardianFactorProviders.js +4 -2
- package/lib/context/yaml/handlers/guardianFactorTemplates.d.ts +2 -3
- package/lib/context/yaml/handlers/guardianFactorTemplates.js +4 -2
- package/lib/context/yaml/handlers/guardianFactors.d.ts +2 -3
- package/lib/context/yaml/handlers/guardianFactors.js +4 -2
- package/lib/context/yaml/handlers/guardianPhoneFactorMessageTypes.d.ts +2 -3
- package/lib/context/yaml/handlers/guardianPhoneFactorMessageTypes.js +4 -2
- package/lib/context/yaml/handlers/guardianPhoneFactorSelectedProvider.d.ts +2 -3
- package/lib/context/yaml/handlers/guardianPhoneFactorSelectedProvider.js +4 -2
- package/lib/context/yaml/handlers/guardianPolicies.d.ts +4 -3
- package/lib/context/yaml/handlers/guardianPolicies.js +4 -2
- package/lib/context/yaml/handlers/hooks.d.ts +2 -3
- package/lib/context/yaml/handlers/hooks.js +20 -19
- package/lib/context/yaml/handlers/index.d.ts +1 -1
- package/lib/context/yaml/handlers/logStreams.d.ts +2 -4
- package/lib/context/yaml/handlers/logStreams.js +4 -1
- package/lib/context/yaml/handlers/migrations.d.ts +2 -3
- package/lib/context/yaml/handlers/migrations.js +5 -9
- package/lib/context/yaml/handlers/organizations.d.ts +2 -1
- package/lib/context/yaml/handlers/organizations.js +17 -15
- package/lib/context/yaml/handlers/pages.d.ts +2 -3
- package/lib/context/yaml/handlers/pages.js +20 -18
- package/lib/context/yaml/handlers/resourceServers.d.ts +2 -3
- package/lib/context/yaml/handlers/resourceServers.js +8 -13
- package/lib/context/yaml/handlers/roles.d.ts +2 -3
- package/lib/context/yaml/handlers/roles.js +13 -11
- package/lib/context/yaml/handlers/rules.d.ts +2 -3
- package/lib/context/yaml/handlers/rules.js +18 -17
- package/lib/context/yaml/handlers/rulesConfigs.d.ts +2 -3
- package/lib/context/yaml/handlers/rulesConfigs.js +9 -5
- package/lib/context/yaml/handlers/tenant.d.ts +2 -3
- package/lib/context/yaml/handlers/tenant.js +4 -3
- package/lib/context/yaml/handlers/triggers.d.ts +2 -3
- package/lib/context/yaml/handlers/triggers.js +2 -2
- package/lib/context/yaml/index.js +2 -1
- package/lib/tools/auth0/handlers/actions.js +23 -7
- package/lib/tools/auth0/handlers/branding.d.ts +2 -2
- package/lib/tools/auth0/handlers/clientGrants.js +1 -1
- package/lib/tools/auth0/handlers/connections.js +1 -1
- package/lib/tools/auth0/handlers/default.js +10 -2
- package/lib/tools/auth0/handlers/organizations.js +1 -1
- package/lib/tools/auth0/handlers/resourceServers.js +1 -1
- package/lib/tools/auth0/handlers/roles.js +1 -1
- package/lib/tools/auth0/handlers/rules.js +3 -3
- package/lib/tools/auth0/index.js +5 -2
- package/lib/tools/calculateChanges.d.ts +2 -2
- package/lib/tools/calculateChanges.js +2 -2
- package/lib/tools/utils.d.ts +9 -0
- package/lib/tools/utils.js +33 -1
- package/lib/types.d.ts +37 -32
- package/lib/utils.d.ts +34 -29
- package/lib/utils.js +1 -1
- package/package.json +9 -6
|
@@ -18,32 +18,33 @@ const utils_1 = require("../../../utils");
|
|
|
18
18
|
const logger_1 = __importDefault(require("../../../logger"));
|
|
19
19
|
function parse(context) {
|
|
20
20
|
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
-
|
|
22
|
-
if (!
|
|
23
|
-
return {};
|
|
21
|
+
const { rules } = context.assets;
|
|
22
|
+
if (!rules)
|
|
23
|
+
return { rules: null };
|
|
24
24
|
return {
|
|
25
25
|
rules: [
|
|
26
|
-
...
|
|
26
|
+
...rules.map((rule) => (Object.assign(Object.assign({}, rule), { script: context.loadFile(rule.script) }))),
|
|
27
27
|
],
|
|
28
28
|
};
|
|
29
29
|
});
|
|
30
30
|
}
|
|
31
31
|
function dump(context) {
|
|
32
32
|
return __awaiter(this, void 0, void 0, function* () {
|
|
33
|
-
let rules =
|
|
34
|
-
if (rules
|
|
35
|
-
|
|
36
|
-
const rulesFolder = path_1.default.join(context.basePath, 'rules');
|
|
37
|
-
fs_extra_1.default.ensureDirSync(rulesFolder);
|
|
38
|
-
rules = rules.map((rule) => {
|
|
39
|
-
// Dump rule to file
|
|
40
|
-
const scriptName = (0, utils_1.sanitize)(`${rule.name}.js`);
|
|
41
|
-
const scriptFile = path_1.default.join(rulesFolder, scriptName);
|
|
42
|
-
logger_1.default.info(`Writing ${scriptFile}`);
|
|
43
|
-
fs_extra_1.default.writeFileSync(scriptFile, rule.script);
|
|
44
|
-
return Object.assign(Object.assign({}, rule), { script: `./rules/${scriptName}` });
|
|
45
|
-
});
|
|
33
|
+
let { rules } = context.assets;
|
|
34
|
+
if (!rules) {
|
|
35
|
+
return { rules: null };
|
|
46
36
|
}
|
|
37
|
+
// Create Rules folder
|
|
38
|
+
const rulesFolder = path_1.default.join(context.basePath, 'rules');
|
|
39
|
+
fs_extra_1.default.ensureDirSync(rulesFolder);
|
|
40
|
+
rules = rules.map((rule) => {
|
|
41
|
+
// Dump rule to file
|
|
42
|
+
const scriptName = (0, utils_1.sanitize)(`${rule.name}.js`);
|
|
43
|
+
const scriptFile = path_1.default.join(rulesFolder, scriptName);
|
|
44
|
+
logger_1.default.info(`Writing ${scriptFile}`);
|
|
45
|
+
fs_extra_1.default.writeFileSync(scriptFile, rule.script);
|
|
46
|
+
return Object.assign(Object.assign({}, rule), { script: `./rules/${scriptName}` });
|
|
47
|
+
});
|
|
47
48
|
return { rules };
|
|
48
49
|
});
|
|
49
50
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { YAMLHandler } from '.';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
} | {};
|
|
2
|
+
import { Asset, ParsedAsset } from '../../../types';
|
|
3
|
+
declare type ParsedRulesConfigs = ParsedAsset<'rulesConfigs', Asset[]>;
|
|
5
4
|
declare const rulesConfigsHandler: YAMLHandler<ParsedRulesConfigs>;
|
|
6
5
|
export default rulesConfigsHandler;
|
|
@@ -11,17 +11,21 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
function parse(context) {
|
|
13
13
|
return __awaiter(this, void 0, void 0, function* () {
|
|
14
|
-
|
|
14
|
+
const { rulesConfigs } = context.assets;
|
|
15
|
+
if (!rulesConfigs)
|
|
16
|
+
return { rulesConfigs: null };
|
|
15
17
|
return {
|
|
16
|
-
rulesConfigs
|
|
18
|
+
rulesConfigs,
|
|
17
19
|
};
|
|
18
20
|
});
|
|
19
21
|
}
|
|
20
|
-
function dump(
|
|
22
|
+
function dump(context) {
|
|
21
23
|
return __awaiter(this, void 0, void 0, function* () {
|
|
22
|
-
|
|
24
|
+
const { rulesConfigs } = context.assets;
|
|
25
|
+
if (!rulesConfigs)
|
|
26
|
+
return { rulesConfigs: null };
|
|
23
27
|
return {
|
|
24
|
-
rulesConfigs: [],
|
|
28
|
+
rulesConfigs: [], // even if they exist, do not export rulesConfigs as its values cannot be extracted
|
|
25
29
|
};
|
|
26
30
|
});
|
|
27
31
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { YAMLHandler } from '.';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
} | {};
|
|
2
|
+
import { Asset, ParsedAsset } from '../../../types';
|
|
3
|
+
declare type ParsedTenant = ParsedAsset<'tenant', Asset>;
|
|
5
4
|
declare const tenantHandler: YAMLHandler<ParsedTenant>;
|
|
6
5
|
export default tenantHandler;
|
|
@@ -24,9 +24,8 @@ const utils_1 = require("../../../utils");
|
|
|
24
24
|
const sessionDurationsToMinutes_1 = require("../../../sessionDurationsToMinutes");
|
|
25
25
|
function parse(context) {
|
|
26
26
|
return __awaiter(this, void 0, void 0, function* () {
|
|
27
|
-
// Nothing to do
|
|
28
27
|
if (!context.assets.tenant)
|
|
29
|
-
return {};
|
|
28
|
+
return { tenant: null };
|
|
30
29
|
/* eslint-disable camelcase */
|
|
31
30
|
const _a = context.assets.tenant, { session_lifetime, idle_session_lifetime } = _a, tenant = __rest(_a, ["session_lifetime", "idle_session_lifetime"]);
|
|
32
31
|
(0, utils_1.clearTenantFlags)(tenant);
|
|
@@ -38,7 +37,9 @@ function parse(context) {
|
|
|
38
37
|
}
|
|
39
38
|
function dump(context) {
|
|
40
39
|
return __awaiter(this, void 0, void 0, function* () {
|
|
41
|
-
const tenant =
|
|
40
|
+
const tenant = context.assets.tenant;
|
|
41
|
+
if (!tenant)
|
|
42
|
+
return { tenant: null };
|
|
42
43
|
(0, utils_1.clearTenantFlags)(tenant);
|
|
43
44
|
return { tenant };
|
|
44
45
|
});
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { YAMLHandler } from '.';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
} | {};
|
|
2
|
+
import { Asset, ParsedAsset } from '../../../types';
|
|
3
|
+
declare type ParsedTriggers = ParsedAsset<'triggers', Asset[]>;
|
|
5
4
|
declare const triggersHandler: YAMLHandler<ParsedTriggers>;
|
|
6
5
|
export default triggersHandler;
|
|
@@ -13,7 +13,7 @@ function parse(context) {
|
|
|
13
13
|
return __awaiter(this, void 0, void 0, function* () {
|
|
14
14
|
// Load the script file for each action
|
|
15
15
|
if (!context.assets.triggers)
|
|
16
|
-
return {};
|
|
16
|
+
return { triggers: null };
|
|
17
17
|
return {
|
|
18
18
|
triggers: context.assets.triggers,
|
|
19
19
|
};
|
|
@@ -24,7 +24,7 @@ function dump(context) {
|
|
|
24
24
|
const { triggers } = context.assets;
|
|
25
25
|
// Nothing to do
|
|
26
26
|
if (!triggers)
|
|
27
|
-
return {};
|
|
27
|
+
return { triggers: null };
|
|
28
28
|
return {
|
|
29
29
|
triggers: triggers,
|
|
30
30
|
};
|
|
@@ -111,7 +111,8 @@ class YAMLContext {
|
|
|
111
111
|
try {
|
|
112
112
|
const data = yield handler.dump(this);
|
|
113
113
|
if (data) {
|
|
114
|
-
|
|
114
|
+
if (data[name] !== null)
|
|
115
|
+
logger_1.default.info(`Exporting ${name}`);
|
|
115
116
|
Object.entries(data).forEach(([k, v]) => {
|
|
116
117
|
this.assets[k] = Array.isArray(v)
|
|
117
118
|
? v.map(utils_1.formatResults).sort(utils_1.recordsSorter)
|
|
@@ -46,7 +46,7 @@ const lodash_1 = __importDefault(require("lodash"));
|
|
|
46
46
|
const default_1 = __importStar(require("./default"));
|
|
47
47
|
const logger_1 = __importDefault(require("../../../logger"));
|
|
48
48
|
const utils_1 = require("../../utils");
|
|
49
|
-
const
|
|
49
|
+
const MAX_ACTION_DEPLOY_RETRY_ATTEMPTS = 60; // 60 * 2s => 2 min timeout
|
|
50
50
|
// With this schema, we can only validate property types but not valid properties on per type basis
|
|
51
51
|
exports.schema = {
|
|
52
52
|
type: 'array',
|
|
@@ -162,10 +162,10 @@ class ActionHandler extends default_1.default {
|
|
|
162
162
|
logger_1.default.info(`[${this.type}]: Waiting for build to complete ${this.objString(action)}`);
|
|
163
163
|
action.retry_count = 1;
|
|
164
164
|
}
|
|
165
|
-
if (action.retry_count >
|
|
165
|
+
if (action.retry_count > MAX_ACTION_DEPLOY_RETRY_ATTEMPTS) {
|
|
166
166
|
throw err;
|
|
167
167
|
}
|
|
168
|
-
yield sleep(
|
|
168
|
+
yield sleep(2000);
|
|
169
169
|
action.retry_count += 1;
|
|
170
170
|
yield this.deployAction(action);
|
|
171
171
|
}
|
|
@@ -211,12 +211,12 @@ class ActionHandler extends default_1.default {
|
|
|
211
211
|
return this.existing;
|
|
212
212
|
}
|
|
213
213
|
catch (err) {
|
|
214
|
-
if (err.statusCode ===
|
|
215
|
-
return
|
|
214
|
+
if (err.statusCode === 404 || err.statusCode === 501) {
|
|
215
|
+
return null;
|
|
216
216
|
}
|
|
217
217
|
if (isActionsDisabled(err)) {
|
|
218
218
|
logger_1.default.info('Skipping actions because it is not enabled.');
|
|
219
|
-
return
|
|
219
|
+
return null;
|
|
220
220
|
}
|
|
221
221
|
throw err;
|
|
222
222
|
}
|
|
@@ -233,9 +233,25 @@ class ActionHandler extends default_1.default {
|
|
|
233
233
|
return;
|
|
234
234
|
const changes = yield this.calcChanges(assets);
|
|
235
235
|
yield _super.processChanges.call(this, assets, changes);
|
|
236
|
+
const postProcessedActions = yield (() => __awaiter(this, void 0, void 0, function* () {
|
|
237
|
+
this.existing = null; //Clear the cache
|
|
238
|
+
const actions = yield this.getType();
|
|
239
|
+
return actions;
|
|
240
|
+
}))();
|
|
236
241
|
// Deploy actions
|
|
237
242
|
const deployActions = [
|
|
238
|
-
...changes.create
|
|
243
|
+
...changes.create
|
|
244
|
+
.filter((action) => action.deployed)
|
|
245
|
+
.map((actionWithoutId) => {
|
|
246
|
+
var _a;
|
|
247
|
+
// Add IDs to just-created actions
|
|
248
|
+
const actionId = (_a = postProcessedActions === null || postProcessedActions === void 0 ? void 0 : postProcessedActions.find((postProcessedAction) => {
|
|
249
|
+
return postProcessedAction.name === actionWithoutId.name;
|
|
250
|
+
})) === null || _a === void 0 ? void 0 : _a.id;
|
|
251
|
+
const actionWithId = Object.assign(Object.assign({}, actionWithoutId), { id: actionId });
|
|
252
|
+
return actionWithId;
|
|
253
|
+
})
|
|
254
|
+
.filter((action) => !!action.id),
|
|
239
255
|
...changes.update.filter((action) => action.deployed),
|
|
240
256
|
];
|
|
241
257
|
yield this.deployActions(deployActions);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import DefaultHandler from './default';
|
|
2
|
-
import { Asset } from '../../../types';
|
|
2
|
+
import { Asset, Assets } from '../../../types';
|
|
3
3
|
export declare const schema: {
|
|
4
4
|
type: string;
|
|
5
5
|
properties: {
|
|
@@ -23,5 +23,5 @@ export default class BrandingHandler extends DefaultHandler {
|
|
|
23
23
|
existing: Asset;
|
|
24
24
|
constructor(options: DefaultHandler);
|
|
25
25
|
getType(): Promise<Asset>;
|
|
26
|
-
processChanges(assets:
|
|
26
|
+
processChanges(assets: Assets): Promise<void>;
|
|
27
27
|
}
|
|
@@ -93,7 +93,7 @@ class ClientGrantsHandler extends default_1.default {
|
|
|
93
93
|
const excludedClientsByNames = (assets.exclude && assets.exclude.clients) || [];
|
|
94
94
|
const excludedClients = (0, utils_1.convertClientNamesToIds)(excludedClientsByNames, clients);
|
|
95
95
|
// Convert clients by name to the id
|
|
96
|
-
const formatted =
|
|
96
|
+
const formatted = clientGrants.map((clientGrant) => {
|
|
97
97
|
const grant = Object.assign({}, clientGrant);
|
|
98
98
|
const found = clients.find((c) => c.name === grant.client_id);
|
|
99
99
|
if (found)
|
|
@@ -145,7 +145,7 @@ class ConnectionsHandler extends default_1.default {
|
|
|
145
145
|
paginate: true,
|
|
146
146
|
include_totals: true,
|
|
147
147
|
});
|
|
148
|
-
const formatted =
|
|
148
|
+
const formatted = connections.map((connection) => (Object.assign(Object.assign(Object.assign({}, connection), this.getFormattedOptions(connection, clients)), { enabled_clients: (0, utils_1.getEnabledClients)(assets, connection, existingConnections, clients) })));
|
|
149
149
|
const proposedChanges = yield _super.calcChanges.call(this, Object.assign(Object.assign({}, assets), { connections: formatted }));
|
|
150
150
|
const proposedChangesWithExcludedProperties = (0, exports.addExcludedConnectionPropertiesToChanges)({
|
|
151
151
|
proposedChanges,
|
|
@@ -69,8 +69,15 @@ class APIHandler {
|
|
|
69
69
|
load() {
|
|
70
70
|
return __awaiter(this, void 0, void 0, function* () {
|
|
71
71
|
// Load Asset from Tenant
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
const data = yield (() => __awaiter(this, void 0, void 0, function* () {
|
|
73
|
+
const { data, hadSufficientScopes, requiredScopes } = yield (0, utils_1.detectInsufficientScopeError)(this.getType.bind(this));
|
|
74
|
+
if (!hadSufficientScopes) {
|
|
75
|
+
logger_1.default.warn(`Cannot retrieve ${this.type} due to missing scopes: ${requiredScopes}`);
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
logger_1.default.info(`Retrieving ${this.type} data from Auth0`);
|
|
79
|
+
return data;
|
|
80
|
+
}))();
|
|
74
81
|
this.existing = (0, utils_1.obfuscateSensitiveValues)(data, this.sensitiveFieldsToObfuscate);
|
|
75
82
|
return { [this.type]: this.existing };
|
|
76
83
|
});
|
|
@@ -92,6 +99,7 @@ class APIHandler {
|
|
|
92
99
|
return (0, calculateChanges_1.calculateChanges)({
|
|
93
100
|
handler: this,
|
|
94
101
|
assets: typeAssets,
|
|
102
|
+
allowDelete: !!this.config('AUTH0_ALLOW_DELETE'),
|
|
95
103
|
//@ts-ignore TODO: investigate what happens when `existing` is null
|
|
96
104
|
existing,
|
|
97
105
|
identifiers: this.identifiers,
|
|
@@ -237,7 +237,7 @@ class OrganizationsHandler extends default_1.default {
|
|
|
237
237
|
assets: organizations,
|
|
238
238
|
existing,
|
|
239
239
|
identifiers: ['id', 'name'],
|
|
240
|
-
allowDelete:
|
|
240
|
+
allowDelete: !!this.config('AUTH0_ALLOW_DELETE'),
|
|
241
241
|
});
|
|
242
242
|
logger_1.default.debug(`Start processChanges for organizations [delete:${changes.del.length}] [update:${changes.update.length}], [create:${changes.create.length}]`);
|
|
243
243
|
const myChanges = [
|
|
@@ -83,7 +83,7 @@ class ResourceServersHandler extends default_1.default {
|
|
|
83
83
|
assets: resourceServers,
|
|
84
84
|
existing,
|
|
85
85
|
identifiers: ['id', 'identifier'],
|
|
86
|
-
allowDelete:
|
|
86
|
+
allowDelete: !!this.config('AUTH0_ALLOW_DELETE'),
|
|
87
87
|
});
|
|
88
88
|
});
|
|
89
89
|
}
|
|
@@ -210,7 +210,7 @@ class RolesHandler extends default_1.default {
|
|
|
210
210
|
assets: roles,
|
|
211
211
|
existing,
|
|
212
212
|
identifiers: ['id', 'name'],
|
|
213
|
-
allowDelete:
|
|
213
|
+
allowDelete: !!this.config('AUTH0_ALLOW_DELETE'),
|
|
214
214
|
});
|
|
215
215
|
logger_1.default.debug(`Start processChanges for roles [delete:${changes.del.length}] [update:${changes.update.length}], [create:${changes.create.length}]`);
|
|
216
216
|
const myChanges = [
|
|
@@ -89,7 +89,7 @@ class RulesHandler extends default_1.default {
|
|
|
89
89
|
assets: rules,
|
|
90
90
|
existing,
|
|
91
91
|
identifiers: ['id', 'name'],
|
|
92
|
-
allowDelete:
|
|
92
|
+
allowDelete: !!this.config('AUTH0_ALLOW_DELETE'),
|
|
93
93
|
});
|
|
94
94
|
// Figure out the rules that need to be re-ordered
|
|
95
95
|
const futureRules = [...create, ...update];
|
|
@@ -175,8 +175,8 @@ class RulesHandler extends default_1.default {
|
|
|
175
175
|
yield this.client.pool
|
|
176
176
|
.addEachTask({
|
|
177
177
|
data: changes.reOrder,
|
|
178
|
-
generator: (rule) => this.client
|
|
179
|
-
.
|
|
178
|
+
generator: (rule) => this.client.rules
|
|
179
|
+
.update({ id: rule.id }, (0, utils_1.stripFields)(rule, this.stripUpdateFields))
|
|
180
180
|
.then(() => {
|
|
181
181
|
const updated = {
|
|
182
182
|
name: rule.name,
|
package/lib/tools/auth0/index.js
CHANGED
|
@@ -62,8 +62,11 @@ class Auth0 {
|
|
|
62
62
|
}
|
|
63
63
|
validate() {
|
|
64
64
|
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
-
const ajv = new ajv_1.default({ useDefaults: true });
|
|
66
|
-
const
|
|
65
|
+
const ajv = new ajv_1.default({ useDefaults: true, nullable: true });
|
|
66
|
+
const nonNullAssets = Object.keys(this.assets)
|
|
67
|
+
.filter((k) => this.assets[k] != null)
|
|
68
|
+
.reduce((a, k) => (Object.assign(Object.assign({}, a), { [k]: this.assets[k] })), {});
|
|
69
|
+
const valid = ajv.validate(schema_1.default, nonNullAssets);
|
|
67
70
|
if (!valid) {
|
|
68
71
|
throw new Error(`Schema validation failed loading ${JSON.stringify(ajv.errors, null, 4)}`);
|
|
69
72
|
}
|
|
@@ -6,14 +6,14 @@ import { Asset, CalculatedChanges } from '../types';
|
|
|
6
6
|
* @param {T} desiredAssetState
|
|
7
7
|
* @param {T} currentAssetState
|
|
8
8
|
* @param {string[]} [objectFields=[]]
|
|
9
|
-
* @param {boolean} [allowDelete
|
|
9
|
+
* @param {boolean} [allowDelete]
|
|
10
10
|
* @returns T
|
|
11
11
|
*/
|
|
12
12
|
export declare function processChangedObjectFields({ handler, desiredAssetState, currentAssetState, allowDelete, }: {
|
|
13
13
|
handler: APIHandler;
|
|
14
14
|
desiredAssetState: Asset;
|
|
15
15
|
currentAssetState: Asset;
|
|
16
|
-
allowDelete
|
|
16
|
+
allowDelete: boolean;
|
|
17
17
|
}): {
|
|
18
18
|
[x: string]: any;
|
|
19
19
|
};
|
|
@@ -11,10 +11,10 @@ const logger_1 = __importDefault(require("../logger"));
|
|
|
11
11
|
* @param {T} desiredAssetState
|
|
12
12
|
* @param {T} currentAssetState
|
|
13
13
|
* @param {string[]} [objectFields=[]]
|
|
14
|
-
* @param {boolean} [allowDelete
|
|
14
|
+
* @param {boolean} [allowDelete]
|
|
15
15
|
* @returns T
|
|
16
16
|
*/
|
|
17
|
-
function processChangedObjectFields({ handler, desiredAssetState, currentAssetState, allowDelete
|
|
17
|
+
function processChangedObjectFields({ handler, desiredAssetState, currentAssetState, allowDelete, }) {
|
|
18
18
|
const desiredAssetStateWithChanges = Object.assign({}, desiredAssetState);
|
|
19
19
|
// eslint-disable-next-line no-restricted-syntax
|
|
20
20
|
for (const fieldName of handler.objectFields) {
|
package/lib/tools/utils.d.ts
CHANGED
|
@@ -16,3 +16,12 @@ export declare function filterExcluded(changes: CalculatedChanges, exclude: stri
|
|
|
16
16
|
export declare function areArraysEquals(x: any[], y: any[]): boolean;
|
|
17
17
|
export declare const obfuscateSensitiveValues: (data: Asset | Asset[] | null, sensitiveFieldsToObfuscate: string[]) => Asset | Asset[] | null;
|
|
18
18
|
export declare const stripObfuscatedFieldsFromPayload: (data: Asset | Asset[] | null, obfuscatedFields: string[]) => Asset | Asset[] | null;
|
|
19
|
+
export declare const detectInsufficientScopeError: <T>(fn: Function) => Promise<{
|
|
20
|
+
hadSufficientScopes: true;
|
|
21
|
+
data: T;
|
|
22
|
+
requiredScopes: [];
|
|
23
|
+
} | {
|
|
24
|
+
hadSufficientScopes: false;
|
|
25
|
+
requiredScopes: string[];
|
|
26
|
+
data: null;
|
|
27
|
+
}>;
|
package/lib/tools/utils.js
CHANGED
|
@@ -22,11 +22,20 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
22
22
|
__setModuleDefault(result, mod);
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
25
34
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
35
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
36
|
};
|
|
28
37
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.stripObfuscatedFieldsFromPayload = exports.obfuscateSensitiveValues = exports.areArraysEquals = exports.filterExcluded = exports.duplicateItems = exports.getEnabledClients = exports.stripFields = exports.convertJsonToString = exports.flatten = exports.loadFileAndReplaceKeywords = exports.convertClientNamesToIds = exports.convertClientNameToId = exports.keywordReplace = exports.keywordStringReplace = exports.keywordArrayReplace = void 0;
|
|
38
|
+
exports.detectInsufficientScopeError = exports.stripObfuscatedFieldsFromPayload = exports.obfuscateSensitiveValues = exports.areArraysEquals = exports.filterExcluded = exports.duplicateItems = exports.getEnabledClients = exports.stripFields = exports.convertJsonToString = exports.flatten = exports.loadFileAndReplaceKeywords = exports.convertClientNamesToIds = exports.convertClientNameToId = exports.keywordReplace = exports.keywordStringReplace = exports.keywordArrayReplace = void 0;
|
|
30
39
|
const path_1 = __importDefault(require("path"));
|
|
31
40
|
const fs_1 = __importStar(require("fs"));
|
|
32
41
|
const dot_prop_1 = __importDefault(require("dot-prop"));
|
|
@@ -208,3 +217,26 @@ const stripObfuscatedFieldsFromPayload = (data, obfuscatedFields) => {
|
|
|
208
217
|
return newAsset;
|
|
209
218
|
};
|
|
210
219
|
exports.stripObfuscatedFieldsFromPayload = stripObfuscatedFieldsFromPayload;
|
|
220
|
+
const detectInsufficientScopeError = (fn) => __awaiter(void 0, void 0, void 0, function* () {
|
|
221
|
+
var _a, _b;
|
|
222
|
+
try {
|
|
223
|
+
const data = yield fn();
|
|
224
|
+
return {
|
|
225
|
+
hadSufficientScopes: true,
|
|
226
|
+
data,
|
|
227
|
+
requiredScopes: [],
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
if (err.statusCode === 403 && err.message.includes('Insufficient scope')) {
|
|
232
|
+
const requiredScopes = (_b = (_a = err.message) === null || _a === void 0 ? void 0 : _a.split('Insufficient scope, expected any of: ')) === null || _b === void 0 ? void 0 : _b.slice(1);
|
|
233
|
+
return {
|
|
234
|
+
hadSufficientScopes: false,
|
|
235
|
+
requiredScopes,
|
|
236
|
+
data: null,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
throw err;
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
exports.detectInsufficientScopeError = detectInsufficientScopeError;
|
package/lib/types.d.ts
CHANGED
|
@@ -156,9 +156,6 @@ export declare type BaseAuth0APIClient = {
|
|
|
156
156
|
triggers: APIClientBaseFunctions & {
|
|
157
157
|
getTriggerBindings: () => Promise<Asset>;
|
|
158
158
|
};
|
|
159
|
-
updateRule: (arg0: {
|
|
160
|
-
id: string;
|
|
161
|
-
}, arg1: Asset) => Promise<Asset>;
|
|
162
159
|
};
|
|
163
160
|
export declare type Auth0APIClient = BaseAuth0APIClient & {
|
|
164
161
|
pool: {
|
|
@@ -208,42 +205,47 @@ export declare type Config = {
|
|
|
208
205
|
export declare type Asset = {
|
|
209
206
|
[key: string]: any;
|
|
210
207
|
};
|
|
211
|
-
export declare type Assets = {
|
|
212
|
-
actions: Asset[];
|
|
213
|
-
attackProtection: Asset;
|
|
214
|
-
branding:
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
208
|
+
export declare type Assets = Partial<{
|
|
209
|
+
actions: Asset[] | null;
|
|
210
|
+
attackProtection: Asset | null;
|
|
211
|
+
branding: {
|
|
212
|
+
templates?: {
|
|
213
|
+
template: string;
|
|
214
|
+
body: string;
|
|
215
|
+
}[] | null;
|
|
216
|
+
} | null;
|
|
217
|
+
clients: Asset[] | null;
|
|
218
|
+
clientGrants: Asset[] | null;
|
|
219
|
+
connections: Asset[] | null;
|
|
220
|
+
databases: Asset[] | null;
|
|
221
|
+
emailProvider: Asset | null;
|
|
222
|
+
emailTemplates: Asset[] | null;
|
|
223
|
+
guardianFactorProviders: Asset[] | null;
|
|
224
|
+
guardianFactors: Asset[] | null;
|
|
225
|
+
guardianFactorTemplates: Asset[] | null;
|
|
224
226
|
guardianPhoneFactorMessageTypes: {
|
|
225
227
|
message_types: Asset[];
|
|
226
|
-
};
|
|
227
|
-
guardianPhoneFactorSelectedProvider: Asset;
|
|
228
|
+
} | null;
|
|
229
|
+
guardianPhoneFactorSelectedProvider: Asset | null;
|
|
228
230
|
guardianPolicies: {
|
|
229
231
|
policies: Asset[];
|
|
230
|
-
};
|
|
231
|
-
hooks: Asset[];
|
|
232
|
-
logStreams: Asset[];
|
|
233
|
-
migrations: Asset[];
|
|
234
|
-
organizations: Asset[];
|
|
235
|
-
pages: Asset[];
|
|
236
|
-
resourceServers: Asset[];
|
|
237
|
-
roles: Asset[];
|
|
238
|
-
rules: Asset[];
|
|
239
|
-
rulesConfigs: Asset[];
|
|
240
|
-
tenant: Asset;
|
|
241
|
-
triggers: Asset[];
|
|
232
|
+
} | null;
|
|
233
|
+
hooks: Asset[] | null;
|
|
234
|
+
logStreams: Asset[] | null;
|
|
235
|
+
migrations: Asset[] | null;
|
|
236
|
+
organizations: Asset[] | null;
|
|
237
|
+
pages: Asset[] | null;
|
|
238
|
+
resourceServers: Asset[] | null;
|
|
239
|
+
roles: Asset[] | null;
|
|
240
|
+
rules: Asset[] | null;
|
|
241
|
+
rulesConfigs: Asset[] | null;
|
|
242
|
+
tenant: Asset | null;
|
|
243
|
+
triggers: Asset[] | null;
|
|
242
244
|
exclude?: {
|
|
243
245
|
[key: string]: string[];
|
|
244
246
|
};
|
|
245
|
-
clientsOrig: Asset[];
|
|
246
|
-
}
|
|
247
|
+
clientsOrig: Asset[] | null;
|
|
248
|
+
}>;
|
|
247
249
|
export declare type CalculatedChanges = {
|
|
248
250
|
del: Asset[];
|
|
249
251
|
update: Asset[];
|
|
@@ -254,4 +256,7 @@ export declare type AssetTypes = 'rules' | 'rulesConfigs' | 'hooks' | 'pages' |
|
|
|
254
256
|
export declare type KeywordMappings = {
|
|
255
257
|
[key: string]: (string | number)[] | string | number;
|
|
256
258
|
};
|
|
259
|
+
export declare type ParsedAsset<Key extends AssetTypes, T> = {
|
|
260
|
+
[key in Key]: T | null;
|
|
261
|
+
};
|
|
257
262
|
export {};
|
package/lib/utils.d.ts
CHANGED
|
@@ -10,40 +10,45 @@ export declare function dumpJSON(file: string, mappings: {
|
|
|
10
10
|
export declare function existsMustBeDir(folder: string): boolean;
|
|
11
11
|
export declare function toConfigFn(data: Config): (arg0: keyof Config) => any;
|
|
12
12
|
export declare function stripIdentifiers(auth0: Auth0, assets: Assets): {
|
|
13
|
-
actions
|
|
14
|
-
attackProtection
|
|
15
|
-
branding
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
13
|
+
actions?: Asset[] | null | undefined;
|
|
14
|
+
attackProtection?: Asset | null | undefined;
|
|
15
|
+
branding?: {
|
|
16
|
+
templates?: {
|
|
17
|
+
template: string;
|
|
18
|
+
body: string;
|
|
19
|
+
}[] | null | undefined;
|
|
20
|
+
} | null | undefined;
|
|
21
|
+
clients?: Asset[] | null | undefined;
|
|
22
|
+
clientGrants?: Asset[] | null | undefined;
|
|
23
|
+
connections?: Asset[] | null | undefined;
|
|
24
|
+
databases?: Asset[] | null | undefined;
|
|
25
|
+
emailProvider?: Asset | null | undefined;
|
|
26
|
+
emailTemplates?: Asset[] | null | undefined;
|
|
27
|
+
guardianFactorProviders?: Asset[] | null | undefined;
|
|
28
|
+
guardianFactors?: Asset[] | null | undefined;
|
|
29
|
+
guardianFactorTemplates?: Asset[] | null | undefined;
|
|
30
|
+
guardianPhoneFactorMessageTypes?: {
|
|
26
31
|
message_types: Asset[];
|
|
27
|
-
};
|
|
28
|
-
guardianPhoneFactorSelectedProvider
|
|
29
|
-
guardianPolicies
|
|
32
|
+
} | null | undefined;
|
|
33
|
+
guardianPhoneFactorSelectedProvider?: Asset | null | undefined;
|
|
34
|
+
guardianPolicies?: {
|
|
30
35
|
policies: Asset[];
|
|
31
|
-
};
|
|
32
|
-
hooks
|
|
33
|
-
logStreams
|
|
34
|
-
migrations
|
|
35
|
-
organizations
|
|
36
|
-
pages
|
|
37
|
-
resourceServers
|
|
38
|
-
roles
|
|
39
|
-
rules
|
|
40
|
-
rulesConfigs
|
|
41
|
-
tenant
|
|
42
|
-
triggers
|
|
36
|
+
} | null | undefined;
|
|
37
|
+
hooks?: Asset[] | null | undefined;
|
|
38
|
+
logStreams?: Asset[] | null | undefined;
|
|
39
|
+
migrations?: Asset[] | null | undefined;
|
|
40
|
+
organizations?: Asset[] | null | undefined;
|
|
41
|
+
pages?: Asset[] | null | undefined;
|
|
42
|
+
resourceServers?: Asset[] | null | undefined;
|
|
43
|
+
roles?: Asset[] | null | undefined;
|
|
44
|
+
rules?: Asset[] | null | undefined;
|
|
45
|
+
rulesConfigs?: Asset[] | null | undefined;
|
|
46
|
+
tenant?: Asset | null | undefined;
|
|
47
|
+
triggers?: Asset[] | null | undefined;
|
|
43
48
|
exclude?: {
|
|
44
49
|
[key: string]: string[];
|
|
45
50
|
} | undefined;
|
|
46
|
-
clientsOrig
|
|
51
|
+
clientsOrig?: Asset[] | null | undefined;
|
|
47
52
|
};
|
|
48
53
|
export declare function sanitize(str: string): string;
|
|
49
54
|
declare type ImportantFields = {
|
package/lib/utils.js
CHANGED