getdoorman 1.0.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 (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +181 -0
  3. package/bin/doorman.js +444 -0
  4. package/package.json +74 -0
  5. package/src/ai-fixer.js +559 -0
  6. package/src/ast-scanner.js +434 -0
  7. package/src/auth.js +149 -0
  8. package/src/baseline.js +48 -0
  9. package/src/compliance.js +539 -0
  10. package/src/config.js +466 -0
  11. package/src/custom-rules.js +32 -0
  12. package/src/dashboard.js +202 -0
  13. package/src/detector.js +142 -0
  14. package/src/fix-engine.js +48 -0
  15. package/src/fix-registry-extra.js +95 -0
  16. package/src/fix-registry-go-rust.js +77 -0
  17. package/src/fix-registry-java-csharp.js +77 -0
  18. package/src/fix-registry-js.js +99 -0
  19. package/src/fix-registry-mcp-ai.js +57 -0
  20. package/src/fix-registry-python.js +87 -0
  21. package/src/fixer-ruby-php.js +608 -0
  22. package/src/fixer.js +2113 -0
  23. package/src/hooks.js +115 -0
  24. package/src/ignore.js +176 -0
  25. package/src/index.js +384 -0
  26. package/src/metrics.js +126 -0
  27. package/src/monorepo.js +65 -0
  28. package/src/presets.js +54 -0
  29. package/src/reporter.js +975 -0
  30. package/src/rule-worker.js +36 -0
  31. package/src/rules/ast-rules.js +756 -0
  32. package/src/rules/bugs/accessibility.js +235 -0
  33. package/src/rules/bugs/ai-codegen-fixable.js +172 -0
  34. package/src/rules/bugs/ai-codegen.js +365 -0
  35. package/src/rules/bugs/code-smell-bugs.js +247 -0
  36. package/src/rules/bugs/crypto-bugs.js +195 -0
  37. package/src/rules/bugs/docker-bugs.js +158 -0
  38. package/src/rules/bugs/general.js +361 -0
  39. package/src/rules/bugs/go-bugs.js +279 -0
  40. package/src/rules/bugs/index.js +73 -0
  41. package/src/rules/bugs/js-api.js +257 -0
  42. package/src/rules/bugs/js-array-object.js +210 -0
  43. package/src/rules/bugs/js-async-fixable.js +223 -0
  44. package/src/rules/bugs/js-async.js +211 -0
  45. package/src/rules/bugs/js-closure-scope.js +182 -0
  46. package/src/rules/bugs/js-database.js +203 -0
  47. package/src/rules/bugs/js-error-handling.js +148 -0
  48. package/src/rules/bugs/js-logic.js +261 -0
  49. package/src/rules/bugs/js-memory.js +214 -0
  50. package/src/rules/bugs/js-node.js +361 -0
  51. package/src/rules/bugs/js-react.js +373 -0
  52. package/src/rules/bugs/js-regex.js +200 -0
  53. package/src/rules/bugs/js-state.js +272 -0
  54. package/src/rules/bugs/js-type-coercion.js +318 -0
  55. package/src/rules/bugs/nextjs-bugs.js +242 -0
  56. package/src/rules/bugs/nextjs-fixable.js +120 -0
  57. package/src/rules/bugs/node-fixable.js +178 -0
  58. package/src/rules/bugs/python-advanced.js +245 -0
  59. package/src/rules/bugs/python-fixable.js +98 -0
  60. package/src/rules/bugs/python.js +284 -0
  61. package/src/rules/bugs/react-fixable.js +207 -0
  62. package/src/rules/bugs/ruby-bugs.js +182 -0
  63. package/src/rules/bugs/shell-bugs.js +181 -0
  64. package/src/rules/bugs/silent-failures.js +261 -0
  65. package/src/rules/bugs/ts-bugs.js +235 -0
  66. package/src/rules/bugs/unused-vars.js +65 -0
  67. package/src/rules/compliance/accessibility-ext.js +468 -0
  68. package/src/rules/compliance/education.js +322 -0
  69. package/src/rules/compliance/financial.js +421 -0
  70. package/src/rules/compliance/frameworks.js +507 -0
  71. package/src/rules/compliance/healthcare.js +520 -0
  72. package/src/rules/compliance/index.js +2714 -0
  73. package/src/rules/compliance/regional-eu.js +480 -0
  74. package/src/rules/compliance/regional-international.js +903 -0
  75. package/src/rules/cost/index.js +1993 -0
  76. package/src/rules/data/index.js +2503 -0
  77. package/src/rules/dependencies/index.js +1684 -0
  78. package/src/rules/deployment/index.js +2050 -0
  79. package/src/rules/index.js +71 -0
  80. package/src/rules/infrastructure/index.js +3048 -0
  81. package/src/rules/performance/index.js +3455 -0
  82. package/src/rules/quality/index.js +3175 -0
  83. package/src/rules/reliability/index.js +3040 -0
  84. package/src/rules/scope-rules.js +815 -0
  85. package/src/rules/security/ai-api.js +1177 -0
  86. package/src/rules/security/auth.js +1328 -0
  87. package/src/rules/security/cors.js +127 -0
  88. package/src/rules/security/crypto.js +527 -0
  89. package/src/rules/security/csharp.js +862 -0
  90. package/src/rules/security/csrf.js +193 -0
  91. package/src/rules/security/dart.js +835 -0
  92. package/src/rules/security/deserialization.js +291 -0
  93. package/src/rules/security/file-upload.js +187 -0
  94. package/src/rules/security/go.js +850 -0
  95. package/src/rules/security/headers.js +235 -0
  96. package/src/rules/security/index.js +65 -0
  97. package/src/rules/security/injection.js +1639 -0
  98. package/src/rules/security/mcp-server.js +71 -0
  99. package/src/rules/security/misconfiguration.js +660 -0
  100. package/src/rules/security/oauth-jwt.js +329 -0
  101. package/src/rules/security/path-traversal.js +295 -0
  102. package/src/rules/security/php.js +1054 -0
  103. package/src/rules/security/prototype-pollution.js +283 -0
  104. package/src/rules/security/rate-limiting.js +208 -0
  105. package/src/rules/security/ruby.js +1061 -0
  106. package/src/rules/security/rust.js +693 -0
  107. package/src/rules/security/secrets.js +747 -0
  108. package/src/rules/security/shell.js +647 -0
  109. package/src/rules/security/ssrf.js +298 -0
  110. package/src/rules/security/supply-chain-advanced.js +393 -0
  111. package/src/rules/security/supply-chain.js +734 -0
  112. package/src/rules/security/swift.js +835 -0
  113. package/src/rules/security/taint.js +27 -0
  114. package/src/rules/security/xss.js +520 -0
  115. package/src/scan-cache.js +71 -0
  116. package/src/scanner.js +710 -0
  117. package/src/scope-analyzer.js +685 -0
  118. package/src/share.js +88 -0
  119. package/src/taint.js +300 -0
  120. package/src/telemetry.js +183 -0
  121. package/src/tracer.js +190 -0
  122. package/src/upload.js +35 -0
  123. package/src/worker.js +31 -0
@@ -0,0 +1,235 @@
1
+ const JS_EXT = ['.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs'];
2
+ const isJS = (f) => JS_EXT.some(ext => f.endsWith(ext));
3
+
4
+ const rules = [
5
+ // SEC-HDR-001
6
+ {
7
+ id: 'SEC-HDR-001', category: 'security', severity: 'high', confidence: 'likely',
8
+ title: 'Missing Content-Security-Policy header',
9
+ check({ files, stack }) {
10
+ const findings = [];
11
+ if (stack.runtime !== 'node') return findings;
12
+ const hasCSP = [...files.values()].some(c =>
13
+ c.includes('Content-Security-Policy') || c.includes('contentSecurityPolicy')
14
+ );
15
+ const hasHelmet = 'helmet' in (stack.dependencies || {});
16
+ if (!hasCSP && !hasHelmet) {
17
+ findings.push({
18
+ ruleId: 'SEC-HDR-001', category: 'security', severity: 'high',
19
+ title: 'No Content-Security-Policy header — XSS attacks not mitigated',
20
+ description: 'CSP restricts which scripts can run on your page, preventing XSS.',
21
+ fix: null,
22
+ });
23
+ }
24
+ return findings;
25
+ },
26
+ },
27
+
28
+ // SEC-HDR-002
29
+ {
30
+ id: 'SEC-HDR-002', category: 'security', severity: 'medium', confidence: 'likely',
31
+ title: 'Missing X-Content-Type-Options header',
32
+ check({ files, stack }) {
33
+ const findings = [];
34
+ if (stack.runtime !== 'node') return findings;
35
+ const has = [...files.values()].some(c => c.includes('X-Content-Type-Options') || c.includes('nosniff'));
36
+ const hasHelmet = 'helmet' in (stack.dependencies || {});
37
+ if (!has && !hasHelmet) {
38
+ findings.push({
39
+ ruleId: 'SEC-HDR-002', category: 'security', severity: 'medium',
40
+ title: 'Missing X-Content-Type-Options: nosniff header',
41
+ fix: null,
42
+ });
43
+ }
44
+ return findings;
45
+ },
46
+ },
47
+
48
+ // SEC-HDR-003
49
+ {
50
+ id: 'SEC-HDR-003', category: 'security', severity: 'medium', confidence: 'likely',
51
+ title: 'Missing X-Frame-Options header',
52
+ check({ files, stack }) {
53
+ const findings = [];
54
+ if (stack.runtime !== 'node') return findings;
55
+ const has = [...files.values()].some(c => c.includes('X-Frame-Options') || c.includes('frameguard'));
56
+ const hasHelmet = 'helmet' in (stack.dependencies || {});
57
+ if (!has && !hasHelmet) {
58
+ findings.push({
59
+ ruleId: 'SEC-HDR-003', category: 'security', severity: 'medium',
60
+ title: 'Missing X-Frame-Options header — clickjacking possible',
61
+ fix: null,
62
+ });
63
+ }
64
+ return findings;
65
+ },
66
+ },
67
+
68
+ // SEC-HDR-004
69
+ {
70
+ id: 'SEC-HDR-004', category: 'security', severity: 'high', confidence: 'likely',
71
+ title: 'Missing Strict-Transport-Security header',
72
+ check({ files, stack }) {
73
+ const findings = [];
74
+ if (stack.runtime !== 'node') return findings;
75
+ const has = [...files.values()].some(c => c.includes('Strict-Transport-Security') || c.includes('hsts'));
76
+ const hasHelmet = 'helmet' in (stack.dependencies || {});
77
+ if (!has && !hasHelmet) {
78
+ findings.push({
79
+ ruleId: 'SEC-HDR-004', category: 'security', severity: 'high',
80
+ title: 'Missing HSTS header — HTTPS downgrade attacks possible',
81
+ fix: null,
82
+ });
83
+ }
84
+ return findings;
85
+ },
86
+ },
87
+
88
+ // SEC-HDR-005
89
+ {
90
+ id: 'SEC-HDR-005', category: 'security', severity: 'low', confidence: 'suggestion',
91
+ title: 'Missing X-XSS-Protection header',
92
+ check({ files, stack }) {
93
+ const findings = [];
94
+ if (stack.runtime !== 'node') return findings;
95
+ const has = [...files.values()].some(c => c.includes('X-XSS-Protection'));
96
+ const hasHelmet = 'helmet' in (stack.dependencies || {});
97
+ if (!has && !hasHelmet) {
98
+ findings.push({
99
+ ruleId: 'SEC-HDR-005', category: 'security', severity: 'low',
100
+ title: 'Missing X-XSS-Protection header (legacy browser protection)',
101
+ fix: null,
102
+ });
103
+ }
104
+ return findings;
105
+ },
106
+ },
107
+
108
+ // SEC-HDR-006
109
+ {
110
+ id: 'SEC-HDR-006', category: 'security', severity: 'medium', confidence: 'likely',
111
+ title: 'Missing Referrer-Policy header',
112
+ check({ files, stack }) {
113
+ const findings = [];
114
+ if (stack.runtime !== 'node') return findings;
115
+ const has = [...files.values()].some(c => c.includes('Referrer-Policy') || c.includes('referrerPolicy'));
116
+ const hasHelmet = 'helmet' in (stack.dependencies || {});
117
+ if (!has && !hasHelmet) {
118
+ findings.push({
119
+ ruleId: 'SEC-HDR-006', category: 'security', severity: 'medium',
120
+ title: 'Missing Referrer-Policy — URLs leaked to third parties via referrer',
121
+ fix: null,
122
+ });
123
+ }
124
+ return findings;
125
+ },
126
+ },
127
+
128
+ // SEC-HDR-007
129
+ {
130
+ id: 'SEC-HDR-007', category: 'security', severity: 'medium', confidence: 'likely',
131
+ title: 'Missing Permissions-Policy header',
132
+ check({ files, stack }) {
133
+ const findings = [];
134
+ if (stack.runtime !== 'node') return findings;
135
+ const has = [...files.values()].some(c =>
136
+ c.includes('Permissions-Policy') || c.includes('Feature-Policy') || c.includes('permissionsPolicy')
137
+ );
138
+ const hasHelmet = 'helmet' in (stack.dependencies || {});
139
+ if (!has && !hasHelmet) {
140
+ findings.push({
141
+ ruleId: 'SEC-HDR-007', category: 'security', severity: 'medium',
142
+ title: 'Missing Permissions-Policy — browser features (camera, mic, location) not restricted',
143
+ fix: null,
144
+ });
145
+ }
146
+ return findings;
147
+ },
148
+ },
149
+
150
+ // SEC-HDR-008
151
+ {
152
+ id: 'SEC-HDR-008', category: 'security', severity: 'low', confidence: 'suggestion',
153
+ title: 'Server header exposes version info',
154
+ check({ files }) {
155
+ const findings = [];
156
+ for (const [fp, content] of files) {
157
+ if (!isJS(fp)) continue;
158
+ if (content.match(/(?:res|response)\.(?:setHeader|set)\s*\(\s*['"]Server['"]/i)) {
159
+ findings.push({
160
+ ruleId: 'SEC-HDR-008', category: 'security', severity: 'low',
161
+ title: 'Server header set — may expose server technology and version',
162
+ file: fp, fix: null,
163
+ });
164
+ }
165
+ }
166
+ return findings;
167
+ },
168
+ },
169
+
170
+ // SEC-HDR-009
171
+ {
172
+ id: 'SEC-HDR-009', category: 'security', severity: 'low', confidence: 'suggestion',
173
+ title: 'X-Powered-By header exposed',
174
+ check({ files, stack }) {
175
+ const findings = [];
176
+ if (stack.framework !== 'express') return findings;
177
+ const hasHelmet = 'helmet' in (stack.dependencies || {});
178
+ const disablesPoweredBy = [...files.values()].some(c =>
179
+ c.includes('x-powered-by') || c.includes('X-Powered-By') || c.includes('hidePoweredBy') || c.includes("disable('x-powered-by')")
180
+ );
181
+ if (!hasHelmet && !disablesPoweredBy) {
182
+ findings.push({
183
+ ruleId: 'SEC-HDR-009', category: 'security', severity: 'low',
184
+ title: 'Express X-Powered-By header reveals technology stack',
185
+ description: 'Use app.disable("x-powered-by") or helmet to remove it.',
186
+ fix: null,
187
+ });
188
+ }
189
+ return findings;
190
+ },
191
+ },
192
+
193
+ // SEC-HDR-010
194
+ {
195
+ id: 'SEC-HDR-010', category: 'security', severity: 'medium', confidence: 'likely',
196
+ title: 'Insecure CSP with unsafe-inline/unsafe-eval',
197
+ check({ files }) {
198
+ const findings = [];
199
+ for (const [fp, content] of files) {
200
+ if (!isJS(fp)) continue;
201
+ if (content.includes('Content-Security-Policy') || content.includes('contentSecurityPolicy')) {
202
+ if (content.includes("'unsafe-inline'") || content.includes("'unsafe-eval'")) {
203
+ findings.push({
204
+ ruleId: 'SEC-HDR-010', category: 'security', severity: 'medium',
205
+ title: 'CSP includes unsafe-inline or unsafe-eval — weakens XSS protection',
206
+ file: fp, fix: null,
207
+ });
208
+ }
209
+ }
210
+ }
211
+ return findings;
212
+ },
213
+ },
214
+
215
+ // SEC-HDR-011
216
+ {
217
+ id: 'SEC-HDR-011', category: 'security', severity: 'high', confidence: 'likely',
218
+ title: 'No helmet.js in Express app',
219
+ check({ files, stack }) {
220
+ const findings = [];
221
+ if (stack.framework !== 'express') return findings;
222
+ if (!('helmet' in (stack.dependencies || {}))) {
223
+ findings.push({
224
+ ruleId: 'SEC-HDR-011', category: 'security', severity: 'high',
225
+ title: 'Express app without helmet middleware — no security headers set',
226
+ description: 'Install and use helmet to automatically set security headers.',
227
+ fix: null,
228
+ });
229
+ }
230
+ return findings;
231
+ },
232
+ },
233
+ ];
234
+
235
+ export default rules;
@@ -0,0 +1,65 @@
1
+ import injectionRules from './injection.js';
2
+ import xssRules from './xss.js';
3
+ import csrfRules from './csrf.js';
4
+ import headersRules from './headers.js';
5
+ import corsRules from './cors.js';
6
+ import rateLimitingRules from './rate-limiting.js';
7
+ import fileUploadRules from './file-upload.js';
8
+ import cryptoRules from './crypto.js';
9
+ import secretsRules from './secrets.js';
10
+ import misconfigRules from './misconfiguration.js';
11
+ import authRules from './auth.js';
12
+ import supplyChainRules from './supply-chain.js';
13
+ import taintRules from './taint.js';
14
+ import prototypePollutionRules from './prototype-pollution.js';
15
+ import ssrfRules from './ssrf.js';
16
+ import deserializationRules from './deserialization.js';
17
+ import pathTraversalRules from './path-traversal.js';
18
+ import oauthJwtRules from './oauth-jwt.js';
19
+ import supplyChainAdvancedRules from './supply-chain-advanced.js';
20
+ import goRules from './go.js';
21
+ import rustRules from './rust.js';
22
+ import csharpRules from './csharp.js';
23
+ import swiftRules from './swift.js';
24
+ import dartRules from './dart.js';
25
+ import shellRules from './shell.js';
26
+ import rubyRules from './ruby.js';
27
+ import phpRules from './php.js';
28
+ import scopeRules from '../scope-rules.js';
29
+ import mcpServerRules from './mcp-server.js';
30
+ import aiApiRules from './ai-api.js';
31
+
32
+ const rules = [
33
+ ...injectionRules,
34
+ ...xssRules,
35
+ ...csrfRules,
36
+ ...headersRules,
37
+ ...corsRules,
38
+ ...rateLimitingRules,
39
+ ...fileUploadRules,
40
+ ...cryptoRules,
41
+ ...secretsRules,
42
+ ...misconfigRules,
43
+ ...authRules,
44
+ ...supplyChainRules,
45
+ ...taintRules,
46
+ ...prototypePollutionRules,
47
+ ...ssrfRules,
48
+ ...deserializationRules,
49
+ ...pathTraversalRules,
50
+ ...oauthJwtRules,
51
+ ...supplyChainAdvancedRules,
52
+ ...goRules,
53
+ ...rustRules,
54
+ ...csharpRules,
55
+ ...swiftRules,
56
+ ...dartRules,
57
+ ...shellRules,
58
+ ...rubyRules,
59
+ ...phpRules,
60
+ ...scopeRules,
61
+ ...mcpServerRules,
62
+ ...aiApiRules,
63
+ ];
64
+
65
+ export default rules;