auth0-deploy-cli 7.3.7 → 7.5.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/.circleci/config.yml +15 -0
- package/.eslintrc +66 -17
- package/.github/CODEOWNERS +1 -0
- package/.husky/pre-commit +6 -0
- package/.husky/pre-push +4 -0
- package/CHANGELOG.md +37 -2
- package/lib/args.js +94 -81
- package/lib/commands/export.js +54 -78
- package/lib/commands/import.js +46 -70
- package/lib/commands/index.js +11 -20
- package/lib/configFactory.js +19 -27
- package/lib/context/defaults.js +18 -41
- package/lib/context/directory/handlers/actions.js +77 -107
- package/lib/context/directory/handlers/attackProtection.js +59 -0
- package/lib/context/directory/handlers/clientGrants.js +45 -54
- package/lib/context/directory/handlers/clients.js +60 -79
- package/lib/context/directory/handlers/connections.js +65 -89
- package/lib/context/directory/handlers/databases.js +91 -123
- package/lib/context/directory/handlers/emailProvider.js +46 -57
- package/lib/context/directory/handlers/emailTemplates.js +67 -80
- package/lib/context/directory/handlers/guardianFactorProviders.js +41 -49
- package/lib/context/directory/handlers/guardianFactorTemplates.js +41 -49
- package/lib/context/directory/handlers/guardianFactors.js +41 -49
- package/lib/context/directory/handlers/guardianPhoneFactorMessageTypes.js +40 -50
- package/lib/context/directory/handlers/guardianPhoneFactorSelectedProvider.js +40 -50
- package/lib/context/directory/handlers/guardianPolicies.js +40 -50
- package/lib/context/directory/handlers/hooks.js +55 -70
- package/lib/context/directory/handlers/index.js +53 -123
- package/lib/context/directory/handlers/migrations.js +36 -41
- package/lib/context/directory/handlers/organizations.js +54 -69
- package/lib/context/directory/handlers/pages.js +72 -86
- package/lib/context/directory/handlers/resourceServers.js +41 -49
- package/lib/context/directory/handlers/roles.js +49 -62
- package/lib/context/directory/handlers/rules.js +52 -68
- package/lib/context/directory/handlers/rulesConfigs.js +33 -32
- package/lib/context/directory/handlers/tenant.js +52 -47
- package/lib/context/directory/handlers/triggers.js +39 -54
- package/lib/context/directory/index.js +113 -101
- package/lib/context/index.js +96 -105
- package/lib/context/yaml/handlers/actions.js +71 -88
- package/lib/context/yaml/handlers/attackProtection.js +29 -0
- package/lib/context/yaml/handlers/clientGrants.js +36 -29
- package/lib/context/yaml/handlers/clients.js +61 -76
- package/lib/context/yaml/handlers/connections.js +76 -103
- package/lib/context/yaml/handlers/databases.js +64 -79
- package/lib/context/yaml/handlers/emailProvider.js +33 -30
- package/lib/context/yaml/handlers/emailTemplates.js +45 -54
- package/lib/context/yaml/handlers/guardianFactorProviders.js +27 -18
- package/lib/context/yaml/handlers/guardianFactorTemplates.js +27 -18
- package/lib/context/yaml/handlers/guardianFactors.js +27 -18
- package/lib/context/yaml/handlers/guardianPhoneFactorMessageTypes.js +27 -20
- package/lib/context/yaml/handlers/guardianPhoneFactorSelectedProvider.js +27 -20
- package/lib/context/yaml/handlers/guardianPolicies.js +27 -20
- package/lib/context/yaml/handlers/hooks.js +57 -67
- package/lib/context/yaml/handlers/index.js +53 -123
- package/lib/context/yaml/handlers/migrations.js +23 -24
- package/lib/context/yaml/handlers/organizations.js +40 -38
- package/lib/context/yaml/handlers/pages.js +49 -58
- package/lib/context/yaml/handlers/resourceServers.js +27 -18
- package/lib/context/yaml/handlers/roles.js +34 -24
- package/lib/context/yaml/handlers/rules.js +48 -58
- package/lib/context/yaml/handlers/rulesConfigs.js +27 -18
- package/lib/context/yaml/handlers/tenant.js +44 -30
- package/lib/context/yaml/handlers/triggers.js +32 -23
- package/lib/context/yaml/index.js +127 -142
- package/lib/index.js +73 -79
- package/lib/logger.js +18 -22
- package/lib/readonly.js +74 -66
- package/lib/tools/ValidationError.js +8 -13
- package/lib/tools/auth0/client.js +143 -133
- package/lib/tools/auth0/handlers/actions.js +231 -243
- package/lib/tools/auth0/handlers/attackProtection.js +86 -0
- package/lib/tools/auth0/handlers/branding.js +47 -46
- package/lib/tools/auth0/handlers/clientGrants.js +118 -116
- package/lib/tools/auth0/handlers/clients.js +72 -90
- package/lib/tools/auth0/handlers/connections.js +150 -118
- package/lib/tools/auth0/handlers/databases.js +127 -124
- package/lib/tools/auth0/handlers/default.js +186 -189
- package/lib/tools/auth0/handlers/emailProvider.js +67 -78
- package/lib/tools/auth0/handlers/emailTemplates.js +116 -92
- package/lib/tools/auth0/handlers/guardianFactorProviders.js +66 -81
- package/lib/tools/auth0/handlers/guardianFactorTemplates.js +60 -71
- package/lib/tools/auth0/handlers/guardianFactors.js +56 -63
- package/lib/tools/auth0/handlers/guardianPhoneFactorMessageTypes.js +80 -79
- package/lib/tools/auth0/handlers/guardianPhoneFactorSelectedProvider.js +77 -76
- package/lib/tools/auth0/handlers/guardianPolicies.js +59 -62
- package/lib/tools/auth0/handlers/hooks.js +201 -227
- package/lib/tools/auth0/handlers/index.js +53 -111
- package/lib/tools/auth0/handlers/migrations.js +99 -79
- package/lib/tools/auth0/handlers/organizations.js +225 -247
- package/lib/tools/auth0/handlers/pages.js +116 -154
- package/lib/tools/auth0/handlers/prompts.js +47 -46
- package/lib/tools/auth0/handlers/resourceServers.js +88 -112
- package/lib/tools/auth0/handlers/roles.js +203 -220
- package/lib/tools/auth0/handlers/rules.js +168 -189
- package/lib/tools/auth0/handlers/rulesConfigs.js +54 -63
- package/lib/tools/auth0/handlers/tenant.js +88 -64
- package/lib/tools/auth0/handlers/triggers.js +126 -126
- package/lib/tools/auth0/index.js +92 -85
- package/lib/tools/auth0/schema.js +39 -31
- package/lib/tools/constants.js +111 -21
- package/lib/tools/deploy.js +35 -32
- package/lib/tools/index.js +19 -32
- package/lib/tools/logger.js +11 -12
- package/lib/tools/utils.js +258 -254
- package/lib/utils.js +167 -190
- package/package.json +13 -17
- package/tsconfig.json +17 -0
- package/typescript-migration-progress.sh +22 -0
- package/.babelrc +0 -17
- package/.nyc_output/32e2bffd-d561-4814-9aa3-fe929a1e178a.json +0 -1
- package/.nyc_output/processinfo/32e2bffd-d561-4814-9aa3-fe929a1e178a.json +0 -1
- package/.nyc_output/processinfo/index.json +0 -1
package/lib/commands/index.js
CHANGED
|
@@ -1,22 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
var _import2 = _interopRequireDefault(_import);
|
|
10
|
-
|
|
11
|
-
var _export = require("./export");
|
|
12
|
-
|
|
13
|
-
var _export2 = _interopRequireDefault(_export);
|
|
14
|
-
|
|
15
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
16
|
-
|
|
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 import_1 = __importDefault(require("./import"));
|
|
7
|
+
const export_1 = __importDefault(require("./export"));
|
|
17
8
|
exports.default = {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
};
|
|
9
|
+
import: import_1.default,
|
|
10
|
+
export: export_1.default,
|
|
11
|
+
deploy: import_1.default,
|
|
12
|
+
dump: export_1.default
|
|
13
|
+
};
|
package/lib/configFactory.js
CHANGED
|
@@ -1,28 +1,20 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
1
|
module.exports = function () {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
config.setValue = function setValue(key, value) {
|
|
24
|
-
settings[key] = value;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
return config;
|
|
28
|
-
};
|
|
2
|
+
const settings = {};
|
|
3
|
+
let currentProvider = null;
|
|
4
|
+
const config = function getConfig(key) {
|
|
5
|
+
if (settings && settings[key]) {
|
|
6
|
+
return settings[key];
|
|
7
|
+
}
|
|
8
|
+
if (!currentProvider) {
|
|
9
|
+
throw new Error('A configuration provider has not been set');
|
|
10
|
+
}
|
|
11
|
+
return currentProvider(key);
|
|
12
|
+
};
|
|
13
|
+
config.setProvider = function setProvider(providerFunction) {
|
|
14
|
+
currentProvider = providerFunction;
|
|
15
|
+
};
|
|
16
|
+
config.setValue = function setValue(key, value) {
|
|
17
|
+
settings[key] = value;
|
|
18
|
+
};
|
|
19
|
+
return config;
|
|
20
|
+
};
|
package/lib/context/defaults.js
CHANGED
|
@@ -1,43 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.emailProviderDefaults = emailProviderDefaults;
|
|
7
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.emailProviderDefaults = void 0;
|
|
8
4
|
function emailProviderDefaults(emailProvider) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
name
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
smtp_host: '##SMTP_HOSTNAME##',
|
|
26
|
-
smtp_port: '##SMTP_PORT##',
|
|
27
|
-
smtp_user: '##SMTP_USER##',
|
|
28
|
-
smtp_pass: '##SMTP_PASS##',
|
|
29
|
-
...(updated.credentials || {})
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
if (name === 'ses') {
|
|
34
|
-
updated.credentials = {
|
|
35
|
-
accessKeyId: '##SES_ACCESS_KEY_ID##',
|
|
36
|
-
secretAccessKey: '##SES_ACCESS_SECRET_KEY##',
|
|
37
|
-
region: '##SES_AWS_REGION##',
|
|
38
|
-
...(updated.credentials || {})
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
return updated;
|
|
43
|
-
}
|
|
5
|
+
const updated = Object.assign({}, emailProvider);
|
|
6
|
+
const apiKeyProviders = ['mailgun', 'mandrill', 'sendgrid', 'sparkpost'];
|
|
7
|
+
// Add placeholder for credentials as they cannot be exported
|
|
8
|
+
const { name } = updated;
|
|
9
|
+
if (apiKeyProviders.includes(name)) {
|
|
10
|
+
updated.credentials = Object.assign({ api_key: `##${name.toUpperCase()}_API_KEY##` }, updated.credentials || {});
|
|
11
|
+
}
|
|
12
|
+
if (name === 'smtp') {
|
|
13
|
+
updated.credentials = Object.assign({ smtp_host: '##SMTP_HOSTNAME##', smtp_port: '##SMTP_PORT##', smtp_user: '##SMTP_USER##', smtp_pass: '##SMTP_PASS##' }, updated.credentials || {});
|
|
14
|
+
}
|
|
15
|
+
if (name === 'ses') {
|
|
16
|
+
updated.credentials = Object.assign({ accessKeyId: '##SES_ACCESS_KEY_ID##', secretAccessKey: '##SES_ACCESS_SECRET_KEY##', region: '##SES_AWS_REGION##' }, updated.credentials || {});
|
|
17
|
+
}
|
|
18
|
+
return updated;
|
|
19
|
+
}
|
|
20
|
+
exports.emailProviderDefaults = emailProviderDefaults;
|
|
@@ -1,119 +1,89 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
var
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
var _logger2 = _interopRequireDefault(_logger);
|
|
22
|
-
|
|
23
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
24
|
-
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
/* eslint-disable consistent-return */
|
|
16
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
17
|
+
const path_1 = __importDefault(require("path"));
|
|
18
|
+
const tools_1 = require("../../../tools");
|
|
19
|
+
const utils_1 = require("../../../utils");
|
|
20
|
+
const logger_1 = __importDefault(require("../../../logger"));
|
|
25
21
|
function parse(context) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
22
|
+
const actionsFolder = path_1.default.join(context.filePath, tools_1.constants.ACTIONS_DIRECTORY);
|
|
23
|
+
if (!(0, utils_1.existsMustBeDir)(actionsFolder))
|
|
24
|
+
return { actions: undefined }; // Skip
|
|
25
|
+
const files = (0, utils_1.getFiles)(actionsFolder, ['.json']);
|
|
26
|
+
const actions = files.map((file) => {
|
|
27
|
+
const action = Object.assign({}, (0, utils_1.loadJSON)(file, context.mappings));
|
|
28
|
+
const actionFolder = path_1.default.join(tools_1.constants.ACTIONS_DIRECTORY, `${action.name}`);
|
|
29
|
+
if (action.code) {
|
|
30
|
+
action.code = context.loadFile(action.code, actionFolder);
|
|
31
|
+
}
|
|
32
|
+
return action;
|
|
33
|
+
});
|
|
34
|
+
return {
|
|
35
|
+
actions
|
|
34
36
|
};
|
|
35
|
-
|
|
36
|
-
const actionFolder = _path2.default.join(_tools.constants.ACTIONS_DIRECTORY, `${action.name}`);
|
|
37
|
-
|
|
38
|
-
if (action.code) {
|
|
39
|
-
action.code = context.loadFile(action.code, actionFolder);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
return action;
|
|
43
|
-
});
|
|
44
|
-
return {
|
|
45
|
-
actions
|
|
46
|
-
};
|
|
47
37
|
}
|
|
48
|
-
|
|
49
38
|
function mapSecrets(secrets) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}));
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return [];
|
|
39
|
+
if (secrets && secrets.length > 0) {
|
|
40
|
+
return secrets.map((secret) => ({ name: secret.name, value: secret.value }));
|
|
41
|
+
}
|
|
42
|
+
return [];
|
|
58
43
|
}
|
|
59
|
-
|
|
60
44
|
function mapActionCode(filePath, action) {
|
|
61
|
-
|
|
62
|
-
code
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
_fsExtra2.default.ensureDirSync(actionFolder);
|
|
74
|
-
|
|
75
|
-
const codeFile = _path2.default.join(actionFolder, 'code.js');
|
|
76
|
-
|
|
77
|
-
_logger2.default.info(`Writing ${codeFile}`);
|
|
78
|
-
|
|
79
|
-
_fsExtra2.default.writeFileSync(codeFile, code);
|
|
80
|
-
|
|
81
|
-
return `${codeFile}`;
|
|
45
|
+
const { code } = action;
|
|
46
|
+
if (!code) {
|
|
47
|
+
return '';
|
|
48
|
+
}
|
|
49
|
+
const actionName = (0, utils_1.sanitize)(action.name);
|
|
50
|
+
const actionFolder = path_1.default.join(filePath, tools_1.constants.ACTIONS_DIRECTORY, `${actionName}`);
|
|
51
|
+
fs_extra_1.default.ensureDirSync(actionFolder);
|
|
52
|
+
const codeFile = path_1.default.join(actionFolder, 'code.js');
|
|
53
|
+
logger_1.default.info(`Writing ${codeFile}`);
|
|
54
|
+
fs_extra_1.default.writeFileSync(codeFile, code);
|
|
55
|
+
return `${codeFile}`;
|
|
82
56
|
}
|
|
83
|
-
|
|
84
57
|
function mapToAction(filePath, action) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
58
|
+
return {
|
|
59
|
+
name: action.name,
|
|
60
|
+
code: mapActionCode(filePath, action),
|
|
61
|
+
runtime: action.runtime,
|
|
62
|
+
status: action.status,
|
|
63
|
+
dependencies: action.dependencies || [],
|
|
64
|
+
secrets: mapSecrets(action.secrets),
|
|
65
|
+
supported_triggers: action.supported_triggers,
|
|
66
|
+
deployed: action.deployed || action.all_changes_deployed
|
|
67
|
+
};
|
|
95
68
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
_fsExtra2.default.writeFileSync(actionFile, JSON.stringify(mapToAction(context.filePath, action), null, 2));
|
|
113
|
-
});
|
|
69
|
+
function dump(context) {
|
|
70
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
71
|
+
const actions = [...context.assets.actions || []];
|
|
72
|
+
if (actions.length < 1)
|
|
73
|
+
return;
|
|
74
|
+
// Create Actions folder
|
|
75
|
+
const actionsFolder = path_1.default.join(context.filePath, tools_1.constants.ACTIONS_DIRECTORY);
|
|
76
|
+
fs_extra_1.default.ensureDirSync(actionsFolder);
|
|
77
|
+
actions.forEach((action) => {
|
|
78
|
+
// Dump template metadata
|
|
79
|
+
const name = (0, utils_1.sanitize)(action.name);
|
|
80
|
+
const actionFile = path_1.default.join(actionsFolder, `${name}.json`);
|
|
81
|
+
logger_1.default.info(`Writing ${actionFile}`);
|
|
82
|
+
fs_extra_1.default.writeFileSync(actionFile, JSON.stringify(mapToAction(context.filePath, action), null, 2));
|
|
83
|
+
});
|
|
84
|
+
});
|
|
114
85
|
}
|
|
115
|
-
|
|
116
86
|
exports.default = {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
};
|
|
87
|
+
parse,
|
|
88
|
+
dump
|
|
89
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
16
|
+
const path_1 = __importDefault(require("path"));
|
|
17
|
+
const tools_1 = require("../../../tools");
|
|
18
|
+
const utils_1 = require("../../../utils");
|
|
19
|
+
function attackProtectionFiles(filePath) {
|
|
20
|
+
const directory = path_1.default.join(filePath, tools_1.constants.ATTACK_PROTECTION_DIRECTORY);
|
|
21
|
+
return {
|
|
22
|
+
directory: directory,
|
|
23
|
+
breachedPasswordDetection: path_1.default.join(directory, 'breached-password-detection.json'),
|
|
24
|
+
bruteForceProtection: path_1.default.join(directory, 'brute-force-protection.json'),
|
|
25
|
+
suspiciousIpThrottling: path_1.default.join(directory, 'suspicious-ip-throttling.json')
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function parse(context) {
|
|
29
|
+
const files = attackProtectionFiles(context.filePath);
|
|
30
|
+
if (!(0, utils_1.existsMustBeDir)(files.directory)) {
|
|
31
|
+
return {
|
|
32
|
+
attackProtection: undefined
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const breachedPasswordDetection = (0, utils_1.loadJSON)(files.breachedPasswordDetection);
|
|
36
|
+
const bruteForceProtection = (0, utils_1.loadJSON)(files.bruteForceProtection);
|
|
37
|
+
const suspiciousIpThrottling = (0, utils_1.loadJSON)(files.suspiciousIpThrottling);
|
|
38
|
+
return {
|
|
39
|
+
attackProtection: {
|
|
40
|
+
breachedPasswordDetection,
|
|
41
|
+
bruteForceProtection,
|
|
42
|
+
suspiciousIpThrottling
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function dump(context) {
|
|
47
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
48
|
+
const { attackProtection } = context.assets;
|
|
49
|
+
const files = attackProtectionFiles(context.filePath);
|
|
50
|
+
fs_extra_1.default.ensureDirSync(files.directory);
|
|
51
|
+
(0, utils_1.dumpJSON)(files.breachedPasswordDetection, attackProtection.breachedPasswordDetection);
|
|
52
|
+
(0, utils_1.dumpJSON)(files.bruteForceProtection, attackProtection.bruteForceProtection);
|
|
53
|
+
(0, utils_1.dumpJSON)(files.suspiciousIpThrottling, attackProtection.suspiciousIpThrottling);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
exports.default = {
|
|
57
|
+
parse,
|
|
58
|
+
dump
|
|
59
|
+
};
|
|
@@ -1,59 +1,50 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
var
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
20
|
-
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
16
|
+
const path_1 = __importDefault(require("path"));
|
|
17
|
+
const tools_1 = require("../../../tools");
|
|
18
|
+
const utils_1 = require("../../../utils");
|
|
21
19
|
function parse(context) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
clientGrants
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
async function dump(context) {
|
|
35
|
-
const {
|
|
36
|
-
clientGrants
|
|
37
|
-
} = context.assets;
|
|
38
|
-
if (!clientGrants) return;
|
|
39
|
-
|
|
40
|
-
const grantsFolder = _path2.default.join(context.filePath, _tools.constants.CLIENTS_GRANTS_DIRECTORY);
|
|
41
|
-
|
|
42
|
-
_fsExtra2.default.ensureDirSync(grantsFolder);
|
|
43
|
-
|
|
44
|
-
clientGrants.forEach(grant => {
|
|
45
|
-
const dumpGrant = { ...grant
|
|
20
|
+
const grantsFolder = path_1.default.join(context.filePath, tools_1.constants.CLIENTS_GRANTS_DIRECTORY);
|
|
21
|
+
if (!(0, utils_1.existsMustBeDir)(grantsFolder))
|
|
22
|
+
return { clientGrants: undefined }; // Skip
|
|
23
|
+
const foundFiles = (0, utils_1.getFiles)(grantsFolder, ['.json']);
|
|
24
|
+
const clientGrants = foundFiles.map((f) => (0, utils_1.loadJSON)(f, context.mappings))
|
|
25
|
+
.filter((p) => Object.keys(p).length > 0); // Filter out empty grants
|
|
26
|
+
return {
|
|
27
|
+
clientGrants
|
|
46
28
|
};
|
|
47
|
-
dumpGrant.client_id = (0, _utils.convertClientIdToName)(dumpGrant.client_id, context.assets.clientsOrig);
|
|
48
|
-
const name = (0, _utils.sanitize)(`${dumpGrant.client_id} (${dumpGrant.audience})`);
|
|
49
|
-
|
|
50
|
-
const grantFile = _path2.default.join(grantsFolder, `${name}.json`);
|
|
51
|
-
|
|
52
|
-
(0, _utils.dumpJSON)(grantFile, dumpGrant);
|
|
53
|
-
});
|
|
54
29
|
}
|
|
55
|
-
|
|
30
|
+
function dump(context) {
|
|
31
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
const { clientGrants } = context.assets;
|
|
33
|
+
if (!clientGrants)
|
|
34
|
+
return; // Skip, nothing to dump
|
|
35
|
+
const grantsFolder = path_1.default.join(context.filePath, tools_1.constants.CLIENTS_GRANTS_DIRECTORY);
|
|
36
|
+
fs_extra_1.default.ensureDirSync(grantsFolder);
|
|
37
|
+
// Convert client_id to the client name for readability
|
|
38
|
+
clientGrants.forEach((grant) => {
|
|
39
|
+
const dumpGrant = Object.assign({}, grant);
|
|
40
|
+
dumpGrant.client_id = (0, utils_1.convertClientIdToName)(dumpGrant.client_id, context.assets.clientsOrig);
|
|
41
|
+
const name = (0, utils_1.sanitize)(`${dumpGrant.client_id} (${dumpGrant.audience})`);
|
|
42
|
+
const grantFile = path_1.default.join(grantsFolder, `${name}.json`);
|
|
43
|
+
(0, utils_1.dumpJSON)(grantFile, dumpGrant);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
56
47
|
exports.default = {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
};
|
|
48
|
+
parse,
|
|
49
|
+
dump
|
|
50
|
+
};
|
|
@@ -1,84 +1,65 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
var
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
var _utils = require("../../../utils");
|
|
22
|
-
|
|
23
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
24
|
-
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
16
|
+
const path_1 = __importDefault(require("path"));
|
|
17
|
+
const tools_1 = require("../../../tools");
|
|
18
|
+
const logger_1 = __importDefault(require("../../../logger"));
|
|
19
|
+
const utils_1 = require("../../../utils");
|
|
25
20
|
function parse(context) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
client
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
return {
|
|
46
|
-
clients
|
|
47
|
-
};
|
|
21
|
+
const clientsFolder = path_1.default.join(context.filePath, tools_1.constants.CLIENTS_DIRECTORY);
|
|
22
|
+
if (!(0, utils_1.existsMustBeDir)(clientsFolder))
|
|
23
|
+
return { clients: undefined }; // Skip
|
|
24
|
+
const foundFiles = (0, utils_1.getFiles)(clientsFolder, ['.json']);
|
|
25
|
+
const clients = foundFiles
|
|
26
|
+
.map((f) => {
|
|
27
|
+
const client = (0, utils_1.loadJSON)(f, context.mappings);
|
|
28
|
+
if (client.custom_login_page) {
|
|
29
|
+
const htmlFileName = path_1.default.join(clientsFolder, client.custom_login_page);
|
|
30
|
+
if ((0, utils_1.isFile)(htmlFileName)) {
|
|
31
|
+
client.custom_login_page = (0, tools_1.loadFileAndReplaceKeywords)(htmlFileName, context.mappings);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return client;
|
|
35
|
+
})
|
|
36
|
+
.filter((p) => Object.keys(p).length > 0); // Filter out empty clients
|
|
37
|
+
return {
|
|
38
|
+
clients
|
|
39
|
+
};
|
|
48
40
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
_logger2.default.info(`Writing ${customLoginHtml}`);
|
|
71
|
-
|
|
72
|
-
_fsExtra2.default.writeFileSync(customLoginHtml, html);
|
|
73
|
-
|
|
74
|
-
client.custom_login_page = `./${clientName}_custom_login_page.html`;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
(0, _utils.dumpJSON)(clientFile, (0, _utils.clearClientArrays)(client));
|
|
78
|
-
});
|
|
41
|
+
function dump(context) {
|
|
42
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
43
|
+
const { clients } = context.assets;
|
|
44
|
+
if (!clients)
|
|
45
|
+
return; // Skip, nothing to dump
|
|
46
|
+
const clientsFolder = path_1.default.join(context.filePath, tools_1.constants.CLIENTS_DIRECTORY);
|
|
47
|
+
fs_extra_1.default.ensureDirSync(clientsFolder);
|
|
48
|
+
clients.forEach((client) => {
|
|
49
|
+
const clientName = (0, utils_1.sanitize)(client.name);
|
|
50
|
+
const clientFile = path_1.default.join(clientsFolder, `${clientName}.json`);
|
|
51
|
+
if (client.custom_login_page) {
|
|
52
|
+
const html = client.custom_login_page;
|
|
53
|
+
const customLoginHtml = path_1.default.join(clientsFolder, `${clientName}_custom_login_page.html`);
|
|
54
|
+
logger_1.default.info(`Writing ${customLoginHtml}`);
|
|
55
|
+
fs_extra_1.default.writeFileSync(customLoginHtml, html);
|
|
56
|
+
client.custom_login_page = `./${clientName}_custom_login_page.html`;
|
|
57
|
+
}
|
|
58
|
+
(0, utils_1.dumpJSON)(clientFile, (0, utils_1.clearClientArrays)(client));
|
|
59
|
+
});
|
|
60
|
+
});
|
|
79
61
|
}
|
|
80
|
-
|
|
81
62
|
exports.default = {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
};
|
|
63
|
+
parse,
|
|
64
|
+
dump
|
|
65
|
+
};
|