@j-schreiber/sf-cli-security-audit 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +26 -22
  2. package/messages/rules.enforceClassificationPresets.md +4 -0
  3. package/messages/rules.users.md +12 -0
  4. package/oclif.lock +365 -71
  5. package/oclif.manifest.json +2 -253
  6. package/package.json +1 -1
  7. package/lib/commands/org/audit/init.d.ts +0 -19
  8. package/lib/commands/org/audit/init.js +0 -72
  9. package/lib/commands/org/audit/init.js.map +0 -1
  10. package/lib/commands/org/audit/run.d.ts +0 -22
  11. package/lib/commands/org/audit/run.js +0 -119
  12. package/lib/commands/org/audit/run.js.map +0 -1
  13. package/lib/commands/org/scan/user-perms.d.ts +0 -20
  14. package/lib/commands/org/scan/user-perms.js +0 -87
  15. package/lib/commands/org/scan/user-perms.js.map +0 -1
  16. package/lib/libs/conf-init/auditConfig.d.ts +0 -35
  17. package/lib/libs/conf-init/auditConfig.js +0 -41
  18. package/lib/libs/conf-init/auditConfig.js.map +0 -1
  19. package/lib/libs/conf-init/permissionsClassification.d.ts +0 -17
  20. package/lib/libs/conf-init/permissionsClassification.js +0 -80
  21. package/lib/libs/conf-init/permissionsClassification.js.map +0 -1
  22. package/lib/libs/conf-init/policyConfigs.d.ts +0 -31
  23. package/lib/libs/conf-init/policyConfigs.js +0 -91
  24. package/lib/libs/conf-init/policyConfigs.js.map +0 -1
  25. package/lib/libs/conf-init/presets/loose.d.ts +0 -6
  26. package/lib/libs/conf-init/presets/loose.js +0 -51
  27. package/lib/libs/conf-init/presets/loose.js.map +0 -1
  28. package/lib/libs/conf-init/presets/none.d.ts +0 -30
  29. package/lib/libs/conf-init/presets/none.js +0 -54
  30. package/lib/libs/conf-init/presets/none.js.map +0 -1
  31. package/lib/libs/conf-init/presets/strict.d.ts +0 -4
  32. package/lib/libs/conf-init/presets/strict.js +0 -45
  33. package/lib/libs/conf-init/presets/strict.js.map +0 -1
  34. package/lib/libs/conf-init/presets.d.ts +0 -7
  35. package/lib/libs/conf-init/presets.js +0 -20
  36. package/lib/libs/conf-init/presets.js.map +0 -1
  37. package/lib/libs/core/auditRun.d.ts +0 -36
  38. package/lib/libs/core/auditRun.js +0 -86
  39. package/lib/libs/core/auditRun.js.map +0 -1
  40. package/lib/libs/core/classification-types.d.ts +0 -20
  41. package/lib/libs/core/classification-types.js +0 -23
  42. package/lib/libs/core/classification-types.js.map +0 -1
  43. package/lib/libs/core/constants.d.ts +0 -11
  44. package/lib/libs/core/constants.js +0 -20
  45. package/lib/libs/core/constants.js.map +0 -1
  46. package/lib/libs/core/file-mgmt/auditConfigFileManager.d.ts +0 -48
  47. package/lib/libs/core/file-mgmt/auditConfigFileManager.js +0 -145
  48. package/lib/libs/core/file-mgmt/auditConfigFileManager.js.map +0 -1
  49. package/lib/libs/core/file-mgmt/schema.d.ts +0 -123
  50. package/lib/libs/core/file-mgmt/schema.js +0 -69
  51. package/lib/libs/core/file-mgmt/schema.js.map +0 -1
  52. package/lib/libs/core/mdapi/mdapiRetriever.d.ts +0 -54
  53. package/lib/libs/core/mdapi/mdapiRetriever.js +0 -123
  54. package/lib/libs/core/mdapi/mdapiRetriever.js.map +0 -1
  55. package/lib/libs/core/mdapi/metadataRegistryEntry.d.ts +0 -40
  56. package/lib/libs/core/mdapi/metadataRegistryEntry.js +0 -46
  57. package/lib/libs/core/mdapi/metadataRegistryEntry.js.map +0 -1
  58. package/lib/libs/core/mdapi/namedMetadataToolingQueryable.d.ts +0 -33
  59. package/lib/libs/core/mdapi/namedMetadataToolingQueryable.js +0 -41
  60. package/lib/libs/core/mdapi/namedMetadataToolingQueryable.js.map +0 -1
  61. package/lib/libs/core/mdapi/namedMetadataType.d.ts +0 -20
  62. package/lib/libs/core/mdapi/namedMetadataType.js +0 -41
  63. package/lib/libs/core/mdapi/namedMetadataType.js.map +0 -1
  64. package/lib/libs/core/mdapi/singletonMetadataType.d.ts +0 -21
  65. package/lib/libs/core/mdapi/singletonMetadataType.js +0 -37
  66. package/lib/libs/core/mdapi/singletonMetadataType.js.map +0 -1
  67. package/lib/libs/core/policies/connectedAppPolicy.d.ts +0 -10
  68. package/lib/libs/core/policies/connectedAppPolicy.js +0 -78
  69. package/lib/libs/core/policies/connectedAppPolicy.js.map +0 -1
  70. package/lib/libs/core/policies/permissionSetPolicy.d.ts +0 -11
  71. package/lib/libs/core/policies/permissionSetPolicy.js +0 -62
  72. package/lib/libs/core/policies/permissionSetPolicy.js.map +0 -1
  73. package/lib/libs/core/policies/policy.d.ts +0 -31
  74. package/lib/libs/core/policies/policy.js +0 -100
  75. package/lib/libs/core/policies/policy.js.map +0 -1
  76. package/lib/libs/core/policies/profilePolicy.d.ts +0 -11
  77. package/lib/libs/core/policies/profilePolicy.js +0 -64
  78. package/lib/libs/core/policies/profilePolicy.js.map +0 -1
  79. package/lib/libs/core/policies/salesforceStandardTypes.d.ts +0 -53
  80. package/lib/libs/core/policies/salesforceStandardTypes.js +0 -2
  81. package/lib/libs/core/policies/salesforceStandardTypes.js.map +0 -1
  82. package/lib/libs/core/policies/userPolicy.d.ts +0 -11
  83. package/lib/libs/core/policies/userPolicy.js +0 -104
  84. package/lib/libs/core/policies/userPolicy.js.map +0 -1
  85. package/lib/libs/core/policy-types.d.ts +0 -18
  86. package/lib/libs/core/policy-types.js +0 -28
  87. package/lib/libs/core/policy-types.js.map +0 -1
  88. package/lib/libs/core/policyRegistry.d.ts +0 -23
  89. package/lib/libs/core/policyRegistry.js +0 -38
  90. package/lib/libs/core/policyRegistry.js.map +0 -1
  91. package/lib/libs/core/registries/connectedApps.d.ts +0 -13
  92. package/lib/libs/core/registries/connectedApps.js +0 -13
  93. package/lib/libs/core/registries/connectedApps.js.map +0 -1
  94. package/lib/libs/core/registries/permissionSets.d.ts +0 -11
  95. package/lib/libs/core/registries/permissionSets.js +0 -11
  96. package/lib/libs/core/registries/permissionSets.js.map +0 -1
  97. package/lib/libs/core/registries/profiles.d.ts +0 -11
  98. package/lib/libs/core/registries/profiles.js +0 -13
  99. package/lib/libs/core/registries/profiles.js.map +0 -1
  100. package/lib/libs/core/registries/ruleRegistry.d.ts +0 -37
  101. package/lib/libs/core/registries/ruleRegistry.js +0 -48
  102. package/lib/libs/core/registries/ruleRegistry.js.map +0 -1
  103. package/lib/libs/core/registries/rules/allUsedAppsUnderManagement.d.ts +0 -7
  104. package/lib/libs/core/registries/rules/allUsedAppsUnderManagement.js +0 -23
  105. package/lib/libs/core/registries/rules/allUsedAppsUnderManagement.js.map +0 -1
  106. package/lib/libs/core/registries/rules/enforceCustomPermsClassificationOnProfiles.d.ts +0 -7
  107. package/lib/libs/core/registries/rules/enforceCustomPermsClassificationOnProfiles.js +0 -52
  108. package/lib/libs/core/registries/rules/enforceCustomPermsClassificationOnProfiles.js.map +0 -1
  109. package/lib/libs/core/registries/rules/enforceUserPermsClassificationOnPermSets.d.ts +0 -7
  110. package/lib/libs/core/registries/rules/enforceUserPermsClassificationOnPermSets.js +0 -52
  111. package/lib/libs/core/registries/rules/enforceUserPermsClassificationOnPermSets.js.map +0 -1
  112. package/lib/libs/core/registries/rules/enforceUserPermsClassificationOnProfiles.d.ts +0 -7
  113. package/lib/libs/core/registries/rules/enforceUserPermsClassificationOnProfiles.js +0 -54
  114. package/lib/libs/core/registries/rules/enforceUserPermsClassificationOnProfiles.js.map +0 -1
  115. package/lib/libs/core/registries/rules/noInactiveUsers.d.ts +0 -9
  116. package/lib/libs/core/registries/rules/noInactiveUsers.js +0 -44
  117. package/lib/libs/core/registries/rules/noInactiveUsers.js.map +0 -1
  118. package/lib/libs/core/registries/rules/noOtherApexApiLogins.d.ts +0 -7
  119. package/lib/libs/core/registries/rules/noOtherApexApiLogins.js +0 -24
  120. package/lib/libs/core/registries/rules/noOtherApexApiLogins.js.map +0 -1
  121. package/lib/libs/core/registries/rules/noUserCanSelfAuthorize.d.ts +0 -7
  122. package/lib/libs/core/registries/rules/noUserCanSelfAuthorize.js +0 -31
  123. package/lib/libs/core/registries/rules/noUserCanSelfAuthorize.js.map +0 -1
  124. package/lib/libs/core/registries/rules/policyRule.d.ts +0 -21
  125. package/lib/libs/core/registries/rules/policyRule.js +0 -41
  126. package/lib/libs/core/registries/rules/policyRule.js.map +0 -1
  127. package/lib/libs/core/registries/types.d.ts +0 -37
  128. package/lib/libs/core/registries/types.js +0 -11
  129. package/lib/libs/core/registries/types.js.map +0 -1
  130. package/lib/libs/core/registries/users.d.ts +0 -26
  131. package/lib/libs/core/registries/users.js +0 -10
  132. package/lib/libs/core/registries/users.js.map +0 -1
  133. package/lib/libs/core/result-types.d.ts +0 -172
  134. package/lib/libs/core/result-types.js +0 -2
  135. package/lib/libs/core/result-types.js.map +0 -1
  136. package/lib/libs/core/utils.d.ts +0 -12
  137. package/lib/libs/core/utils.js +0 -31
  138. package/lib/libs/core/utils.js.map +0 -1
  139. package/lib/libs/quick-scan/types.d.ts +0 -17
  140. package/lib/libs/quick-scan/types.js +0 -2
  141. package/lib/libs/quick-scan/types.js.map +0 -1
  142. package/lib/libs/quick-scan/userPermissionScanner.d.ts +0 -22
  143. package/lib/libs/quick-scan/userPermissionScanner.js +0 -75
  144. package/lib/libs/quick-scan/userPermissionScanner.js.map +0 -1
  145. package/lib/ux/auditRunMultiStage.d.ts +0 -65
  146. package/lib/ux/auditRunMultiStage.js +0 -120
  147. package/lib/ux/auditRunMultiStage.js.map +0 -1
@@ -1,255 +1,4 @@
1
1
  {
2
- "commands": {
3
- "org:audit:init": {
4
- "aliases": [],
5
- "args": {},
6
- "description": "Uses your org's configuration to set up a new audit config at the target destination. This creates the basic classification and policy files that make up an audit config. You can select from presets to initialise risk levels with default values. After initialisation, you can customize the files to suit your needs.",
7
- "examples": [
8
- "Initialise audit policies at the root directory\n<%= config.bin %> <%= command.id %> -o MyTargetOrg",
9
- "Initialise audit config at custom directory with preset\n<%= config.bin %> <%= command.id %> -o MyTargetOrg -d my_dir -p loose"
10
- ],
11
- "flags": {
12
- "json": {
13
- "description": "Format output as json.",
14
- "helpGroup": "GLOBAL",
15
- "name": "json",
16
- "allowNo": false,
17
- "type": "boolean"
18
- },
19
- "flags-dir": {
20
- "helpGroup": "GLOBAL",
21
- "name": "flags-dir",
22
- "summary": "Import flag values from a directory.",
23
- "hasDynamicHelp": false,
24
- "multiple": false,
25
- "type": "option"
26
- },
27
- "target-org": {
28
- "char": "o",
29
- "name": "target-org",
30
- "noCacheDefault": true,
31
- "required": true,
32
- "summary": "Target org to export permissions, profiles, users, etc.",
33
- "hasDynamicHelp": true,
34
- "multiple": false,
35
- "type": "option"
36
- },
37
- "output-dir": {
38
- "char": "d",
39
- "name": "output-dir",
40
- "required": false,
41
- "summary": "Directory where the audit config is initialised. If not set, the root directory will be used.",
42
- "default": "",
43
- "hasDynamicHelp": false,
44
- "multiple": false,
45
- "type": "option"
46
- },
47
- "preset": {
48
- "char": "p",
49
- "description": "The selected preset is applied before any other default mechanisms (such as template configs). This means, values from a selected template override the preset. Consult the documentation to learn more about the rationale behind the default risk levels. The risk levels interact with the configured preset on profiles and permission sets and essentially control, if a permission is allowed in a certain profile / permission set.",
50
- "name": "preset",
51
- "summary": "Preset to initialise defaults for permission risk levels.",
52
- "default": "strict",
53
- "hasDynamicHelp": false,
54
- "multiple": false,
55
- "options": [
56
- "strict",
57
- "loose",
58
- "none"
59
- ],
60
- "type": "option"
61
- },
62
- "api-version": {
63
- "description": "Override the api version used for api requests made by this command",
64
- "name": "api-version",
65
- "hasDynamicHelp": false,
66
- "multiple": false,
67
- "type": "option"
68
- }
69
- },
70
- "hasDynamicHelp": true,
71
- "hiddenAliases": [],
72
- "id": "org:audit:init",
73
- "pluginAlias": "@j-schreiber/sf-cli-security-audit",
74
- "pluginName": "@j-schreiber/sf-cli-security-audit",
75
- "pluginType": "core",
76
- "strict": true,
77
- "summary": "Initialise a new audit config.",
78
- "enableJsonFlag": true,
79
- "isESM": true,
80
- "relativePath": [
81
- "lib",
82
- "commands",
83
- "org",
84
- "audit",
85
- "init.js"
86
- ],
87
- "aliasPermutations": [],
88
- "permutations": [
89
- "org:audit:init",
90
- "audit:org:init",
91
- "audit:init:org",
92
- "org:init:audit",
93
- "init:org:audit",
94
- "init:audit:org"
95
- ]
96
- },
97
- "org:audit:run": {
98
- "aliases": [],
99
- "args": {},
100
- "description": "Loads an existing audit config from the source directory and audits the target org. The audit run always creates a comprehensive report in JSON format.",
101
- "examples": [
102
- "Audit the org MyTargetOrg with the config in configs/prod\n<%= config.bin %> <%= command.id %> -o MyTargetOrg -d configs/prod"
103
- ],
104
- "flags": {
105
- "json": {
106
- "description": "Format output as json.",
107
- "helpGroup": "GLOBAL",
108
- "name": "json",
109
- "allowNo": false,
110
- "type": "boolean"
111
- },
112
- "flags-dir": {
113
- "helpGroup": "GLOBAL",
114
- "name": "flags-dir",
115
- "summary": "Import flag values from a directory.",
116
- "hasDynamicHelp": false,
117
- "multiple": false,
118
- "type": "option"
119
- },
120
- "target-org": {
121
- "char": "o",
122
- "name": "target-org",
123
- "noCacheDefault": true,
124
- "required": true,
125
- "summary": "The org that is audited.",
126
- "hasDynamicHelp": true,
127
- "multiple": false,
128
- "type": "option"
129
- },
130
- "source-dir": {
131
- "char": "d",
132
- "name": "source-dir",
133
- "required": false,
134
- "summary": "Source directory of the audit config to run.",
135
- "default": "",
136
- "hasDynamicHelp": false,
137
- "multiple": false,
138
- "type": "option"
139
- },
140
- "api-version": {
141
- "description": "Override the api version used for api requests made by this command",
142
- "name": "api-version",
143
- "hasDynamicHelp": false,
144
- "multiple": false,
145
- "type": "option"
146
- }
147
- },
148
- "hasDynamicHelp": true,
149
- "hiddenAliases": [],
150
- "id": "org:audit:run",
151
- "pluginAlias": "@j-schreiber/sf-cli-security-audit",
152
- "pluginName": "@j-schreiber/sf-cli-security-audit",
153
- "pluginType": "core",
154
- "strict": true,
155
- "summary": "Audit your org with an existing config.",
156
- "enableJsonFlag": true,
157
- "isESM": true,
158
- "relativePath": [
159
- "lib",
160
- "commands",
161
- "org",
162
- "audit",
163
- "run.js"
164
- ],
165
- "aliasPermutations": [],
166
- "permutations": [
167
- "org:audit:run",
168
- "audit:org:run",
169
- "audit:run:org",
170
- "org:run:audit",
171
- "run:org:audit",
172
- "run:audit:org"
173
- ]
174
- },
175
- "org:scan:user-perms": {
176
- "aliases": [],
177
- "args": {},
178
- "description": "The target org is scanned \"in memory\" and searches Profiles and Permission Sets for the named user permissions. This command does not need an audit config and does not create a report file.",
179
- "examples": [
180
- "Search for multiple permissions on MyTargetOrg\n<%= config.bin %> <%= command.id %> -o MyTargetOrg -n AuthorApex -n ModifyMetadata"
181
- ],
182
- "flags": {
183
- "json": {
184
- "description": "Format output as json.",
185
- "helpGroup": "GLOBAL",
186
- "name": "json",
187
- "allowNo": false,
188
- "type": "boolean"
189
- },
190
- "flags-dir": {
191
- "helpGroup": "GLOBAL",
192
- "name": "flags-dir",
193
- "summary": "Import flag values from a directory.",
194
- "hasDynamicHelp": false,
195
- "multiple": false,
196
- "type": "option"
197
- },
198
- "name": {
199
- "char": "n",
200
- "description": "You can specify any valid user permission on your org, such as \"AuthorApex\", \"CustomizeApplication\" or \"ViewSetup\". If you are unsure what permissions are available on your org, initialise a new audit config and check the created userPermissions.yml. Currently, the names are not validated: If you have a typo (such as \"AutorApex\", the scan will retun 0 results).",
201
- "name": "name",
202
- "required": true,
203
- "summary": "One or more permissions to be searched for.",
204
- "hasDynamicHelp": false,
205
- "multiple": true,
206
- "type": "option"
207
- },
208
- "target-org": {
209
- "char": "o",
210
- "name": "target-org",
211
- "noCacheDefault": true,
212
- "required": true,
213
- "summary": "The target org to scan.",
214
- "hasDynamicHelp": true,
215
- "multiple": false,
216
- "type": "option"
217
- },
218
- "api-version": {
219
- "description": "Override the api version used for api requests made by this command",
220
- "name": "api-version",
221
- "hasDynamicHelp": false,
222
- "multiple": false,
223
- "type": "option"
224
- }
225
- },
226
- "hasDynamicHelp": true,
227
- "hiddenAliases": [],
228
- "id": "org:scan:user-perms",
229
- "pluginAlias": "@j-schreiber/sf-cli-security-audit",
230
- "pluginName": "@j-schreiber/sf-cli-security-audit",
231
- "pluginType": "core",
232
- "strict": true,
233
- "summary": "Performs a quick scan for specific user permissions.",
234
- "enableJsonFlag": true,
235
- "isESM": true,
236
- "relativePath": [
237
- "lib",
238
- "commands",
239
- "org",
240
- "scan",
241
- "user-perms.js"
242
- ],
243
- "aliasPermutations": [],
244
- "permutations": [
245
- "org:scan:user-perms",
246
- "scan:org:user-perms",
247
- "scan:user-perms:org",
248
- "org:user-perms:scan",
249
- "user-perms:org:scan",
250
- "user-perms:scan:org"
251
- ]
252
- }
253
- },
254
- "version": "0.7.1"
2
+ "commands": {},
3
+ "version": "0.8.0"
255
4
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@j-schreiber/sf-cli-security-audit",
3
3
  "description": "Salesforce CLI plugin to automate highly configurable security audits",
4
- "version": "0.7.1",
4
+ "version": "0.8.0",
5
5
  "repository": {
6
6
  "type": "https",
7
7
  "url": "https://github.com/j-schreiber/js-sf-cli-security-audit"
@@ -1,19 +0,0 @@
1
- import { SfCommand } from '@salesforce/sf-plugins-core';
2
- import { AuditRunConfig } from '../../../libs/core/file-mgmt/schema.js';
3
- import { AuditInitPresets } from '../../../libs/conf-init/presets.js';
4
- export type OrgAuditInitResult = AuditRunConfig;
5
- export default class OrgAuditInit extends SfCommand<OrgAuditInitResult> {
6
- static readonly summary: string;
7
- static readonly description: string;
8
- static readonly examples: string[];
9
- static readonly flags: {
10
- 'target-org': import("@oclif/core/interfaces").OptionFlag<import("@salesforce/core").Org, import("@oclif/core/interfaces").CustomOptions>;
11
- 'output-dir': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
- preset: import("@oclif/core/interfaces").OptionFlag<AuditInitPresets, import("@oclif/core/interfaces").CustomOptions>;
13
- 'api-version': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
- };
15
- run(): Promise<OrgAuditInitResult>;
16
- private printResults;
17
- private printClassifications;
18
- private printPolicies;
19
- }
@@ -1,72 +0,0 @@
1
- import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
2
- import { Messages } from '@salesforce/core';
3
- import AuditConfig from '../../../libs/conf-init/auditConfig.js';
4
- import { isPermissionsConfig, isPolicyConfig, } from '../../../libs/core/file-mgmt/schema.js';
5
- import { AuditInitPresets } from '../../../libs/conf-init/presets.js';
6
- import { capitalize } from '../../../libs/core/utils.js';
7
- Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
8
- const messages = Messages.loadMessages('@j-schreiber/sf-cli-security-audit', 'org.audit.init');
9
- const presetFlag = Flags.custom({
10
- char: 'p',
11
- summary: messages.getMessage('flags.preset.summary'),
12
- description: messages.getMessage('flags.preset.description'),
13
- options: Object.values(AuditInitPresets),
14
- default: AuditInitPresets.strict,
15
- })();
16
- export default class OrgAuditInit extends SfCommand {
17
- static summary = messages.getMessage('summary');
18
- static description = messages.getMessage('description');
19
- static examples = messages.getMessages('examples');
20
- static flags = {
21
- 'target-org': Flags.requiredOrg({
22
- summary: messages.getMessage('flags.target-org.summary'),
23
- char: 'o',
24
- required: true,
25
- }),
26
- 'output-dir': Flags.directory({
27
- required: false,
28
- char: 'd',
29
- summary: messages.getMessage('flags.output-dir.summary'),
30
- default: '',
31
- }),
32
- preset: presetFlag,
33
- 'api-version': Flags.orgApiVersion(),
34
- };
35
- async run() {
36
- const { flags } = await this.parse(OrgAuditInit);
37
- const auditConfig = await AuditConfig.init(flags['target-org'].getConnection(flags['api-version']), {
38
- targetDir: flags['output-dir'],
39
- preset: flags.preset,
40
- });
41
- this.printResults(auditConfig);
42
- return auditConfig;
43
- }
44
- printResults(config) {
45
- this.printClassifications(config.classifications);
46
- this.printPolicies(config.policies);
47
- }
48
- printClassifications(classifications) {
49
- Object.values(classifications).forEach((def) => {
50
- if (isPermissionsConfig(def)) {
51
- const perms = def.content.permissions ? Object.entries(def.content.permissions) : [];
52
- if (perms.length > 0) {
53
- this.logSuccess(messages.getMessage('success.perm-classification-summary', [perms.length ?? 0, def.filePath]));
54
- }
55
- }
56
- });
57
- }
58
- printPolicies(policies) {
59
- Object.entries(policies).forEach(([name, def]) => {
60
- if (isPolicyConfig(def)) {
61
- if (def.filePath) {
62
- this.logSuccess(messages.getMessage('success.policy-summary', [
63
- capitalize(name),
64
- Object.keys(def.content.rules).length ?? 0,
65
- def.filePath,
66
- ]));
67
- }
68
- }
69
- });
70
- }
71
- }
72
- //# sourceMappingURL=init.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../src/commands/org/audit/init.ts"],"names":[],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- import { Interfaces } from '@oclif/core';
2
- import { SfCommand } from '@salesforce/sf-plugins-core';
3
- import { AuditResult } from '../../../libs/core/result-types.js';
4
- export type OrgAuditRunResult = AuditResult & {
5
- filePath: string;
6
- };
7
- export default class OrgAuditRun extends SfCommand<OrgAuditRunResult> {
8
- static readonly summary: string;
9
- static readonly description: string;
10
- static readonly examples: string[];
11
- static readonly flags: {
12
- 'target-org': Interfaces.OptionFlag<import("@salesforce/core").Org, Interfaces.CustomOptions>;
13
- 'source-dir': Interfaces.OptionFlag<string, Interfaces.CustomOptions>;
14
- 'api-version': Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
15
- };
16
- run(): Promise<OrgAuditRunResult>;
17
- private printResults;
18
- private printPoliciesSummary;
19
- private printExecutedRulesSummary;
20
- private printRuleViolations;
21
- private writeReport;
22
- }
@@ -1,119 +0,0 @@
1
- import { writeFileSync } from 'node:fs';
2
- import path from 'node:path';
3
- import { SfCommand, Flags, StandardColors } from '@salesforce/sf-plugins-core';
4
- import { Messages } from '@salesforce/core';
5
- import { startAuditRun } from '../../../libs/core/auditRun.js';
6
- import AuditRunMultiStageOutput from '../../../ux/auditRunMultiStage.js';
7
- import { capitalize } from '../../../libs/core/utils.js';
8
- Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
9
- const messages = Messages.loadMessages('@j-schreiber/sf-cli-security-audit', 'org.audit.run');
10
- export default class OrgAuditRun extends SfCommand {
11
- static summary = messages.getMessage('summary');
12
- static description = messages.getMessage('description');
13
- static examples = messages.getMessages('examples');
14
- static flags = {
15
- 'target-org': Flags.requiredOrg({
16
- summary: messages.getMessage('flags.target-org.summary'),
17
- char: 'o',
18
- required: true,
19
- }),
20
- 'source-dir': Flags.directory({
21
- required: false,
22
- char: 'd',
23
- summary: messages.getMessage('flags.source-dir.summary'),
24
- default: '',
25
- }),
26
- 'api-version': Flags.orgApiVersion(),
27
- };
28
- async run() {
29
- const { flags } = await this.parse(OrgAuditRun);
30
- const stageOutput = AuditRunMultiStageOutput.create({
31
- directoryRootPath: flags['source-dir'],
32
- targetOrg: flags['target-org'].getUsername() ?? flags['target-org'].getOrgId(),
33
- jsonEnabled: flags.json,
34
- });
35
- stageOutput.start();
36
- const auditRun = startAuditRun(flags['source-dir']);
37
- stageOutput.startPolicyResolve(auditRun);
38
- await auditRun.resolve(flags['target-org'].getConnection(flags['api-version']));
39
- stageOutput.startRuleExecution();
40
- const partialResult = await auditRun.execute(flags['target-org'].getConnection(flags['api-version']));
41
- const result = { orgId: flags['target-org'].getOrgId(), ...partialResult };
42
- stageOutput.finish();
43
- this.printResults(result);
44
- const filePath = this.writeReport(result, flags);
45
- return { ...result, filePath };
46
- }
47
- printResults(result) {
48
- this.printPoliciesSummary(result);
49
- Object.entries(result.policies).forEach(([policyName, policyDetails]) => {
50
- this.printExecutedRulesSummary(policyName, policyDetails);
51
- this.printRuleViolations(policyDetails.executedRules);
52
- });
53
- }
54
- printPoliciesSummary(result) {
55
- const polSummaries = transposePoliciesToTable(result);
56
- if (result.isCompliant) {
57
- this.logSuccess(messages.getMessage('success.all-policies-compliant'));
58
- this.log('');
59
- }
60
- else {
61
- this.log(StandardColors.error(messages.getMessage('summary-non-compliant')));
62
- this.log('');
63
- }
64
- this.table({ data: polSummaries, title: '=== Summary ===', titleOptions: { bold: true } });
65
- }
66
- printExecutedRulesSummary(policyName, policyDetails) {
67
- if (!policyDetails.enabled) {
68
- return;
69
- }
70
- const rulesSummary = transposeExecutedPolicyRules(policyDetails);
71
- if (rulesSummary.length > 0) {
72
- this.table({
73
- data: rulesSummary,
74
- title: `--- Executed Rules for ${capitalize(policyName)} ---`,
75
- titleOptions: { underline: true },
76
- });
77
- }
78
- }
79
- printRuleViolations(executedRules) {
80
- Object.values(executedRules)
81
- .filter((ruleDetails) => !ruleDetails.isCompliant)
82
- .forEach((uncompliantRule) => {
83
- this.table({ data: uncompliantRule.violations, title: `Violations for ${uncompliantRule.ruleName}` });
84
- });
85
- }
86
- writeReport(result, flags) {
87
- const fileName = `report_${flags['target-org'].getOrgId()}_${Date.now()}.json`;
88
- const fullPath = path.join(flags['source-dir'], fileName);
89
- writeFileSync(fullPath, JSON.stringify(result, null, 2));
90
- this.info(messages.getMessage('info.report-file-location', [fullPath]));
91
- return fullPath;
92
- }
93
- }
94
- function transposePoliciesToTable(result) {
95
- return Object.entries(result.policies)
96
- .filter(([, policyDetails]) => policyDetails.enabled)
97
- .map(([policyName, policyDetails]) => {
98
- const rulesExecuted = policyDetails?.executedRules ? Object.keys(policyDetails.executedRules).length : 0;
99
- return {
100
- policy: capitalize(policyName),
101
- isCompliant: policyDetails.isCompliant,
102
- rulesExecuted,
103
- auditedEntities: policyDetails.auditedEntities?.length ?? 0,
104
- ignoredEntities: policyDetails.ignoredEntities?.length ?? 0,
105
- };
106
- });
107
- }
108
- function transposeExecutedPolicyRules(result) {
109
- return Object.entries(result.executedRules).map(([ruleName, ruleDetails]) => ({
110
- rule: ruleName,
111
- isCompliant: ruleDetails.isCompliant,
112
- compliantEntities: ruleDetails.compliantEntities?.length ?? 0,
113
- violatedEntities: ruleDetails.violatedEntities?.length ?? 0,
114
- violations: ruleDetails.violations.length,
115
- warnings: ruleDetails.warnings.length,
116
- errors: ruleDetails.errors.length,
117
- }));
118
- }
119
- //# sourceMappingURL=run.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../src/commands/org/audit/run.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- import { SfCommand } from '@salesforce/sf-plugins-core';
2
- import { QuickScanResult } from '../../../libs/quick-scan/types.js';
3
- import { EntityScanStatus } from '../../../libs/quick-scan/userPermissionScanner.js';
4
- export type OrgUserPermScanResult = QuickScanResult;
5
- export default class OrgUserPermScan extends SfCommand<OrgUserPermScanResult> {
6
- static readonly summary: string;
7
- static readonly description: string;
8
- static readonly examples: string[];
9
- static readonly flags: {
10
- name: import("@oclif/core/interfaces").OptionFlag<string[], import("@oclif/core/interfaces").CustomOptions>;
11
- 'target-org': import("@oclif/core/interfaces").OptionFlag<import("@salesforce/core").Org, import("@oclif/core/interfaces").CustomOptions>;
12
- 'api-version': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
- };
14
- run(): Promise<OrgUserPermScanResult>;
15
- private reportProgress;
16
- private print;
17
- private printSummary;
18
- private printPermissionResults;
19
- }
20
- export declare function isEntityStatus(cls: unknown): cls is EntityScanStatus;
@@ -1,87 +0,0 @@
1
- import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
2
- import { Messages } from '@salesforce/core';
3
- import UserPermissionScanner from '../../../libs/quick-scan/userPermissionScanner.js';
4
- import { capitalize } from '../../../libs/core/utils.js';
5
- Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
6
- const messages = Messages.loadMessages('@j-schreiber/sf-cli-security-audit', 'org.scan.user-perms');
7
- export default class OrgUserPermScan extends SfCommand {
8
- static summary = messages.getMessage('summary');
9
- static description = messages.getMessage('description');
10
- static examples = messages.getMessages('examples');
11
- static flags = {
12
- name: Flags.string({
13
- summary: messages.getMessage('flags.name.summary'),
14
- description: messages.getMessage('flags.name.description'),
15
- char: 'n',
16
- multiple: true,
17
- required: true,
18
- }),
19
- 'target-org': Flags.requiredOrg({
20
- summary: messages.getMessage('flags.target-org.summary'),
21
- char: 'o',
22
- required: true,
23
- }),
24
- 'api-version': Flags.orgApiVersion(),
25
- };
26
- async run() {
27
- const { flags } = await this.parse(OrgUserPermScan);
28
- const scanner = new UserPermissionScanner();
29
- scanner.on('progress', this.reportProgress);
30
- const result = await scanner.quickScan({
31
- targetOrg: flags['target-org'].getConnection(flags['api-version']),
32
- permissions: flags.name,
33
- });
34
- this.print(result);
35
- return result;
36
- }
37
- reportProgress = (event) => {
38
- if (event.status === 'Pending') {
39
- this.spinner.start('Scanning');
40
- }
41
- const counters = [];
42
- Object.entries(event).forEach(([propName, entityStatus]) => {
43
- if (isEntityStatus(entityStatus)) {
44
- counters.push(`${capitalize(propName)} (${entityStatus.resolved}/${entityStatus.total})`);
45
- }
46
- });
47
- this.spinner.status = counters.join(' | ');
48
- if (event.status === 'Completed') {
49
- this.spinner.stop();
50
- this.logSuccess(messages.getMessage('success.scanned-entities-count', [event.profiles.total, event.permissionSets.total]));
51
- this.log();
52
- }
53
- };
54
- print(result) {
55
- this.printSummary(result);
56
- Object.entries(result.permissions).forEach(([permName, permResult]) => {
57
- this.printPermissionResults(permName, permResult);
58
- });
59
- }
60
- printSummary(result) {
61
- const data = [];
62
- Object.entries(result.permissions).forEach(([permissionName, permResult]) => {
63
- data.push({
64
- permissionName,
65
- profiles: permResult.profiles.length,
66
- permissionSets: permResult.permissionSets.length,
67
- });
68
- });
69
- this.table({ data, title: '=== Summary ===', titleOptions: { bold: true } });
70
- }
71
- printPermissionResults(permissionName, result) {
72
- const data = [];
73
- result.profiles.forEach((entityName) => {
74
- data.push({ entityName, type: 'Profile' });
75
- });
76
- result.permissionSets.forEach((entityName) => {
77
- data.push({ entityName, type: 'Permission Set' });
78
- });
79
- if (data.length > 0) {
80
- this.table({ data, title: permissionName, titleOptions: { underline: true } });
81
- }
82
- }
83
- }
84
- export function isEntityStatus(cls) {
85
- return cls.total !== undefined && cls.resolved !== undefined;
86
- }
87
- //# sourceMappingURL=user-perms.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user-perms.js","sourceRoot":"","sources":["../../../../src/commands/org/scan/user-perms.ts"],"names":[],"mappings":"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"}