auth0-deploy-cli 8.27.0 → 8.29.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/.circleci/config.yml +7 -7
- package/CHANGELOG.md +20 -1
- package/CONTRIBUTING.md +1 -1
- package/lib/context/directory/handlers/actionModules.d.ts +5 -0
- package/lib/context/directory/handlers/actionModules.js +91 -0
- package/lib/context/directory/handlers/actions.js +4 -0
- package/lib/context/directory/handlers/index.js +4 -0
- package/lib/context/directory/handlers/supplementalSignals.d.ts +6 -0
- package/lib/context/directory/handlers/supplementalSignals.js +34 -0
- package/lib/context/yaml/handlers/actionModules.d.ts +6 -0
- package/lib/context/yaml/handlers/actionModules.js +68 -0
- package/lib/context/yaml/handlers/actions.js +4 -0
- package/lib/context/yaml/handlers/index.js +4 -0
- package/lib/context/yaml/handlers/supplementalSignals.d.ts +6 -0
- package/lib/context/yaml/handlers/supplementalSignals.js +15 -0
- package/lib/tools/auth0/handlers/actionModules.d.ts +64 -0
- package/lib/tools/auth0/handlers/actionModules.js +200 -0
- package/lib/tools/auth0/handlers/actions.d.ts +19 -1
- package/lib/tools/auth0/handlers/actions.js +89 -1
- package/lib/tools/auth0/handlers/index.js +4 -0
- package/lib/tools/auth0/handlers/resourceServers.d.ts +4 -0
- package/lib/tools/auth0/handlers/resourceServers.js +4 -0
- package/lib/tools/auth0/handlers/supplementalSignals.d.ts +19 -0
- package/lib/tools/auth0/handlers/supplementalSignals.js +102 -0
- package/lib/tools/constants.d.ts +2 -0
- package/lib/tools/constants.js +2 -0
- package/lib/types.d.ts +5 -1
- package/package.json +3 -3
package/.circleci/config.yml
CHANGED
|
@@ -10,7 +10,7 @@ jobs:
|
|
|
10
10
|
working_directory: ~/repo
|
|
11
11
|
steps:
|
|
12
12
|
- checkout
|
|
13
|
-
- run: npm
|
|
13
|
+
- run: npm i
|
|
14
14
|
- run: AUTH0_HTTP_RECORDINGS="lockdown" npm run test:e2e:node-module
|
|
15
15
|
|
|
16
16
|
e2e_test_as_cli:
|
|
@@ -19,7 +19,7 @@ jobs:
|
|
|
19
19
|
working_directory: ~/repo
|
|
20
20
|
steps:
|
|
21
21
|
- checkout
|
|
22
|
-
- run: npm
|
|
22
|
+
- run: npm i
|
|
23
23
|
- run: npm run test:e2e:cli
|
|
24
24
|
|
|
25
25
|
unit_test:
|
|
@@ -34,11 +34,11 @@ jobs:
|
|
|
34
34
|
- checkout
|
|
35
35
|
- restore_cache:
|
|
36
36
|
keys:
|
|
37
|
-
- v<< parameters.v >>-npm-deps-{{ checksum "package
|
|
37
|
+
- v<< parameters.v >>-npm-deps-{{ checksum "package.json" }}
|
|
38
38
|
- v<< parameters.v >>-npm-deps-
|
|
39
|
-
- run: npm
|
|
39
|
+
- run: npm i
|
|
40
40
|
- save_cache:
|
|
41
|
-
key: v<< parameters.v >>-npm-deps-{{ checksum "package
|
|
41
|
+
key: v<< parameters.v >>-npm-deps-{{ checksum "package.json" }}
|
|
42
42
|
paths:
|
|
43
43
|
- node_modules
|
|
44
44
|
- run: npm run lint
|
|
@@ -90,7 +90,7 @@ jobs:
|
|
|
90
90
|
working_directory: ~/repo
|
|
91
91
|
steps:
|
|
92
92
|
- checkout
|
|
93
|
-
- run: npm
|
|
93
|
+
- run: npm i
|
|
94
94
|
- run: npx tsc --noEmit
|
|
95
95
|
|
|
96
96
|
does_lint_pass:
|
|
@@ -99,7 +99,7 @@ jobs:
|
|
|
99
99
|
working_directory: ~/repo
|
|
100
100
|
steps:
|
|
101
101
|
- checkout
|
|
102
|
-
- run: npm
|
|
102
|
+
- run: npm i
|
|
103
103
|
- run: npm run lint
|
|
104
104
|
|
|
105
105
|
workflows:
|
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [8.29.0] - 2026-03-03
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Add DPoP support for proof-of-possession mechanism in `resourceServers` (GA) [#1311]
|
|
15
|
+
- Add `supplemental signals` configuration for Akamai integration.(EA) [#1310]
|
|
16
|
+
|
|
17
|
+
## [8.28.0] - 2026-02-20
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- Add support for managing `action-modules`.(EA) [#1302]
|
|
22
|
+
- Add support for managing `modules` in `actions`.(EA) [#1302]
|
|
23
|
+
|
|
10
24
|
## [8.27.0] - 2026-02-13
|
|
11
25
|
|
|
12
26
|
### Added
|
|
@@ -1652,7 +1666,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
1652
1666
|
[#1294]: https://github.com/auth0/auth0-deploy-cli/issues/1294
|
|
1653
1667
|
[#1297]: https://github.com/auth0/auth0-deploy-cli/issues/1297
|
|
1654
1668
|
[#1298]: https://github.com/auth0/auth0-deploy-cli/issues/1298
|
|
1655
|
-
[
|
|
1669
|
+
[#1302]: https://github.com/auth0/auth0-deploy-cli/issues/1302
|
|
1670
|
+
[#1310]: https://github.com/auth0/auth0-deploy-cli/issues/1310
|
|
1671
|
+
[#1311]: https://github.com/auth0/auth0-deploy-cli/issues/1311
|
|
1672
|
+
[Unreleased]: https://github.com/auth0/auth0-deploy-cli/compare/v8.29.0...HEAD
|
|
1673
|
+
[8.29.0]: https://github.com/auth0/auth0-deploy-cli/compare/v8.28.0...v8.29.0
|
|
1674
|
+
[8.28.0]: https://github.com/auth0/auth0-deploy-cli/compare/v8.27.0...v8.28.0
|
|
1656
1675
|
[8.27.0]: https://github.com/auth0/auth0-deploy-cli/compare/v8.26.0...v8.27.0
|
|
1657
1676
|
[8.26.0]: https://github.com/auth0/auth0-deploy-cli/compare/v8.25.0...v8.26.0
|
|
1658
1677
|
[8.25.0]: https://github.com/auth0/auth0-deploy-cli/compare/v8.24.0...v8.25.0
|
package/CONTRIBUTING.md
CHANGED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { DirectoryHandler } from '.';
|
|
2
|
+
import { Asset, ParsedAsset } from '../../../types';
|
|
3
|
+
type ParsedActionModules = ParsedAsset<'actionModules', Asset[]>;
|
|
4
|
+
declare const actionModulesHandler: DirectoryHandler<ParsedActionModules>;
|
|
5
|
+
export default actionModulesHandler;
|
|
@@ -0,0 +1,91 @@
|
|
|
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
|
+
const path_1 = __importDefault(require("path"));
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const tools_1 = require("../../../tools");
|
|
9
|
+
const utils_1 = require("../../../utils");
|
|
10
|
+
const logger_1 = __importDefault(require("../../../logger"));
|
|
11
|
+
function parse(context) {
|
|
12
|
+
const modulesFolder = path_1.default.join(context.filePath, tools_1.constants.ACTION_MODULES_DIRECTORY);
|
|
13
|
+
if (!(0, utils_1.existsMustBeDir)(modulesFolder))
|
|
14
|
+
return { actionModules: null };
|
|
15
|
+
const files = (0, utils_1.getFiles)(modulesFolder, ['.json']);
|
|
16
|
+
const actionModules = files.map((file) => {
|
|
17
|
+
const module = {
|
|
18
|
+
...(0, utils_1.loadJSON)(file, {
|
|
19
|
+
mappings: context.mappings,
|
|
20
|
+
disableKeywordReplacement: context.disableKeywordReplacement,
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
const moduleFolder = path_1.default.join(tools_1.constants.ACTION_MODULES_DIRECTORY, `${module.name}`);
|
|
24
|
+
if (module.code) {
|
|
25
|
+
// The `module.code` can be a file path. It needs to be loaded.
|
|
26
|
+
// It can be a relative path, so we need to handle both cases.
|
|
27
|
+
const unixPath = module.code.replace(/[\\/]+/g, '/').replace(/^([a-zA-Z]+:|\.\/)/, '');
|
|
28
|
+
if (fs_extra_1.default.existsSync(unixPath)) {
|
|
29
|
+
module.code = context.loadFile(unixPath, moduleFolder);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
module.code = context.loadFile(path_1.default.join(context.filePath, module.code), moduleFolder);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return module;
|
|
36
|
+
});
|
|
37
|
+
return { actionModules };
|
|
38
|
+
}
|
|
39
|
+
function mapSecrets(secrets) {
|
|
40
|
+
if (typeof secrets === 'string') {
|
|
41
|
+
return secrets;
|
|
42
|
+
}
|
|
43
|
+
if (secrets && secrets.length > 0) {
|
|
44
|
+
return secrets.map((secret) => ({ name: secret.name, value: secret.value }));
|
|
45
|
+
}
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
function mapModuleCode(filePath, module) {
|
|
49
|
+
const { code } = module;
|
|
50
|
+
if (!code) {
|
|
51
|
+
return '';
|
|
52
|
+
}
|
|
53
|
+
const moduleName = (0, utils_1.sanitize)(module.name);
|
|
54
|
+
const moduleFolder = path_1.default.join(filePath, tools_1.constants.ACTION_MODULES_DIRECTORY, `${moduleName}`);
|
|
55
|
+
fs_extra_1.default.ensureDirSync(moduleFolder);
|
|
56
|
+
const codeFile = path_1.default.join(moduleFolder, 'code.js');
|
|
57
|
+
logger_1.default.info(`Writing ${codeFile}`);
|
|
58
|
+
fs_extra_1.default.writeFileSync(codeFile, code);
|
|
59
|
+
return `./${tools_1.constants.ACTION_MODULES_DIRECTORY}/${moduleName}/code.js`;
|
|
60
|
+
}
|
|
61
|
+
function mapToActionModule(filePath, module, includeIdentifiers) {
|
|
62
|
+
return {
|
|
63
|
+
...(includeIdentifiers && module.id ? { id: module.id } : {}),
|
|
64
|
+
name: module.name,
|
|
65
|
+
code: mapModuleCode(filePath, module),
|
|
66
|
+
dependencies: module.dependencies,
|
|
67
|
+
secrets: mapSecrets(module.secrets),
|
|
68
|
+
actions_using_module_total: module.actions_using_module_total,
|
|
69
|
+
all_changes_published: module.all_changes_published,
|
|
70
|
+
latest_version_number: module.latest_version_number,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async function dump(context) {
|
|
74
|
+
const { actionModules } = context.assets;
|
|
75
|
+
if (!actionModules)
|
|
76
|
+
return;
|
|
77
|
+
// Create action modules folder
|
|
78
|
+
const modulesFolder = path_1.default.join(context.filePath, tools_1.constants.ACTION_MODULES_DIRECTORY);
|
|
79
|
+
fs_extra_1.default.ensureDirSync(modulesFolder);
|
|
80
|
+
const includeIdentifiers = Boolean(context.config.AUTH0_EXPORT_IDENTIFIERS);
|
|
81
|
+
actionModules.forEach((module) => {
|
|
82
|
+
const name = (0, utils_1.sanitize)(module.name);
|
|
83
|
+
const moduleFile = path_1.default.join(modulesFolder, `${name}.json`);
|
|
84
|
+
(0, utils_1.dumpJSON)(moduleFile, mapToActionModule(context.filePath, module, includeIdentifiers));
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const actionModulesHandler = {
|
|
88
|
+
parse,
|
|
89
|
+
dump,
|
|
90
|
+
};
|
|
91
|
+
exports.default = actionModulesHandler;
|
|
@@ -73,6 +73,10 @@ function mapToAction(filePath, action, includeIdentifiers) {
|
|
|
73
73
|
supported_triggers: action.supported_triggers,
|
|
74
74
|
deployed: action.deployed || action.all_changes_deployed,
|
|
75
75
|
installed_integration_id: action.installed_integration_id,
|
|
76
|
+
modules: action.modules?.map((module) => ({
|
|
77
|
+
module_name: module.module_name,
|
|
78
|
+
module_version_number: module.module_version_number,
|
|
79
|
+
})),
|
|
76
80
|
};
|
|
77
81
|
}
|
|
78
82
|
async function dump(context) {
|
|
@@ -20,6 +20,7 @@ const guardianPhoneFactorSelectedProvider_1 = __importDefault(require("./guardia
|
|
|
20
20
|
const guardianPolicies_1 = __importDefault(require("./guardianPolicies"));
|
|
21
21
|
const roles_1 = __importDefault(require("./roles"));
|
|
22
22
|
const actions_1 = __importDefault(require("./actions"));
|
|
23
|
+
const actionModules_1 = __importDefault(require("./actionModules"));
|
|
23
24
|
const organizations_1 = __importDefault(require("./organizations"));
|
|
24
25
|
const triggers_1 = __importDefault(require("./triggers"));
|
|
25
26
|
const attackProtection_1 = __importDefault(require("./attackProtection"));
|
|
@@ -41,6 +42,7 @@ const networkACLs_1 = __importDefault(require("./networkACLs"));
|
|
|
41
42
|
const userAttributeProfiles_1 = __importDefault(require("./userAttributeProfiles"));
|
|
42
43
|
const connectionProfiles_1 = __importDefault(require("./connectionProfiles"));
|
|
43
44
|
const tokenExchangeProfiles_1 = __importDefault(require("./tokenExchangeProfiles"));
|
|
45
|
+
const supplementalSignals_1 = __importDefault(require("./supplementalSignals"));
|
|
44
46
|
const selfServiceProfiles_1 = __importDefault(require("./selfServiceProfiles"));
|
|
45
47
|
const directoryHandlers = {
|
|
46
48
|
rules: rules_1.default,
|
|
@@ -63,6 +65,7 @@ const directoryHandlers = {
|
|
|
63
65
|
guardianPolicies: guardianPolicies_1.default,
|
|
64
66
|
roles: roles_1.default,
|
|
65
67
|
actions: actions_1.default,
|
|
68
|
+
actionModules: actionModules_1.default,
|
|
66
69
|
organizations: organizations_1.default,
|
|
67
70
|
triggers: triggers_1.default,
|
|
68
71
|
attackProtection: attackProtection_1.default,
|
|
@@ -82,5 +85,6 @@ const directoryHandlers = {
|
|
|
82
85
|
userAttributeProfiles: userAttributeProfiles_1.default,
|
|
83
86
|
connectionProfiles: connectionProfiles_1.default,
|
|
84
87
|
tokenExchangeProfiles: tokenExchangeProfiles_1.default,
|
|
88
|
+
supplementalSignals: supplementalSignals_1.default,
|
|
85
89
|
};
|
|
86
90
|
exports.default = directoryHandlers;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { DirectoryHandler } from '.';
|
|
2
|
+
import { ParsedAsset } from '../../../types';
|
|
3
|
+
import { SupplementalSignals } from '../../../tools/auth0/handlers/supplementalSignals';
|
|
4
|
+
type ParsedSupplementalSignals = ParsedAsset<'supplementalSignals', SupplementalSignals>;
|
|
5
|
+
declare const _default: DirectoryHandler<ParsedSupplementalSignals>;
|
|
6
|
+
export default _default;
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
const path_1 = __importDefault(require("path"));
|
|
7
|
+
const utils_1 = require("../../../utils");
|
|
8
|
+
function parse(context) {
|
|
9
|
+
const baseFolder = path_1.default.join(context.filePath);
|
|
10
|
+
if (!(0, utils_1.existsMustBeDir)(baseFolder))
|
|
11
|
+
return { supplementalSignals: null }; // Skip
|
|
12
|
+
const supplementalSignalsFile = path_1.default.join(baseFolder, 'supplemental-signals.json');
|
|
13
|
+
if (!(0, utils_1.isFile)(supplementalSignalsFile)) {
|
|
14
|
+
return { supplementalSignals: null };
|
|
15
|
+
}
|
|
16
|
+
const supplementalSignals = (0, utils_1.loadJSON)(supplementalSignalsFile, {
|
|
17
|
+
mappings: context.mappings,
|
|
18
|
+
disableKeywordReplacement: context.disableKeywordReplacement,
|
|
19
|
+
});
|
|
20
|
+
return {
|
|
21
|
+
supplementalSignals,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
async function dump(context) {
|
|
25
|
+
const { supplementalSignals } = context.assets;
|
|
26
|
+
if (!supplementalSignals)
|
|
27
|
+
return; // Skip, nothing to dump
|
|
28
|
+
const supplementalSignalsFile = path_1.default.join(context.filePath, 'supplemental-signals.json');
|
|
29
|
+
(0, utils_1.dumpJSON)(supplementalSignalsFile, supplementalSignals);
|
|
30
|
+
}
|
|
31
|
+
exports.default = {
|
|
32
|
+
parse,
|
|
33
|
+
dump,
|
|
34
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { YAMLHandler } from '.';
|
|
2
|
+
import { ParsedAsset } from '../../../types';
|
|
3
|
+
import { ActionModule } from '../../../tools/auth0/handlers/actionModules';
|
|
4
|
+
type ParsedActionModules = ParsedAsset<'actionModules', Partial<ActionModule>[]>;
|
|
5
|
+
declare const ActionModulesHandler: YAMLHandler<ParsedActionModules>;
|
|
6
|
+
export default ActionModulesHandler;
|
|
@@ -0,0 +1,68 @@
|
|
|
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
|
+
const path_1 = __importDefault(require("path"));
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const tools_1 = require("../../../tools");
|
|
9
|
+
const utils_1 = require("../../../utils");
|
|
10
|
+
const logger_1 = __importDefault(require("../../../logger"));
|
|
11
|
+
async function parse(context) {
|
|
12
|
+
const { actionModules } = context.assets;
|
|
13
|
+
if (!actionModules)
|
|
14
|
+
return { actionModules: null };
|
|
15
|
+
return {
|
|
16
|
+
actionModules: [
|
|
17
|
+
...actionModules.map((module) => ({
|
|
18
|
+
...module,
|
|
19
|
+
code: context.loadFile(module.code || ''),
|
|
20
|
+
})),
|
|
21
|
+
],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function mapSecrets(secrets) {
|
|
25
|
+
if (typeof secrets === 'string') {
|
|
26
|
+
return secrets;
|
|
27
|
+
}
|
|
28
|
+
if (secrets && secrets.length > 0) {
|
|
29
|
+
return secrets.map((secret) => ({ name: secret.name, value: secret.value }));
|
|
30
|
+
}
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
function mapModuleCode(basePath, module) {
|
|
34
|
+
const { code } = module;
|
|
35
|
+
if (!code) {
|
|
36
|
+
return '';
|
|
37
|
+
}
|
|
38
|
+
const moduleName = (0, utils_1.sanitize)(module.name);
|
|
39
|
+
const modulesFolder = path_1.default.join(basePath, tools_1.constants.ACTION_MODULES_DIRECTORY, moduleName);
|
|
40
|
+
fs_extra_1.default.ensureDirSync(modulesFolder);
|
|
41
|
+
const codeFile = path_1.default.join(modulesFolder, 'code.js');
|
|
42
|
+
logger_1.default.info(`Writing ${codeFile}`);
|
|
43
|
+
fs_extra_1.default.writeFileSync(codeFile, code);
|
|
44
|
+
return `./${tools_1.constants.ACTION_MODULES_DIRECTORY}/${moduleName}/code.js`;
|
|
45
|
+
}
|
|
46
|
+
async function dump(context) {
|
|
47
|
+
const { actionModules } = context.assets;
|
|
48
|
+
if (!actionModules || actionModules.length === 0)
|
|
49
|
+
return { actionModules: null };
|
|
50
|
+
const includeIdentifiers = Boolean(context.config.AUTH0_EXPORT_IDENTIFIERS);
|
|
51
|
+
return {
|
|
52
|
+
actionModules: actionModules?.map((module) => ({
|
|
53
|
+
...(includeIdentifiers && module.id ? { id: module.id } : {}),
|
|
54
|
+
name: module.name,
|
|
55
|
+
code: mapModuleCode(context.basePath, module),
|
|
56
|
+
dependencies: module.dependencies || [],
|
|
57
|
+
secrets: mapSecrets(module.secrets),
|
|
58
|
+
actions_using_module_total: module.actions_using_module_total,
|
|
59
|
+
all_changes_published: module.all_changes_published,
|
|
60
|
+
latest_version_number: module.latest_version_number,
|
|
61
|
+
})),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const ActionModulesHandler = {
|
|
65
|
+
parse,
|
|
66
|
+
dump,
|
|
67
|
+
};
|
|
68
|
+
exports.default = ActionModulesHandler;
|
|
@@ -77,6 +77,10 @@ async function dump(context) {
|
|
|
77
77
|
status: action.status,
|
|
78
78
|
secrets: mapSecrets(action.secrets),
|
|
79
79
|
supported_triggers: action.supported_triggers,
|
|
80
|
+
modules: action.modules?.map((module) => ({
|
|
81
|
+
module_name: module.module_name,
|
|
82
|
+
module_version_number: module.module_version_number,
|
|
83
|
+
})),
|
|
80
84
|
})),
|
|
81
85
|
};
|
|
82
86
|
}
|
|
@@ -21,6 +21,7 @@ const guardianPolicies_1 = __importDefault(require("./guardianPolicies"));
|
|
|
21
21
|
const roles_1 = __importDefault(require("./roles"));
|
|
22
22
|
const organizations_1 = __importDefault(require("./organizations"));
|
|
23
23
|
const actions_1 = __importDefault(require("./actions"));
|
|
24
|
+
const actionModules_1 = __importDefault(require("./actionModules"));
|
|
24
25
|
const triggers_1 = __importDefault(require("./triggers"));
|
|
25
26
|
const attackProtection_1 = __importDefault(require("./attackProtection"));
|
|
26
27
|
const riskAssessment_1 = __importDefault(require("./riskAssessment"));
|
|
@@ -41,6 +42,7 @@ const networkACLs_1 = __importDefault(require("./networkACLs"));
|
|
|
41
42
|
const userAttributeProfiles_1 = __importDefault(require("./userAttributeProfiles"));
|
|
42
43
|
const connectionProfiles_1 = __importDefault(require("./connectionProfiles"));
|
|
43
44
|
const tokenExchangeProfiles_1 = __importDefault(require("./tokenExchangeProfiles"));
|
|
45
|
+
const supplementalSignals_1 = __importDefault(require("./supplementalSignals"));
|
|
44
46
|
const selfServiceProfiles_1 = __importDefault(require("./selfServiceProfiles"));
|
|
45
47
|
const yamlHandlers = {
|
|
46
48
|
rules: rules_1.default,
|
|
@@ -63,6 +65,7 @@ const yamlHandlers = {
|
|
|
63
65
|
guardianPhoneFactorSelectedProvider: guardianPhoneFactorSelectedProvider_1.default,
|
|
64
66
|
guardianPolicies: guardianPolicies_1.default,
|
|
65
67
|
actions: actions_1.default,
|
|
68
|
+
actionModules: actionModules_1.default,
|
|
66
69
|
organizations: organizations_1.default,
|
|
67
70
|
triggers: triggers_1.default,
|
|
68
71
|
attackProtection: attackProtection_1.default,
|
|
@@ -82,5 +85,6 @@ const yamlHandlers = {
|
|
|
82
85
|
userAttributeProfiles: userAttributeProfiles_1.default,
|
|
83
86
|
connectionProfiles: connectionProfiles_1.default,
|
|
84
87
|
tokenExchangeProfiles: tokenExchangeProfiles_1.default,
|
|
88
|
+
supplementalSignals: supplementalSignals_1.default,
|
|
85
89
|
};
|
|
86
90
|
exports.default = yamlHandlers;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { YAMLHandler } from '.';
|
|
2
|
+
import { ParsedAsset } from '../../../types';
|
|
3
|
+
import { SupplementalSignals } from '../../../tools/auth0/handlers/supplementalSignals';
|
|
4
|
+
type ParsedSupplementalSignals = ParsedAsset<'supplementalSignals', SupplementalSignals>;
|
|
5
|
+
declare const supplementalSignalsHandler: YAMLHandler<ParsedSupplementalSignals>;
|
|
6
|
+
export default supplementalSignalsHandler;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
async function parseAndDump(context) {
|
|
4
|
+
const { supplementalSignals } = context.assets;
|
|
5
|
+
if (!supplementalSignals)
|
|
6
|
+
return { supplementalSignals: null };
|
|
7
|
+
return {
|
|
8
|
+
supplementalSignals,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
const supplementalSignalsHandler = {
|
|
12
|
+
parse: parseAndDump,
|
|
13
|
+
dump: parseAndDump,
|
|
14
|
+
};
|
|
15
|
+
exports.default = supplementalSignalsHandler;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import DefaultAPIHandler from './default';
|
|
2
|
+
import { Asset, Assets } from '../../../types';
|
|
3
|
+
import { Management } from 'auth0';
|
|
4
|
+
export declare const schema: {
|
|
5
|
+
type: string;
|
|
6
|
+
items: {
|
|
7
|
+
type: string;
|
|
8
|
+
required: string[];
|
|
9
|
+
additionalProperties: boolean;
|
|
10
|
+
properties: {
|
|
11
|
+
name: {
|
|
12
|
+
type: string;
|
|
13
|
+
};
|
|
14
|
+
code: {
|
|
15
|
+
type: string;
|
|
16
|
+
};
|
|
17
|
+
dependencies: {
|
|
18
|
+
type: string;
|
|
19
|
+
items: {
|
|
20
|
+
type: string;
|
|
21
|
+
additionalProperties: boolean;
|
|
22
|
+
properties: {
|
|
23
|
+
name: {
|
|
24
|
+
type: string;
|
|
25
|
+
};
|
|
26
|
+
version: {
|
|
27
|
+
type: string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
secrets: {
|
|
33
|
+
type: string;
|
|
34
|
+
items: {
|
|
35
|
+
type: string;
|
|
36
|
+
properties: {
|
|
37
|
+
name: {
|
|
38
|
+
type: string;
|
|
39
|
+
};
|
|
40
|
+
value: {
|
|
41
|
+
type: string;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
required: string[];
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
all_changes_published: {
|
|
48
|
+
type: string;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
export type ActionModule = Management.ActionModuleListItem;
|
|
54
|
+
export default class ActionModulesHandler extends DefaultAPIHandler {
|
|
55
|
+
existing: ActionModule[] | null;
|
|
56
|
+
constructor(options: DefaultAPIHandler);
|
|
57
|
+
createModule(module: Management.CreateActionModuleRequestContent): Promise<Management.CreateActionModuleResponseContent>;
|
|
58
|
+
updateModule(moduleId: string, module: Management.UpdateActionModuleRequestContent): Promise<Management.UpdateActionModuleResponseContent>;
|
|
59
|
+
deleteModule(moduleId: string): Promise<void>;
|
|
60
|
+
objString(module: ActionModule): string;
|
|
61
|
+
publishActionModules(modules: ActionModule[]): Promise<void>;
|
|
62
|
+
getType(): Promise<Asset[] | null>;
|
|
63
|
+
processChanges(assets: Assets): Promise<void>;
|
|
64
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
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 __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
42
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.schema = void 0;
|
|
46
|
+
const default_1 = __importStar(require("./default"));
|
|
47
|
+
const logger_1 = __importDefault(require("../../../logger"));
|
|
48
|
+
const client_1 = require("../client");
|
|
49
|
+
exports.schema = {
|
|
50
|
+
type: 'array',
|
|
51
|
+
items: {
|
|
52
|
+
type: 'object',
|
|
53
|
+
required: ['name', 'code'],
|
|
54
|
+
additionalProperties: true,
|
|
55
|
+
properties: {
|
|
56
|
+
name: { type: 'string' },
|
|
57
|
+
code: { type: 'string' },
|
|
58
|
+
dependencies: {
|
|
59
|
+
type: 'array',
|
|
60
|
+
items: {
|
|
61
|
+
type: 'object',
|
|
62
|
+
additionalProperties: false,
|
|
63
|
+
properties: {
|
|
64
|
+
name: { type: 'string' },
|
|
65
|
+
version: { type: 'string' },
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
secrets: {
|
|
70
|
+
type: 'array',
|
|
71
|
+
items: {
|
|
72
|
+
type: 'object',
|
|
73
|
+
properties: {
|
|
74
|
+
name: { type: 'string' },
|
|
75
|
+
value: { type: 'string' },
|
|
76
|
+
},
|
|
77
|
+
required: ['name'],
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
all_changes_published: { type: 'boolean' },
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
class ActionModulesHandler extends default_1.default {
|
|
85
|
+
constructor(options) {
|
|
86
|
+
super({
|
|
87
|
+
...options,
|
|
88
|
+
type: 'actionModules',
|
|
89
|
+
id: 'id',
|
|
90
|
+
identifiers: ['id', 'name'],
|
|
91
|
+
stripUpdateFields: [
|
|
92
|
+
'name',
|
|
93
|
+
'actions_using_module_total',
|
|
94
|
+
'all_changes_published',
|
|
95
|
+
'latest_version_number',
|
|
96
|
+
'created_at',
|
|
97
|
+
'updated_at',
|
|
98
|
+
],
|
|
99
|
+
stripCreateFields: [
|
|
100
|
+
'actions_using_module_total',
|
|
101
|
+
'latest_version_number',
|
|
102
|
+
'created_at',
|
|
103
|
+
'updated_at',
|
|
104
|
+
],
|
|
105
|
+
functions: {
|
|
106
|
+
create: (module) => this.createModule(module),
|
|
107
|
+
update: (id, module) => this.updateModule(id, module),
|
|
108
|
+
delete: (id) => this.deleteModule(id),
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
async createModule(module) {
|
|
113
|
+
if ('all_changes_published' in module) {
|
|
114
|
+
delete module.all_changes_published;
|
|
115
|
+
}
|
|
116
|
+
const createdModule = await this.client.actions.modules.create(module);
|
|
117
|
+
return createdModule;
|
|
118
|
+
}
|
|
119
|
+
async updateModule(moduleId, module) {
|
|
120
|
+
const updatableModule = {
|
|
121
|
+
code: module.code,
|
|
122
|
+
dependencies: module.dependencies,
|
|
123
|
+
secrets: module.secrets,
|
|
124
|
+
};
|
|
125
|
+
return this.client.actions.modules.update(moduleId, updatableModule);
|
|
126
|
+
}
|
|
127
|
+
async deleteModule(moduleId) {
|
|
128
|
+
return this.client.actions.modules.delete(moduleId);
|
|
129
|
+
}
|
|
130
|
+
objString(module) {
|
|
131
|
+
return super.objString({ id: module.id, name: module.name });
|
|
132
|
+
}
|
|
133
|
+
async publishActionModules(modules) {
|
|
134
|
+
await this.client.pool
|
|
135
|
+
.addEachTask({
|
|
136
|
+
data: modules || [],
|
|
137
|
+
generator: (module) => this.client.actions.modules.versions
|
|
138
|
+
.create(module.id)
|
|
139
|
+
.then(() => {
|
|
140
|
+
logger_1.default.info(`Published [${this.type}]: ${this.objString(module)}`);
|
|
141
|
+
})
|
|
142
|
+
.catch((err) => {
|
|
143
|
+
throw new Error(`Problem Publishing ${this.type} ${this.objString(module)}\n${err}`);
|
|
144
|
+
}),
|
|
145
|
+
})
|
|
146
|
+
.promise();
|
|
147
|
+
}
|
|
148
|
+
async getType() {
|
|
149
|
+
if (this.existing)
|
|
150
|
+
return this.existing;
|
|
151
|
+
try {
|
|
152
|
+
const modules = await (0, client_1.paginate)(this.client.actions.modules.list, {
|
|
153
|
+
paginate: true,
|
|
154
|
+
});
|
|
155
|
+
this.existing = modules;
|
|
156
|
+
return this.existing;
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
if (err.statusCode === 404 || err.statusCode === 501) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
if (err.statusCode === 403 || err.errorCode === 'feature_not_enabled') {
|
|
163
|
+
logger_1.default.debug('Skipping action modules because it is not enabled.');
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
throw err;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Before actions are processed
|
|
170
|
+
async processChanges(assets) {
|
|
171
|
+
const { actionModules } = assets;
|
|
172
|
+
// Do nothing if not set
|
|
173
|
+
if (!actionModules)
|
|
174
|
+
return;
|
|
175
|
+
const changes = await this.calcChanges(assets);
|
|
176
|
+
await super.processChanges(assets, changes);
|
|
177
|
+
// Refresh module list to get latest state with all_changes_published field
|
|
178
|
+
const postProcessedModules = await (async () => {
|
|
179
|
+
this.existing = null; // Clear the cache
|
|
180
|
+
return this.getType();
|
|
181
|
+
})();
|
|
182
|
+
// Publish modules that have unpublished changes
|
|
183
|
+
const modulesToPublish = [
|
|
184
|
+
...changes.create
|
|
185
|
+
.filter((module) => module.all_changes_published === true)
|
|
186
|
+
.map((moduleWithoutId) => {
|
|
187
|
+
// Add IDs to just-created modules
|
|
188
|
+
const moduleId = postProcessedModules?.find((postProcessedModule) => postProcessedModule.name === moduleWithoutId.name)?.id;
|
|
189
|
+
const module = postProcessedModules?.find((postProcessedModule) => postProcessedModule.id === moduleId);
|
|
190
|
+
return module;
|
|
191
|
+
}),
|
|
192
|
+
...changes.update.filter((module) => module.all_changes_published === true),
|
|
193
|
+
].filter((module) => module !== undefined);
|
|
194
|
+
await this.publishActionModules(modulesToPublish);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
exports.default = ActionModulesHandler;
|
|
198
|
+
__decorate([
|
|
199
|
+
(0, default_1.order)('50')
|
|
200
|
+
], ActionModulesHandler.prototype, "processChanges", null);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Management } from 'auth0';
|
|
2
2
|
import DefaultAPIHandler from './default';
|
|
3
|
-
import { Asset, Assets } from '../../../types';
|
|
3
|
+
import { Asset, Assets, CalculatedChanges } from '../../../types';
|
|
4
|
+
import { ActionModule } from './actionModules';
|
|
4
5
|
export type Action = Management.Action & {
|
|
5
6
|
deployed?: boolean;
|
|
6
7
|
};
|
|
@@ -80,6 +81,21 @@ export declare const schema: {
|
|
|
80
81
|
};
|
|
81
82
|
};
|
|
82
83
|
};
|
|
84
|
+
modules: {
|
|
85
|
+
type: string;
|
|
86
|
+
items: {
|
|
87
|
+
type: string;
|
|
88
|
+
required: string[];
|
|
89
|
+
properties: {
|
|
90
|
+
module_name: {
|
|
91
|
+
type: string;
|
|
92
|
+
};
|
|
93
|
+
module_version_number: {
|
|
94
|
+
type: string;
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
};
|
|
83
99
|
deployed: {
|
|
84
100
|
type: string;
|
|
85
101
|
};
|
|
@@ -101,6 +117,8 @@ export default class ActionHandler extends DefaultAPIHandler {
|
|
|
101
117
|
deployAction(action: any): Promise<void>;
|
|
102
118
|
actionChanges(action: any, found: any): Promise<Asset>;
|
|
103
119
|
getType(): Promise<Asset[] | null>;
|
|
120
|
+
calcChanges(assets: Assets): Promise<CalculatedChanges>;
|
|
121
|
+
enrichActionWithModuleIds(action: Action, modules: ActionModule[]): Promise<Action>;
|
|
104
122
|
processChanges(assets: Assets): Promise<void>;
|
|
105
123
|
}
|
|
106
124
|
export {};
|
|
@@ -95,6 +95,17 @@ exports.schema = {
|
|
|
95
95
|
},
|
|
96
96
|
},
|
|
97
97
|
},
|
|
98
|
+
modules: {
|
|
99
|
+
type: 'array',
|
|
100
|
+
items: {
|
|
101
|
+
type: 'object',
|
|
102
|
+
required: ['module_name', 'module_version_number'],
|
|
103
|
+
properties: {
|
|
104
|
+
module_name: { type: 'string' },
|
|
105
|
+
module_version_number: { type: 'number' },
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
},
|
|
98
109
|
deployed: { type: 'boolean' },
|
|
99
110
|
status: { type: 'string' },
|
|
100
111
|
},
|
|
@@ -203,6 +214,9 @@ class ActionHandler extends default_1.default {
|
|
|
203
214
|
if (!(0, utils_1.areArraysEquals)(action.supported_triggers, found.supported_triggers)) {
|
|
204
215
|
actionChanges.supported_triggers = action.supported_triggers;
|
|
205
216
|
}
|
|
217
|
+
if (!(0, utils_1.areArraysEquals)(action.modules, found.modules)) {
|
|
218
|
+
actionChanges.modules = action.modules;
|
|
219
|
+
}
|
|
206
220
|
return actionChanges;
|
|
207
221
|
}
|
|
208
222
|
async getType() {
|
|
@@ -234,6 +248,80 @@ class ActionHandler extends default_1.default {
|
|
|
234
248
|
throw err;
|
|
235
249
|
}
|
|
236
250
|
}
|
|
251
|
+
async calcChanges(assets) {
|
|
252
|
+
let { actions, actionModules } = assets;
|
|
253
|
+
// Do nothing if not set
|
|
254
|
+
if (!actions)
|
|
255
|
+
return {
|
|
256
|
+
del: [],
|
|
257
|
+
create: [],
|
|
258
|
+
update: [],
|
|
259
|
+
conflicts: [],
|
|
260
|
+
};
|
|
261
|
+
let modules = null;
|
|
262
|
+
if (actionModules && actionModules.length > 0) {
|
|
263
|
+
modules = actionModules;
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
try {
|
|
267
|
+
modules = await (0, client_1.paginate)(this.client.actions.modules.list, {
|
|
268
|
+
paginate: true,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
logger_1.default.debug('Skipping actions modules enrichment because action modules could not be retrieved.');
|
|
273
|
+
modules = null;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
if (modules != null) {
|
|
277
|
+
// Use task queue to process actions in parallel
|
|
278
|
+
const processedActions = await this.client.pool
|
|
279
|
+
.addEachTask({
|
|
280
|
+
data: actions || [],
|
|
281
|
+
generator: (action) => this.enrichActionWithModuleIds(action, modules),
|
|
282
|
+
})
|
|
283
|
+
.promise();
|
|
284
|
+
actions = processedActions;
|
|
285
|
+
}
|
|
286
|
+
return super.calcChanges({ ...assets, actions });
|
|
287
|
+
}
|
|
288
|
+
async enrichActionWithModuleIds(action, modules) {
|
|
289
|
+
if (!action.modules || action.modules.length === 0) {
|
|
290
|
+
return action;
|
|
291
|
+
}
|
|
292
|
+
const updatedModules = await this.client.pool
|
|
293
|
+
.addEachTask({
|
|
294
|
+
data: action.modules,
|
|
295
|
+
generator: async (module) => {
|
|
296
|
+
const foundModule = modules.find((m) => m.name === module.module_name);
|
|
297
|
+
if (foundModule && foundModule.id) {
|
|
298
|
+
// paginate to get all versions of the module
|
|
299
|
+
const allModuleVersions = [];
|
|
300
|
+
let moduleVersions = await this.client.actions.modules.versions.list(foundModule.id);
|
|
301
|
+
// Process first page
|
|
302
|
+
allModuleVersions.push(...moduleVersions.data);
|
|
303
|
+
// Fetch remaining pages
|
|
304
|
+
while (moduleVersions.hasNextPage()) {
|
|
305
|
+
moduleVersions = await moduleVersions.getNextPage();
|
|
306
|
+
allModuleVersions.push(...moduleVersions.data);
|
|
307
|
+
}
|
|
308
|
+
return {
|
|
309
|
+
module_name: module.module_name,
|
|
310
|
+
module_id: foundModule.id,
|
|
311
|
+
module_version_number: module.module_version_number,
|
|
312
|
+
module_version_id: allModuleVersions?.find((v) => v.version_number === module.module_version_number)
|
|
313
|
+
?.id || '',
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
return module;
|
|
317
|
+
},
|
|
318
|
+
})
|
|
319
|
+
.promise();
|
|
320
|
+
return {
|
|
321
|
+
...action,
|
|
322
|
+
modules: updatedModules,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
237
325
|
async processChanges(assets) {
|
|
238
326
|
const { actions } = assets;
|
|
239
327
|
// Do nothing if not set
|
|
@@ -271,5 +359,5 @@ class ActionHandler extends default_1.default {
|
|
|
271
359
|
}
|
|
272
360
|
exports.default = ActionHandler;
|
|
273
361
|
__decorate([
|
|
274
|
-
(0, default_1.order)('
|
|
362
|
+
(0, default_1.order)('51')
|
|
275
363
|
], ActionHandler.prototype, "processChanges", null);
|
|
@@ -57,6 +57,7 @@ const phoneProviders = __importStar(require("./phoneProvider"));
|
|
|
57
57
|
const phoneTemplates = __importStar(require("./phoneTemplates"));
|
|
58
58
|
const prompts = __importStar(require("./prompts"));
|
|
59
59
|
const actions = __importStar(require("./actions"));
|
|
60
|
+
const actionModules = __importStar(require("./actionModules"));
|
|
60
61
|
const triggers = __importStar(require("./triggers"));
|
|
61
62
|
const organizations = __importStar(require("./organizations"));
|
|
62
63
|
const attackProtection = __importStar(require("./attackProtection"));
|
|
@@ -72,6 +73,7 @@ const networkACLs = __importStar(require("./networkACLs"));
|
|
|
72
73
|
const userAttributeProfiles = __importStar(require("./userAttributeProfiles"));
|
|
73
74
|
const connectionProfiles = __importStar(require("./connectionProfiles"));
|
|
74
75
|
const tokenExchangeProfiles = __importStar(require("./tokenExchangeProfiles"));
|
|
76
|
+
const supplementalSignals = __importStar(require("./supplementalSignals"));
|
|
75
77
|
const auth0ApiHandlers = {
|
|
76
78
|
rules,
|
|
77
79
|
rulesConfigs,
|
|
@@ -98,6 +100,7 @@ const auth0ApiHandlers = {
|
|
|
98
100
|
//@ts-ignore because prompts have not been universally implemented yet
|
|
99
101
|
prompts,
|
|
100
102
|
actions,
|
|
103
|
+
actionModules,
|
|
101
104
|
triggers,
|
|
102
105
|
organizations,
|
|
103
106
|
attackProtection,
|
|
@@ -113,5 +116,6 @@ const auth0ApiHandlers = {
|
|
|
113
116
|
userAttributeProfiles,
|
|
114
117
|
connectionProfiles,
|
|
115
118
|
tokenExchangeProfiles,
|
|
119
|
+
supplementalSignals,
|
|
116
120
|
};
|
|
117
121
|
exports.default = auth0ApiHandlers; // TODO: apply stronger types to schema properties
|
|
@@ -41,6 +41,10 @@ exports.schema = {
|
|
|
41
41
|
enum: Object.values(auth0_1.Management.ResourceServerProofOfPossessionMechanismEnum),
|
|
42
42
|
},
|
|
43
43
|
required: { type: 'boolean' },
|
|
44
|
+
required_for: {
|
|
45
|
+
type: 'string',
|
|
46
|
+
enum: Object.values(auth0_1.Management.ResourceServerProofOfPossessionRequiredForEnum),
|
|
47
|
+
},
|
|
44
48
|
},
|
|
45
49
|
required: ['mechanism', 'required'],
|
|
46
50
|
},
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Management } from 'auth0';
|
|
2
|
+
import DefaultHandler from './default';
|
|
3
|
+
import { Asset, Assets } from '../../../types';
|
|
4
|
+
export declare const schema: {
|
|
5
|
+
type: string;
|
|
6
|
+
properties: {
|
|
7
|
+
akamai_enabled: {
|
|
8
|
+
type: string;
|
|
9
|
+
description: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export type SupplementalSignals = Management.GetSupplementalSignalsResponseContent;
|
|
14
|
+
export default class SupplementalSignalsHandler extends DefaultHandler {
|
|
15
|
+
existing: SupplementalSignals | null;
|
|
16
|
+
constructor(options: DefaultHandler);
|
|
17
|
+
getType(): Promise<Asset | null>;
|
|
18
|
+
processChanges(assets: Assets): Promise<void>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
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 __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
42
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.schema = void 0;
|
|
46
|
+
const auth0_1 = require("auth0");
|
|
47
|
+
const default_1 = __importStar(require("./default"));
|
|
48
|
+
const logger_1 = __importDefault(require("../../../logger"));
|
|
49
|
+
exports.schema = {
|
|
50
|
+
type: 'object',
|
|
51
|
+
properties: {
|
|
52
|
+
akamai_enabled: {
|
|
53
|
+
type: 'boolean',
|
|
54
|
+
description: 'Enable Akamai supplemental signals integration',
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
class SupplementalSignalsHandler extends default_1.default {
|
|
59
|
+
constructor(options) {
|
|
60
|
+
super({
|
|
61
|
+
...options,
|
|
62
|
+
type: 'supplementalSignals',
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
async getType() {
|
|
66
|
+
try {
|
|
67
|
+
const supplementalSignals = await this.client.supplementalSignals.get();
|
|
68
|
+
this.existing = supplementalSignals;
|
|
69
|
+
return supplementalSignals;
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
if (err instanceof auth0_1.ManagementError && err.statusCode === 403) {
|
|
73
|
+
logger_1.default.debug('Supplemental Signals unavailable: insufficient scope or missing attack_protection entitlement.');
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
throw err;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async processChanges(assets) {
|
|
80
|
+
const { supplementalSignals } = assets;
|
|
81
|
+
if (!supplementalSignals)
|
|
82
|
+
return;
|
|
83
|
+
if (Object.keys(supplementalSignals).length > 0) {
|
|
84
|
+
try {
|
|
85
|
+
await this.client.supplementalSignals.patch(supplementalSignals);
|
|
86
|
+
this.updated += 1;
|
|
87
|
+
this.didUpdate(supplementalSignals);
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
if (err instanceof auth0_1.ManagementError && err.statusCode === 403) {
|
|
91
|
+
logger_1.default.debug('Supplemental Signals unavailable: insufficient scope or missing attack_protection entitlement.');
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
throw err;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.default = SupplementalSignalsHandler;
|
|
100
|
+
__decorate([
|
|
101
|
+
(0, default_1.order)('100')
|
|
102
|
+
], SupplementalSignalsHandler.prototype, "processChanges", null);
|
package/lib/tools/constants.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ declare const constants: {
|
|
|
8
8
|
OBFUSCATED_SECRET_VALUE: string;
|
|
9
9
|
HOOKS_DIRECTORY: string;
|
|
10
10
|
ACTIONS_DIRECTORY: string;
|
|
11
|
+
ACTION_MODULES_DIRECTORY: string;
|
|
11
12
|
TRIGGERS_DIRECTORY: string;
|
|
12
13
|
RULES_CONFIGS_DIRECTORY: string;
|
|
13
14
|
PAGES_DIRECTORY: string;
|
|
@@ -88,5 +89,6 @@ declare const constants: {
|
|
|
88
89
|
USER_ATTRIBUTE_PROFILES_DIRECTORY: string;
|
|
89
90
|
CONNECTION_PROFILES_DIRECTORY: string;
|
|
90
91
|
TOKEN_EXCHANGE_PROFILES_DIRECTORY: string;
|
|
92
|
+
SUPPLEMENTAL_SIGNALS_DIRECTORY: string;
|
|
91
93
|
};
|
|
92
94
|
export default constants;
|
package/lib/tools/constants.js
CHANGED
|
@@ -31,6 +31,7 @@ const constants = {
|
|
|
31
31
|
OBFUSCATED_SECRET_VALUE,
|
|
32
32
|
HOOKS_DIRECTORY: 'hooks',
|
|
33
33
|
ACTIONS_DIRECTORY: 'actions',
|
|
34
|
+
ACTION_MODULES_DIRECTORY: 'action-modules',
|
|
34
35
|
TRIGGERS_DIRECTORY: 'triggers',
|
|
35
36
|
RULES_CONFIGS_DIRECTORY: 'rules-configs',
|
|
36
37
|
PAGES_DIRECTORY: 'pages',
|
|
@@ -216,5 +217,6 @@ const constants = {
|
|
|
216
217
|
USER_ATTRIBUTE_PROFILES_DIRECTORY: 'user-attribute-profiles',
|
|
217
218
|
CONNECTION_PROFILES_DIRECTORY: 'connection-profiles',
|
|
218
219
|
TOKEN_EXCHANGE_PROFILES_DIRECTORY: 'token-exchange-profiles',
|
|
220
|
+
SUPPLEMENTAL_SIGNALS_DIRECTORY: 'supplemental-signals',
|
|
219
221
|
};
|
|
220
222
|
exports.default = constants;
|
package/lib/types.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Management, ManagementClient } from 'auth0';
|
|
2
2
|
import { PromisePoolExecutor } from 'promise-pool-executor';
|
|
3
3
|
import { Action } from './tools/auth0/handlers/actions';
|
|
4
|
+
import { ActionModule } from './tools/auth0/handlers/actionModules';
|
|
4
5
|
import { Prompts } from './tools/auth0/handlers/prompts';
|
|
5
6
|
import { Tenant } from './tools/auth0/handlers/tenant';
|
|
6
7
|
import { Page } from './tools/auth0/handlers/pages';
|
|
@@ -19,6 +20,7 @@ import { UserAttributeProfile } from './tools/auth0/handlers/userAttributeProfil
|
|
|
19
20
|
import { AttackProtection } from './tools/auth0/handlers/attackProtection';
|
|
20
21
|
import { TokenExchangeProfile } from './tools/auth0/handlers/tokenExchangeProfiles';
|
|
21
22
|
import { RiskAssessment } from './tools/auth0/handlers/riskAssessment';
|
|
23
|
+
import { SupplementalSignals } from './tools/auth0/handlers/supplementalSignals';
|
|
22
24
|
type SharedPaginationParams = {
|
|
23
25
|
checkpoint?: boolean;
|
|
24
26
|
paginate?: boolean;
|
|
@@ -91,6 +93,7 @@ export type Asset = {
|
|
|
91
93
|
};
|
|
92
94
|
export type Assets = Partial<{
|
|
93
95
|
actions: Action[] | null;
|
|
96
|
+
actionModules: ActionModule[] | null;
|
|
94
97
|
attackProtection: AttackProtection | null;
|
|
95
98
|
riskAssessment: RiskAssessment | null;
|
|
96
99
|
branding: (Asset & {
|
|
@@ -129,6 +132,7 @@ export type Assets = Partial<{
|
|
|
129
132
|
rulesConfigs: Asset[] | null;
|
|
130
133
|
tenant: Tenant | null;
|
|
131
134
|
triggers: Asset[] | null;
|
|
135
|
+
supplementalSignals: SupplementalSignals | null;
|
|
132
136
|
exclude?: {
|
|
133
137
|
[key: string]: string[];
|
|
134
138
|
};
|
|
@@ -153,7 +157,7 @@ export type CalculatedChanges = {
|
|
|
153
157
|
conflicts: Asset[];
|
|
154
158
|
create: Asset[];
|
|
155
159
|
};
|
|
156
|
-
export type AssetTypes = 'rules' | 'rulesConfigs' | 'hooks' | 'pages' | 'databases' | 'clientGrants' | 'resourceServers' | 'clients' | 'connections' | 'tenant' | 'emailProvider' | 'emailTemplates' | 'guardianFactors' | 'guardianFactorProviders' | 'guardianFactorTemplates' | 'guardianPhoneFactorMessageTypes' | 'guardianPhoneFactorSelectedProvider' | 'guardianPolicies' | 'roles' | 'actions' | 'organizations' | 'triggers' | 'attackProtection' | 'riskAssessment' | 'branding' | 'phoneProviders' | 'phoneTemplates' | 'logStreams' | 'prompts' | 'customDomains' | 'themes' | 'forms' | 'flows' | 'flowVaultConnections' | 'selfServiceProfiles' | 'networkACLs' | 'userAttributeProfiles' | 'connectionProfiles' | 'tokenExchangeProfiles';
|
|
160
|
+
export type AssetTypes = 'rules' | 'rulesConfigs' | 'hooks' | 'pages' | 'databases' | 'clientGrants' | 'resourceServers' | 'clients' | 'connections' | 'tenant' | 'emailProvider' | 'emailTemplates' | 'guardianFactors' | 'guardianFactorProviders' | 'guardianFactorTemplates' | 'guardianPhoneFactorMessageTypes' | 'guardianPhoneFactorSelectedProvider' | 'guardianPolicies' | 'roles' | 'actions' | 'actionModules' | 'organizations' | 'triggers' | 'attackProtection' | 'riskAssessment' | 'branding' | 'phoneProviders' | 'phoneTemplates' | 'logStreams' | 'prompts' | 'customDomains' | 'themes' | 'forms' | 'flows' | 'flowVaultConnections' | 'selfServiceProfiles' | 'networkACLs' | 'userAttributeProfiles' | 'connectionProfiles' | 'tokenExchangeProfiles' | 'supplementalSignals';
|
|
157
161
|
export type KeywordMappings = {
|
|
158
162
|
[key: string]: (string | number)[] | string | number;
|
|
159
163
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "auth0-deploy-cli",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.29.0",
|
|
4
4
|
"description": "A command line tool for deploying updates to your Auth0 tenant",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -42,16 +42,16 @@
|
|
|
42
42
|
"nconf": "^0.13.0",
|
|
43
43
|
"promise-pool-executor": "^1.1.1",
|
|
44
44
|
"sanitize-filename": "^1.6.3",
|
|
45
|
-
"undici": "^7.
|
|
45
|
+
"undici": "^7.22.0",
|
|
46
46
|
"winston": "^3.19.0",
|
|
47
47
|
"yargs": "^15.4.1"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
+
"@eslint/js": "^9.39.2",
|
|
50
51
|
"@types/fs-extra": "^9.0.13",
|
|
51
52
|
"@types/lodash": "^4.17.23",
|
|
52
53
|
"@types/mocha": "^10.0.10",
|
|
53
54
|
"@types/nconf": "^0.10.7",
|
|
54
|
-
"@eslint/js": "^9.39.2",
|
|
55
55
|
"@typescript-eslint/eslint-plugin": "^8.55.0",
|
|
56
56
|
"@typescript-eslint/parser": "^8.55.0",
|
|
57
57
|
"chai": "^4.5.0",
|