auth0-deploy-cli 7.5.1 → 7.7.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/.eslintrc +7 -41
- package/.husky/pre-commit +4 -0
- package/.husky/pre-push +3 -1
- package/.prettierignore +10 -0
- package/.prettierrc.json +4 -0
- package/CHANGELOG.md +209 -7
- package/CONTRIBUTING.md +2 -2
- package/README.md +3 -0
- package/lib/args.js +16 -17
- package/lib/commands/export.js +3 -3
- package/lib/commands/import.js +7 -6
- package/lib/commands/index.js +1 -1
- package/lib/configFactory.js +5 -1
- package/lib/context/defaults.js +4 -3
- package/lib/context/directory/handlers/actions.js +6 -5
- package/lib/context/directory/handlers/attackProtection.js +7 -6
- package/lib/context/directory/handlers/branding.js +60 -0
- package/lib/context/directory/handlers/clientGrants.js +6 -4
- package/lib/context/directory/handlers/clients.js +4 -3
- package/lib/context/directory/handlers/connections.js +7 -4
- package/lib/context/directory/handlers/databases.js +30 -22
- package/lib/context/directory/handlers/emailProvider.js +6 -4
- package/lib/context/directory/handlers/emailTemplates.js +13 -11
- package/lib/context/directory/handlers/guardianFactorProviders.js +6 -4
- package/lib/context/directory/handlers/guardianFactorTemplates.js +6 -4
- package/lib/context/directory/handlers/guardianFactors.js +6 -4
- package/lib/context/directory/handlers/guardianPhoneFactorMessageTypes.js +4 -3
- package/lib/context/directory/handlers/guardianPhoneFactorSelectedProvider.js +4 -3
- package/lib/context/directory/handlers/guardianPolicies.js +4 -3
- package/lib/context/directory/handlers/hooks.js +5 -4
- package/lib/context/directory/handlers/index.js +5 -2
- package/lib/context/directory/handlers/migrations.js +8 -8
- package/lib/context/directory/handlers/organizations.js +4 -3
- package/lib/context/directory/handlers/pages.js +20 -20
- package/lib/context/directory/handlers/resourceServers.js +6 -4
- package/lib/context/directory/handlers/roles.js +4 -3
- package/lib/context/directory/handlers/rules.js +5 -4
- package/lib/context/directory/handlers/rulesConfigs.js +7 -5
- package/lib/context/directory/handlers/tenant.js +7 -4
- package/lib/context/directory/handlers/triggers.js +3 -2
- package/lib/context/directory/index.js +23 -22
- package/lib/context/index.js +66 -62
- package/lib/context/yaml/handlers/actions.js +12 -8
- package/lib/context/yaml/handlers/attackProtection.js +6 -12
- package/lib/context/yaml/handlers/branding.js +66 -0
- package/lib/context/yaml/handlers/clientGrants.js +5 -4
- package/lib/context/yaml/handlers/clients.js +9 -6
- package/lib/context/yaml/handlers/connections.js +10 -7
- package/lib/context/yaml/handlers/databases.js +15 -10
- package/lib/context/yaml/handlers/emailProvider.js +7 -5
- package/lib/context/yaml/handlers/emailTemplates.js +6 -5
- package/lib/context/yaml/handlers/guardianFactorProviders.js +6 -13
- package/lib/context/yaml/handlers/guardianFactorTemplates.js +6 -13
- package/lib/context/yaml/handlers/guardianFactors.js +6 -13
- package/lib/context/yaml/handlers/guardianPhoneFactorMessageTypes.js +6 -13
- package/lib/context/yaml/handlers/guardianPhoneFactorSelectedProvider.js +6 -13
- package/lib/context/yaml/handlers/guardianPolicies.js +6 -13
- package/lib/context/yaml/handlers/hooks.js +7 -5
- package/lib/context/yaml/handlers/index.js +5 -2
- package/lib/context/yaml/handlers/migrations.js +3 -2
- package/lib/context/yaml/handlers/organizations.js +6 -5
- package/lib/context/yaml/handlers/pages.js +6 -5
- package/lib/context/yaml/handlers/resourceServers.js +5 -4
- package/lib/context/yaml/handlers/roles.js +6 -5
- package/lib/context/yaml/handlers/rules.js +6 -5
- package/lib/context/yaml/handlers/rulesConfigs.js +6 -5
- package/lib/context/yaml/handlers/tenant.js +7 -5
- package/lib/context/yaml/handlers/triggers.js +5 -4
- package/lib/context/yaml/index.js +33 -24
- package/lib/index.js +20 -15
- package/lib/logger.js +4 -3
- package/lib/readonly.js +11 -16
- package/lib/sessionDurationsToMinutes.js +15 -0
- package/lib/tools/auth0/client.js +6 -6
- package/lib/tools/auth0/handlers/actions.js +21 -23
- package/lib/tools/auth0/handlers/attackProtection.js +14 -17
- package/lib/tools/auth0/handlers/branding.js +71 -13
- package/lib/tools/auth0/handlers/clientGrants.js +17 -10
- package/lib/tools/auth0/handlers/clients.js +15 -8
- package/lib/tools/auth0/handlers/connections.js +30 -10
- package/lib/tools/auth0/handlers/databases.js +24 -12
- package/lib/tools/auth0/handlers/default.js +47 -29
- package/lib/tools/auth0/handlers/emailTemplates.js +8 -10
- package/lib/tools/auth0/handlers/guardianFactorProviders.js +3 -3
- package/lib/tools/auth0/handlers/guardianFactorTemplates.js +3 -3
- package/lib/tools/auth0/handlers/guardianFactors.js +3 -3
- package/lib/tools/auth0/handlers/guardianPhoneFactorMessageTypes.js +11 -10
- package/lib/tools/auth0/handlers/guardianPhoneFactorSelectedProvider.js +10 -9
- package/lib/tools/auth0/handlers/guardianPolicies.js +5 -4
- package/lib/tools/auth0/handlers/hooks.js +34 -21
- package/lib/tools/auth0/handlers/index.js +31 -27
- package/lib/tools/auth0/handlers/migrations.js +2 -1
- package/lib/tools/auth0/handlers/organizations.js +67 -32
- package/lib/tools/auth0/handlers/pages.js +20 -14
- package/lib/tools/auth0/handlers/prompts.js +1 -0
- package/lib/tools/auth0/handlers/resourceServers.js +28 -15
- package/lib/tools/auth0/handlers/roles.js +61 -32
- package/lib/tools/auth0/handlers/rules.js +55 -32
- package/lib/tools/auth0/handlers/rulesConfigs.js +12 -6
- package/lib/tools/auth0/handlers/tenant.js +8 -4
- package/lib/tools/auth0/handlers/triggers.js +11 -12
- package/lib/tools/auth0/index.js +15 -31
- package/lib/tools/auth0/schema.js +7 -27
- package/lib/tools/calculateChanges.js +149 -0
- package/lib/tools/constants.js +162 -154
- package/lib/tools/deploy.js +1 -1
- package/lib/tools/index.js +1 -1
- package/lib/tools/logger.js +14 -8
- package/lib/tools/utils.js +3 -144
- package/lib/tools/{ValidationError.js → validationError.js} +3 -1
- package/lib/types.js +2 -0
- package/lib/utils.js +12 -22
- package/package.json +9 -2
- package/tsconfig.json +2 -3
- package/typescript-migration-progress.sh +1 -1
|
@@ -56,15 +56,15 @@ exports.schema = {
|
|
|
56
56
|
type: 'object',
|
|
57
57
|
properties: {
|
|
58
58
|
action_name: { type: 'string', enum: constants_1.default.ACTIONS_TRIGGERS },
|
|
59
|
-
display_name: { type: 'string', default: '' }
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
59
|
+
display_name: { type: 'string', default: '' },
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
64
|
};
|
|
65
65
|
function isActionsDisabled(err) {
|
|
66
66
|
const errorBody = lodash_1.default.get(err, 'originalError.response.body') || {};
|
|
67
|
-
return
|
|
67
|
+
return err.statusCode === 403 && errorBody.errorCode === 'feature_not_enabled';
|
|
68
68
|
}
|
|
69
69
|
class TriggersHandler extends default_1.default {
|
|
70
70
|
constructor(options) {
|
|
@@ -76,8 +76,7 @@ class TriggersHandler extends default_1.default {
|
|
|
76
76
|
return this.existing;
|
|
77
77
|
}
|
|
78
78
|
// in case client version does not support actions
|
|
79
|
-
if (!this.client.actions
|
|
80
|
-
|| typeof this.client.actions.getAllTriggers !== 'function') {
|
|
79
|
+
if (!this.client.actions || typeof this.client.actions.getAllTriggers !== 'function') {
|
|
81
80
|
return [];
|
|
82
81
|
}
|
|
83
82
|
const triggerBindings = {};
|
|
@@ -87,12 +86,12 @@ class TriggersHandler extends default_1.default {
|
|
|
87
86
|
for (let i = 0; i < triggers.length; i++) {
|
|
88
87
|
const triggerId = triggers[i];
|
|
89
88
|
const { bindings } = yield this.client.actions.getTriggerBindings({
|
|
90
|
-
trigger_id: triggerId
|
|
89
|
+
trigger_id: triggerId,
|
|
91
90
|
});
|
|
92
91
|
if (bindings.length > 0) {
|
|
93
92
|
triggerBindings[triggerId] = bindings.map((binding) => ({
|
|
94
93
|
action_name: binding.action.name,
|
|
95
|
-
display_name: binding.display_name
|
|
94
|
+
display_name: binding.display_name,
|
|
96
95
|
}));
|
|
97
96
|
}
|
|
98
97
|
}
|
|
@@ -123,9 +122,9 @@ class TriggersHandler extends default_1.default {
|
|
|
123
122
|
const bindings = data.map((binding) => ({
|
|
124
123
|
ref: {
|
|
125
124
|
type: 'action_name',
|
|
126
|
-
value: binding.action_name
|
|
125
|
+
value: binding.action_name,
|
|
127
126
|
},
|
|
128
|
-
display_name: binding.display_name
|
|
127
|
+
display_name: binding.display_name,
|
|
129
128
|
}));
|
|
130
129
|
yield this.client.actions.updateTriggerBindings({ trigger_id: name }, { bindings });
|
|
131
130
|
this.didUpdate({ trigger_id: name });
|
package/lib/tools/auth0/index.js
CHANGED
|
@@ -1,27 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -38,12 +15,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
38
15
|
const ajv_1 = __importDefault(require("ajv/lib/ajv"));
|
|
39
16
|
const client_1 = __importDefault(require("./client"));
|
|
40
17
|
const schema_1 = __importDefault(require("./schema"));
|
|
41
|
-
const
|
|
42
|
-
const defaultOrder = 50;
|
|
18
|
+
const handlers_1 = __importDefault(require("./handlers"));
|
|
43
19
|
function sortByOrder(toSort, stage) {
|
|
20
|
+
const defaultOrder = 50;
|
|
44
21
|
const sorted = [...toSort];
|
|
45
22
|
sorted.sort((a, b) => {
|
|
23
|
+
//@ts-ignore because this doesn't actually work. TODO: apply stage order
|
|
46
24
|
const aOrder = a[stage].order || defaultOrder;
|
|
25
|
+
//@ts-ignore because this doesn't actually work. TODO: apply stage order
|
|
47
26
|
const bOrder = b[stage].order || defaultOrder;
|
|
48
27
|
return aOrder - bOrder;
|
|
49
28
|
});
|
|
@@ -54,19 +33,24 @@ class Auth0 {
|
|
|
54
33
|
this.client = (0, client_1.default)(client);
|
|
55
34
|
this.config = config;
|
|
56
35
|
this.assets = assets;
|
|
57
|
-
this.handlers =
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
this.
|
|
36
|
+
this.handlers = Object.values(handlers_1.default)
|
|
37
|
+
.map((handler) => {
|
|
38
|
+
//@ts-ignore because class expects `type` property but gets directly injected into class constructors
|
|
39
|
+
return new handler.default({ client: this.client, config: this.config });
|
|
40
|
+
})
|
|
41
|
+
.filter((handler) => {
|
|
42
|
+
const excludedAssetTypes = config('AUTH0_EXCLUDED') || [];
|
|
43
|
+
return !excludedAssetTypes.includes(handler.type);
|
|
61
44
|
});
|
|
62
45
|
}
|
|
63
46
|
runStage(stage) {
|
|
64
47
|
return __awaiter(this, void 0, void 0, function* () {
|
|
65
48
|
// Sort by priority
|
|
66
|
-
for (const handler of sortByOrder(this.handlers, stage)) {
|
|
49
|
+
for (const handler of sortByOrder(this.handlers, stage)) {
|
|
50
|
+
// eslint-disable-line
|
|
67
51
|
try {
|
|
68
52
|
const stageFn = Object.getPrototypeOf(handler)[stage];
|
|
69
|
-
this.assets = Object.assign(Object.assign({}, this.assets), (yield stageFn.apply(handler, [this.assets])) || {});
|
|
53
|
+
this.assets = Object.assign(Object.assign({}, this.assets), ((yield stageFn.apply(handler, [this.assets])) || {}));
|
|
70
54
|
}
|
|
71
55
|
catch (err) {
|
|
72
56
|
err.type = handler.type;
|
|
@@ -1,34 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
24
4
|
};
|
|
25
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
const
|
|
27
|
-
const typesSchema = Object.entries(
|
|
6
|
+
const handlers_1 = __importDefault(require("./handlers"));
|
|
7
|
+
const typesSchema = Object.entries(handlers_1.default).reduce((map, [name, obj]) => {
|
|
28
8
|
map[name] = obj.schema; //eslint-disable-line
|
|
29
9
|
return map;
|
|
30
10
|
}, {});
|
|
31
|
-
const excludeSchema = Object.entries(
|
|
11
|
+
const excludeSchema = Object.entries(handlers_1.default).reduce((map, [name, obj]) => {
|
|
32
12
|
if (obj.excludeSchema) {
|
|
33
13
|
map[name] = obj.excludeSchema;
|
|
34
14
|
}
|
|
@@ -40,7 +20,7 @@ exports.default = {
|
|
|
40
20
|
properties: Object.assign(Object.assign({}, typesSchema), { exclude: {
|
|
41
21
|
type: 'object',
|
|
42
22
|
properties: Object.assign({}, excludeSchema),
|
|
43
|
-
default: {}
|
|
23
|
+
default: {},
|
|
44
24
|
} }),
|
|
45
|
-
additionalProperties: false
|
|
25
|
+
additionalProperties: false,
|
|
46
26
|
};
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.calculateChanges = exports.processChangedObjectFields = void 0;
|
|
7
|
+
const logger_1 = __importDefault(require("./logger"));
|
|
8
|
+
/**
|
|
9
|
+
* @template T
|
|
10
|
+
* @param {typeof import('./auth0/handlers/default').default} handler
|
|
11
|
+
* @param {T} desiredAssetState
|
|
12
|
+
* @param {T} currentAssetState
|
|
13
|
+
* @param {string[]} [objectFields=[]]
|
|
14
|
+
* @param {boolean} [allowDelete=false]
|
|
15
|
+
* @returns T
|
|
16
|
+
*/
|
|
17
|
+
function processChangedObjectFields({ handler, desiredAssetState, currentAssetState, allowDelete = false, }) {
|
|
18
|
+
const desiredAssetStateWithChanges = Object.assign({}, desiredAssetState);
|
|
19
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
20
|
+
for (const fieldName of handler.objectFields) {
|
|
21
|
+
const areDesiredStateAndCurrentStateEmpty = Object.keys(desiredAssetState[fieldName] || {}).length === 0 &&
|
|
22
|
+
Object.keys(currentAssetState[fieldName] || {}).length === 0;
|
|
23
|
+
if (areDesiredStateAndCurrentStateEmpty) {
|
|
24
|
+
// If both the desired state and current state for a given object is empty, it is a no-op and can skip
|
|
25
|
+
// eslint-disable-next-line no-continue
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
// A desired state that omits the objectField OR that has it as an empty object should
|
|
29
|
+
// signal that all fields should be removed (subject to ALLOW_DELETE).
|
|
30
|
+
if (desiredAssetState[fieldName] && Object.keys(desiredAssetState[fieldName]).length) {
|
|
31
|
+
// Both the current and desired state have the object field. Here's where we need to map
|
|
32
|
+
// to the APIv2 protocol of setting `null` values for deleted fields.
|
|
33
|
+
// For new and modified properties of the object field, we can just pass them through to
|
|
34
|
+
// APIv2.
|
|
35
|
+
if (currentAssetState[fieldName]) {
|
|
36
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
37
|
+
for (const currentObjectFieldPropertyName of Object.keys(currentAssetState[fieldName])) {
|
|
38
|
+
// Loop through each object property that exists currently
|
|
39
|
+
if (desiredAssetState[fieldName][currentObjectFieldPropertyName] === undefined) {
|
|
40
|
+
// If the object has a property that exists now but doesn't exist in the proposed state
|
|
41
|
+
if (allowDelete) {
|
|
42
|
+
desiredAssetStateWithChanges[fieldName][currentObjectFieldPropertyName] = null;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// If deletes aren't allowed, do outright delete the property within the object
|
|
46
|
+
logger_1.default.warn(`Detected that the ${fieldName} of the following ${handler.name || handler.id || ''} should be deleted. Doing so may be destructive.\nYou can enable deletes by setting 'AUTH0_ALLOW_DELETE' to true in the config\n${handler.objString(currentAssetState)}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else if (allowDelete) {
|
|
53
|
+
// If the desired state does not have the object field and the current state does, we
|
|
54
|
+
// should mark *all* properties for deletion by specifying an empty object.
|
|
55
|
+
//
|
|
56
|
+
// See: https://auth0.com/docs/users/metadata/manage-metadata-api#delete-user-metadata
|
|
57
|
+
desiredAssetStateWithChanges[fieldName] = {};
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
delete desiredAssetStateWithChanges[fieldName];
|
|
61
|
+
logger_1.default.warn(`Detected that the ${fieldName} of the following ${handler.name || handler.id || ''} should be emptied. Doing so may be destructive.\nYou can enable deletes by setting 'AUTH0_ALLOW_DELETE' to true in the config\n${handler.objString(currentAssetState)}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return desiredAssetStateWithChanges;
|
|
65
|
+
}
|
|
66
|
+
exports.processChangedObjectFields = processChangedObjectFields;
|
|
67
|
+
function calculateChanges({ handler, assets, existing, identifiers = ['id', 'name'], allowDelete, }) {
|
|
68
|
+
// Calculate the changes required between two sets of assets.
|
|
69
|
+
const update = [];
|
|
70
|
+
let del = [...existing];
|
|
71
|
+
let create = [...assets];
|
|
72
|
+
const conflicts = [];
|
|
73
|
+
const findByKeyValue = (key, value, arr) => arr.find((e) => {
|
|
74
|
+
if (Array.isArray(key)) {
|
|
75
|
+
const values = key.map((k) => e[k]);
|
|
76
|
+
if (values.every((v) => v)) {
|
|
77
|
+
return value === values.join('-');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return e[key] === value;
|
|
81
|
+
});
|
|
82
|
+
const processAssets = (id, arr) => {
|
|
83
|
+
arr.forEach((asset) => {
|
|
84
|
+
const assetIdValue = (() => {
|
|
85
|
+
if (Array.isArray(id)) {
|
|
86
|
+
const values = id.map((i) => asset[i]);
|
|
87
|
+
if (values.every((v) => v)) {
|
|
88
|
+
return values.join('-');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return asset[id];
|
|
92
|
+
})();
|
|
93
|
+
if (assetIdValue !== undefined) {
|
|
94
|
+
const found = findByKeyValue(id, assetIdValue, del);
|
|
95
|
+
if (found !== undefined) {
|
|
96
|
+
// Delete from existing
|
|
97
|
+
del = del.filter((e) => e !== found);
|
|
98
|
+
// Delete from create as it's an update
|
|
99
|
+
create = create.filter((e) => e !== asset);
|
|
100
|
+
// Append identifiers to asset
|
|
101
|
+
update.push(Object.assign(Object.assign({}, identifiers.reduce((obj, i) => {
|
|
102
|
+
if (found[i])
|
|
103
|
+
obj[i] = found[i];
|
|
104
|
+
return obj;
|
|
105
|
+
}, {})), (handler.objectFields.length
|
|
106
|
+
? processChangedObjectFields({
|
|
107
|
+
handler,
|
|
108
|
+
desiredAssetState: asset,
|
|
109
|
+
currentAssetState: found,
|
|
110
|
+
allowDelete,
|
|
111
|
+
})
|
|
112
|
+
: asset)));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
};
|
|
117
|
+
// Loop through identifiers (in order) to try match assets to existing
|
|
118
|
+
// If existing then update if not create
|
|
119
|
+
// The remainder will be deleted
|
|
120
|
+
for (const id of identifiers) {
|
|
121
|
+
// eslint-disable-line
|
|
122
|
+
processAssets(id, [...create]);
|
|
123
|
+
}
|
|
124
|
+
// Check if there are assets with names that will conflict with existing names during the update process
|
|
125
|
+
// This will rename those assets to a temp random name first
|
|
126
|
+
// This assumes the first identifiers is the unique identifier
|
|
127
|
+
if (identifiers.includes('name')) {
|
|
128
|
+
const uniqueID = identifiers[0];
|
|
129
|
+
const futureAssets = [...create, ...update];
|
|
130
|
+
futureAssets.forEach((a) => {
|
|
131
|
+
// If the conflicting item is going to be deleted then skip
|
|
132
|
+
const inDeleted = del.filter((e) => e.name === a.name && e[uniqueID] !== a[uniqueID])[0];
|
|
133
|
+
if (!inDeleted) {
|
|
134
|
+
const conflict = existing.filter((e) => e.name === a.name && e[uniqueID] !== a[uniqueID])[0];
|
|
135
|
+
if (conflict) {
|
|
136
|
+
const temp = Math.random().toString(36).substr(2, 5);
|
|
137
|
+
conflicts.push(Object.assign(Object.assign({}, conflict), { name: `${conflict.name}-${temp}` }));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
del,
|
|
144
|
+
update,
|
|
145
|
+
conflicts,
|
|
146
|
+
create,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
exports.calculateChanges = calculateChanges;
|
package/lib/tools/constants.js
CHANGED
|
@@ -1,158 +1,166 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
];
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
'
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
]
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
'
|
|
91
|
-
'
|
|
92
|
-
'
|
|
93
|
-
'
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
'
|
|
105
|
-
'
|
|
106
|
-
'
|
|
107
|
-
'
|
|
108
|
-
|
|
109
|
-
]
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
]
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
3
|
+
const PAGE_GUARDIAN_MULTIFACTOR = 'guardian_multifactor';
|
|
4
|
+
const PAGE_PASSWORD_RESET = 'password_reset';
|
|
5
|
+
const PAGE_LOGIN = 'login';
|
|
6
|
+
const PAGE_ERROR = 'error_page';
|
|
7
|
+
const RULES_STAGES = ['login_success'];
|
|
8
|
+
const DATABASE_SCRIPTS_GET_USER = 'get_user';
|
|
9
|
+
const DATABASE_SCRIPTS_CHANGE_EMAIL = 'change_email';
|
|
10
|
+
const EMAIL_VERIFY = 'verify_email';
|
|
11
|
+
const EMAIL_VERIFY_BY_CODE = 'verify_email_by_code';
|
|
12
|
+
const EMAIL_RESET = 'reset_email';
|
|
13
|
+
const EMAIL_WELCOME = 'welcome_email';
|
|
14
|
+
const EMAIL_BLOCKED = 'blocked_account';
|
|
15
|
+
const EMAIL_STOLEN_CREDENTIALS = 'stolen_credentials';
|
|
16
|
+
const EMAIL_ENROLLMENT = 'enrollment_email';
|
|
17
|
+
const EMAIL_CHANGE_PASSWORD = 'change_password';
|
|
18
|
+
const EMAIL_PASSWORD_RESET = 'password_reset';
|
|
19
|
+
const EMAIL_MFA_OOB_CODE = 'mfa_oob_code';
|
|
20
|
+
const EMAIL_USER_INVITATION = 'user_invitation';
|
|
21
|
+
const UNIVERSAL_LOGIN_TEMPLATE = 'universal_login';
|
|
22
|
+
const constants = {
|
|
23
|
+
CONCURRENT_CALLS: 5,
|
|
24
|
+
RULES_DIRECTORY: 'rules',
|
|
25
|
+
RULES_STAGES,
|
|
26
|
+
DEFAULT_RULE_STAGE: RULES_STAGES[0],
|
|
27
|
+
HOOKS_HIDDEN_SECRET_VALUE: '_VALUE_NOT_SHOWN_',
|
|
28
|
+
HOOKS_DIRECTORY: 'hooks',
|
|
29
|
+
ACTIONS_DIRECTORY: 'actions',
|
|
30
|
+
TRIGGERS_DIRECTORY: 'triggers',
|
|
31
|
+
RULES_CONFIGS_DIRECTORY: 'rules-configs',
|
|
32
|
+
PAGES_DIRECTORY: 'pages',
|
|
33
|
+
PAGE_LOGIN,
|
|
34
|
+
PAGE_GUARDIAN_MULTIFACTOR,
|
|
35
|
+
PAGE_PASSWORD_RESET,
|
|
36
|
+
PAGE_ERROR,
|
|
37
|
+
DATABASE_CONNECTIONS_DIRECTORY: 'database-connections',
|
|
38
|
+
DATABASE_SCRIPTS_CHANGE_EMAIL,
|
|
39
|
+
DATABASE_SCRIPTS_GET_USER,
|
|
40
|
+
EMAIL_TEMPLATES_TYPES: [
|
|
41
|
+
'verify_email',
|
|
42
|
+
'verify_email_by_code',
|
|
43
|
+
'reset_email',
|
|
44
|
+
'welcome_email',
|
|
45
|
+
'blocked_account',
|
|
46
|
+
'stolen_credentials',
|
|
47
|
+
'enrollment_email',
|
|
48
|
+
'mfa_oob_code',
|
|
49
|
+
'change_password',
|
|
50
|
+
'password_reset',
|
|
51
|
+
'user_invitation',
|
|
52
|
+
],
|
|
53
|
+
ACTIONS_TRIGGERS: [
|
|
54
|
+
'post-login',
|
|
55
|
+
'credentials-exchange',
|
|
56
|
+
'pre-user-registration',
|
|
57
|
+
'post-user-registration',
|
|
58
|
+
'post-change-password',
|
|
59
|
+
'send-phone-message',
|
|
60
|
+
],
|
|
61
|
+
EMAIL_TEMPLATES_DIRECTORY: 'emails',
|
|
62
|
+
EMAIL_VERIFY,
|
|
63
|
+
EMAIL_VERIFY_BY_CODE,
|
|
64
|
+
EMAIL_RESET,
|
|
65
|
+
EMAIL_WELCOME,
|
|
66
|
+
EMAIL_BLOCKED,
|
|
67
|
+
EMAIL_STOLEN_CREDENTIALS,
|
|
68
|
+
EMAIL_ENROLLMENT,
|
|
69
|
+
EMAIL_CHANGE_PASSWORD,
|
|
70
|
+
EMAIL_PASSWORD_RESET,
|
|
71
|
+
EMAIL_MFA_OOB_CODE,
|
|
72
|
+
EMAIL_USER_INVITATION,
|
|
73
|
+
GUARDIAN_DIRECTORY: 'guardian',
|
|
74
|
+
GUARDIAN_FACTORS_DIRECTORY: 'factors',
|
|
75
|
+
GUARDIAN_PROVIDERS_DIRECTORY: 'providers',
|
|
76
|
+
GUARDIAN_TEMPLATES_DIRECTORY: 'templates',
|
|
77
|
+
UNIVERSAL_LOGIN_TEMPLATE,
|
|
78
|
+
RESOURCE_SERVERS_DIRECTORY: 'resource-servers',
|
|
79
|
+
RESOURCE_SERVERS_CLIENT_NAME: 'resourceServers',
|
|
80
|
+
RESOURCE_SERVERS_MANAGEMENT_API_NAME: 'Auth0 Management API',
|
|
81
|
+
RESOURCE_SERVERS_ID_NAME: 'id',
|
|
82
|
+
CLIENTS_DIRECTORY: 'clients',
|
|
83
|
+
CLIENTS_GRANTS_DIRECTORY: 'grants',
|
|
84
|
+
BRANDING_DIRECTORY: 'branding',
|
|
85
|
+
BRANDING_TEMPLATES_DIRECTORY: 'templates',
|
|
86
|
+
BRANDING_TEMPLATES_YAML_DIRECTORY: 'branding_templates',
|
|
87
|
+
CLIENTS_CLIENT_NAME: 'clients',
|
|
88
|
+
CLIENTS_CLIENT_ID_NAME: 'client_id',
|
|
89
|
+
CONNECTIONS_DIRECTORY: 'connections',
|
|
90
|
+
CONNECTIONS_CLIENT_NAME: 'connections',
|
|
91
|
+
CONNECTIONS_ID_NAME: 'id',
|
|
92
|
+
ROLES_DIRECTORY: 'roles',
|
|
93
|
+
ATTACK_PROTECTION_DIRECTORY: 'attack-protection',
|
|
94
|
+
GUARDIAN_FACTORS: [
|
|
95
|
+
'sms',
|
|
96
|
+
'push-notification',
|
|
97
|
+
'otp',
|
|
98
|
+
'email',
|
|
99
|
+
'duo',
|
|
100
|
+
'webauthn-roaming',
|
|
101
|
+
'webauthn-platform',
|
|
102
|
+
'recovery-code',
|
|
103
|
+
],
|
|
104
|
+
GUARDIAN_POLICIES: ['all-applications', 'confidence-score'],
|
|
105
|
+
GUARDIAN_PHONE_PROVIDERS: ['auth0', 'twilio', 'phone-message-hook'],
|
|
106
|
+
GUARDIAN_PHONE_MESSAGE_TYPES: ['sms', 'voice'],
|
|
107
|
+
GUARDIAN_FACTOR_TEMPLATES: ['sms'],
|
|
108
|
+
GUARDIAN_FACTOR_PROVIDERS: {
|
|
109
|
+
sms: ['twilio'],
|
|
110
|
+
'push-notification': ['sns'],
|
|
111
|
+
},
|
|
112
|
+
PAGE_NAMES: [
|
|
113
|
+
`${PAGE_GUARDIAN_MULTIFACTOR}.html`,
|
|
114
|
+
`${PAGE_GUARDIAN_MULTIFACTOR}.json`,
|
|
115
|
+
`${PAGE_PASSWORD_RESET}.html`,
|
|
116
|
+
`${PAGE_PASSWORD_RESET}.json`,
|
|
117
|
+
`${PAGE_LOGIN}.html`,
|
|
118
|
+
`${PAGE_LOGIN}.json`,
|
|
119
|
+
`${PAGE_ERROR}.html`,
|
|
120
|
+
`${PAGE_ERROR}.json`,
|
|
121
|
+
],
|
|
122
|
+
DATABASE_SCRIPTS: [
|
|
123
|
+
DATABASE_SCRIPTS_GET_USER,
|
|
124
|
+
'create',
|
|
125
|
+
'verify',
|
|
126
|
+
'login',
|
|
127
|
+
'change_password',
|
|
128
|
+
'delete',
|
|
129
|
+
DATABASE_SCRIPTS_CHANGE_EMAIL,
|
|
130
|
+
],
|
|
131
|
+
DATABASE_SCRIPTS_NO_IMPORT: [
|
|
132
|
+
DATABASE_SCRIPTS_GET_USER,
|
|
133
|
+
'create',
|
|
134
|
+
'verify',
|
|
135
|
+
'login',
|
|
136
|
+
'change_password',
|
|
137
|
+
'delete',
|
|
138
|
+
],
|
|
139
|
+
DATABASE_SCRIPTS_IMPORT: [DATABASE_SCRIPTS_GET_USER, 'login'],
|
|
140
|
+
EMAIL_TEMPLATES_NAMES: [
|
|
141
|
+
`${EMAIL_VERIFY}.json`,
|
|
142
|
+
`${EMAIL_VERIFY}.html`,
|
|
143
|
+
`${EMAIL_VERIFY_BY_CODE}.json`,
|
|
144
|
+
`${EMAIL_VERIFY_BY_CODE}.html`,
|
|
145
|
+
`${EMAIL_RESET}.json`,
|
|
146
|
+
`${EMAIL_RESET}.html`,
|
|
147
|
+
`${EMAIL_WELCOME}.json`,
|
|
148
|
+
`${EMAIL_WELCOME}.html`,
|
|
149
|
+
`${EMAIL_BLOCKED}.json`,
|
|
150
|
+
`${EMAIL_BLOCKED}.html`,
|
|
151
|
+
`${EMAIL_STOLEN_CREDENTIALS}.json`,
|
|
152
|
+
`${EMAIL_STOLEN_CREDENTIALS}.html`,
|
|
153
|
+
`${EMAIL_ENROLLMENT}.json`,
|
|
154
|
+
`${EMAIL_ENROLLMENT}.html`,
|
|
155
|
+
`${EMAIL_CHANGE_PASSWORD}.json`,
|
|
156
|
+
`${EMAIL_CHANGE_PASSWORD}.html`,
|
|
157
|
+
`${EMAIL_PASSWORD_RESET}.json`,
|
|
158
|
+
`${EMAIL_PASSWORD_RESET}.html`,
|
|
159
|
+
`${EMAIL_MFA_OOB_CODE}.json`,
|
|
160
|
+
`${EMAIL_MFA_OOB_CODE}.html`,
|
|
161
|
+
`${EMAIL_USER_INVITATION}.json`,
|
|
162
|
+
`${EMAIL_USER_INVITATION}.html`,
|
|
163
|
+
],
|
|
164
|
+
SUPPORTED_BRANDING_TEMPLATES: [UNIVERSAL_LOGIN_TEMPLATE],
|
|
143
165
|
};
|
|
144
|
-
constants.RESOURCE_SERVERS_DIRECTORY = 'resource-servers';
|
|
145
|
-
constants.RESOURCE_SERVERS_CLIENT_NAME = 'resourceServers';
|
|
146
|
-
constants.RESOURCE_SERVERS_MANAGEMENT_API_NAME = 'Auth0 Management API';
|
|
147
|
-
constants.RESOURCE_SERVERS_ID_NAME = 'id';
|
|
148
|
-
constants.CLIENTS_DIRECTORY = 'clients';
|
|
149
|
-
constants.CLIENTS_GRANTS_DIRECTORY = 'grants';
|
|
150
|
-
constants.CLIENTS_CLIENT_NAME = 'clients';
|
|
151
|
-
constants.CLIENTS_CLIENT_ID_NAME = 'client_id';
|
|
152
|
-
constants.CONNECTIONS_DIRECTORY = 'connections';
|
|
153
|
-
constants.CONNECTIONS_CLIENT_NAME = 'connections';
|
|
154
|
-
constants.CONNECTIONS_ID_NAME = 'id';
|
|
155
|
-
constants.CONCURRENT_CALLS = 5;
|
|
156
|
-
constants.ROLES_DIRECTORY = 'roles';
|
|
157
|
-
constants.ATTACK_PROTECTION_DIRECTORY = 'attack-protection';
|
|
158
166
|
exports.default = constants;
|