@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.
Files changed (276) hide show
  1. package/README.md +3 -3
  2. package/lib/commands/org/audit/init.d.ts +5 -3
  3. package/lib/commands/org/audit/init.js +14 -20
  4. package/lib/commands/org/audit/init.js.map +1 -1
  5. package/lib/commands/org/audit/run.d.ts +1 -1
  6. package/lib/commands/org/audit/run.js +5 -3
  7. package/lib/commands/org/audit/run.js.map +1 -1
  8. package/lib/commands/org/scan/user-perms.js +1 -1
  9. package/lib/commands/org/scan/user-perms.js.map +1 -1
  10. package/lib/libs/{core → audit-engine}/auditRun.d.ts +6 -7
  11. package/lib/libs/{core → audit-engine}/auditRun.js +20 -16
  12. package/lib/libs/audit-engine/auditRun.js.map +1 -0
  13. package/lib/libs/audit-engine/file-manager/fileManager.d.ts +31 -0
  14. package/lib/libs/audit-engine/file-manager/fileManager.js +139 -0
  15. package/lib/libs/audit-engine/file-manager/fileManager.js.map +1 -0
  16. package/lib/libs/audit-engine/file-manager/fileManager.types.d.ts +30 -0
  17. package/lib/libs/audit-engine/file-manager/fileManager.types.js +2 -0
  18. package/lib/libs/audit-engine/file-manager/fileManager.types.js.map +1 -0
  19. package/lib/libs/audit-engine/index.d.ts +121 -0
  20. package/lib/libs/audit-engine/index.js +9 -0
  21. package/lib/libs/audit-engine/index.js.map +1 -0
  22. package/lib/libs/{core/registries/types.d.ts → audit-engine/registry/context.types.d.ts} +6 -10
  23. package/lib/libs/audit-engine/registry/context.types.js +2 -0
  24. package/lib/libs/audit-engine/registry/context.types.js.map +1 -0
  25. package/lib/libs/audit-engine/registry/definitions.d.ts +23 -0
  26. package/lib/libs/audit-engine/registry/definitions.js +53 -0
  27. package/lib/libs/audit-engine/registry/definitions.js.map +1 -0
  28. package/lib/libs/{core/registries → audit-engine/registry}/helpers/permissionsScanning.d.ts +12 -2
  29. package/lib/libs/{core/registries → audit-engine/registry}/helpers/permissionsScanning.js +15 -3
  30. package/lib/libs/audit-engine/registry/helpers/permissionsScanning.js.map +1 -0
  31. package/lib/libs/audit-engine/registry/policies/connectedApps.d.ts +12 -0
  32. package/lib/libs/audit-engine/registry/policies/connectedApps.js +22 -0
  33. package/lib/libs/audit-engine/registry/policies/connectedApps.js.map +1 -0
  34. package/lib/libs/audit-engine/registry/policies/permissionSets.d.ts +18 -0
  35. package/lib/libs/audit-engine/registry/policies/permissionSets.js +80 -0
  36. package/lib/libs/audit-engine/registry/policies/permissionSets.js.map +1 -0
  37. package/lib/libs/audit-engine/registry/policies/profiles.d.ts +18 -0
  38. package/lib/libs/audit-engine/registry/policies/profiles.js +76 -0
  39. package/lib/libs/audit-engine/registry/policies/profiles.js.map +1 -0
  40. package/lib/libs/audit-engine/registry/policies/settings.d.ts +18 -0
  41. package/lib/libs/{core/policies/settingsPolicy.js → audit-engine/registry/policies/settings.js} +48 -18
  42. package/lib/libs/audit-engine/registry/policies/settings.js.map +1 -0
  43. package/lib/libs/audit-engine/registry/policies/users.d.ts +19 -0
  44. package/lib/libs/audit-engine/registry/policies/users.js +76 -0
  45. package/lib/libs/audit-engine/registry/policies/users.js.map +1 -0
  46. package/lib/libs/{core/policies → audit-engine/registry}/policy.d.ts +7 -6
  47. package/lib/libs/{core/policies → audit-engine/registry}/policy.js +2 -0
  48. package/lib/libs/audit-engine/registry/policy.js.map +1 -0
  49. package/lib/libs/{core/result-types.d.ts → audit-engine/registry/result.types.d.ts} +2 -2
  50. package/lib/libs/audit-engine/registry/result.types.js +2 -0
  51. package/lib/libs/audit-engine/registry/result.types.js.map +1 -0
  52. package/lib/libs/{core/registries → audit-engine/registry}/ruleRegistry.d.ts +10 -7
  53. package/lib/libs/{core/registries → audit-engine/registry}/ruleRegistry.js +7 -7
  54. package/lib/libs/audit-engine/registry/ruleRegistry.js.map +1 -0
  55. package/lib/libs/audit-engine/registry/rules/allUsedAppsUnderManagement.d.ts +7 -0
  56. package/lib/libs/audit-engine/registry/rules/allUsedAppsUnderManagement.js.map +1 -0
  57. package/lib/libs/{core/registries → audit-engine/registry}/rules/enforcePermissionPresets.d.ts +4 -2
  58. package/lib/libs/{core/registries → audit-engine/registry}/rules/enforcePermissionPresets.js +17 -15
  59. package/lib/libs/audit-engine/registry/rules/enforcePermissionPresets.js.map +1 -0
  60. package/lib/libs/{core/registries → audit-engine/registry}/rules/enforcePermissionsOnProfileLike.d.ts +1 -1
  61. package/lib/libs/{core/registries → audit-engine/registry}/rules/enforcePermissionsOnProfileLike.js +3 -3
  62. package/lib/libs/audit-engine/registry/rules/enforcePermissionsOnProfileLike.js.map +1 -0
  63. package/lib/libs/{core/registries → audit-engine/registry}/rules/enforcePermissionsOnUser.d.ts +2 -2
  64. package/lib/libs/audit-engine/registry/rules/enforcePermissionsOnUser.js +38 -0
  65. package/lib/libs/audit-engine/registry/rules/enforcePermissionsOnUser.js.map +1 -0
  66. package/lib/libs/{core/registries → audit-engine/registry}/rules/enforceSettings.d.ts +2 -2
  67. package/lib/libs/audit-engine/registry/rules/enforceSettings.js.map +1 -0
  68. package/lib/libs/audit-engine/registry/rules/noInactiveUsers.d.ts +14 -0
  69. package/lib/libs/{core/registries → audit-engine/registry}/rules/noInactiveUsers.js +17 -4
  70. package/lib/libs/audit-engine/registry/rules/noInactiveUsers.js.map +1 -0
  71. package/lib/libs/{core/registries → audit-engine/registry}/rules/noOtherApexApiLogins.d.ts +2 -2
  72. package/lib/libs/{core/registries → audit-engine/registry}/rules/noOtherApexApiLogins.js +4 -1
  73. package/lib/libs/audit-engine/registry/rules/noOtherApexApiLogins.js.map +1 -0
  74. package/lib/libs/audit-engine/registry/rules/noUserCanSelfAuthorize.d.ts +7 -0
  75. package/lib/libs/audit-engine/registry/rules/noUserCanSelfAuthorize.js.map +1 -0
  76. package/lib/libs/{core/registries → audit-engine/registry}/rules/policyRule.d.ts +4 -6
  77. package/lib/libs/{core/registries → audit-engine/registry}/rules/policyRule.js +2 -12
  78. package/lib/libs/audit-engine/registry/rules/policyRule.js.map +1 -0
  79. package/lib/libs/audit-engine/registry/schema.d.ts +2 -0
  80. package/lib/libs/audit-engine/registry/schema.js +11 -0
  81. package/lib/libs/audit-engine/registry/schema.js.map +1 -0
  82. package/lib/libs/audit-engine/registry/shape/auditConfigShape.d.ts +122 -0
  83. package/lib/libs/audit-engine/registry/shape/auditConfigShape.js +54 -0
  84. package/lib/libs/audit-engine/registry/shape/auditConfigShape.js.map +1 -0
  85. package/lib/libs/audit-engine/registry/shape/schema.d.ts +96 -0
  86. package/lib/libs/audit-engine/registry/shape/schema.js +84 -0
  87. package/lib/libs/audit-engine/registry/shape/schema.js.map +1 -0
  88. package/lib/libs/conf-init/auditConfig.d.ts +3 -12
  89. package/lib/libs/conf-init/auditConfig.js +25 -25
  90. package/lib/libs/conf-init/auditConfig.js.map +1 -1
  91. package/lib/libs/conf-init/defaultClassifications.d.ts +8 -0
  92. package/lib/libs/conf-init/defaultClassifications.js +116 -0
  93. package/lib/libs/conf-init/defaultClassifications.js.map +1 -0
  94. package/lib/libs/conf-init/defaultPolicies.d.ts +2 -0
  95. package/lib/libs/conf-init/defaultPolicies.js +20 -0
  96. package/lib/libs/conf-init/defaultPolicies.js.map +1 -0
  97. package/lib/libs/conf-init/init.types.d.ts +27 -0
  98. package/lib/libs/conf-init/init.types.js +8 -0
  99. package/lib/libs/conf-init/init.types.js.map +1 -0
  100. package/lib/libs/conf-init/presets/loose.d.ts +1 -1
  101. package/lib/libs/conf-init/presets/loose.js +4 -2
  102. package/lib/libs/conf-init/presets/loose.js.map +1 -1
  103. package/lib/libs/conf-init/presets/none.d.ts +2 -7
  104. package/lib/libs/conf-init/presets/none.js +1 -1
  105. package/lib/libs/conf-init/presets/none.js.map +1 -1
  106. package/lib/libs/conf-init/presets/strict.js +3 -1
  107. package/lib/libs/conf-init/presets/strict.js.map +1 -1
  108. package/lib/libs/conf-init/presets.d.ts +1 -6
  109. package/lib/libs/conf-init/presets.js +1 -6
  110. package/lib/libs/conf-init/presets.js.map +1 -1
  111. package/lib/libs/quick-scan/userPermissionScanner.js +17 -13
  112. package/lib/libs/quick-scan/userPermissionScanner.js.map +1 -1
  113. package/lib/salesforce/index.d.ts +10 -0
  114. package/lib/salesforce/index.js +8 -0
  115. package/lib/salesforce/index.js.map +1 -0
  116. package/lib/salesforce/mdapi/constants.d.ts +1 -0
  117. package/lib/salesforce/mdapi/constants.js +3 -0
  118. package/lib/salesforce/mdapi/constants.js.map +1 -0
  119. package/lib/{libs/core/mdapi/anySettingsMetadata.d.ts → salesforce/mdapi/genericSettingsMetadata.d.ts} +3 -4
  120. package/lib/{libs/core/mdapi/anySettingsMetadata.js → salesforce/mdapi/genericSettingsMetadata.js} +8 -10
  121. package/lib/salesforce/mdapi/genericSettingsMetadata.js.map +1 -0
  122. package/lib/salesforce/mdapi/mdapi.d.ts +46 -0
  123. package/lib/{libs/core/mdapi/mdapiRetriever.js → salesforce/mdapi/mdapi.js} +19 -40
  124. package/lib/salesforce/mdapi/mdapi.js.map +1 -0
  125. package/lib/salesforce/mdapi/metadataRegistry.d.ts +26 -0
  126. package/lib/salesforce/mdapi/metadataRegistry.js +43 -0
  127. package/lib/salesforce/mdapi/metadataRegistry.js.map +1 -0
  128. package/lib/{libs/core → salesforce}/mdapi/metadataRegistryEntry.js +1 -1
  129. package/lib/salesforce/mdapi/metadataRegistryEntry.js.map +1 -0
  130. package/lib/{libs/core → salesforce}/mdapi/namedMetadataToolingQueryable.js +1 -1
  131. package/lib/{libs/core → salesforce}/mdapi/namedMetadataToolingQueryable.js.map +1 -1
  132. package/lib/salesforce/mdapi/namedMetadataType.js.map +1 -0
  133. package/lib/salesforce/mdapi/singletonMetadataType.js.map +1 -0
  134. package/lib/salesforce/repositories/connected-apps/connected-app.types.d.ts +28 -0
  135. package/lib/salesforce/repositories/connected-apps/connected-app.types.js +6 -0
  136. package/lib/salesforce/repositories/connected-apps/connected-app.types.js.map +1 -0
  137. package/lib/salesforce/repositories/connected-apps/connected-apps.d.ts +16 -0
  138. package/lib/salesforce/repositories/connected-apps/connected-apps.js +83 -0
  139. package/lib/salesforce/repositories/connected-apps/connected-apps.js.map +1 -0
  140. package/lib/salesforce/repositories/connected-apps/queries.d.ts +2 -0
  141. package/lib/salesforce/repositories/connected-apps/queries.js +3 -0
  142. package/lib/salesforce/repositories/connected-apps/queries.js.map +1 -0
  143. package/lib/salesforce/repositories/perm-sets/perm-sets.types.d.ts +29 -0
  144. package/lib/salesforce/repositories/perm-sets/perm-sets.types.js +10 -0
  145. package/lib/salesforce/repositories/perm-sets/perm-sets.types.js.map +1 -0
  146. package/lib/salesforce/repositories/perm-sets/permission-sets.d.ts +11 -0
  147. package/lib/salesforce/repositories/perm-sets/permission-sets.js +43 -0
  148. package/lib/salesforce/repositories/perm-sets/permission-sets.js.map +1 -0
  149. package/lib/salesforce/repositories/perm-sets/queries.d.ts +1 -0
  150. package/lib/salesforce/repositories/perm-sets/queries.js +2 -0
  151. package/lib/salesforce/repositories/perm-sets/queries.js.map +1 -0
  152. package/lib/salesforce/repositories/profiles/profile.types.d.ts +29 -0
  153. package/lib/salesforce/repositories/profiles/profile.types.js +8 -0
  154. package/lib/salesforce/repositories/profiles/profile.types.js.map +1 -0
  155. package/lib/salesforce/repositories/profiles/profiles.d.ts +14 -0
  156. package/lib/salesforce/repositories/profiles/profiles.js +38 -0
  157. package/lib/salesforce/repositories/profiles/profiles.js.map +1 -0
  158. package/lib/salesforce/repositories/profiles/queries.d.ts +2 -0
  159. package/lib/salesforce/repositories/profiles/queries.js +7 -0
  160. package/lib/salesforce/repositories/profiles/queries.js.map +1 -0
  161. package/lib/salesforce/repositories/users/queries.d.ts +3 -0
  162. package/lib/{libs/core/constants.js → salesforce/repositories/users/queries.js} +1 -11
  163. package/lib/salesforce/repositories/users/queries.js.map +1 -0
  164. package/lib/salesforce/repositories/users/user.types.d.ts +54 -0
  165. package/lib/salesforce/repositories/users/user.types.js +12 -0
  166. package/lib/salesforce/repositories/users/user.types.js.map +1 -0
  167. package/lib/salesforce/repositories/users/users.d.ts +22 -0
  168. package/lib/salesforce/repositories/users/users.js +134 -0
  169. package/lib/salesforce/repositories/users/users.js.map +1 -0
  170. package/lib/{libs/core/utils.d.ts → utils.d.ts} +2 -0
  171. package/lib/{libs/core/utils.js → utils.js} +26 -0
  172. package/lib/utils.js.map +1 -0
  173. package/lib/ux/auditRunMultiStage.d.ts +1 -1
  174. package/lib/ux/auditRunMultiStage.js +5 -5
  175. package/lib/ux/auditRunMultiStage.js.map +1 -1
  176. package/messages/policies.general.md +9 -1
  177. package/messages/policyclassifications.md +8 -0
  178. package/messages/rules.enforceClassificationPresets.md +2 -2
  179. package/messages/rules.users.md +1 -1
  180. package/oclif.manifest.json +1 -1
  181. package/package.json +1 -1
  182. package/lib/libs/conf-init/permissionsClassification.d.ts +0 -37
  183. package/lib/libs/conf-init/permissionsClassification.js +0 -126
  184. package/lib/libs/conf-init/permissionsClassification.js.map +0 -1
  185. package/lib/libs/conf-init/policyConfigs.d.ts +0 -21
  186. package/lib/libs/conf-init/policyConfigs.js +0 -47
  187. package/lib/libs/conf-init/policyConfigs.js.map +0 -1
  188. package/lib/libs/core/auditRun.js.map +0 -1
  189. package/lib/libs/core/classification-types.d.ts +0 -20
  190. package/lib/libs/core/classification-types.js +0 -23
  191. package/lib/libs/core/classification-types.js.map +0 -1
  192. package/lib/libs/core/constants.d.ts +0 -10
  193. package/lib/libs/core/constants.js.map +0 -1
  194. package/lib/libs/core/file-mgmt/auditConfigFileManager.d.ts +0 -48
  195. package/lib/libs/core/file-mgmt/auditConfigFileManager.js +0 -145
  196. package/lib/libs/core/file-mgmt/auditConfigFileManager.js.map +0 -1
  197. package/lib/libs/core/file-mgmt/schema.d.ts +0 -156
  198. package/lib/libs/core/file-mgmt/schema.js +0 -81
  199. package/lib/libs/core/file-mgmt/schema.js.map +0 -1
  200. package/lib/libs/core/mdapi/anySettingsMetadata.js.map +0 -1
  201. package/lib/libs/core/mdapi/mdapiRetriever.d.ts +0 -54
  202. package/lib/libs/core/mdapi/mdapiRetriever.js.map +0 -1
  203. package/lib/libs/core/mdapi/metadataRegistryEntry.js.map +0 -1
  204. package/lib/libs/core/mdapi/namedMetadataType.js.map +0 -1
  205. package/lib/libs/core/mdapi/singletonMetadataType.js.map +0 -1
  206. package/lib/libs/core/mdapi/usersRepository.d.ts +0 -85
  207. package/lib/libs/core/mdapi/usersRepository.js +0 -126
  208. package/lib/libs/core/mdapi/usersRepository.js.map +0 -1
  209. package/lib/libs/core/policies/connectedAppPolicy.d.ts +0 -10
  210. package/lib/libs/core/policies/connectedAppPolicy.js +0 -78
  211. package/lib/libs/core/policies/connectedAppPolicy.js.map +0 -1
  212. package/lib/libs/core/policies/permissionSetPolicy.d.ts +0 -12
  213. package/lib/libs/core/policies/permissionSetPolicy.js +0 -64
  214. package/lib/libs/core/policies/permissionSetPolicy.js.map +0 -1
  215. package/lib/libs/core/policies/policy.js.map +0 -1
  216. package/lib/libs/core/policies/profilePolicy.d.ts +0 -12
  217. package/lib/libs/core/policies/profilePolicy.js +0 -65
  218. package/lib/libs/core/policies/profilePolicy.js.map +0 -1
  219. package/lib/libs/core/policies/salesforceStandardTypes.d.ts +0 -58
  220. package/lib/libs/core/policies/salesforceStandardTypes.js +0 -2
  221. package/lib/libs/core/policies/salesforceStandardTypes.js.map +0 -1
  222. package/lib/libs/core/policies/settingsPolicy.d.ts +0 -11
  223. package/lib/libs/core/policies/settingsPolicy.js.map +0 -1
  224. package/lib/libs/core/policies/userPolicy.d.ts +0 -12
  225. package/lib/libs/core/policies/userPolicy.js +0 -62
  226. package/lib/libs/core/policies/userPolicy.js.map +0 -1
  227. package/lib/libs/core/policy-types.d.ts +0 -18
  228. package/lib/libs/core/policy-types.js +0 -28
  229. package/lib/libs/core/policy-types.js.map +0 -1
  230. package/lib/libs/core/policyRegistry.d.ts +0 -23
  231. package/lib/libs/core/policyRegistry.js +0 -52
  232. package/lib/libs/core/policyRegistry.js.map +0 -1
  233. package/lib/libs/core/registries/connectedApps.d.ts +0 -13
  234. package/lib/libs/core/registries/connectedApps.js +0 -13
  235. package/lib/libs/core/registries/connectedApps.js.map +0 -1
  236. package/lib/libs/core/registries/helpers/permissionsScanning.js.map +0 -1
  237. package/lib/libs/core/registries/permissionSets.d.ts +0 -11
  238. package/lib/libs/core/registries/permissionSets.js +0 -11
  239. package/lib/libs/core/registries/permissionSets.js.map +0 -1
  240. package/lib/libs/core/registries/profiles.d.ts +0 -11
  241. package/lib/libs/core/registries/profiles.js +0 -11
  242. package/lib/libs/core/registries/profiles.js.map +0 -1
  243. package/lib/libs/core/registries/ruleRegistry.js.map +0 -1
  244. package/lib/libs/core/registries/rules/allUsedAppsUnderManagement.d.ts +0 -7
  245. package/lib/libs/core/registries/rules/allUsedAppsUnderManagement.js.map +0 -1
  246. package/lib/libs/core/registries/rules/enforcePermissionPresets.js.map +0 -1
  247. package/lib/libs/core/registries/rules/enforcePermissionsOnProfileLike.js.map +0 -1
  248. package/lib/libs/core/registries/rules/enforcePermissionsOnUser.js +0 -42
  249. package/lib/libs/core/registries/rules/enforcePermissionsOnUser.js.map +0 -1
  250. package/lib/libs/core/registries/rules/enforceSettings.js.map +0 -1
  251. package/lib/libs/core/registries/rules/noInactiveUsers.d.ts +0 -9
  252. package/lib/libs/core/registries/rules/noInactiveUsers.js.map +0 -1
  253. package/lib/libs/core/registries/rules/noOtherApexApiLogins.js.map +0 -1
  254. package/lib/libs/core/registries/rules/noUserCanSelfAuthorize.d.ts +0 -7
  255. package/lib/libs/core/registries/rules/noUserCanSelfAuthorize.js.map +0 -1
  256. package/lib/libs/core/registries/rules/policyRule.js.map +0 -1
  257. package/lib/libs/core/registries/settings.d.ts +0 -8
  258. package/lib/libs/core/registries/settings.js +0 -51
  259. package/lib/libs/core/registries/settings.js.map +0 -1
  260. package/lib/libs/core/registries/types.js +0 -13
  261. package/lib/libs/core/registries/types.js.map +0 -1
  262. package/lib/libs/core/registries/users.d.ts +0 -10
  263. package/lib/libs/core/registries/users.js +0 -17
  264. package/lib/libs/core/registries/users.js.map +0 -1
  265. package/lib/libs/core/result-types.js +0 -2
  266. package/lib/libs/core/result-types.js.map +0 -1
  267. package/lib/libs/core/utils.js.map +0 -1
  268. /package/lib/libs/{core/registries → audit-engine/registry}/rules/allUsedAppsUnderManagement.js +0 -0
  269. /package/lib/libs/{core/registries → audit-engine/registry}/rules/enforceSettings.js +0 -0
  270. /package/lib/libs/{core/registries → audit-engine/registry}/rules/noUserCanSelfAuthorize.js +0 -0
  271. /package/lib/{libs/core → salesforce}/mdapi/metadataRegistryEntry.d.ts +0 -0
  272. /package/lib/{libs/core → salesforce}/mdapi/namedMetadataToolingQueryable.d.ts +0 -0
  273. /package/lib/{libs/core → salesforce}/mdapi/namedMetadataType.d.ts +0 -0
  274. /package/lib/{libs/core → salesforce}/mdapi/namedMetadataType.js +0 -0
  275. /package/lib/{libs/core → salesforce}/mdapi/singletonMetadataType.d.ts +0 -0
  276. /package/lib/{libs/core → salesforce}/mdapi/singletonMetadataType.js +0 -0
@@ -1,14 +1,46 @@
1
+ import z from 'zod';
1
2
  import { Messages } from '@salesforce/core';
2
- import { findSettingsName, SettingsRegistry } from '../registries/settings.js';
3
- import AnySettingsMetadata from '../mdapi/anySettingsMetadata.js';
4
- import Policy from './policy.js';
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, registry = SettingsRegistry) {
11
- super(config, auditConfig, registry);
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 = new AnySettingsMetadata(context.targetOrgConnection);
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: convertToRecord(actuallyResolvedSettings),
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.has(rule.settingName)) {
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.has(maybeName) || !settingsMap.get(maybeName)) {
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
- //# sourceMappingURL=settingsPolicy.js.map
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 { AuditPolicyResult, EntityResolveError } from '../result-types.js';
3
- import { AuditRunConfig, BasePolicyFileContent } from '../file-mgmt/schema.js';
4
- import RuleRegistry, { RegistryRuleResolveResult } from '../registries/ruleRegistry.js';
5
- import { AuditContext, IPolicy, RowLevelPolicyRule } from '../registries/types.js';
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: BasePolicyFileContent;
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: BasePolicyFileContent, auditConfig: AuditRunConfig, registry: RuleRegistry);
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 { AuditRunConfigPolicies } from './file-mgmt/schema.js';
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 AuditRunConfigPolicies]: AuditPolicyResult;
170
+ [P in keyof AuditRunConfig['policies']]: AuditPolicyResult;
171
171
  };
172
172
  };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=result.types.js.map
@@ -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 { EntityResolveError, PolicyRuleSkipResult } from '../result-types.js';
2
- import { AuditRunConfig, RuleMap } from '../../core/file-mgmt/schema.js';
3
- import { Constructor, RowLevelPolicyRule } from './types.js';
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
- rules: Record<string, Constructor<RowLevelPolicyRule<unknown>>>;
21
- constructor(rules: Record<string, Constructor<RowLevelPolicyRule<unknown>>>);
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 auditContext
36
+ * @param auditConfig
34
37
  * @returns
35
38
  */
36
- resolveRules(ruleObjs: RuleMap, auditContext: AuditRunConfig): RegistryRuleResolveResult;
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
- rules;
10
+ availableRules;
11
11
  constructor(rules) {
12
- this.rules = rules;
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.rules);
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 auditContext
27
+ * @param auditConfig
28
28
  * @returns
29
29
  */
30
- resolveRules(ruleObjs, auditContext) {
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.rules[ruleName] && ruleConfig.enabled) {
36
- enabledRules.push(new this.rules[ruleName]({ auditContext, ruleDisplayName: ruleName, ruleConfig: ruleConfig.options }));
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"}
@@ -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
  }
@@ -1,7 +1,7 @@
1
1
  import { Messages } from '@salesforce/core';
2
- import UsersRepository from '../../mdapi/usersRepository.js';
3
- import { UserPrivilegeLevel, resolvePresetOrdinalValue } from '../../policy-types.js';
4
- import { capitalize } from '../../utils.js';
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
- async run(context) {
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 profilePreset = this.auditContext.classifications.profiles?.content.profiles[user.profileName];
20
- auditPermissionsEntity(result, user, 'profile', user.profileName, profilePreset?.role);
21
- const permsets = userPerms.get(user.userId);
22
- if (permsets) {
23
- for (const assignment of permsets.assignedPermissionsets) {
24
- const permsetPreset = this.auditContext.classifications.permissionSets?.content.permissionSets[assignment.permissionSetIdentifier];
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> {
@@ -1,4 +1,4 @@
1
- import { isNullish } from '../../utils.js';
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.auditContext);
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.auditContext);
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"}
@@ -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 { SalesforceSetting } from '../../mdapi/anySettingsMetadata.js';
2
- import { PartialPolicyRuleResult, RuleAuditContext } from '../types.js';
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 {};