@j-schreiber/sf-cli-security-audit 0.11.0 → 0.11.2
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 +3 -3
- package/lib/commands/org/audit/init.d.ts +5 -3
- package/lib/commands/org/audit/init.js +14 -20
- package/lib/commands/org/audit/init.js.map +1 -1
- package/lib/commands/org/audit/run.d.ts +1 -1
- package/lib/commands/org/audit/run.js +5 -3
- package/lib/commands/org/audit/run.js.map +1 -1
- package/lib/commands/org/scan/user-perms.js +1 -1
- package/lib/commands/org/scan/user-perms.js.map +1 -1
- package/lib/libs/{core → audit-engine}/auditRun.d.ts +6 -7
- package/lib/libs/{core → audit-engine}/auditRun.js +20 -16
- package/lib/libs/audit-engine/auditRun.js.map +1 -0
- package/lib/libs/audit-engine/file-manager/fileManager.d.ts +31 -0
- package/lib/libs/audit-engine/file-manager/fileManager.js +139 -0
- package/lib/libs/audit-engine/file-manager/fileManager.js.map +1 -0
- package/lib/libs/audit-engine/file-manager/fileManager.types.d.ts +30 -0
- package/lib/libs/audit-engine/file-manager/fileManager.types.js +2 -0
- package/lib/libs/audit-engine/file-manager/fileManager.types.js.map +1 -0
- package/lib/libs/audit-engine/index.d.ts +121 -0
- package/lib/libs/audit-engine/index.js +9 -0
- package/lib/libs/audit-engine/index.js.map +1 -0
- package/lib/libs/{core/registries/types.d.ts → audit-engine/registry/context.types.d.ts} +6 -10
- package/lib/libs/audit-engine/registry/context.types.js +2 -0
- package/lib/libs/audit-engine/registry/context.types.js.map +1 -0
- package/lib/libs/audit-engine/registry/definitions.d.ts +23 -0
- package/lib/libs/audit-engine/registry/definitions.js +53 -0
- package/lib/libs/audit-engine/registry/definitions.js.map +1 -0
- package/lib/libs/{core/registries → audit-engine/registry}/helpers/permissionsScanning.d.ts +12 -2
- package/lib/libs/{core/registries → audit-engine/registry}/helpers/permissionsScanning.js +15 -3
- package/lib/libs/audit-engine/registry/helpers/permissionsScanning.js.map +1 -0
- package/lib/libs/audit-engine/registry/policies/connectedApps.d.ts +12 -0
- package/lib/libs/audit-engine/registry/policies/connectedApps.js +22 -0
- package/lib/libs/audit-engine/registry/policies/connectedApps.js.map +1 -0
- package/lib/libs/audit-engine/registry/policies/permissionSets.d.ts +18 -0
- package/lib/libs/audit-engine/registry/policies/permissionSets.js +80 -0
- package/lib/libs/audit-engine/registry/policies/permissionSets.js.map +1 -0
- package/lib/libs/audit-engine/registry/policies/profiles.d.ts +18 -0
- package/lib/libs/audit-engine/registry/policies/profiles.js +76 -0
- package/lib/libs/audit-engine/registry/policies/profiles.js.map +1 -0
- package/lib/libs/audit-engine/registry/policies/settings.d.ts +18 -0
- package/lib/libs/{core/policies/settingsPolicy.js → audit-engine/registry/policies/settings.js} +48 -18
- package/lib/libs/audit-engine/registry/policies/settings.js.map +1 -0
- package/lib/libs/audit-engine/registry/policies/users.d.ts +19 -0
- package/lib/libs/audit-engine/registry/policies/users.js +76 -0
- package/lib/libs/audit-engine/registry/policies/users.js.map +1 -0
- package/lib/libs/{core/policies → audit-engine/registry}/policy.d.ts +7 -6
- package/lib/libs/{core/policies → audit-engine/registry}/policy.js +2 -0
- package/lib/libs/audit-engine/registry/policy.js.map +1 -0
- package/lib/libs/{core/result-types.d.ts → audit-engine/registry/result.types.d.ts} +2 -2
- package/lib/libs/audit-engine/registry/result.types.js +2 -0
- package/lib/libs/audit-engine/registry/result.types.js.map +1 -0
- package/lib/libs/{core/registries → audit-engine/registry}/ruleRegistry.d.ts +10 -7
- package/lib/libs/{core/registries → audit-engine/registry}/ruleRegistry.js +7 -7
- package/lib/libs/audit-engine/registry/ruleRegistry.js.map +1 -0
- package/lib/libs/audit-engine/registry/rules/allUsedAppsUnderManagement.d.ts +7 -0
- package/lib/libs/audit-engine/registry/rules/allUsedAppsUnderManagement.js.map +1 -0
- package/lib/libs/{core/registries → audit-engine/registry}/rules/enforcePermissionPresets.d.ts +4 -2
- package/lib/libs/{core/registries → audit-engine/registry}/rules/enforcePermissionPresets.js +17 -15
- package/lib/libs/audit-engine/registry/rules/enforcePermissionPresets.js.map +1 -0
- package/lib/libs/{core/registries → audit-engine/registry}/rules/enforcePermissionsOnProfileLike.d.ts +1 -1
- package/lib/libs/{core/registries → audit-engine/registry}/rules/enforcePermissionsOnProfileLike.js +3 -3
- package/lib/libs/audit-engine/registry/rules/enforcePermissionsOnProfileLike.js.map +1 -0
- package/lib/libs/{core/registries → audit-engine/registry}/rules/enforcePermissionsOnUser.d.ts +2 -2
- package/lib/libs/audit-engine/registry/rules/enforcePermissionsOnUser.js +38 -0
- package/lib/libs/audit-engine/registry/rules/enforcePermissionsOnUser.js.map +1 -0
- package/lib/libs/{core/registries → audit-engine/registry}/rules/enforceSettings.d.ts +2 -2
- package/lib/libs/audit-engine/registry/rules/enforceSettings.js.map +1 -0
- package/lib/libs/audit-engine/registry/rules/noInactiveUsers.d.ts +14 -0
- package/lib/libs/{core/registries → audit-engine/registry}/rules/noInactiveUsers.js +17 -4
- package/lib/libs/audit-engine/registry/rules/noInactiveUsers.js.map +1 -0
- package/lib/libs/{core/registries → audit-engine/registry}/rules/noOtherApexApiLogins.d.ts +2 -2
- package/lib/libs/{core/registries → audit-engine/registry}/rules/noOtherApexApiLogins.js +4 -1
- package/lib/libs/audit-engine/registry/rules/noOtherApexApiLogins.js.map +1 -0
- package/lib/libs/audit-engine/registry/rules/noUserCanSelfAuthorize.d.ts +7 -0
- package/lib/libs/audit-engine/registry/rules/noUserCanSelfAuthorize.js.map +1 -0
- package/lib/libs/{core/registries → audit-engine/registry}/rules/policyRule.d.ts +4 -6
- package/lib/libs/{core/registries → audit-engine/registry}/rules/policyRule.js +2 -12
- package/lib/libs/audit-engine/registry/rules/policyRule.js.map +1 -0
- package/lib/libs/audit-engine/registry/schema.d.ts +2 -0
- package/lib/libs/audit-engine/registry/schema.js +11 -0
- package/lib/libs/audit-engine/registry/schema.js.map +1 -0
- package/lib/libs/audit-engine/registry/shape/auditConfigShape.d.ts +122 -0
- package/lib/libs/audit-engine/registry/shape/auditConfigShape.js +54 -0
- package/lib/libs/audit-engine/registry/shape/auditConfigShape.js.map +1 -0
- package/lib/libs/audit-engine/registry/shape/schema.d.ts +96 -0
- package/lib/libs/audit-engine/registry/shape/schema.js +84 -0
- package/lib/libs/audit-engine/registry/shape/schema.js.map +1 -0
- package/lib/libs/conf-init/auditConfig.d.ts +3 -12
- package/lib/libs/conf-init/auditConfig.js +25 -25
- package/lib/libs/conf-init/auditConfig.js.map +1 -1
- package/lib/libs/conf-init/defaultClassifications.d.ts +8 -0
- package/lib/libs/conf-init/defaultClassifications.js +116 -0
- package/lib/libs/conf-init/defaultClassifications.js.map +1 -0
- package/lib/libs/conf-init/defaultPolicies.d.ts +2 -0
- package/lib/libs/conf-init/defaultPolicies.js +20 -0
- package/lib/libs/conf-init/defaultPolicies.js.map +1 -0
- package/lib/libs/conf-init/init.types.d.ts +27 -0
- package/lib/libs/conf-init/init.types.js +8 -0
- package/lib/libs/conf-init/init.types.js.map +1 -0
- package/lib/libs/conf-init/presets/loose.d.ts +1 -1
- package/lib/libs/conf-init/presets/loose.js +4 -2
- package/lib/libs/conf-init/presets/loose.js.map +1 -1
- package/lib/libs/conf-init/presets/none.d.ts +2 -7
- package/lib/libs/conf-init/presets/none.js +1 -1
- package/lib/libs/conf-init/presets/none.js.map +1 -1
- package/lib/libs/conf-init/presets/strict.js +3 -1
- package/lib/libs/conf-init/presets/strict.js.map +1 -1
- package/lib/libs/conf-init/presets.d.ts +1 -6
- package/lib/libs/conf-init/presets.js +1 -6
- package/lib/libs/conf-init/presets.js.map +1 -1
- package/lib/libs/quick-scan/userPermissionScanner.js +17 -13
- package/lib/libs/quick-scan/userPermissionScanner.js.map +1 -1
- package/lib/salesforce/index.d.ts +10 -0
- package/lib/salesforce/index.js +8 -0
- package/lib/salesforce/index.js.map +1 -0
- package/lib/salesforce/mdapi/constants.d.ts +1 -0
- package/lib/salesforce/mdapi/constants.js +3 -0
- package/lib/salesforce/mdapi/constants.js.map +1 -0
- package/lib/{libs/core/mdapi/anySettingsMetadata.d.ts → salesforce/mdapi/genericSettingsMetadata.d.ts} +3 -4
- package/lib/{libs/core/mdapi/anySettingsMetadata.js → salesforce/mdapi/genericSettingsMetadata.js} +8 -10
- package/lib/salesforce/mdapi/genericSettingsMetadata.js.map +1 -0
- package/lib/salesforce/mdapi/mdapi.d.ts +46 -0
- package/lib/{libs/core/mdapi/mdapiRetriever.js → salesforce/mdapi/mdapi.js} +19 -40
- package/lib/salesforce/mdapi/mdapi.js.map +1 -0
- package/lib/salesforce/mdapi/metadataRegistry.d.ts +26 -0
- package/lib/salesforce/mdapi/metadataRegistry.js +43 -0
- package/lib/salesforce/mdapi/metadataRegistry.js.map +1 -0
- package/lib/{libs/core → salesforce}/mdapi/metadataRegistryEntry.js +1 -1
- package/lib/salesforce/mdapi/metadataRegistryEntry.js.map +1 -0
- package/lib/{libs/core → salesforce}/mdapi/namedMetadataToolingQueryable.js +1 -1
- package/lib/{libs/core → salesforce}/mdapi/namedMetadataToolingQueryable.js.map +1 -1
- package/lib/salesforce/mdapi/namedMetadataType.js.map +1 -0
- package/lib/salesforce/mdapi/singletonMetadataType.js.map +1 -0
- package/lib/salesforce/repositories/connected-apps/connected-app.types.d.ts +28 -0
- package/lib/salesforce/repositories/connected-apps/connected-app.types.js +6 -0
- package/lib/salesforce/repositories/connected-apps/connected-app.types.js.map +1 -0
- package/lib/salesforce/repositories/connected-apps/connected-apps.d.ts +16 -0
- package/lib/salesforce/repositories/connected-apps/connected-apps.js +83 -0
- package/lib/salesforce/repositories/connected-apps/connected-apps.js.map +1 -0
- package/lib/salesforce/repositories/connected-apps/queries.d.ts +2 -0
- package/lib/salesforce/repositories/connected-apps/queries.js +3 -0
- package/lib/salesforce/repositories/connected-apps/queries.js.map +1 -0
- package/lib/salesforce/repositories/perm-sets/perm-sets.types.d.ts +29 -0
- package/lib/salesforce/repositories/perm-sets/perm-sets.types.js +10 -0
- package/lib/salesforce/repositories/perm-sets/perm-sets.types.js.map +1 -0
- package/lib/salesforce/repositories/perm-sets/permission-sets.d.ts +11 -0
- package/lib/salesforce/repositories/perm-sets/permission-sets.js +43 -0
- package/lib/salesforce/repositories/perm-sets/permission-sets.js.map +1 -0
- package/lib/salesforce/repositories/perm-sets/queries.d.ts +1 -0
- package/lib/salesforce/repositories/perm-sets/queries.js +2 -0
- package/lib/salesforce/repositories/perm-sets/queries.js.map +1 -0
- package/lib/salesforce/repositories/profiles/profile.types.d.ts +29 -0
- package/lib/salesforce/repositories/profiles/profile.types.js +8 -0
- package/lib/salesforce/repositories/profiles/profile.types.js.map +1 -0
- package/lib/salesforce/repositories/profiles/profiles.d.ts +14 -0
- package/lib/salesforce/repositories/profiles/profiles.js +38 -0
- package/lib/salesforce/repositories/profiles/profiles.js.map +1 -0
- package/lib/salesforce/repositories/profiles/queries.d.ts +2 -0
- package/lib/salesforce/repositories/profiles/queries.js +7 -0
- package/lib/salesforce/repositories/profiles/queries.js.map +1 -0
- package/lib/salesforce/repositories/users/queries.d.ts +3 -0
- package/lib/{libs/core/constants.js → salesforce/repositories/users/queries.js} +1 -11
- package/lib/salesforce/repositories/users/queries.js.map +1 -0
- package/lib/salesforce/repositories/users/user.types.d.ts +54 -0
- package/lib/salesforce/repositories/users/user.types.js +12 -0
- package/lib/salesforce/repositories/users/user.types.js.map +1 -0
- package/lib/salesforce/repositories/users/users.d.ts +22 -0
- package/lib/salesforce/repositories/users/users.js +134 -0
- package/lib/salesforce/repositories/users/users.js.map +1 -0
- package/lib/{libs/core/utils.d.ts → utils.d.ts} +2 -0
- package/lib/{libs/core/utils.js → utils.js} +26 -0
- package/lib/utils.js.map +1 -0
- package/lib/ux/auditRunMultiStage.d.ts +1 -1
- package/lib/ux/auditRunMultiStage.js +5 -5
- package/lib/ux/auditRunMultiStage.js.map +1 -1
- package/messages/policies.general.md +9 -1
- package/messages/policyclassifications.md +8 -0
- package/messages/rules.enforceClassificationPresets.md +2 -2
- package/messages/rules.users.md +1 -1
- package/oclif.manifest.json +1 -1
- package/package.json +1 -1
- package/lib/libs/conf-init/permissionsClassification.d.ts +0 -37
- package/lib/libs/conf-init/permissionsClassification.js +0 -126
- package/lib/libs/conf-init/permissionsClassification.js.map +0 -1
- package/lib/libs/conf-init/policyConfigs.d.ts +0 -21
- package/lib/libs/conf-init/policyConfigs.js +0 -47
- package/lib/libs/conf-init/policyConfigs.js.map +0 -1
- 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 -10
- 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 -156
- package/lib/libs/core/file-mgmt/schema.js +0 -81
- package/lib/libs/core/file-mgmt/schema.js.map +0 -1
- package/lib/libs/core/mdapi/anySettingsMetadata.js.map +0 -1
- package/lib/libs/core/mdapi/mdapiRetriever.d.ts +0 -54
- package/lib/libs/core/mdapi/mdapiRetriever.js.map +0 -1
- package/lib/libs/core/mdapi/metadataRegistryEntry.js.map +0 -1
- package/lib/libs/core/mdapi/namedMetadataType.js.map +0 -1
- package/lib/libs/core/mdapi/singletonMetadataType.js.map +0 -1
- package/lib/libs/core/mdapi/usersRepository.d.ts +0 -85
- package/lib/libs/core/mdapi/usersRepository.js +0 -126
- package/lib/libs/core/mdapi/usersRepository.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 -12
- package/lib/libs/core/policies/permissionSetPolicy.js +0 -64
- package/lib/libs/core/policies/permissionSetPolicy.js.map +0 -1
- package/lib/libs/core/policies/policy.js.map +0 -1
- package/lib/libs/core/policies/profilePolicy.d.ts +0 -12
- package/lib/libs/core/policies/profilePolicy.js +0 -65
- package/lib/libs/core/policies/profilePolicy.js.map +0 -1
- package/lib/libs/core/policies/salesforceStandardTypes.d.ts +0 -58
- package/lib/libs/core/policies/salesforceStandardTypes.js +0 -2
- package/lib/libs/core/policies/salesforceStandardTypes.js.map +0 -1
- package/lib/libs/core/policies/settingsPolicy.d.ts +0 -11
- package/lib/libs/core/policies/settingsPolicy.js.map +0 -1
- package/lib/libs/core/policies/userPolicy.d.ts +0 -12
- package/lib/libs/core/policies/userPolicy.js +0 -62
- 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 -52
- 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/helpers/permissionsScanning.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 -11
- package/lib/libs/core/registries/profiles.js.map +0 -1
- 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.map +0 -1
- package/lib/libs/core/registries/rules/enforcePermissionPresets.js.map +0 -1
- package/lib/libs/core/registries/rules/enforcePermissionsOnProfileLike.js.map +0 -1
- package/lib/libs/core/registries/rules/enforcePermissionsOnUser.js +0 -42
- package/lib/libs/core/registries/rules/enforcePermissionsOnUser.js.map +0 -1
- package/lib/libs/core/registries/rules/enforceSettings.js.map +0 -1
- package/lib/libs/core/registries/rules/noInactiveUsers.d.ts +0 -9
- package/lib/libs/core/registries/rules/noInactiveUsers.js.map +0 -1
- 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.map +0 -1
- package/lib/libs/core/registries/rules/policyRule.js.map +0 -1
- package/lib/libs/core/registries/settings.d.ts +0 -8
- package/lib/libs/core/registries/settings.js +0 -51
- package/lib/libs/core/registries/settings.js.map +0 -1
- package/lib/libs/core/registries/types.js +0 -13
- package/lib/libs/core/registries/types.js.map +0 -1
- package/lib/libs/core/registries/users.d.ts +0 -10
- package/lib/libs/core/registries/users.js +0 -17
- package/lib/libs/core/registries/users.js.map +0 -1
- package/lib/libs/core/result-types.js +0 -2
- package/lib/libs/core/result-types.js.map +0 -1
- package/lib/libs/core/utils.js.map +0 -1
- /package/lib/libs/{core/registries → audit-engine/registry}/rules/allUsedAppsUnderManagement.js +0 -0
- /package/lib/libs/{core/registries → audit-engine/registry}/rules/enforceSettings.js +0 -0
- /package/lib/libs/{core/registries → audit-engine/registry}/rules/noUserCanSelfAuthorize.js +0 -0
- /package/lib/{libs/core → salesforce}/mdapi/metadataRegistryEntry.d.ts +0 -0
- /package/lib/{libs/core → salesforce}/mdapi/namedMetadataToolingQueryable.d.ts +0 -0
- /package/lib/{libs/core → salesforce}/mdapi/namedMetadataType.d.ts +0 -0
- /package/lib/{libs/core → salesforce}/mdapi/namedMetadataType.js +0 -0
- /package/lib/{libs/core → salesforce}/mdapi/singletonMetadataType.d.ts +0 -0
- /package/lib/{libs/core → salesforce}/mdapi/singletonMetadataType.js +0 -0
package/lib/libs/{core/policies/settingsPolicy.js → audit-engine/registry/policies/settings.js}
RENAMED
|
@@ -1,14 +1,46 @@
|
|
|
1
|
+
import z from 'zod';
|
|
1
2
|
import { Messages } from '@salesforce/core';
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
3
|
+
import RuleRegistry from '../ruleRegistry.js';
|
|
4
|
+
import EnforceSettings from '../rules/enforceSettings.js';
|
|
5
|
+
import { MDAPI } from '../../../../salesforce/index.js';
|
|
6
|
+
import Policy from '../policy.js';
|
|
5
7
|
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
6
8
|
const messages = Messages.loadMessages('@j-schreiber/sf-cli-security-audit', 'policies.general');
|
|
9
|
+
export class SettingsRuleRegistry extends RuleRegistry {
|
|
10
|
+
constructor() {
|
|
11
|
+
super({});
|
|
12
|
+
}
|
|
13
|
+
// eslint-disable-next-line class-methods-use-this
|
|
14
|
+
resolveRules(ruleObjs, auditContext) {
|
|
15
|
+
const result = { enabledRules: [], skippedRules: [], resolveErrors: [] };
|
|
16
|
+
Object.entries(ruleObjs).forEach(([ruleName, ruleConfig]) => {
|
|
17
|
+
const settingName = findSettingsName(ruleName);
|
|
18
|
+
if (settingName && ruleConfig.enabled) {
|
|
19
|
+
result.enabledRules.push(new EnforceSettings({
|
|
20
|
+
auditConfig: auditContext,
|
|
21
|
+
ruleDisplayName: ruleName,
|
|
22
|
+
settingName,
|
|
23
|
+
ruleConfig: SettingsRuleConfigSchema.parse(ruleConfig.options ?? {}),
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
else if (!ruleConfig.enabled) {
|
|
27
|
+
result.skippedRules.push({ name: ruleName, skipReason: messages.getMessage('skip-reason.rule-not-enabled') });
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
result.skippedRules.push({
|
|
31
|
+
name: ruleName,
|
|
32
|
+
skipReason: messages.getMessage('resolve-error.no-valid-settings-rule'),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
7
39
|
export default class SettingsPolicy extends Policy {
|
|
8
40
|
config;
|
|
9
41
|
auditConfig;
|
|
10
|
-
constructor(config, auditConfig
|
|
11
|
-
super(config, auditConfig,
|
|
42
|
+
constructor(config, auditConfig) {
|
|
43
|
+
super(config, auditConfig, new SettingsRuleRegistry());
|
|
12
44
|
this.config = config;
|
|
13
45
|
this.auditConfig = auditConfig;
|
|
14
46
|
}
|
|
@@ -19,22 +51,22 @@ export default class SettingsPolicy extends Policy {
|
|
|
19
51
|
resolved: 0,
|
|
20
52
|
});
|
|
21
53
|
const settingNames = extractSettingNames(this.config.rules);
|
|
22
|
-
const settingsRetriever =
|
|
23
|
-
const actuallyResolvedSettings = await settingsRetriever.resolve(settingNames);
|
|
54
|
+
const settingsRetriever = MDAPI.create(context.targetOrgConnection);
|
|
55
|
+
const actuallyResolvedSettings = await settingsRetriever.resolve('Settings', settingNames);
|
|
24
56
|
this.removeInvalidSettingsFromResolvedRules(actuallyResolvedSettings);
|
|
25
57
|
this.emit('entityresolve', {
|
|
26
58
|
total: numberOfRules,
|
|
27
59
|
resolved: actuallyResolvedSettings.size,
|
|
28
60
|
});
|
|
29
61
|
return {
|
|
30
|
-
resolvedEntities:
|
|
62
|
+
resolvedEntities: actuallyResolvedSettings,
|
|
31
63
|
ignoredEntities: findIgnoredEntities(actuallyResolvedSettings, this.config.rules),
|
|
32
64
|
};
|
|
33
65
|
}
|
|
34
66
|
removeInvalidSettingsFromResolvedRules(validSettings) {
|
|
35
67
|
this.resolvedRules.enabledRules.forEach((rule, index) => {
|
|
36
68
|
if (isEnforceSettingsRule(rule)) {
|
|
37
|
-
if (!validSettings
|
|
69
|
+
if (!validSettings[rule.settingName]) {
|
|
38
70
|
this.resolvedRules.enabledRules.splice(index, 1);
|
|
39
71
|
this.resolvedRules.skippedRules.push({
|
|
40
72
|
name: rule.ruleDisplayName,
|
|
@@ -48,13 +80,6 @@ export default class SettingsPolicy extends Policy {
|
|
|
48
80
|
function isEnforceSettingsRule(cls) {
|
|
49
81
|
return cls.ruleDisplayName !== undefined;
|
|
50
82
|
}
|
|
51
|
-
function convertToRecord(settingsMap) {
|
|
52
|
-
const result = {};
|
|
53
|
-
for (const [settingsName, settingsValue] of settingsMap.entries()) {
|
|
54
|
-
result[settingsName] = settingsValue;
|
|
55
|
-
}
|
|
56
|
-
return result;
|
|
57
|
-
}
|
|
58
83
|
function findIgnoredEntities(settingsMap, rules) {
|
|
59
84
|
const result = new Array();
|
|
60
85
|
for (const ruleName of Object.keys(rules)) {
|
|
@@ -62,7 +87,7 @@ function findIgnoredEntities(settingsMap, rules) {
|
|
|
62
87
|
if (!maybeName) {
|
|
63
88
|
continue;
|
|
64
89
|
}
|
|
65
|
-
if (!settingsMap
|
|
90
|
+
if (!settingsMap[maybeName]) {
|
|
66
91
|
result.push({ name: maybeName, message: messages.getMessage('resolve-error.failed-to-resolve-setting') });
|
|
67
92
|
}
|
|
68
93
|
}
|
|
@@ -78,4 +103,9 @@ function extractSettingNames(rules) {
|
|
|
78
103
|
}
|
|
79
104
|
return names;
|
|
80
105
|
}
|
|
81
|
-
|
|
106
|
+
function findSettingsName(ruleName) {
|
|
107
|
+
const match = /^Enforce(.+)Settings$/.exec(ruleName);
|
|
108
|
+
return match ? match[1] : null;
|
|
109
|
+
}
|
|
110
|
+
const SettingsRuleConfigSchema = z.record(z.string(), z.unknown());
|
|
111
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../../../src/libs/audit-engine/registry/policies/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import RuleRegistry from '../ruleRegistry.js';
|
|
2
|
+
import { User } from '../../../../salesforce/index.js';
|
|
3
|
+
import Policy, { ResolveEntityResult } from '../policy.js';
|
|
4
|
+
import { AuditContext } from '../context.types.js';
|
|
5
|
+
import { UserPolicyConfig, UserPrivilegeLevel } from '../shape/schema.js';
|
|
6
|
+
import { AuditRunConfig } from '../shape/auditConfigShape.js';
|
|
7
|
+
export type ResolvedUser = User & {
|
|
8
|
+
role: UserPrivilegeLevel;
|
|
9
|
+
};
|
|
10
|
+
export default class UsersPolicy extends Policy<ResolvedUser> {
|
|
11
|
+
config: UserPolicyConfig;
|
|
12
|
+
auditConfig: AuditRunConfig;
|
|
13
|
+
private totalEntities;
|
|
14
|
+
private readonly classifications;
|
|
15
|
+
private readonly resolveOptions;
|
|
16
|
+
constructor(config: UserPolicyConfig, auditConfig: AuditRunConfig, registry: RuleRegistry);
|
|
17
|
+
protected resolveEntities(context: AuditContext): Promise<ResolveEntityResult<ResolvedUser>>;
|
|
18
|
+
private finaliseResolvedUsers;
|
|
19
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Messages } from '@salesforce/core';
|
|
2
|
+
import { Users } from '../../../../salesforce/index.js';
|
|
3
|
+
import Policy, { getTotal } from '../policy.js';
|
|
4
|
+
import { UserPrivilegeLevel } from '../shape/schema.js';
|
|
5
|
+
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
6
|
+
const messages = Messages.loadMessages('@j-schreiber/sf-cli-security-audit', 'policies.general');
|
|
7
|
+
export default class UsersPolicy extends Policy {
|
|
8
|
+
config;
|
|
9
|
+
auditConfig;
|
|
10
|
+
totalEntities;
|
|
11
|
+
classifications;
|
|
12
|
+
resolveOptions;
|
|
13
|
+
constructor(config, auditConfig, registry) {
|
|
14
|
+
super(config, auditConfig, registry);
|
|
15
|
+
this.config = config;
|
|
16
|
+
this.auditConfig = auditConfig;
|
|
17
|
+
this.classifications = this.auditConfig.classifications.users?.users ?? {};
|
|
18
|
+
this.totalEntities = Object.keys(this.classifications).length;
|
|
19
|
+
this.resolveOptions = buildResolveOptions(this.config);
|
|
20
|
+
}
|
|
21
|
+
async resolveEntities(context) {
|
|
22
|
+
this.emit('entityresolve', {
|
|
23
|
+
total: this.totalEntities,
|
|
24
|
+
resolved: 0,
|
|
25
|
+
});
|
|
26
|
+
const usersRepo = new Users(context.targetOrgConnection);
|
|
27
|
+
const allUsersOnOrg = await usersRepo.resolve(this.resolveOptions);
|
|
28
|
+
this.totalEntities = allUsersOnOrg.size;
|
|
29
|
+
this.emit('entityresolve', {
|
|
30
|
+
total: this.totalEntities,
|
|
31
|
+
resolved: 0,
|
|
32
|
+
});
|
|
33
|
+
const result = this.finaliseResolvedUsers(allUsersOnOrg);
|
|
34
|
+
this.emit('entityresolve', {
|
|
35
|
+
total: this.totalEntities,
|
|
36
|
+
resolved: getTotal(result),
|
|
37
|
+
});
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
finaliseResolvedUsers(users) {
|
|
41
|
+
const resolvedEntities = {};
|
|
42
|
+
const ignoredEntities = {};
|
|
43
|
+
for (const user of users.values()) {
|
|
44
|
+
const finalUser = {
|
|
45
|
+
...user,
|
|
46
|
+
role: this.classifications[user.username]?.role ?? this.config.options.defaultRoleForMissingUsers,
|
|
47
|
+
};
|
|
48
|
+
if (finalUser.role === UserPrivilegeLevel.UNKNOWN) {
|
|
49
|
+
ignoredEntities[user.username] = {
|
|
50
|
+
name: user.username,
|
|
51
|
+
message: messages.getMessage('user-with-role-unknown'),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
resolvedEntities[user.username] = finalUser;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return { resolvedEntities, ignoredEntities: Object.values(ignoredEntities) };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function buildResolveOptions(policyConfig) {
|
|
62
|
+
const opts = {};
|
|
63
|
+
if (policyConfig.rules['NoOtherApexApiLogins'] || policyConfig.rules['NoInactiveUsers']) {
|
|
64
|
+
opts.withLoginHistory = true;
|
|
65
|
+
opts.loginHistoryDaysToAnalyse = policyConfig.options.analyseLastNDaysOfLoginHistory;
|
|
66
|
+
}
|
|
67
|
+
if (policyConfig.rules['EnforcePermissionPresets']) {
|
|
68
|
+
opts.withPermissions = true;
|
|
69
|
+
}
|
|
70
|
+
if (policyConfig.rules['EnforcePermissionClassifications']) {
|
|
71
|
+
opts.withPermissions = true;
|
|
72
|
+
opts.withPermissionsMetadata = true;
|
|
73
|
+
}
|
|
74
|
+
return opts;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=users.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../../../../src/libs/audit-engine/registry/policies/users.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import EventEmitter from 'node:events';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
2
|
+
import RuleRegistry, { RegistryRuleResolveResult } from './ruleRegistry.js';
|
|
3
|
+
import { AuditPolicyResult, EntityResolveError } from './result.types.js';
|
|
4
|
+
import { AuditContext, IPolicy, RowLevelPolicyRule } from './context.types.js';
|
|
5
|
+
import { PolicyConfig } from './shape/schema.js';
|
|
6
|
+
import { AuditRunConfig } from './shape/auditConfigShape.js';
|
|
6
7
|
export type ResolveEntityResult<T> = {
|
|
7
8
|
resolvedEntities: Record<string, T>;
|
|
8
9
|
ignoredEntities: EntityResolveError[];
|
|
9
10
|
};
|
|
10
11
|
export default abstract class Policy<T> extends EventEmitter implements IPolicy {
|
|
11
|
-
config:
|
|
12
|
+
config: PolicyConfig;
|
|
12
13
|
auditConfig: AuditRunConfig;
|
|
13
14
|
protected registry: RuleRegistry;
|
|
14
15
|
protected resolvedRules: RegistryRuleResolveResult;
|
|
15
16
|
protected entities?: ResolveEntityResult<T>;
|
|
16
|
-
constructor(config:
|
|
17
|
+
constructor(config: PolicyConfig, auditConfig: AuditRunConfig, registry: RuleRegistry);
|
|
17
18
|
getExecutableRules(): Array<RowLevelPolicyRule<T>>;
|
|
18
19
|
/**
|
|
19
20
|
* Resolves all entities of the policy.
|
|
@@ -97,6 +97,8 @@ function evalResolvedEntities(ruleResult, entities) {
|
|
|
97
97
|
violatedEntities: ruleResult.violatedEntities ?? Array.from(violatedEntities),
|
|
98
98
|
};
|
|
99
99
|
}
|
|
100
|
+
// TODO: Can be removed when policy emit their resolve result
|
|
101
|
+
// and we propagate this as an aggregated resolve status
|
|
100
102
|
export function getTotal(resolveResult) {
|
|
101
103
|
const resolvedCount = resolveResult.resolvedEntities ? Object.keys(resolveResult.resolvedEntities).length : 0;
|
|
102
104
|
const ignoredCount = resolveResult.ignoredEntities ? resolveResult.ignoredEntities.length : 0;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../../src/libs/audit-engine/registry/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AuditRunConfig } from './shape/auditConfigShape.js';
|
|
2
2
|
/**
|
|
3
3
|
* A single violation from a policy rule execution.
|
|
4
4
|
*/
|
|
@@ -167,6 +167,6 @@ export type AuditResult = {
|
|
|
167
167
|
* Record map of all modules (policies) that were run.
|
|
168
168
|
*/
|
|
169
169
|
policies: {
|
|
170
|
-
[P in keyof
|
|
170
|
+
[P in keyof AuditRunConfig['policies']]: AuditPolicyResult;
|
|
171
171
|
};
|
|
172
172
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.types.js","sourceRoot":"","sources":["../../../../src/libs/audit-engine/registry/result.types.ts"],"names":[],"mappings":""}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { AuditRunConfig } from './shape/auditConfigShape.js';
|
|
2
|
+
import { EntityResolveError, PolicyRuleSkipResult } from './result.types.js';
|
|
3
|
+
import { RowLevelPolicyRule } from './context.types.js';
|
|
4
|
+
import { PolicyConfig } from './shape/schema.js';
|
|
5
|
+
export type Constructor<T, Args extends any[] = any[]> = new (...args: Args) => T;
|
|
6
|
+
export type RuleHandlerMap = Record<string, Constructor<RowLevelPolicyRule<unknown>>>;
|
|
4
7
|
/**
|
|
5
8
|
* Result contains the actually available and enabled rules
|
|
6
9
|
* from the raw config file. Rules that are not present in the
|
|
@@ -17,8 +20,8 @@ export type RegistryRuleResolveResult = {
|
|
|
17
20
|
* allow users to BYOR ("bring your own rules").
|
|
18
21
|
*/
|
|
19
22
|
export default class RuleRegistry {
|
|
20
|
-
|
|
21
|
-
constructor(rules
|
|
23
|
+
private availableRules;
|
|
24
|
+
constructor(rules?: RuleHandlerMap);
|
|
22
25
|
/**
|
|
23
26
|
* Returns the display/config names of all registered rules
|
|
24
27
|
*
|
|
@@ -30,8 +33,8 @@ export default class RuleRegistry {
|
|
|
30
33
|
* rules are ignored and disabled rules are skipped.
|
|
31
34
|
*
|
|
32
35
|
* @param ruleObjs
|
|
33
|
-
* @param
|
|
36
|
+
* @param auditConfig
|
|
34
37
|
* @returns
|
|
35
38
|
*/
|
|
36
|
-
resolveRules(ruleObjs:
|
|
39
|
+
resolveRules(ruleObjs: PolicyConfig['rules'], auditConfig: AuditRunConfig): RegistryRuleResolveResult;
|
|
37
40
|
}
|
|
@@ -7,9 +7,9 @@ const messages = Messages.loadMessages('@j-schreiber/sf-cli-security-audit', 'po
|
|
|
7
7
|
* allow users to BYOR ("bring your own rules").
|
|
8
8
|
*/
|
|
9
9
|
export default class RuleRegistry {
|
|
10
|
-
|
|
10
|
+
availableRules;
|
|
11
11
|
constructor(rules) {
|
|
12
|
-
this.
|
|
12
|
+
this.availableRules = rules ?? {};
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
15
|
* Returns the display/config names of all registered rules
|
|
@@ -17,23 +17,23 @@ export default class RuleRegistry {
|
|
|
17
17
|
* @returns
|
|
18
18
|
*/
|
|
19
19
|
registeredRules() {
|
|
20
|
-
return Object.keys(this.
|
|
20
|
+
return Object.keys(this.availableRules);
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
23
|
* Resolves a given set of rule configs to actually registered rules. Unknown
|
|
24
24
|
* rules are ignored and disabled rules are skipped.
|
|
25
25
|
*
|
|
26
26
|
* @param ruleObjs
|
|
27
|
-
* @param
|
|
27
|
+
* @param auditConfig
|
|
28
28
|
* @returns
|
|
29
29
|
*/
|
|
30
|
-
resolveRules(ruleObjs,
|
|
30
|
+
resolveRules(ruleObjs, auditConfig) {
|
|
31
31
|
const enabledRules = new Array();
|
|
32
32
|
const skippedRules = new Array();
|
|
33
33
|
const resolveErrors = new Array();
|
|
34
34
|
Object.entries(ruleObjs).forEach(([ruleName, ruleConfig]) => {
|
|
35
|
-
if (this.
|
|
36
|
-
enabledRules.push(new this.
|
|
35
|
+
if (this.availableRules[ruleName] && ruleConfig.enabled) {
|
|
36
|
+
enabledRules.push(new this.availableRules[ruleName]({ auditConfig, ruleDisplayName: ruleName, ruleConfig: ruleConfig.options }));
|
|
37
37
|
}
|
|
38
38
|
else if (ruleConfig.enabled === false) {
|
|
39
39
|
skippedRules.push({ name: ruleName, skipReason: messages.getMessage('skip-reason.rule-not-enabled') });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ruleRegistry.js","sourceRoot":"","sources":["../../../../src/libs/audit-engine/registry/ruleRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAM5C,QAAQ,CAAC,kCAAkC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,oCAAoC,EAAE,kBAAkB,CAAC,CAAC;AAkBjG;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,YAAY;IACvB,cAAc,CAAC;IAEvB,YAAmB,KAAsB;QACvC,IAAI,CAAC,cAAc,GAAG,KAAK,IAAI,EAAE,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACI,eAAe;QACpB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;;;OAOG;IACI,YAAY,CAAC,QAA+B,EAAE,WAA2B;QAC9E,MAAM,YAAY,GAAG,IAAI,KAAK,EAA+B,CAAC;QAC9D,MAAM,YAAY,GAAG,IAAI,KAAK,EAAwB,CAAC;QACvD,MAAM,aAAa,GAAG,IAAI,KAAK,EAAsB,CAAC;QACtD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE;YAC1D,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACxD,YAAY,CAAC,IAAI,CACf,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,CAC9G,CAAC;YACJ,CAAC;iBAAM,IAAI,UAAU,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;gBACxC,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC;YACzG,CAAC;iBAAM,CAAC;gBACN,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAC;YAC5G,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;IACvD,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { PartialPolicyRuleResult, RuleAuditContext } from '../context.types.js';
|
|
2
|
+
import { ConnectedApp } from '../../../../salesforce/index.js';
|
|
3
|
+
import PolicyRule, { RuleOptions } from './policyRule.js';
|
|
4
|
+
export default class AllUsedAppsUnderManagement extends PolicyRule<ConnectedApp> {
|
|
5
|
+
constructor(opts: RuleOptions);
|
|
6
|
+
run(context: RuleAuditContext<ConnectedApp>): Promise<PartialPolicyRuleResult>;
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allUsedAppsUnderManagement.js","sourceRoot":"","sources":["../../../../../src/libs/audit-engine/registry/rules/allUsedAppsUnderManagement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,UAA2B,MAAM,iBAAiB,CAAC;AAE1D,QAAQ,CAAC,kCAAkC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,oCAAoC,EAAE,qBAAqB,CAAC,CAAC;AAEpG,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,UAAwB;IAC9E,YAAmB,IAAiB;QAClC,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;IAEM,GAAG,CAAC,OAAuC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACnD,IAAI,GAAG,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBAChC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;oBACrB,UAAU,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;oBACtB,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,wCAAwC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;iBACzG,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;CACF"}
|
package/lib/libs/{core/registries → audit-engine/registry}/rules/enforcePermissionPresets.d.ts
RENAMED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { PartialPolicyRuleResult, RuleAuditContext } from '../types.js';
|
|
2
|
-
import { ResolvedUser } from '../users.js';
|
|
1
|
+
import { PartialPolicyRuleResult, RuleAuditContext } from '../context.types.js';
|
|
2
|
+
import { ResolvedUser } from '../policies/users.js';
|
|
3
3
|
import PolicyRule, { RuleOptions } from './policyRule.js';
|
|
4
4
|
export default class EnforcePermissionPresets extends PolicyRule<ResolvedUser> {
|
|
5
5
|
constructor(opts: RuleOptions);
|
|
6
6
|
run(context: RuleAuditContext<ResolvedUser>): Promise<PartialPolicyRuleResult>;
|
|
7
|
+
private resolveProfileRole;
|
|
8
|
+
private resolvePermissionSetRole;
|
|
7
9
|
}
|
package/lib/libs/{core/registries → audit-engine/registry}/rules/enforcePermissionPresets.js
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Messages } from '@salesforce/core';
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { capitalize } from '../../../../utils.js';
|
|
3
|
+
import { resolvePresetOrdinalValue } from '../helpers/permissionsScanning.js';
|
|
4
|
+
import { UserPrivilegeLevel } from '../shape/schema.js';
|
|
5
5
|
import PolicyRule from './policyRule.js';
|
|
6
6
|
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
7
7
|
const messages = Messages.loadMessages('@j-schreiber/sf-cli-security-audit', 'rules.users');
|
|
@@ -9,24 +9,26 @@ export default class EnforcePermissionPresets extends PolicyRule {
|
|
|
9
9
|
constructor(opts) {
|
|
10
10
|
super(opts);
|
|
11
11
|
}
|
|
12
|
-
|
|
12
|
+
run(context) {
|
|
13
13
|
const result = this.initResult();
|
|
14
14
|
const users = context.resolvedEntities;
|
|
15
|
-
const userRepo = new UsersRepository(context.targetOrgConnection);
|
|
16
|
-
// options "with/without metadata - only identifiers"
|
|
17
|
-
const userPerms = await userRepo.resolveUserPermissions(Object.values(users), { withMetadata: false });
|
|
18
15
|
for (const user of Object.values(users)) {
|
|
19
|
-
const
|
|
20
|
-
auditPermissionsEntity(result, user, 'profile', user.profileName,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
auditPermissionsEntity(result, user, 'permission set', assignment.permissionSetIdentifier, permsetPreset?.role);
|
|
16
|
+
const profileRole = this.resolveProfileRole(user.profileName);
|
|
17
|
+
auditPermissionsEntity(result, user, 'profile', user.profileName, profileRole);
|
|
18
|
+
if (user.assignments) {
|
|
19
|
+
for (const assignment of user.assignments) {
|
|
20
|
+
const permsetRole = this.resolvePermissionSetRole(assignment.permissionSetIdentifier);
|
|
21
|
+
auditPermissionsEntity(result, user, 'permission set', assignment.permissionSetIdentifier, permsetRole);
|
|
26
22
|
}
|
|
27
23
|
}
|
|
28
24
|
}
|
|
29
|
-
return result;
|
|
25
|
+
return Promise.resolve(result);
|
|
26
|
+
}
|
|
27
|
+
resolveProfileRole(profileName) {
|
|
28
|
+
return this.auditConfig.classifications.profiles?.profiles[profileName]?.role;
|
|
29
|
+
}
|
|
30
|
+
resolvePermissionSetRole(permsetName) {
|
|
31
|
+
return this.auditConfig.classifications.permissionSets?.permissionSets[permsetName]?.role;
|
|
30
32
|
}
|
|
31
33
|
}
|
|
32
34
|
function auditPermissionsEntity(result, user, entityType, entityIdentifier, entityPreset) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enforcePermissionPresets.js","sourceRoot":"","sources":["../../../../../src/libs/audit-engine/registry/rules/enforcePermissionPresets.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PartialPolicyRuleResult, RuleAuditContext } from '../types.js';
|
|
1
|
+
import { PartialPolicyRuleResult, RuleAuditContext } from '../context.types.js';
|
|
2
2
|
import { ResolvedProfileLike } from '../helpers/permissionsScanning.js';
|
|
3
3
|
import PolicyRule, { RuleOptions } from './policyRule.js';
|
|
4
4
|
export default class EnforcePermissionsOnProfileLike extends PolicyRule<ResolvedProfileLike> {
|
package/lib/libs/{core/registries → audit-engine/registry}/rules/enforcePermissionsOnProfileLike.js
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isNullish } from '
|
|
1
|
+
import { isNullish } from '../../../../utils.js';
|
|
2
2
|
import { scanPermissions } from '../helpers/permissionsScanning.js';
|
|
3
3
|
import PolicyRule from './policyRule.js';
|
|
4
4
|
export default class EnforcePermissionsOnProfileLike extends PolicyRule {
|
|
@@ -10,12 +10,12 @@ export default class EnforcePermissionsOnProfileLike extends PolicyRule {
|
|
|
10
10
|
const resolvedProfiles = context.resolvedEntities;
|
|
11
11
|
for (const profile of Object.values(resolvedProfiles)) {
|
|
12
12
|
if (!isNullish(profile.metadata.userPermissions)) {
|
|
13
|
-
const userPermsScan = scanPermissions(profile, 'userPermissions', this.
|
|
13
|
+
const userPermsScan = scanPermissions(profile, 'userPermissions', this.auditConfig);
|
|
14
14
|
result.violations.push(...userPermsScan.violations);
|
|
15
15
|
result.warnings.push(...userPermsScan.warnings);
|
|
16
16
|
}
|
|
17
17
|
if (!isNullish(profile.metadata.customPermissions)) {
|
|
18
|
-
const customPermsScan = scanPermissions(profile, 'customPermissions', this.
|
|
18
|
+
const customPermsScan = scanPermissions(profile, 'customPermissions', this.auditConfig);
|
|
19
19
|
result.violations.push(...customPermsScan.violations);
|
|
20
20
|
result.warnings.push(...customPermsScan.warnings);
|
|
21
21
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enforcePermissionsOnProfileLike.js","sourceRoot":"","sources":["../../../../../src/libs/audit-engine/registry/rules/enforcePermissionsOnProfileLike.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAuB,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzF,OAAO,UAA2B,MAAM,iBAAiB,CAAC;AAE1D,MAAM,CAAC,OAAO,OAAO,+BAAgC,SAAQ,UAA+B;IAC1F,YAAmB,IAAiB;QAClC,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;IAEM,GAAG,CAAC,OAA8C;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QAClD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBACjD,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,EAAE,iBAAiB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBACpF,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;gBACpD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;YAClD,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACnD,MAAM,eAAe,GAAG,eAAe,CAAC,OAAO,EAAE,mBAAmB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBACxF,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;gBACtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;CACF"}
|
package/lib/libs/{core/registries → audit-engine/registry}/rules/enforcePermissionsOnUser.d.ts
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PartialPolicyRuleResult, RuleAuditContext } from '../types.js';
|
|
2
|
-
import { ResolvedUser } from '../users.js';
|
|
1
|
+
import { PartialPolicyRuleResult, RuleAuditContext } from '../context.types.js';
|
|
2
|
+
import { ResolvedUser } from '../policies/users.js';
|
|
3
3
|
import PolicyRule, { RuleOptions } from './policyRule.js';
|
|
4
4
|
export default class EnforcePermissionsOnUser extends PolicyRule<ResolvedUser> {
|
|
5
5
|
constructor(opts: RuleOptions);
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { scanProfileLike } from '../helpers/permissionsScanning.js';
|
|
2
|
+
import PolicyRule from './policyRule.js';
|
|
3
|
+
export default class EnforcePermissionsOnUser extends PolicyRule {
|
|
4
|
+
constructor(opts) {
|
|
5
|
+
super(opts);
|
|
6
|
+
}
|
|
7
|
+
run(context) {
|
|
8
|
+
const result = this.initResult();
|
|
9
|
+
const users = context.resolvedEntities;
|
|
10
|
+
for (const user of Object.values(users)) {
|
|
11
|
+
const { violations, warnings } = this.scanAssignedPermissionSets(user, user.assignments);
|
|
12
|
+
result.violations.push(...violations);
|
|
13
|
+
result.warnings.push(...warnings);
|
|
14
|
+
if (user.profileMetadata) {
|
|
15
|
+
const profileResult = scanProfileLike({ role: user.role, metadata: user.profileMetadata, name: user.profileName }, this.auditConfig, [user.username]);
|
|
16
|
+
result.violations.push(...profileResult.violations);
|
|
17
|
+
result.warnings.push(...profileResult.warnings);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return Promise.resolve(result);
|
|
21
|
+
}
|
|
22
|
+
scanAssignedPermissionSets(user, assignments) {
|
|
23
|
+
const result = { violations: [], warnings: [] };
|
|
24
|
+
if (!assignments) {
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
for (const assignedPermSet of assignments) {
|
|
28
|
+
if (!assignedPermSet.metadata) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const permsetScan = scanProfileLike({ role: user.role, metadata: assignedPermSet.metadata, name: assignedPermSet.permissionSetIdentifier }, this.auditConfig, [user.username]);
|
|
32
|
+
result.violations.push(...permsetScan.violations);
|
|
33
|
+
result.warnings.push(...permsetScan.warnings);
|
|
34
|
+
}
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=enforcePermissionsOnUser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enforcePermissionsOnUser.js","sourceRoot":"","sources":["../../../../../src/libs/audit-engine/registry/rules/enforcePermissionsOnUser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAc,MAAM,mCAAmC,CAAC;AAGhF,OAAO,UAA2B,MAAM,iBAAiB,CAAC;AAE1D,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,UAAwB;IAC5E,YAAmB,IAAiB;QAClC,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;IAEM,GAAG,CAAC,OAAuC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACzF,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;YACtC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;YAClC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,MAAM,aAAa,GAAG,eAAe,CACnC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,EAC3E,IAAI,CAAC,WAAW,EAChB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAChB,CAAC;gBACF,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;gBACpD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAEO,0BAA0B,CAAC,IAAkB,EAAE,WAAwC;QAC7F,MAAM,MAAM,GAAe,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,KAAK,MAAM,eAAe,IAAI,WAAW,EAAE,CAAC;YAC1C,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;gBAC9B,SAAS;YACX,CAAC;YACD,MAAM,WAAW,GAAG,eAAe,CACjC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,eAAe,CAAC,uBAAuB,EAAE,EACtG,IAAI,CAAC,WAAW,EAChB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAChB,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;YAClD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { PartialPolicyRuleResult, RuleAuditContext } from '../context.types.js';
|
|
2
|
+
import { SalesforceSetting } from '../policies/settings.js';
|
|
3
3
|
import PolicyRule, { ConfigurableRuleOptions } from './policyRule.js';
|
|
4
4
|
type EnforceSettingsOpts = ConfigurableRuleOptions<Record<string, unknown>> & {
|
|
5
5
|
settingName: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enforceSettings.js","sourceRoot":"","sources":["../../../../../src/libs/audit-engine/registry/rules/enforceSettings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,UAAuC,MAAM,iBAAiB,CAAC;AAEtE,QAAQ,CAAC,kCAAkC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,oCAAoC,EAAE,gBAAgB,CAAC,CAAC;AAM/F,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,UAAmB;IAG1B;IAF7B,WAAW,CAAC;IAEnB,YAAoC,WAAgC;QAClE,KAAK,CAAC,WAAW,CAAC,CAAC;QADe,gBAAW,GAAX,WAAW,CAAqB;QAElE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;IAClD,CAAC;IAEM,GAAG,CAAC,OAA4C;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC9E,MAAM,cAAc,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,UAAU,CAAC;QACjE,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC,CAAC;QACrF,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,iBAAiB,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5C,MAAM,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,iBAAiB,GAAG,EAAE,CAAC;YAC9B,MAAM,CAAC,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,UAAU,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;CACF;AAED,SAAS,aAAa,CACpB,cAAiC,EACjC,WAAoC,EACpC,SAAmB,EACnB,YAAgC;IAEhC,KAAK,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAC1E,MAAM,YAAY,GAAG,CAAC,GAAG,SAAS,EAAE,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,WAAW,CAAC,KAAK,SAAS,EAAE,CAAC;YAC7D,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACxB,UAAU,EAAE,YAAY;gBACxB,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,kCAAkC,CAAC;aACjE,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,YAAY,EAAE,CAAC;YACtD,aAAa,CACX,aAAkC,EAClC,WAAW,EACX,YAAY,EACZ,YAAY,CAAC,WAAW,CAAsB,CAC/C,CAAC;QACJ,CAAC;aAAM,IACL,OAAO,aAAa,KAAK,QAAQ;YACjC,OAAO,aAAa,KAAK,SAAS;YAClC,OAAO,aAAa,KAAK,QAAQ,EACjC,CAAC;YACD,IAAI,aAAa,KAAK,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;gBAChD,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC;oBAC1B,UAAU,EAAE,YAAY;oBACxB,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,0CAA0C,EAAE;wBACvE,aAAa;wBACb,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;qBAClC,CAAC;iBACH,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import z from 'zod';
|
|
2
|
+
import { PartialPolicyRuleResult, RuleAuditContext } from '../context.types.js';
|
|
3
|
+
import { ResolvedUser } from '../policies/users.js';
|
|
4
|
+
import PolicyRule, { ConfigurableRuleOptions } from './policyRule.js';
|
|
5
|
+
declare const NoInactiveUsersOptionsSchema: z.ZodObject<{
|
|
6
|
+
daysAfterUserIsInactive: z.ZodDefault<z.ZodNumber>;
|
|
7
|
+
}, z.z.core.$strict>;
|
|
8
|
+
type NoInactiveUsersOptions = z.infer<typeof NoInactiveUsersOptionsSchema>;
|
|
9
|
+
export default class NoInactiveUsers extends PolicyRule<ResolvedUser> {
|
|
10
|
+
private readonly ruleConfig;
|
|
11
|
+
constructor(localOpts: ConfigurableRuleOptions<NoInactiveUsersOptions>);
|
|
12
|
+
run(context: RuleAuditContext<ResolvedUser>): Promise<PartialPolicyRuleResult>;
|
|
13
|
+
}
|
|
14
|
+
export {};
|