@j-schreiber/sf-cli-security-audit 0.7.1 → 0.8.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/README.md +26 -22
- package/messages/rules.enforceClassificationPresets.md +4 -0
- package/messages/rules.users.md +12 -0
- package/oclif.lock +1285 -1006
- package/oclif.manifest.json +2 -253
- package/package.json +1 -1
- package/lib/commands/org/audit/init.d.ts +0 -19
- package/lib/commands/org/audit/init.js +0 -72
- package/lib/commands/org/audit/init.js.map +0 -1
- package/lib/commands/org/audit/run.d.ts +0 -22
- package/lib/commands/org/audit/run.js +0 -119
- package/lib/commands/org/audit/run.js.map +0 -1
- package/lib/commands/org/scan/user-perms.d.ts +0 -20
- package/lib/commands/org/scan/user-perms.js +0 -87
- package/lib/commands/org/scan/user-perms.js.map +0 -1
- package/lib/libs/conf-init/auditConfig.d.ts +0 -35
- package/lib/libs/conf-init/auditConfig.js +0 -41
- package/lib/libs/conf-init/auditConfig.js.map +0 -1
- package/lib/libs/conf-init/permissionsClassification.d.ts +0 -17
- package/lib/libs/conf-init/permissionsClassification.js +0 -80
- package/lib/libs/conf-init/permissionsClassification.js.map +0 -1
- package/lib/libs/conf-init/policyConfigs.d.ts +0 -31
- package/lib/libs/conf-init/policyConfigs.js +0 -91
- package/lib/libs/conf-init/policyConfigs.js.map +0 -1
- package/lib/libs/conf-init/presets/loose.d.ts +0 -6
- package/lib/libs/conf-init/presets/loose.js +0 -51
- package/lib/libs/conf-init/presets/loose.js.map +0 -1
- package/lib/libs/conf-init/presets/none.d.ts +0 -30
- package/lib/libs/conf-init/presets/none.js +0 -54
- package/lib/libs/conf-init/presets/none.js.map +0 -1
- package/lib/libs/conf-init/presets/strict.d.ts +0 -4
- package/lib/libs/conf-init/presets/strict.js +0 -45
- package/lib/libs/conf-init/presets/strict.js.map +0 -1
- package/lib/libs/conf-init/presets.d.ts +0 -7
- package/lib/libs/conf-init/presets.js +0 -20
- package/lib/libs/conf-init/presets.js.map +0 -1
- package/lib/libs/core/auditRun.d.ts +0 -36
- package/lib/libs/core/auditRun.js +0 -86
- package/lib/libs/core/auditRun.js.map +0 -1
- package/lib/libs/core/classification-types.d.ts +0 -20
- package/lib/libs/core/classification-types.js +0 -23
- package/lib/libs/core/classification-types.js.map +0 -1
- package/lib/libs/core/constants.d.ts +0 -11
- package/lib/libs/core/constants.js +0 -20
- package/lib/libs/core/constants.js.map +0 -1
- package/lib/libs/core/file-mgmt/auditConfigFileManager.d.ts +0 -48
- package/lib/libs/core/file-mgmt/auditConfigFileManager.js +0 -145
- package/lib/libs/core/file-mgmt/auditConfigFileManager.js.map +0 -1
- package/lib/libs/core/file-mgmt/schema.d.ts +0 -123
- package/lib/libs/core/file-mgmt/schema.js +0 -69
- package/lib/libs/core/file-mgmt/schema.js.map +0 -1
- package/lib/libs/core/mdapi/mdapiRetriever.d.ts +0 -54
- package/lib/libs/core/mdapi/mdapiRetriever.js +0 -123
- package/lib/libs/core/mdapi/mdapiRetriever.js.map +0 -1
- package/lib/libs/core/mdapi/metadataRegistryEntry.d.ts +0 -40
- package/lib/libs/core/mdapi/metadataRegistryEntry.js +0 -46
- package/lib/libs/core/mdapi/metadataRegistryEntry.js.map +0 -1
- package/lib/libs/core/mdapi/namedMetadataToolingQueryable.d.ts +0 -33
- package/lib/libs/core/mdapi/namedMetadataToolingQueryable.js +0 -41
- package/lib/libs/core/mdapi/namedMetadataToolingQueryable.js.map +0 -1
- package/lib/libs/core/mdapi/namedMetadataType.d.ts +0 -20
- package/lib/libs/core/mdapi/namedMetadataType.js +0 -41
- package/lib/libs/core/mdapi/namedMetadataType.js.map +0 -1
- package/lib/libs/core/mdapi/singletonMetadataType.d.ts +0 -21
- package/lib/libs/core/mdapi/singletonMetadataType.js +0 -37
- package/lib/libs/core/mdapi/singletonMetadataType.js.map +0 -1
- package/lib/libs/core/policies/connectedAppPolicy.d.ts +0 -10
- package/lib/libs/core/policies/connectedAppPolicy.js +0 -78
- package/lib/libs/core/policies/connectedAppPolicy.js.map +0 -1
- package/lib/libs/core/policies/permissionSetPolicy.d.ts +0 -11
- package/lib/libs/core/policies/permissionSetPolicy.js +0 -62
- package/lib/libs/core/policies/permissionSetPolicy.js.map +0 -1
- package/lib/libs/core/policies/policy.d.ts +0 -31
- package/lib/libs/core/policies/policy.js +0 -100
- package/lib/libs/core/policies/policy.js.map +0 -1
- package/lib/libs/core/policies/profilePolicy.d.ts +0 -11
- package/lib/libs/core/policies/profilePolicy.js +0 -64
- package/lib/libs/core/policies/profilePolicy.js.map +0 -1
- package/lib/libs/core/policies/salesforceStandardTypes.d.ts +0 -53
- package/lib/libs/core/policies/salesforceStandardTypes.js +0 -2
- package/lib/libs/core/policies/salesforceStandardTypes.js.map +0 -1
- package/lib/libs/core/policies/userPolicy.d.ts +0 -11
- package/lib/libs/core/policies/userPolicy.js +0 -104
- package/lib/libs/core/policies/userPolicy.js.map +0 -1
- package/lib/libs/core/policy-types.d.ts +0 -18
- package/lib/libs/core/policy-types.js +0 -28
- package/lib/libs/core/policy-types.js.map +0 -1
- package/lib/libs/core/policyRegistry.d.ts +0 -23
- package/lib/libs/core/policyRegistry.js +0 -38
- package/lib/libs/core/policyRegistry.js.map +0 -1
- package/lib/libs/core/registries/connectedApps.d.ts +0 -13
- package/lib/libs/core/registries/connectedApps.js +0 -13
- package/lib/libs/core/registries/connectedApps.js.map +0 -1
- package/lib/libs/core/registries/permissionSets.d.ts +0 -11
- package/lib/libs/core/registries/permissionSets.js +0 -11
- package/lib/libs/core/registries/permissionSets.js.map +0 -1
- package/lib/libs/core/registries/profiles.d.ts +0 -11
- package/lib/libs/core/registries/profiles.js +0 -13
- package/lib/libs/core/registries/profiles.js.map +0 -1
- package/lib/libs/core/registries/ruleRegistry.d.ts +0 -37
- package/lib/libs/core/registries/ruleRegistry.js +0 -48
- package/lib/libs/core/registries/ruleRegistry.js.map +0 -1
- package/lib/libs/core/registries/rules/allUsedAppsUnderManagement.d.ts +0 -7
- package/lib/libs/core/registries/rules/allUsedAppsUnderManagement.js +0 -23
- package/lib/libs/core/registries/rules/allUsedAppsUnderManagement.js.map +0 -1
- package/lib/libs/core/registries/rules/enforceCustomPermsClassificationOnProfiles.d.ts +0 -7
- package/lib/libs/core/registries/rules/enforceCustomPermsClassificationOnProfiles.js +0 -52
- package/lib/libs/core/registries/rules/enforceCustomPermsClassificationOnProfiles.js.map +0 -1
- package/lib/libs/core/registries/rules/enforceUserPermsClassificationOnPermSets.d.ts +0 -7
- package/lib/libs/core/registries/rules/enforceUserPermsClassificationOnPermSets.js +0 -52
- package/lib/libs/core/registries/rules/enforceUserPermsClassificationOnPermSets.js.map +0 -1
- package/lib/libs/core/registries/rules/enforceUserPermsClassificationOnProfiles.d.ts +0 -7
- package/lib/libs/core/registries/rules/enforceUserPermsClassificationOnProfiles.js +0 -54
- package/lib/libs/core/registries/rules/enforceUserPermsClassificationOnProfiles.js.map +0 -1
- package/lib/libs/core/registries/rules/noInactiveUsers.d.ts +0 -9
- package/lib/libs/core/registries/rules/noInactiveUsers.js +0 -44
- package/lib/libs/core/registries/rules/noInactiveUsers.js.map +0 -1
- package/lib/libs/core/registries/rules/noOtherApexApiLogins.d.ts +0 -7
- package/lib/libs/core/registries/rules/noOtherApexApiLogins.js +0 -24
- package/lib/libs/core/registries/rules/noOtherApexApiLogins.js.map +0 -1
- package/lib/libs/core/registries/rules/noUserCanSelfAuthorize.d.ts +0 -7
- package/lib/libs/core/registries/rules/noUserCanSelfAuthorize.js +0 -31
- package/lib/libs/core/registries/rules/noUserCanSelfAuthorize.js.map +0 -1
- package/lib/libs/core/registries/rules/policyRule.d.ts +0 -21
- package/lib/libs/core/registries/rules/policyRule.js +0 -41
- package/lib/libs/core/registries/rules/policyRule.js.map +0 -1
- package/lib/libs/core/registries/types.d.ts +0 -37
- package/lib/libs/core/registries/types.js +0 -11
- package/lib/libs/core/registries/types.js.map +0 -1
- package/lib/libs/core/registries/users.d.ts +0 -26
- package/lib/libs/core/registries/users.js +0 -10
- package/lib/libs/core/registries/users.js.map +0 -1
- package/lib/libs/core/result-types.d.ts +0 -172
- package/lib/libs/core/result-types.js +0 -2
- package/lib/libs/core/result-types.js.map +0 -1
- package/lib/libs/core/utils.d.ts +0 -12
- package/lib/libs/core/utils.js +0 -31
- package/lib/libs/core/utils.js.map +0 -1
- package/lib/libs/quick-scan/types.d.ts +0 -17
- package/lib/libs/quick-scan/types.js +0 -2
- package/lib/libs/quick-scan/types.js.map +0 -1
- package/lib/libs/quick-scan/userPermissionScanner.d.ts +0 -22
- package/lib/libs/quick-scan/userPermissionScanner.js +0 -75
- package/lib/libs/quick-scan/userPermissionScanner.js.map +0 -1
- package/lib/ux/auditRunMultiStage.d.ts +0 -65
- package/lib/ux/auditRunMultiStage.js +0 -120
- package/lib/ux/auditRunMultiStage.js.map +0 -1
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import { XMLParser } from 'fast-xml-parser';
|
|
2
|
-
import NamedMetadata from './namedMetadataType.js';
|
|
3
|
-
import SingletonMetadata from './singletonMetadataType.js';
|
|
4
|
-
import NamedMetadataQueryable from './namedMetadataToolingQueryable.js';
|
|
5
|
-
export default class MDAPI {
|
|
6
|
-
connection;
|
|
7
|
-
static retrievers = new Map();
|
|
8
|
-
cache;
|
|
9
|
-
constructor(connection) {
|
|
10
|
-
this.connection = connection;
|
|
11
|
-
this.cache = new MetadataCache();
|
|
12
|
-
}
|
|
13
|
-
static create(connection) {
|
|
14
|
-
if (!this.retrievers.has(connection.instanceUrl)) {
|
|
15
|
-
this.retrievers.set(connection.instanceUrl, new MDAPI(connection));
|
|
16
|
-
}
|
|
17
|
-
return this.retrievers.get(connection.instanceUrl);
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Resolves one of the pre-configured metadata types and returns
|
|
21
|
-
* a map of resolved names and entire XML content of source file body.
|
|
22
|
-
*
|
|
23
|
-
* @param typeName
|
|
24
|
-
* @param componentNames
|
|
25
|
-
* @returns
|
|
26
|
-
*/
|
|
27
|
-
async resolve(typeName, componentNames) {
|
|
28
|
-
const retriever = NamedTypesRegistry[typeName];
|
|
29
|
-
const { toRetrieve, cached } = this.fetchCached(componentNames);
|
|
30
|
-
if (toRetrieve.length > 0) {
|
|
31
|
-
const retrieveResults = await retriever.resolve(this.connection, toRetrieve);
|
|
32
|
-
this.cacheResults(retrieveResults);
|
|
33
|
-
return {
|
|
34
|
-
...cached,
|
|
35
|
-
...retrieveResults,
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
return cached;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Resolves one of the pre-configured metadata types and returns
|
|
42
|
-
* the entire XML content of source file body.
|
|
43
|
-
*
|
|
44
|
-
* @param typeName
|
|
45
|
-
* @returns
|
|
46
|
-
*/
|
|
47
|
-
async resolveSingleton(typeName) {
|
|
48
|
-
const retriever = SingletonRegistry[typeName];
|
|
49
|
-
const { toRetrieve, cached } = this.fetchCached([typeName]);
|
|
50
|
-
if (toRetrieve.length > 0) {
|
|
51
|
-
const retrieveResults = await retriever.resolve(this.connection);
|
|
52
|
-
this.cache.set(typeName, retrieveResults);
|
|
53
|
-
return retrieveResults;
|
|
54
|
-
}
|
|
55
|
-
return cached[typeName];
|
|
56
|
-
}
|
|
57
|
-
cacheResults(results) {
|
|
58
|
-
Object.entries(results).forEach(([cname, mdata]) => {
|
|
59
|
-
this.cache.set(cname, mdata);
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
fetchCached(componentNames) {
|
|
63
|
-
const toRetrieve = [];
|
|
64
|
-
const cached = {};
|
|
65
|
-
for (const cname of componentNames) {
|
|
66
|
-
if (this.cache.isCached(cname)) {
|
|
67
|
-
cached[cname] = this.cache.fetch(cname);
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
toRetrieve.push(cname);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return { toRetrieve, cached };
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
class MetadataCache {
|
|
77
|
-
components = {};
|
|
78
|
-
isCached(cmpName) {
|
|
79
|
-
return this.components[cmpName] !== undefined && this.components[cmpName] !== null;
|
|
80
|
-
}
|
|
81
|
-
fetch(cmpName) {
|
|
82
|
-
if (!this.isCached(cmpName)) {
|
|
83
|
-
throw new Error('Component not cached. Check first before fetching: ' + cmpName);
|
|
84
|
-
}
|
|
85
|
-
return this.components[cmpName];
|
|
86
|
-
}
|
|
87
|
-
set(cmpName, content) {
|
|
88
|
-
this.components[cmpName] = content;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
export const NamedTypesRegistry = {
|
|
92
|
-
PermissionSet: new NamedMetadata({
|
|
93
|
-
retrieveType: 'PermissionSet',
|
|
94
|
-
rootNodeName: 'PermissionSet',
|
|
95
|
-
parser: new XMLParser({
|
|
96
|
-
isArray: (jpath) => ['userPermissions', 'fieldPermissions', 'customPermissions', 'classAccesses'].includes(jpath),
|
|
97
|
-
}),
|
|
98
|
-
parsePostProcessor: (parseResult) => ({
|
|
99
|
-
...parseResult,
|
|
100
|
-
userPermissions: parseResult.userPermissions ?? [],
|
|
101
|
-
customPermissions: parseResult.customPermissions ?? [],
|
|
102
|
-
classAccesses: parseResult.classAccesses ?? [],
|
|
103
|
-
}),
|
|
104
|
-
}),
|
|
105
|
-
Profile: new NamedMetadataQueryable({
|
|
106
|
-
objectName: 'Profile',
|
|
107
|
-
nameField: 'Name',
|
|
108
|
-
parsePostProcessor: (parseResult) => ({
|
|
109
|
-
...parseResult,
|
|
110
|
-
userPermissions: parseResult.userPermissions ?? [],
|
|
111
|
-
customPermissions: parseResult.customPermissions ?? [],
|
|
112
|
-
classAccesses: parseResult.classAccesses ?? [],
|
|
113
|
-
}),
|
|
114
|
-
}),
|
|
115
|
-
};
|
|
116
|
-
export const SingletonRegistry = {
|
|
117
|
-
ConnectedAppSettings: new SingletonMetadata({
|
|
118
|
-
rootNodeName: 'ConnectedAppSettings',
|
|
119
|
-
retrieveName: 'ConnectedApp',
|
|
120
|
-
retrieveType: 'Settings',
|
|
121
|
-
}),
|
|
122
|
-
};
|
|
123
|
-
//# sourceMappingURL=mdapiRetriever.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mdapiRetriever.js","sourceRoot":"","sources":["../../../../src/libs/core/mdapi/mdapiRetriever.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { PathLike } from 'node:fs';
|
|
2
|
-
import { XMLParser } from 'fast-xml-parser';
|
|
3
|
-
import { ComponentSet, FileResponse, RetrieveResult } from '@salesforce/source-deploy-retrieve';
|
|
4
|
-
import { Connection } from '@salesforce/core';
|
|
5
|
-
export type MetadataRegistryEntryOpts<Type, Key extends keyof Type> = {
|
|
6
|
-
/**
|
|
7
|
-
* Metadata API name of the type.
|
|
8
|
-
*/
|
|
9
|
-
retrieveType: string;
|
|
10
|
-
/**
|
|
11
|
-
* Metadata API name entity.
|
|
12
|
-
*/
|
|
13
|
-
retrieveName?: string;
|
|
14
|
-
/**
|
|
15
|
-
* Optional XML parser instance. Typically used to fix errors for
|
|
16
|
-
* properties that must be parsed as list.
|
|
17
|
-
*/
|
|
18
|
-
parser?: XMLParser;
|
|
19
|
-
/**
|
|
20
|
-
* Name of the root node in XML file content
|
|
21
|
-
*/
|
|
22
|
-
rootNodeName: Key;
|
|
23
|
-
/**
|
|
24
|
-
* Post processor function that sanitises the XML parse result
|
|
25
|
-
*/
|
|
26
|
-
parsePostProcessor?: (parseResult: Type[Key]) => Type[Key];
|
|
27
|
-
};
|
|
28
|
-
export type NamedMetadataResolver<Type> = {
|
|
29
|
-
resolve(con: Connection, componentNames: string[]): Promise<Record<string, Type>>;
|
|
30
|
-
};
|
|
31
|
-
export default abstract class MetadataRegistryEntry<Type, Key extends keyof Type> {
|
|
32
|
-
private opts;
|
|
33
|
-
parser: XMLParser;
|
|
34
|
-
retrieveType: string;
|
|
35
|
-
rootNodeName: Key;
|
|
36
|
-
constructor(opts: MetadataRegistryEntryOpts<Type, Key>);
|
|
37
|
-
parse(fullFilePath: PathLike): Type[Key];
|
|
38
|
-
}
|
|
39
|
-
export declare function retrieve(compSet: ComponentSet, con: Connection): Promise<RetrieveResult>;
|
|
40
|
-
export declare function cleanRetrieveDir(files: FileResponse[]): void;
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { readFileSync, rmSync } from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { XMLParser } from 'fast-xml-parser';
|
|
4
|
-
import { RETRIEVE_CACHE } from '../constants.js';
|
|
5
|
-
export default class MetadataRegistryEntry {
|
|
6
|
-
opts;
|
|
7
|
-
parser;
|
|
8
|
-
retrieveType;
|
|
9
|
-
rootNodeName;
|
|
10
|
-
constructor(opts) {
|
|
11
|
-
this.opts = opts;
|
|
12
|
-
this.retrieveType = this.opts.retrieveType;
|
|
13
|
-
this.parser = this.opts.parser ?? new XMLParser();
|
|
14
|
-
this.rootNodeName = this.opts.rootNodeName;
|
|
15
|
-
}
|
|
16
|
-
parse(fullFilePath) {
|
|
17
|
-
const fileContent = readFileSync(fullFilePath, 'utf-8');
|
|
18
|
-
const parsedContent = this.parser.parse(fileContent);
|
|
19
|
-
if (this.opts.parsePostProcessor) {
|
|
20
|
-
return this.opts.parsePostProcessor(parsedContent[this.rootNodeName]);
|
|
21
|
-
}
|
|
22
|
-
return parsedContent[this.rootNodeName];
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
export async function retrieve(compSet, con) {
|
|
26
|
-
const retrieveRequest = await compSet.retrieve({
|
|
27
|
-
usernameOrConnection: con,
|
|
28
|
-
output: RETRIEVE_CACHE,
|
|
29
|
-
});
|
|
30
|
-
const retrieveResult = await retrieveRequest.pollStatus();
|
|
31
|
-
return retrieveResult;
|
|
32
|
-
}
|
|
33
|
-
export function cleanRetrieveDir(files) {
|
|
34
|
-
const dirNames = new Set();
|
|
35
|
-
files.forEach((file) => {
|
|
36
|
-
if (file.filePath) {
|
|
37
|
-
const dirName = path.dirname(path.normalize(file.filePath));
|
|
38
|
-
const parts = dirName.split(path.sep).filter((dirPart) => dirPart.startsWith('metadataPackage_'));
|
|
39
|
-
parts.forEach((mdPart) => dirNames.add(mdPart));
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
dirNames.forEach((dir) => {
|
|
43
|
-
rmSync(path.join(RETRIEVE_CACHE, dir), { recursive: true });
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=metadataRegistryEntry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"metadataRegistryEntry.js","sourceRoot":"","sources":["../../../../src/libs/core/mdapi/metadataRegistryEntry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AA8BjD,MAAM,CAAC,OAAO,OAAgB,qBAAqB;IAKtB;IAJpB,MAAM,CAAY;IAClB,YAAY,CAAS;IACrB,YAAY,CAAM;IAEzB,YAA2B,IAA0C;QAA1C,SAAI,GAAJ,IAAI,CAAsC;QACnE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAClD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;IAC7C,CAAC;IAEM,KAAK,CAAC,YAAsB;QACjC,MAAM,WAAW,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAS,CAAC;QAC7D,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAqB,EAAE,GAAe;IACnE,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC;QAC7C,oBAAoB,EAAE,GAAG;QACzB,MAAM,EAAE,cAAc;KACvB,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,CAAC;IAC1D,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAqB;IACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACrB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAClG,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACvB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { Connection } from '@salesforce/core';
|
|
2
|
-
import { NamedMetadataResolver } from './metadataRegistryEntry.js';
|
|
3
|
-
export type NamedMetadataQueryableOpts<Type> = {
|
|
4
|
-
/**
|
|
5
|
-
* Object API name to retrieve. Must be available in tooling API
|
|
6
|
-
*/
|
|
7
|
-
objectName: string;
|
|
8
|
-
/**
|
|
9
|
-
* Unique name field that is used to retrieve the object
|
|
10
|
-
*/
|
|
11
|
-
nameField: string;
|
|
12
|
-
/**
|
|
13
|
-
* Post processor function that sanitises the XML parse result
|
|
14
|
-
*/
|
|
15
|
-
parsePostProcessor?: (parseResult: Type) => Type;
|
|
16
|
-
};
|
|
17
|
-
/**
|
|
18
|
-
* The entry is a typical named metadata that is organized in a dedicated source folder
|
|
19
|
-
* where all entities have the same format. The components are queries from tooling API
|
|
20
|
-
* and organized by their developer name.
|
|
21
|
-
*/
|
|
22
|
-
export default class NamedMetadataQueryable<Type, Key extends keyof Type> implements NamedMetadataResolver<Type[Key]> {
|
|
23
|
-
private opts;
|
|
24
|
-
constructor(opts: NamedMetadataQueryableOpts<Type[Key]>);
|
|
25
|
-
/**
|
|
26
|
-
* Resolves a set of component names by querying "Metadata" property from tooling API
|
|
27
|
-
*
|
|
28
|
-
* @param con
|
|
29
|
-
* @param componentNames
|
|
30
|
-
* @returns
|
|
31
|
-
*/
|
|
32
|
-
resolve(con: Connection, componentNames: string[]): Promise<Record<string, Type[Key]>>;
|
|
33
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { isNullish } from '../utils.js';
|
|
2
|
-
/**
|
|
3
|
-
* The entry is a typical named metadata that is organized in a dedicated source folder
|
|
4
|
-
* where all entities have the same format. The components are queries from tooling API
|
|
5
|
-
* and organized by their developer name.
|
|
6
|
-
*/
|
|
7
|
-
export default class NamedMetadataQueryable {
|
|
8
|
-
opts;
|
|
9
|
-
constructor(opts) {
|
|
10
|
-
this.opts = opts;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Resolves a set of component names by querying "Metadata" property from tooling API
|
|
14
|
-
*
|
|
15
|
-
* @param con
|
|
16
|
-
* @param componentNames
|
|
17
|
-
* @returns
|
|
18
|
-
*/
|
|
19
|
-
async resolve(con, componentNames) {
|
|
20
|
-
const pendingQueries = new Array();
|
|
21
|
-
componentNames.forEach((cname) => {
|
|
22
|
-
const qr = Promise.resolve(con.tooling.query(`SELECT ${this.opts.nameField},Metadata FROM ${this.opts.objectName} WHERE ${this.opts.nameField} = '${cname}'`));
|
|
23
|
-
pendingQueries.push(qr);
|
|
24
|
-
});
|
|
25
|
-
const queryResults = await Promise.all(pendingQueries);
|
|
26
|
-
const resultMap = {};
|
|
27
|
-
queryResults.forEach((qr) => {
|
|
28
|
-
if (qr.totalSize > 0) {
|
|
29
|
-
const record = qr.records[0];
|
|
30
|
-
const identifier = record[this.opts.nameField];
|
|
31
|
-
if (identifier && !isNullish(record.Metadata)) {
|
|
32
|
-
resultMap[identifier] = this.opts.parsePostProcessor
|
|
33
|
-
? this.opts.parsePostProcessor(record.Metadata)
|
|
34
|
-
: record.Metadata;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
return resultMap;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=namedMetadataToolingQueryable.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"namedMetadataToolingQueryable.js","sourceRoot":"","sources":["../../../../src/libs/core/mdapi/namedMetadataToolingQueryable.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAoBxC;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,sBAAsB;IACd;IAA3B,YAA2B,IAA2C;QAA3C,SAAI,GAAJ,IAAI,CAAuC;IAAG,CAAC;IAC1E;;;;;;OAMG;IACI,KAAK,CAAC,OAAO,CAAC,GAAe,EAAE,cAAwB;QAC5D,MAAM,cAAc,GAAG,IAAI,KAAK,EAAmD,CAAC;QACpF,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC/B,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CACxB,GAAG,CAAC,OAAO,CAAC,KAAK,CACf,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS,kBAAkB,IAAI,CAAC,IAAI,CAAC,UAAU,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS,OAAO,KAAK,GAAG,CAChH,CACF,CAAC;YACF,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,SAAS,GAA8B,EAAE,CAAC;QAChD,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YAC1B,IAAI,EAAE,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAW,CAAC;gBACzD,IAAI,UAAU,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC9C,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB;wBAClD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC;wBAC/C,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { Connection } from '@salesforce/core';
|
|
2
|
-
import MetadataRegistryEntry, { MetadataRegistryEntryOpts } from './metadataRegistryEntry.js';
|
|
3
|
-
/**
|
|
4
|
-
* The entry is a typical named metadata that is organized in a dedicated source folder
|
|
5
|
-
* where all entities have the same format. The components are retrieved and organized
|
|
6
|
-
* by their developer name.
|
|
7
|
-
*/
|
|
8
|
-
export default class NamedMetadata<Type, Key extends keyof Type> extends MetadataRegistryEntry<Type, Key> {
|
|
9
|
-
constructor(opts: MetadataRegistryEntryOpts<Type, Key>);
|
|
10
|
-
/**
|
|
11
|
-
* Resolves component names, retrieves the metadata and returns
|
|
12
|
-
* as a strongly typed result.
|
|
13
|
-
*
|
|
14
|
-
* @param con
|
|
15
|
-
* @param componentNames
|
|
16
|
-
* @returns
|
|
17
|
-
*/
|
|
18
|
-
resolve(con: Connection, componentNames: string[]): Promise<Record<string, Type[Key]>>;
|
|
19
|
-
private parseSourceFiles;
|
|
20
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { ComponentSet } from '@salesforce/source-deploy-retrieve';
|
|
2
|
-
import MetadataRegistryEntry, { cleanRetrieveDir, retrieve, } from './metadataRegistryEntry.js';
|
|
3
|
-
/**
|
|
4
|
-
* The entry is a typical named metadata that is organized in a dedicated source folder
|
|
5
|
-
* where all entities have the same format. The components are retrieved and organized
|
|
6
|
-
* by their developer name.
|
|
7
|
-
*/
|
|
8
|
-
export default class NamedMetadata extends MetadataRegistryEntry {
|
|
9
|
-
constructor(opts) {
|
|
10
|
-
super(opts);
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Resolves component names, retrieves the metadata and returns
|
|
14
|
-
* as a strongly typed result.
|
|
15
|
-
*
|
|
16
|
-
* @param con
|
|
17
|
-
* @param componentNames
|
|
18
|
-
* @returns
|
|
19
|
-
*/
|
|
20
|
-
async resolve(con, componentNames) {
|
|
21
|
-
const cmpSet = new ComponentSet(componentNames.map((cname) => ({ type: this.retrieveType, fullName: cname })));
|
|
22
|
-
const retrieveResult = await retrieve(cmpSet, con);
|
|
23
|
-
const resolvedFiles = this.parseSourceFiles(retrieveResult.components, componentNames);
|
|
24
|
-
cleanRetrieveDir(retrieveResult.getFileResponses());
|
|
25
|
-
return resolvedFiles;
|
|
26
|
-
}
|
|
27
|
-
parseSourceFiles(componentSet, retrievedNames) {
|
|
28
|
-
const cmps = componentSet.getSourceComponents().toArray();
|
|
29
|
-
const result = {};
|
|
30
|
-
cmps.forEach((sourceComponent) => {
|
|
31
|
-
if (sourceComponent.xml && retrievedNames.includes(sourceComponent.name)) {
|
|
32
|
-
// the available method parseXmlSync on source component does not
|
|
33
|
-
// resolve the "rootNodeProblem" from XML. Therefore, we implement
|
|
34
|
-
// our own method to parse and return the "inner xml".
|
|
35
|
-
result[sourceComponent.name] = this.parse(sourceComponent.xml);
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
return result;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=namedMetadataType.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"namedMetadataType.js","sourceRoot":"","sources":["../../../../src/libs/core/mdapi/namedMetadataType.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,qBAAqB,EAAE,EAC5B,gBAAgB,EAEhB,QAAQ,GACT,MAAM,4BAA4B,CAAC;AAEpC;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,aAA4C,SAAQ,qBAAgC;IACvG,YAAmB,IAA0C;QAC3D,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;IACD;;;;;;;OAOG;IACI,KAAK,CAAC,OAAO,CAAC,GAAe,EAAE,cAAwB;QAC5D,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/G,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QACvF,gBAAgB,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACpD,OAAO,aAAa,CAAC;IACvB,CAAC;IAEO,gBAAgB,CAAC,YAA0B,EAAE,cAAwB;QAC3E,MAAM,IAAI,GAAG,YAAY,CAAC,mBAAmB,EAAE,CAAC,OAAO,EAAE,CAAC;QAC1D,MAAM,MAAM,GAA8B,EAAE,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,CAAC,eAAe,EAAE,EAAE;YAC/B,IAAI,eAAe,CAAC,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzE,iEAAiE;gBACjE,kEAAkE;gBAClE,sDAAsD;gBACtD,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YACjE,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Connection } from '@salesforce/core';
|
|
2
|
-
import MetadataRegistryEntry, { MetadataRegistryEntryOpts } from './metadataRegistryEntry.js';
|
|
3
|
-
/**
|
|
4
|
-
* The entry is a type that only has one single instance on the org, such as
|
|
5
|
-
* a Setting. The component is typically retrieved by a more generic name and
|
|
6
|
-
* organized & cached by the explicit name.
|
|
7
|
-
*/
|
|
8
|
-
export default class SingletonMetadata<Type, Key extends keyof Type> extends MetadataRegistryEntry<Type, Key> {
|
|
9
|
-
retrieveName: string;
|
|
10
|
-
constructor(opts: MetadataRegistryEntryOpts<Type, Key>);
|
|
11
|
-
/**
|
|
12
|
-
* Resolves component names, retrieves the metadata and returns
|
|
13
|
-
* as a strongly typed result.
|
|
14
|
-
*
|
|
15
|
-
* @param con
|
|
16
|
-
* @param componentNames
|
|
17
|
-
* @returns
|
|
18
|
-
*/
|
|
19
|
-
resolve(con: Connection): Promise<Type[Key]>;
|
|
20
|
-
private parseSourceFile;
|
|
21
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { ComponentSet } from '@salesforce/source-deploy-retrieve';
|
|
2
|
-
import MetadataRegistryEntry, { cleanRetrieveDir, retrieve, } from './metadataRegistryEntry.js';
|
|
3
|
-
/**
|
|
4
|
-
* The entry is a type that only has one single instance on the org, such as
|
|
5
|
-
* a Setting. The component is typically retrieved by a more generic name and
|
|
6
|
-
* organized & cached by the explicit name.
|
|
7
|
-
*/
|
|
8
|
-
export default class SingletonMetadata extends MetadataRegistryEntry {
|
|
9
|
-
retrieveName;
|
|
10
|
-
constructor(opts) {
|
|
11
|
-
super(opts);
|
|
12
|
-
this.retrieveName = opts.retrieveName ?? String(this.rootNodeName);
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Resolves component names, retrieves the metadata and returns
|
|
16
|
-
* as a strongly typed result.
|
|
17
|
-
*
|
|
18
|
-
* @param con
|
|
19
|
-
* @param componentNames
|
|
20
|
-
* @returns
|
|
21
|
-
*/
|
|
22
|
-
async resolve(con) {
|
|
23
|
-
const cmpSet = new ComponentSet([{ type: this.retrieveType, fullName: this.retrieveName }]);
|
|
24
|
-
const retrieveResult = await retrieve(cmpSet, con);
|
|
25
|
-
const resolvedCmp = this.parseSourceFile(retrieveResult.components);
|
|
26
|
-
cleanRetrieveDir(retrieveResult.getFileResponses());
|
|
27
|
-
return resolvedCmp;
|
|
28
|
-
}
|
|
29
|
-
parseSourceFile(componentSet) {
|
|
30
|
-
const cmps = componentSet.getSourceComponents({ type: this.retrieveType, fullName: this.retrieveName }).toArray();
|
|
31
|
-
if (cmps.length > 0 && cmps[0].xml) {
|
|
32
|
-
return this.parse(cmps[0].xml);
|
|
33
|
-
}
|
|
34
|
-
throw new Error('Failed to resolve settings for: ' + this.retrieveName);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=singletonMetadataType.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"singletonMetadataType.js","sourceRoot":"","sources":["../../../../src/libs/core/mdapi/singletonMetadataType.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,qBAAqB,EAAE,EAC5B,gBAAgB,EAEhB,QAAQ,GACT,MAAM,4BAA4B,CAAC;AAEpC;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAgD,SAAQ,qBAAgC;IACpG,YAAY,CAAS;IAC5B,YAAmB,IAA0C;QAC3D,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACrE,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,OAAO,CAAC,GAAe;QAClC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QAC5F,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACpE,gBAAgB,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACpD,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,eAAe,CAAC,YAA0B;QAChD,MAAM,IAAI,GAAG,YAAY,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QAClH,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1E,CAAC;CACF"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { AuditRunConfig, BasePolicyFileContent } from '../file-mgmt/schema.js';
|
|
2
|
-
import { AuditContext } from '../registries/types.js';
|
|
3
|
-
import { ResolvedConnectedApp } from '../registries/connectedApps.js';
|
|
4
|
-
import Policy, { ResolveEntityResult } from './policy.js';
|
|
5
|
-
export default class ConnectedAppPolicy extends Policy<ResolvedConnectedApp> {
|
|
6
|
-
config: BasePolicyFileContent;
|
|
7
|
-
auditConfig: AuditRunConfig;
|
|
8
|
-
constructor(config: BasePolicyFileContent, auditConfig: AuditRunConfig, registry?: import("../registries/connectedApps.js").default);
|
|
9
|
-
protected resolveEntities(context: AuditContext): Promise<ResolveEntityResult<ResolvedConnectedApp>>;
|
|
10
|
-
}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { CONNECTED_APPS_QUERY, OAUTH_TOKEN_QUERY } from '../constants.js';
|
|
2
|
-
import { ConnectedAppsRegistry } from '../registries/connectedApps.js';
|
|
3
|
-
import MDAPI from '../mdapi/mdapiRetriever.js';
|
|
4
|
-
import Policy, { getTotal } from './policy.js';
|
|
5
|
-
export default class ConnectedAppPolicy extends Policy {
|
|
6
|
-
config;
|
|
7
|
-
auditConfig;
|
|
8
|
-
constructor(config, auditConfig, registry = ConnectedAppsRegistry) {
|
|
9
|
-
super(config, auditConfig, registry);
|
|
10
|
-
this.config = config;
|
|
11
|
-
this.auditConfig = auditConfig;
|
|
12
|
-
}
|
|
13
|
-
// eslint-disable-next-line class-methods-use-this
|
|
14
|
-
async resolveEntities(context) {
|
|
15
|
-
const successfullyResolved = {};
|
|
16
|
-
const ignoredEntities = {};
|
|
17
|
-
const metadataApi = new MDAPI(context.targetOrgConnection);
|
|
18
|
-
this.emit('entityresolve', {
|
|
19
|
-
total: 0,
|
|
20
|
-
resolved: 0,
|
|
21
|
-
});
|
|
22
|
-
const installedApps = await context.targetOrgConnection.query(CONNECTED_APPS_QUERY);
|
|
23
|
-
this.emit('entityresolve', {
|
|
24
|
-
total: installedApps.totalSize,
|
|
25
|
-
resolved: 0,
|
|
26
|
-
});
|
|
27
|
-
installedApps.records.forEach((installedApp) => {
|
|
28
|
-
successfullyResolved[installedApp.Name] = {
|
|
29
|
-
name: installedApp.Name,
|
|
30
|
-
origin: 'Installed',
|
|
31
|
-
onlyAdminApprovedUsersAllowed: installedApp.OptionsAllowAdminApprovedUsersOnly,
|
|
32
|
-
overrideByApiSecurityAccess: false,
|
|
33
|
-
useCount: 0,
|
|
34
|
-
users: [],
|
|
35
|
-
};
|
|
36
|
-
});
|
|
37
|
-
const usersOAuthToken = await context.targetOrgConnection.query(OAUTH_TOKEN_QUERY);
|
|
38
|
-
usersOAuthToken.records.forEach((token) => {
|
|
39
|
-
if (successfullyResolved[token.AppName] === undefined) {
|
|
40
|
-
successfullyResolved[token.AppName] = {
|
|
41
|
-
name: token.AppName,
|
|
42
|
-
origin: 'OauthToken',
|
|
43
|
-
onlyAdminApprovedUsersAllowed: false,
|
|
44
|
-
overrideByApiSecurityAccess: false,
|
|
45
|
-
useCount: token.UseCount,
|
|
46
|
-
users: [token.User.Username],
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
successfullyResolved[token.AppName].useCount += token.UseCount;
|
|
51
|
-
if (!successfullyResolved[token.AppName].users.includes(token.User.Username)) {
|
|
52
|
-
successfullyResolved[token.AppName].users.push(token.User.Username);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
this.emit('entityresolve', {
|
|
57
|
-
total: Object.keys(successfullyResolved).length,
|
|
58
|
-
resolved: 0,
|
|
59
|
-
});
|
|
60
|
-
let overrideByApiSecurityAccess = false;
|
|
61
|
-
const apiSecurityAccessSetting = await metadataApi.resolveSingleton('ConnectedAppSettings');
|
|
62
|
-
if (apiSecurityAccessSetting && apiSecurityAccessSetting.enableAdminApprovedAppsOnly) {
|
|
63
|
-
overrideByApiSecurityAccess = true;
|
|
64
|
-
}
|
|
65
|
-
Object.values(successfullyResolved).forEach((conApp) => {
|
|
66
|
-
// eslint-disable-next-line no-param-reassign
|
|
67
|
-
conApp.overrideByApiSecurityAccess = overrideByApiSecurityAccess;
|
|
68
|
-
});
|
|
69
|
-
const result = { resolvedEntities: successfullyResolved, ignoredEntities: Object.values(ignoredEntities) };
|
|
70
|
-
this.emit('entityresolve', {
|
|
71
|
-
total: getTotal(result),
|
|
72
|
-
resolved: getTotal(result),
|
|
73
|
-
});
|
|
74
|
-
// also query from tooling, to get additional information info
|
|
75
|
-
return result;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=connectedAppPolicy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connectedAppPolicy.js","sourceRoot":"","sources":["../../../../src/libs/core/policies/connectedAppPolicy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { AuditRunConfig, PermSetsPolicyFileContent } from '../file-mgmt/schema.js';
|
|
2
|
-
import { AuditContext } from '../registries/types.js';
|
|
3
|
-
import { ResolvedPermissionSet } from '../registries/permissionSets.js';
|
|
4
|
-
import Policy, { ResolveEntityResult } from './policy.js';
|
|
5
|
-
export default class PermissionSetPolicy extends Policy<ResolvedPermissionSet> {
|
|
6
|
-
config: PermSetsPolicyFileContent;
|
|
7
|
-
auditContext: AuditRunConfig;
|
|
8
|
-
private totalEntities;
|
|
9
|
-
constructor(config: PermSetsPolicyFileContent, auditContext: AuditRunConfig, registry?: import("../registries/permissionSets.js").default);
|
|
10
|
-
protected resolveEntities(context: AuditContext): Promise<ResolveEntityResult<ResolvedPermissionSet>>;
|
|
11
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { Messages } from '@salesforce/core';
|
|
2
|
-
import MDAPI from '../mdapi/mdapiRetriever.js';
|
|
3
|
-
import { ProfilesRiskPreset } from '../policy-types.js';
|
|
4
|
-
import { PermissionSetsRegistry } from '../registries/permissionSets.js';
|
|
5
|
-
import Policy, { getTotal } from './policy.js';
|
|
6
|
-
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
7
|
-
const messages = Messages.loadMessages('@j-schreiber/sf-cli-security-audit', 'policies.general');
|
|
8
|
-
export default class PermissionSetPolicy extends Policy {
|
|
9
|
-
config;
|
|
10
|
-
auditContext;
|
|
11
|
-
totalEntities;
|
|
12
|
-
constructor(config, auditContext, registry = PermissionSetsRegistry) {
|
|
13
|
-
super(config, auditContext, registry);
|
|
14
|
-
this.config = config;
|
|
15
|
-
this.auditContext = auditContext;
|
|
16
|
-
this.totalEntities = this.config.permissionSets ? Object.keys(this.config.permissionSets).length : 0;
|
|
17
|
-
}
|
|
18
|
-
async resolveEntities(context) {
|
|
19
|
-
this.emit('entityresolve', {
|
|
20
|
-
total: this.totalEntities,
|
|
21
|
-
resolved: 0,
|
|
22
|
-
});
|
|
23
|
-
const successfullyResolved = {};
|
|
24
|
-
const unresolved = {};
|
|
25
|
-
const retriever = new MDAPI(context.targetOrgConnection);
|
|
26
|
-
const resolvedPermsets = await retriever.resolve('PermissionSet', filterCategorizedPermsets(this.config.permissionSets));
|
|
27
|
-
Object.entries(this.config.permissionSets).forEach(([key, val]) => {
|
|
28
|
-
const resolved = resolvedPermsets[key];
|
|
29
|
-
if (resolved) {
|
|
30
|
-
successfullyResolved[key] = {
|
|
31
|
-
metadata: resolved,
|
|
32
|
-
preset: this.config.permissionSets[key].preset,
|
|
33
|
-
name: key,
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
else if (successfullyResolved[key] === undefined) {
|
|
37
|
-
if (val.preset === ProfilesRiskPreset.UNKNOWN) {
|
|
38
|
-
unresolved[key] = { name: key, message: messages.getMessage('preset-unknown', ['Permission Set']) };
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
unresolved[key] = { name: key, message: messages.getMessage('entity-not-found') };
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
const result = { resolvedEntities: successfullyResolved, ignoredEntities: Object.values(unresolved) };
|
|
46
|
-
this.emit('entityresolve', {
|
|
47
|
-
total: this.totalEntities,
|
|
48
|
-
resolved: getTotal(result),
|
|
49
|
-
});
|
|
50
|
-
return result;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
function filterCategorizedPermsets(permSets) {
|
|
54
|
-
const filteredNames = [];
|
|
55
|
-
Object.entries(permSets).forEach(([key, val]) => {
|
|
56
|
-
if (val.preset !== ProfilesRiskPreset.UNKNOWN) {
|
|
57
|
-
filteredNames.push(key);
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
return filteredNames;
|
|
61
|
-
}
|
|
62
|
-
//# sourceMappingURL=permissionSetPolicy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"permissionSetPolicy.js","sourceRoot":"","sources":["../../../../src/libs/core/policies/permissionSetPolicy.ts"],"names":[],"mappings":"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"}
|