driftdetect-detectors 0.1.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.
- package/dist/accessibility/alt-text.d.ts +63 -0
- package/dist/accessibility/alt-text.d.ts.map +1 -0
- package/dist/accessibility/alt-text.js +100 -0
- package/dist/accessibility/alt-text.js.map +1 -0
- package/dist/accessibility/aria-roles.d.ts +65 -0
- package/dist/accessibility/aria-roles.d.ts.map +1 -0
- package/dist/accessibility/aria-roles.js +87 -0
- package/dist/accessibility/aria-roles.js.map +1 -0
- package/dist/accessibility/focus-management.d.ts +62 -0
- package/dist/accessibility/focus-management.d.ts.map +1 -0
- package/dist/accessibility/focus-management.js +88 -0
- package/dist/accessibility/focus-management.js.map +1 -0
- package/dist/accessibility/heading-hierarchy.d.ts +66 -0
- package/dist/accessibility/heading-hierarchy.d.ts.map +1 -0
- package/dist/accessibility/heading-hierarchy.js +94 -0
- package/dist/accessibility/heading-hierarchy.js.map +1 -0
- package/dist/accessibility/index.d.ts +25 -0
- package/dist/accessibility/index.d.ts.map +1 -0
- package/dist/accessibility/index.js +21 -0
- package/dist/accessibility/index.js.map +1 -0
- package/dist/accessibility/keyboard-nav.d.ts +63 -0
- package/dist/accessibility/keyboard-nav.d.ts.map +1 -0
- package/dist/accessibility/keyboard-nav.js +86 -0
- package/dist/accessibility/keyboard-nav.js.map +1 -0
- package/dist/accessibility/semantic-html.d.ts +76 -0
- package/dist/accessibility/semantic-html.d.ts.map +1 -0
- package/dist/accessibility/semantic-html.js +204 -0
- package/dist/accessibility/semantic-html.js.map +1 -0
- package/dist/api/client-patterns.d.ts +121 -0
- package/dist/api/client-patterns.d.ts.map +1 -0
- package/dist/api/client-patterns.js +478 -0
- package/dist/api/client-patterns.js.map +1 -0
- package/dist/api/error-format.d.ts +140 -0
- package/dist/api/error-format.d.ts.map +1 -0
- package/dist/api/error-format.js +614 -0
- package/dist/api/error-format.js.map +1 -0
- package/dist/api/http-methods.d.ts +255 -0
- package/dist/api/http-methods.d.ts.map +1 -0
- package/dist/api/http-methods.js +890 -0
- package/dist/api/http-methods.js.map +1 -0
- package/dist/api/index.d.ts +16 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +37 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/pagination.d.ts +133 -0
- package/dist/api/pagination.d.ts.map +1 -0
- package/dist/api/pagination.js +521 -0
- package/dist/api/pagination.js.map +1 -0
- package/dist/api/response-envelope.d.ts +261 -0
- package/dist/api/response-envelope.d.ts.map +1 -0
- package/dist/api/response-envelope.js +1050 -0
- package/dist/api/response-envelope.js.map +1 -0
- package/dist/api/retry-patterns.d.ts +117 -0
- package/dist/api/retry-patterns.d.ts.map +1 -0
- package/dist/api/retry-patterns.js +480 -0
- package/dist/api/retry-patterns.js.map +1 -0
- package/dist/api/route-structure.d.ts +128 -0
- package/dist/api/route-structure.d.ts.map +1 -0
- package/dist/api/route-structure.js +738 -0
- package/dist/api/route-structure.js.map +1 -0
- package/dist/auth/audit-logging.d.ts +80 -0
- package/dist/auth/audit-logging.d.ts.map +1 -0
- package/dist/auth/audit-logging.js +370 -0
- package/dist/auth/audit-logging.js.map +1 -0
- package/dist/auth/index.d.ts +33 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +49 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware-usage.d.ts +65 -0
- package/dist/auth/middleware-usage.d.ts.map +1 -0
- package/dist/auth/middleware-usage.js +192 -0
- package/dist/auth/middleware-usage.js.map +1 -0
- package/dist/auth/permission-checks.d.ts +60 -0
- package/dist/auth/permission-checks.d.ts.map +1 -0
- package/dist/auth/permission-checks.js +159 -0
- package/dist/auth/permission-checks.js.map +1 -0
- package/dist/auth/rbac-patterns.d.ts +68 -0
- package/dist/auth/rbac-patterns.d.ts.map +1 -0
- package/dist/auth/rbac-patterns.js +143 -0
- package/dist/auth/rbac-patterns.js.map +1 -0
- package/dist/auth/resource-ownership.d.ts +77 -0
- package/dist/auth/resource-ownership.d.ts.map +1 -0
- package/dist/auth/resource-ownership.js +324 -0
- package/dist/auth/resource-ownership.js.map +1 -0
- package/dist/auth/token-handling.d.ts +64 -0
- package/dist/auth/token-handling.d.ts.map +1 -0
- package/dist/auth/token-handling.js +151 -0
- package/dist/auth/token-handling.js.map +1 -0
- package/dist/base/ast-detector.d.ts +421 -0
- package/dist/base/ast-detector.d.ts.map +1 -0
- package/dist/base/ast-detector.js +699 -0
- package/dist/base/ast-detector.js.map +1 -0
- package/dist/base/base-detector.d.ts +366 -0
- package/dist/base/base-detector.d.ts.map +1 -0
- package/dist/base/base-detector.js +170 -0
- package/dist/base/base-detector.js.map +1 -0
- package/dist/base/index.d.ts +12 -0
- package/dist/base/index.d.ts.map +1 -0
- package/dist/base/index.js +17 -0
- package/dist/base/index.js.map +1 -0
- package/dist/base/regex-detector.d.ts +421 -0
- package/dist/base/regex-detector.d.ts.map +1 -0
- package/dist/base/regex-detector.js +537 -0
- package/dist/base/regex-detector.js.map +1 -0
- package/dist/base/structural-detector.d.ts +424 -0
- package/dist/base/structural-detector.d.ts.map +1 -0
- package/dist/base/structural-detector.js +731 -0
- package/dist/base/structural-detector.js.map +1 -0
- package/dist/base/types.d.ts +53 -0
- package/dist/base/types.d.ts.map +1 -0
- package/dist/base/types.js +5 -0
- package/dist/base/types.js.map +1 -0
- package/dist/components/component-structure.d.ts +163 -0
- package/dist/components/component-structure.d.ts.map +1 -0
- package/dist/components/component-structure.js +500 -0
- package/dist/components/component-structure.js.map +1 -0
- package/dist/components/composition.d.ts +287 -0
- package/dist/components/composition.d.ts.map +1 -0
- package/dist/components/composition.js +1123 -0
- package/dist/components/composition.js.map +1 -0
- package/dist/components/duplicate-detection.d.ts +251 -0
- package/dist/components/duplicate-detection.d.ts.map +1 -0
- package/dist/components/duplicate-detection.js +804 -0
- package/dist/components/duplicate-detection.js.map +1 -0
- package/dist/components/index.d.ts +16 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +51 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/near-duplicate.d.ts +402 -0
- package/dist/components/near-duplicate.d.ts.map +1 -0
- package/dist/components/near-duplicate.js +1090 -0
- package/dist/components/near-duplicate.js.map +1 -0
- package/dist/components/props-patterns.d.ts +194 -0
- package/dist/components/props-patterns.d.ts.map +1 -0
- package/dist/components/props-patterns.js +795 -0
- package/dist/components/props-patterns.js.map +1 -0
- package/dist/components/ref-forwarding.d.ts +250 -0
- package/dist/components/ref-forwarding.d.ts.map +1 -0
- package/dist/components/ref-forwarding.js +832 -0
- package/dist/components/ref-forwarding.js.map +1 -0
- package/dist/components/state-patterns.d.ts +291 -0
- package/dist/components/state-patterns.d.ts.map +1 -0
- package/dist/components/state-patterns.js +970 -0
- package/dist/components/state-patterns.js.map +1 -0
- package/dist/config/config-validation.d.ts +74 -0
- package/dist/config/config-validation.d.ts.map +1 -0
- package/dist/config/config-validation.js +446 -0
- package/dist/config/config-validation.js.map +1 -0
- package/dist/config/default-values.d.ts +72 -0
- package/dist/config/default-values.d.ts.map +1 -0
- package/dist/config/default-values.js +386 -0
- package/dist/config/default-values.js.map +1 -0
- package/dist/config/env-naming.d.ts +73 -0
- package/dist/config/env-naming.d.ts.map +1 -0
- package/dist/config/env-naming.js +429 -0
- package/dist/config/env-naming.js.map +1 -0
- package/dist/config/environment-detection.d.ts +72 -0
- package/dist/config/environment-detection.d.ts.map +1 -0
- package/dist/config/environment-detection.js +400 -0
- package/dist/config/environment-detection.js.map +1 -0
- package/dist/config/feature-flags.d.ts +72 -0
- package/dist/config/feature-flags.d.ts.map +1 -0
- package/dist/config/feature-flags.js +384 -0
- package/dist/config/feature-flags.js.map +1 -0
- package/dist/config/index.d.ts +27 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +43 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/required-optional.d.ts +71 -0
- package/dist/config/required-optional.d.ts.map +1 -0
- package/dist/config/required-optional.js +344 -0
- package/dist/config/required-optional.js.map +1 -0
- package/dist/data-access/connection-pooling.d.ts +63 -0
- package/dist/data-access/connection-pooling.d.ts.map +1 -0
- package/dist/data-access/connection-pooling.js +297 -0
- package/dist/data-access/connection-pooling.js.map +1 -0
- package/dist/data-access/dto-patterns.d.ts +64 -0
- package/dist/data-access/dto-patterns.d.ts.map +1 -0
- package/dist/data-access/dto-patterns.js +291 -0
- package/dist/data-access/dto-patterns.js.map +1 -0
- package/dist/data-access/index.d.ts +31 -0
- package/dist/data-access/index.d.ts.map +1 -0
- package/dist/data-access/index.js +49 -0
- package/dist/data-access/index.js.map +1 -0
- package/dist/data-access/n-plus-one.d.ts +60 -0
- package/dist/data-access/n-plus-one.d.ts.map +1 -0
- package/dist/data-access/n-plus-one.js +264 -0
- package/dist/data-access/n-plus-one.js.map +1 -0
- package/dist/data-access/query-patterns.d.ts +64 -0
- package/dist/data-access/query-patterns.d.ts.map +1 -0
- package/dist/data-access/query-patterns.js +314 -0
- package/dist/data-access/query-patterns.js.map +1 -0
- package/dist/data-access/repository-pattern.d.ts +62 -0
- package/dist/data-access/repository-pattern.d.ts.map +1 -0
- package/dist/data-access/repository-pattern.js +257 -0
- package/dist/data-access/repository-pattern.js.map +1 -0
- package/dist/data-access/transaction-patterns.d.ts +61 -0
- package/dist/data-access/transaction-patterns.d.ts.map +1 -0
- package/dist/data-access/transaction-patterns.js +277 -0
- package/dist/data-access/transaction-patterns.js.map +1 -0
- package/dist/data-access/validation-patterns.d.ts +62 -0
- package/dist/data-access/validation-patterns.d.ts.map +1 -0
- package/dist/data-access/validation-patterns.js +301 -0
- package/dist/data-access/validation-patterns.js.map +1 -0
- package/dist/documentation/deprecation.d.ts +62 -0
- package/dist/documentation/deprecation.d.ts.map +1 -0
- package/dist/documentation/deprecation.js +83 -0
- package/dist/documentation/deprecation.js.map +1 -0
- package/dist/documentation/example-code.d.ts +64 -0
- package/dist/documentation/example-code.d.ts.map +1 -0
- package/dist/documentation/example-code.js +79 -0
- package/dist/documentation/example-code.js.map +1 -0
- package/dist/documentation/index.d.ts +22 -0
- package/dist/documentation/index.d.ts.map +1 -0
- package/dist/documentation/index.js +19 -0
- package/dist/documentation/index.js.map +1 -0
- package/dist/documentation/jsdoc-patterns.d.ts +72 -0
- package/dist/documentation/jsdoc-patterns.d.ts.map +1 -0
- package/dist/documentation/jsdoc-patterns.js +92 -0
- package/dist/documentation/jsdoc-patterns.js.map +1 -0
- package/dist/documentation/readme-structure.d.ts +67 -0
- package/dist/documentation/readme-structure.d.ts.map +1 -0
- package/dist/documentation/readme-structure.js +76 -0
- package/dist/documentation/readme-structure.js.map +1 -0
- package/dist/documentation/todo-patterns.d.ts +67 -0
- package/dist/documentation/todo-patterns.d.ts.map +1 -0
- package/dist/documentation/todo-patterns.js +73 -0
- package/dist/documentation/todo-patterns.js.map +1 -0
- package/dist/errors/async-errors.d.ts +72 -0
- package/dist/errors/async-errors.d.ts.map +1 -0
- package/dist/errors/async-errors.js +214 -0
- package/dist/errors/async-errors.js.map +1 -0
- package/dist/errors/circuit-breaker.d.ts +53 -0
- package/dist/errors/circuit-breaker.d.ts.map +1 -0
- package/dist/errors/circuit-breaker.js +241 -0
- package/dist/errors/circuit-breaker.js.map +1 -0
- package/dist/errors/error-codes.d.ts +73 -0
- package/dist/errors/error-codes.d.ts.map +1 -0
- package/dist/errors/error-codes.js +211 -0
- package/dist/errors/error-codes.js.map +1 -0
- package/dist/errors/error-logging.d.ts +73 -0
- package/dist/errors/error-logging.d.ts.map +1 -0
- package/dist/errors/error-logging.js +256 -0
- package/dist/errors/error-logging.js.map +1 -0
- package/dist/errors/error-propagation.d.ts +73 -0
- package/dist/errors/error-propagation.d.ts.map +1 -0
- package/dist/errors/error-propagation.js +244 -0
- package/dist/errors/error-propagation.js.map +1 -0
- package/dist/errors/exception-hierarchy.d.ts +75 -0
- package/dist/errors/exception-hierarchy.d.ts.map +1 -0
- package/dist/errors/exception-hierarchy.js +259 -0
- package/dist/errors/exception-hierarchy.js.map +1 -0
- package/dist/errors/index.d.ts +31 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +49 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/try-catch-placement.d.ts +73 -0
- package/dist/errors/try-catch-placement.d.ts.map +1 -0
- package/dist/errors/try-catch-placement.js +214 -0
- package/dist/errors/try-catch-placement.js.map +1 -0
- package/dist/index.d.ts +221 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +245 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/context-fields.d.ts +48 -0
- package/dist/logging/context-fields.d.ts.map +1 -0
- package/dist/logging/context-fields.js +160 -0
- package/dist/logging/context-fields.js.map +1 -0
- package/dist/logging/correlation-ids.d.ts +44 -0
- package/dist/logging/correlation-ids.d.ts.map +1 -0
- package/dist/logging/correlation-ids.js +144 -0
- package/dist/logging/correlation-ids.js.map +1 -0
- package/dist/logging/health-checks.d.ts +45 -0
- package/dist/logging/health-checks.d.ts.map +1 -0
- package/dist/logging/health-checks.js +165 -0
- package/dist/logging/health-checks.js.map +1 -0
- package/dist/logging/index.d.ts +31 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +49 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/log-levels.d.ts +46 -0
- package/dist/logging/log-levels.d.ts.map +1 -0
- package/dist/logging/log-levels.js +178 -0
- package/dist/logging/log-levels.js.map +1 -0
- package/dist/logging/metric-naming.d.ts +46 -0
- package/dist/logging/metric-naming.d.ts.map +1 -0
- package/dist/logging/metric-naming.js +157 -0
- package/dist/logging/metric-naming.js.map +1 -0
- package/dist/logging/pii-redaction.d.ts +44 -0
- package/dist/logging/pii-redaction.d.ts.map +1 -0
- package/dist/logging/pii-redaction.js +166 -0
- package/dist/logging/pii-redaction.js.map +1 -0
- package/dist/logging/structured-format.d.ts +53 -0
- package/dist/logging/structured-format.d.ts.map +1 -0
- package/dist/logging/structured-format.js +235 -0
- package/dist/logging/structured-format.js.map +1 -0
- package/dist/performance/bundle-size.d.ts +79 -0
- package/dist/performance/bundle-size.d.ts.map +1 -0
- package/dist/performance/bundle-size.js +276 -0
- package/dist/performance/bundle-size.js.map +1 -0
- package/dist/performance/caching-patterns.d.ts +78 -0
- package/dist/performance/caching-patterns.d.ts.map +1 -0
- package/dist/performance/caching-patterns.js +257 -0
- package/dist/performance/caching-patterns.js.map +1 -0
- package/dist/performance/code-splitting.d.ts +86 -0
- package/dist/performance/code-splitting.d.ts.map +1 -0
- package/dist/performance/code-splitting.js +447 -0
- package/dist/performance/code-splitting.js.map +1 -0
- package/dist/performance/debounce-throttle.d.ts +75 -0
- package/dist/performance/debounce-throttle.d.ts.map +1 -0
- package/dist/performance/debounce-throttle.js +232 -0
- package/dist/performance/debounce-throttle.js.map +1 -0
- package/dist/performance/index.d.ts +28 -0
- package/dist/performance/index.d.ts.map +1 -0
- package/dist/performance/index.js +39 -0
- package/dist/performance/index.js.map +1 -0
- package/dist/performance/lazy-loading.d.ts +75 -0
- package/dist/performance/lazy-loading.d.ts.map +1 -0
- package/dist/performance/lazy-loading.js +233 -0
- package/dist/performance/lazy-loading.js.map +1 -0
- package/dist/performance/memoization.d.ts +75 -0
- package/dist/performance/memoization.d.ts.map +1 -0
- package/dist/performance/memoization.js +251 -0
- package/dist/performance/memoization.js.map +1 -0
- package/dist/registry/detector-registry.d.ts +266 -0
- package/dist/registry/detector-registry.d.ts.map +1 -0
- package/dist/registry/detector-registry.js +526 -0
- package/dist/registry/detector-registry.js.map +1 -0
- package/dist/registry/index.d.ts +10 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +10 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/loader.d.ts +232 -0
- package/dist/registry/loader.d.ts.map +1 -0
- package/dist/registry/loader.js +419 -0
- package/dist/registry/loader.js.map +1 -0
- package/dist/registry/types.d.ts +111 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +19 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/security/csp-headers.d.ts +78 -0
- package/dist/security/csp-headers.d.ts.map +1 -0
- package/dist/security/csp-headers.js +401 -0
- package/dist/security/csp-headers.js.map +1 -0
- package/dist/security/csrf-protection.d.ts +72 -0
- package/dist/security/csrf-protection.d.ts.map +1 -0
- package/dist/security/csrf-protection.js +344 -0
- package/dist/security/csrf-protection.js.map +1 -0
- package/dist/security/index.d.ts +30 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +48 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/input-sanitization.d.ts +74 -0
- package/dist/security/input-sanitization.d.ts.map +1 -0
- package/dist/security/input-sanitization.js +373 -0
- package/dist/security/input-sanitization.js.map +1 -0
- package/dist/security/rate-limiting.d.ts +81 -0
- package/dist/security/rate-limiting.d.ts.map +1 -0
- package/dist/security/rate-limiting.js +535 -0
- package/dist/security/rate-limiting.js.map +1 -0
- package/dist/security/secret-management.d.ts +83 -0
- package/dist/security/secret-management.d.ts.map +1 -0
- package/dist/security/secret-management.js +547 -0
- package/dist/security/secret-management.js.map +1 -0
- package/dist/security/sql-injection.d.ts +76 -0
- package/dist/security/sql-injection.d.ts.map +1 -0
- package/dist/security/sql-injection.js +383 -0
- package/dist/security/sql-injection.js.map +1 -0
- package/dist/security/xss-prevention.d.ts +80 -0
- package/dist/security/xss-prevention.d.ts.map +1 -0
- package/dist/security/xss-prevention.js +416 -0
- package/dist/security/xss-prevention.js.map +1 -0
- package/dist/structural/barrel-exports.d.ts +178 -0
- package/dist/structural/barrel-exports.d.ts.map +1 -0
- package/dist/structural/barrel-exports.js +553 -0
- package/dist/structural/barrel-exports.js.map +1 -0
- package/dist/structural/circular-deps.d.ts +140 -0
- package/dist/structural/circular-deps.d.ts.map +1 -0
- package/dist/structural/circular-deps.js +422 -0
- package/dist/structural/circular-deps.js.map +1 -0
- package/dist/structural/co-location.d.ts +202 -0
- package/dist/structural/co-location.d.ts.map +1 -0
- package/dist/structural/co-location.js +640 -0
- package/dist/structural/co-location.js.map +1 -0
- package/dist/structural/directory-structure.d.ts +151 -0
- package/dist/structural/directory-structure.d.ts.map +1 -0
- package/dist/structural/directory-structure.js +457 -0
- package/dist/structural/directory-structure.js.map +1 -0
- package/dist/structural/file-naming.d.ts +61 -0
- package/dist/structural/file-naming.d.ts.map +1 -0
- package/dist/structural/file-naming.js +231 -0
- package/dist/structural/file-naming.js.map +1 -0
- package/dist/structural/import-ordering.d.ts +212 -0
- package/dist/structural/import-ordering.d.ts.map +1 -0
- package/dist/structural/import-ordering.js +821 -0
- package/dist/structural/import-ordering.js.map +1 -0
- package/dist/structural/index.d.ts +23 -0
- package/dist/structural/index.d.ts.map +1 -0
- package/dist/structural/index.js +26 -0
- package/dist/structural/index.js.map +1 -0
- package/dist/structural/module-boundaries.d.ts +164 -0
- package/dist/structural/module-boundaries.d.ts.map +1 -0
- package/dist/structural/module-boundaries.js +616 -0
- package/dist/structural/module-boundaries.js.map +1 -0
- package/dist/structural/package-boundaries.d.ts +182 -0
- package/dist/structural/package-boundaries.d.ts.map +1 -0
- package/dist/structural/package-boundaries.js +602 -0
- package/dist/structural/package-boundaries.js.map +1 -0
- package/dist/styling/class-naming.d.ts +263 -0
- package/dist/styling/class-naming.d.ts.map +1 -0
- package/dist/styling/class-naming.js +892 -0
- package/dist/styling/class-naming.js.map +1 -0
- package/dist/styling/color-usage.d.ts +213 -0
- package/dist/styling/color-usage.d.ts.map +1 -0
- package/dist/styling/color-usage.js +732 -0
- package/dist/styling/color-usage.js.map +1 -0
- package/dist/styling/design-tokens.d.ts +212 -0
- package/dist/styling/design-tokens.d.ts.map +1 -0
- package/dist/styling/design-tokens.js +748 -0
- package/dist/styling/design-tokens.js.map +1 -0
- package/dist/styling/index.d.ts +16 -0
- package/dist/styling/index.d.ts.map +1 -0
- package/dist/styling/index.js +56 -0
- package/dist/styling/index.js.map +1 -0
- package/dist/styling/responsive.d.ts +304 -0
- package/dist/styling/responsive.d.ts.map +1 -0
- package/dist/styling/responsive.js +888 -0
- package/dist/styling/responsive.js.map +1 -0
- package/dist/styling/spacing-scale.d.ts +248 -0
- package/dist/styling/spacing-scale.d.ts.map +1 -0
- package/dist/styling/spacing-scale.js +865 -0
- package/dist/styling/spacing-scale.js.map +1 -0
- package/dist/styling/tailwind-patterns.d.ts +305 -0
- package/dist/styling/tailwind-patterns.d.ts.map +1 -0
- package/dist/styling/tailwind-patterns.js +1181 -0
- package/dist/styling/tailwind-patterns.js.map +1 -0
- package/dist/styling/typography.d.ts +281 -0
- package/dist/styling/typography.d.ts.map +1 -0
- package/dist/styling/typography.js +1004 -0
- package/dist/styling/typography.js.map +1 -0
- package/dist/styling/z-index-scale.d.ts +270 -0
- package/dist/styling/z-index-scale.d.ts.map +1 -0
- package/dist/styling/z-index-scale.js +714 -0
- package/dist/styling/z-index-scale.js.map +1 -0
- package/dist/testing/co-location.d.ts +42 -0
- package/dist/testing/co-location.d.ts.map +1 -0
- package/dist/testing/co-location.js +134 -0
- package/dist/testing/co-location.js.map +1 -0
- package/dist/testing/describe-naming.d.ts +47 -0
- package/dist/testing/describe-naming.d.ts.map +1 -0
- package/dist/testing/describe-naming.js +150 -0
- package/dist/testing/describe-naming.js.map +1 -0
- package/dist/testing/file-naming.d.ts +44 -0
- package/dist/testing/file-naming.d.ts.map +1 -0
- package/dist/testing/file-naming.js +131 -0
- package/dist/testing/file-naming.js.map +1 -0
- package/dist/testing/fixture-patterns.d.ts +52 -0
- package/dist/testing/fixture-patterns.d.ts.map +1 -0
- package/dist/testing/fixture-patterns.js +228 -0
- package/dist/testing/fixture-patterns.js.map +1 -0
- package/dist/testing/index.d.ts +31 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +49 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock-patterns.d.ts +53 -0
- package/dist/testing/mock-patterns.d.ts.map +1 -0
- package/dist/testing/mock-patterns.js +264 -0
- package/dist/testing/mock-patterns.js.map +1 -0
- package/dist/testing/setup-teardown.d.ts +55 -0
- package/dist/testing/setup-teardown.d.ts.map +1 -0
- package/dist/testing/setup-teardown.js +262 -0
- package/dist/testing/setup-teardown.js.map +1 -0
- package/dist/testing/test-structure.d.ts +51 -0
- package/dist/testing/test-structure.d.ts.map +1 -0
- package/dist/testing/test-structure.js +225 -0
- package/dist/testing/test-structure.js.map +1 -0
- package/dist/types/any-usage.d.ts +99 -0
- package/dist/types/any-usage.d.ts.map +1 -0
- package/dist/types/any-usage.js +641 -0
- package/dist/types/any-usage.js.map +1 -0
- package/dist/types/file-location.d.ts +76 -0
- package/dist/types/file-location.d.ts.map +1 -0
- package/dist/types/file-location.js +395 -0
- package/dist/types/file-location.js.map +1 -0
- package/dist/types/generic-patterns.d.ts +97 -0
- package/dist/types/generic-patterns.d.ts.map +1 -0
- package/dist/types/generic-patterns.js +615 -0
- package/dist/types/generic-patterns.js.map +1 -0
- package/dist/types/index.d.ts +31 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +43 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/interface-vs-type.d.ts +81 -0
- package/dist/types/interface-vs-type.d.ts.map +1 -0
- package/dist/types/interface-vs-type.js +440 -0
- package/dist/types/interface-vs-type.js.map +1 -0
- package/dist/types/naming-conventions.d.ts +84 -0
- package/dist/types/naming-conventions.d.ts.map +1 -0
- package/dist/types/naming-conventions.js +455 -0
- package/dist/types/naming-conventions.js.map +1 -0
- package/dist/types/type-assertions.d.ts +98 -0
- package/dist/types/type-assertions.d.ts.map +1 -0
- package/dist/types/type-assertions.js +639 -0
- package/dist/types/type-assertions.js.map +1 -0
- package/dist/types/utility-types.d.ts +110 -0
- package/dist/types/utility-types.d.ts.map +1 -0
- package/dist/types/utility-types.js +547 -0
- package/dist/types/utility-types.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RBAC Patterns Detector - Role-Based Access Control pattern detection
|
|
3
|
+
*
|
|
4
|
+
* Detects RBAC patterns including role definitions, role assignments,
|
|
5
|
+
* and role-based authorization.
|
|
6
|
+
*
|
|
7
|
+
* @requirements 11.4 - RBAC patterns
|
|
8
|
+
*/
|
|
9
|
+
import { RegexDetector } from '../base/index.js';
|
|
10
|
+
export const ROLE_DEFINITION_PATTERNS = [
|
|
11
|
+
// TypeScript/JavaScript patterns
|
|
12
|
+
/(?:enum|const)\s+(?:Role|Roles|UserRole)\s*[={]/gi,
|
|
13
|
+
/roles?\s*:\s*\[\s*['"`](?:admin|user|moderator|editor|viewer)/gi,
|
|
14
|
+
/(?:ADMIN|USER|MODERATOR|EDITOR|VIEWER)\s*[=:]/gi,
|
|
15
|
+
/type\s+Role\s*=/gi,
|
|
16
|
+
// Python patterns - Enum classes, role constants
|
|
17
|
+
/class\s+(?:Role|Roles|UserRole)\s*\(\s*(?:str\s*,\s*)?Enum\s*\)/gi,
|
|
18
|
+
/(?:ADMIN|USER|MODERATOR|EDITOR|VIEWER)\s*=\s*['"`]/gi,
|
|
19
|
+
/ROLES?\s*=\s*\[/gi,
|
|
20
|
+
/role_choices\s*=/gi,
|
|
21
|
+
];
|
|
22
|
+
export const ROLE_ASSIGNMENT_PATTERNS = [
|
|
23
|
+
// TypeScript/JavaScript patterns
|
|
24
|
+
/user\.role\s*=\s*['"`]?\w+/gi,
|
|
25
|
+
/setRole\s*\(/gi,
|
|
26
|
+
/assignRole\s*\(/gi,
|
|
27
|
+
/grantRole\s*\(/gi,
|
|
28
|
+
/role\s*:\s*['"`](?:admin|user|moderator)/gi,
|
|
29
|
+
// Python patterns - snake_case methods
|
|
30
|
+
/user\.role\s*=\s*['"`]?\w+/gi,
|
|
31
|
+
/set_role\s*\(/gi,
|
|
32
|
+
/assign_role\s*\(/gi,
|
|
33
|
+
/grant_role\s*\(/gi,
|
|
34
|
+
/role\s*=\s*['"`](?:admin|user|moderator)/gi,
|
|
35
|
+
/update_user_role\s*\(/gi,
|
|
36
|
+
];
|
|
37
|
+
export const ROLE_CHECK_PATTERNS = [
|
|
38
|
+
// TypeScript/JavaScript patterns
|
|
39
|
+
/user\.role\s*===?\s*['"`]?\w+/gi,
|
|
40
|
+
/hasRole\s*\(\s*['"`]\w+['"`]/gi,
|
|
41
|
+
/isAdmin|isModerator|isEditor/gi,
|
|
42
|
+
/role\s*===?\s*(?:Role\.)?\w+/gi,
|
|
43
|
+
/roles?\.includes\s*\(/gi,
|
|
44
|
+
// Python patterns - snake_case, equality checks
|
|
45
|
+
/user\.role\s*==\s*['"`]?\w+/gi,
|
|
46
|
+
/has_role\s*\(/gi,
|
|
47
|
+
/is_admin|is_moderator|is_editor/gi,
|
|
48
|
+
/role\s*==\s*(?:Role\.)?\w+/gi,
|
|
49
|
+
/role\s+in\s+\[/gi,
|
|
50
|
+
/check_role\s*\(/gi,
|
|
51
|
+
/require_role\s*\(/gi,
|
|
52
|
+
];
|
|
53
|
+
export const ROLE_HIERARCHY_PATTERNS = [
|
|
54
|
+
/roleHierarchy/gi,
|
|
55
|
+
/parentRole/gi,
|
|
56
|
+
/inheritedRoles/gi,
|
|
57
|
+
/roleInherits/gi,
|
|
58
|
+
];
|
|
59
|
+
export const EXCLUDED_FILE_PATTERNS = [/\.test\.[jt]sx?$/, /\.spec\.[jt]sx?$/, /node_modules\//, /\.d\.ts$/, /_test\.py$/, /test_.*\.py$/, /conftest\.py$/];
|
|
60
|
+
export function shouldExcludeFile(filePath) {
|
|
61
|
+
return EXCLUDED_FILE_PATTERNS.some(p => p.test(filePath));
|
|
62
|
+
}
|
|
63
|
+
function isInsideComment(content, index) {
|
|
64
|
+
const before = content.slice(0, index);
|
|
65
|
+
const lastNewline = before.lastIndexOf('\n');
|
|
66
|
+
const line = before.slice(lastNewline + 1);
|
|
67
|
+
if (line.includes('//') && index - lastNewline - 1 > line.indexOf('//'))
|
|
68
|
+
return true;
|
|
69
|
+
return before.lastIndexOf('/*') > before.lastIndexOf('*/');
|
|
70
|
+
}
|
|
71
|
+
function getPosition(content, index) {
|
|
72
|
+
const before = content.slice(0, index);
|
|
73
|
+
return { line: before.split('\n').length, column: index - before.lastIndexOf('\n') };
|
|
74
|
+
}
|
|
75
|
+
function detectPatterns(content, file, patterns, type) {
|
|
76
|
+
const results = [];
|
|
77
|
+
const lines = content.split('\n');
|
|
78
|
+
for (const pattern of patterns) {
|
|
79
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
80
|
+
let match;
|
|
81
|
+
while ((match = regex.exec(content)) !== null) {
|
|
82
|
+
if (isInsideComment(content, match.index))
|
|
83
|
+
continue;
|
|
84
|
+
const { line, column } = getPosition(content, match.index);
|
|
85
|
+
results.push({ type, file, line, column, matchedText: match[0], context: lines[line - 1] || '' });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return results;
|
|
89
|
+
}
|
|
90
|
+
export function detectRoleDefinitions(content, file) {
|
|
91
|
+
return detectPatterns(content, file, ROLE_DEFINITION_PATTERNS, 'role-definition');
|
|
92
|
+
}
|
|
93
|
+
export function detectRoleChecks(content, file) {
|
|
94
|
+
return detectPatterns(content, file, ROLE_CHECK_PATTERNS, 'role-check');
|
|
95
|
+
}
|
|
96
|
+
export function detectRoleAssignments(content, file) {
|
|
97
|
+
return detectPatterns(content, file, ROLE_ASSIGNMENT_PATTERNS, 'role-assignment');
|
|
98
|
+
}
|
|
99
|
+
export function detectRoleHierarchy(content, file) {
|
|
100
|
+
return detectPatterns(content, file, ROLE_HIERARCHY_PATTERNS, 'role-hierarchy');
|
|
101
|
+
}
|
|
102
|
+
export function analyzeRbac(content, file) {
|
|
103
|
+
if (shouldExcludeFile(file)) {
|
|
104
|
+
return { patterns: [], violations: [], roles: [], hasRoleHierarchy: false };
|
|
105
|
+
}
|
|
106
|
+
const patterns = [
|
|
107
|
+
...detectRoleDefinitions(content, file),
|
|
108
|
+
...detectRoleAssignments(content, file),
|
|
109
|
+
...detectRoleChecks(content, file),
|
|
110
|
+
...detectRoleHierarchy(content, file),
|
|
111
|
+
];
|
|
112
|
+
const roleMatches = content.match(/['"`](admin|user|moderator|editor|viewer|guest|owner|member)['"`]/gi) || [];
|
|
113
|
+
const roles = [...new Set(roleMatches.map(r => r.replace(/['"`]/g, '').toLowerCase()))];
|
|
114
|
+
const hasRoleHierarchy = patterns.some(p => p.type === 'role-hierarchy');
|
|
115
|
+
return { patterns, violations: [], roles, hasRoleHierarchy };
|
|
116
|
+
}
|
|
117
|
+
export const analyzeRBACPatterns = analyzeRbac;
|
|
118
|
+
export class RbacPatternsDetector extends RegexDetector {
|
|
119
|
+
id = 'auth/rbac-patterns';
|
|
120
|
+
name = 'RBAC Patterns Detector';
|
|
121
|
+
description = 'Detects Role-Based Access Control patterns';
|
|
122
|
+
category = 'auth';
|
|
123
|
+
subcategory = 'rbac';
|
|
124
|
+
supportedLanguages = ['typescript', 'javascript', 'python'];
|
|
125
|
+
async detect(context) {
|
|
126
|
+
const { content, file } = context;
|
|
127
|
+
if (shouldExcludeFile(file))
|
|
128
|
+
return this.createEmptyResult();
|
|
129
|
+
const analysis = analyzeRbac(content, file);
|
|
130
|
+
return this.createResult([], [], analysis.patterns.length > 0 ? 0.85 : 1.0);
|
|
131
|
+
}
|
|
132
|
+
generateQuickFix() {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Alias for backward compatibility
|
|
137
|
+
export const RBACPatternsDetector = RbacPatternsDetector;
|
|
138
|
+
export function createRbacPatternsDetector() {
|
|
139
|
+
return new RbacPatternsDetector();
|
|
140
|
+
}
|
|
141
|
+
// Alias for backward compatibility
|
|
142
|
+
export const createRBACPatternsDetector = createRbacPatternsDetector;
|
|
143
|
+
//# sourceMappingURL=rbac-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rbac-patterns.js","sourceRoot":"","sources":["../../src/auth/rbac-patterns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource Ownership Detector - Ownership pattern detection
|
|
3
|
+
*
|
|
4
|
+
* Detects resource ownership patterns including:
|
|
5
|
+
* - User ID checks on resources
|
|
6
|
+
* - Owner field validation
|
|
7
|
+
* - Tenant/organization scoping
|
|
8
|
+
* - Resource access control patterns
|
|
9
|
+
* - Ownership transfer patterns
|
|
10
|
+
*
|
|
11
|
+
* Flags violations:
|
|
12
|
+
* - Missing ownership checks on sensitive operations
|
|
13
|
+
* - Direct resource access without ownership validation
|
|
14
|
+
* - Inconsistent ownership patterns
|
|
15
|
+
*
|
|
16
|
+
* @requirements 11.5 - Resource ownership patterns
|
|
17
|
+
*/
|
|
18
|
+
import type { Language } from 'driftdetect-core';
|
|
19
|
+
import { RegexDetector, type DetectionContext, type DetectionResult } from '../base/index.js';
|
|
20
|
+
export type OwnershipPatternType = 'user-id-check' | 'owner-field' | 'tenant-scope' | 'created-by' | 'ownership-query' | 'ownership-transfer';
|
|
21
|
+
export type OwnershipViolationType = 'missing-ownership-check' | 'direct-resource-access' | 'inconsistent-ownership';
|
|
22
|
+
export interface OwnershipPatternInfo {
|
|
23
|
+
type: OwnershipPatternType;
|
|
24
|
+
file: string;
|
|
25
|
+
line: number;
|
|
26
|
+
column: number;
|
|
27
|
+
matchedText: string;
|
|
28
|
+
ownerField?: string;
|
|
29
|
+
context?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface OwnershipViolationInfo {
|
|
32
|
+
type: OwnershipViolationType;
|
|
33
|
+
file: string;
|
|
34
|
+
line: number;
|
|
35
|
+
column: number;
|
|
36
|
+
endLine: number;
|
|
37
|
+
endColumn: number;
|
|
38
|
+
value: string;
|
|
39
|
+
issue: string;
|
|
40
|
+
suggestedFix?: string;
|
|
41
|
+
lineContent: string;
|
|
42
|
+
}
|
|
43
|
+
export interface OwnershipAnalysis {
|
|
44
|
+
patterns: OwnershipPatternInfo[];
|
|
45
|
+
violations: OwnershipViolationInfo[];
|
|
46
|
+
hasOwnershipChecks: boolean;
|
|
47
|
+
dominantPattern: OwnershipPatternType | null;
|
|
48
|
+
confidence: number;
|
|
49
|
+
}
|
|
50
|
+
export declare const USER_ID_CHECK_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp];
|
|
51
|
+
export declare const OWNER_FIELD_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp];
|
|
52
|
+
export declare const TENANT_SCOPE_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp];
|
|
53
|
+
export declare const CREATED_BY_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp];
|
|
54
|
+
export declare const OWNERSHIP_QUERY_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp];
|
|
55
|
+
export declare const OWNERSHIP_TRANSFER_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp];
|
|
56
|
+
export declare const SENSITIVE_OPERATION_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp, RegExp, RegExp];
|
|
57
|
+
export declare const EXCLUDED_FILE_PATTERNS: RegExp[];
|
|
58
|
+
export declare function shouldExcludeFile(filePath: string): boolean;
|
|
59
|
+
export declare function detectUserIdChecks(content: string, file: string): OwnershipPatternInfo[];
|
|
60
|
+
export declare function detectOwnerFields(content: string, file: string): OwnershipPatternInfo[];
|
|
61
|
+
export declare function detectTenantScoping(content: string, file: string): OwnershipPatternInfo[];
|
|
62
|
+
export declare function detectCreatedByPatterns(content: string, file: string): OwnershipPatternInfo[];
|
|
63
|
+
export declare function detectOwnershipQueries(content: string, file: string): OwnershipPatternInfo[];
|
|
64
|
+
export declare function detectMissingOwnershipViolations(patterns: OwnershipPatternInfo[], content: string, file: string): OwnershipViolationInfo[];
|
|
65
|
+
export declare function analyzeOwnership(content: string, file: string): OwnershipAnalysis;
|
|
66
|
+
export declare class ResourceOwnershipDetector extends RegexDetector {
|
|
67
|
+
readonly id = "auth/resource-ownership";
|
|
68
|
+
readonly name = "Resource Ownership Detector";
|
|
69
|
+
readonly description = "Detects resource ownership patterns and missing ownership checks";
|
|
70
|
+
readonly category = "auth";
|
|
71
|
+
readonly subcategory = "ownership";
|
|
72
|
+
readonly supportedLanguages: Language[];
|
|
73
|
+
detect(context: DetectionContext): Promise<DetectionResult>;
|
|
74
|
+
generateQuickFix(): null;
|
|
75
|
+
}
|
|
76
|
+
export declare function createResourceOwnershipDetector(): ResourceOwnershipDetector;
|
|
77
|
+
//# sourceMappingURL=resource-ownership.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-ownership.d.ts","sourceRoot":"","sources":["../../src/auth/resource-ownership.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource Ownership Detector - Ownership pattern detection
|
|
3
|
+
*
|
|
4
|
+
* Detects resource ownership patterns including:
|
|
5
|
+
* - User ID checks on resources
|
|
6
|
+
* - Owner field validation
|
|
7
|
+
* - Tenant/organization scoping
|
|
8
|
+
* - Resource access control patterns
|
|
9
|
+
* - Ownership transfer patterns
|
|
10
|
+
*
|
|
11
|
+
* Flags violations:
|
|
12
|
+
* - Missing ownership checks on sensitive operations
|
|
13
|
+
* - Direct resource access without ownership validation
|
|
14
|
+
* - Inconsistent ownership patterns
|
|
15
|
+
*
|
|
16
|
+
* @requirements 11.5 - Resource ownership patterns
|
|
17
|
+
*/
|
|
18
|
+
import { RegexDetector } from '../base/index.js';
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// Constants
|
|
21
|
+
// ============================================================================
|
|
22
|
+
export const USER_ID_CHECK_PATTERNS = [
|
|
23
|
+
// TypeScript/JavaScript patterns
|
|
24
|
+
/userId\s*===?\s*(?:resource|item|record|data)\.\s*userId/gi,
|
|
25
|
+
/(?:resource|item|record|data)\.userId\s*===?\s*userId/gi,
|
|
26
|
+
/user\.id\s*===?\s*(?:resource|item)\.(?:userId|ownerId|createdBy)/gi,
|
|
27
|
+
/req\.user\.id\s*===?\s*\w+\.(?:userId|ownerId)/gi,
|
|
28
|
+
/session\.userId\s*===?\s*\w+\.(?:userId|ownerId)/gi,
|
|
29
|
+
// Python patterns - snake_case, equality checks
|
|
30
|
+
/user_id\s*==\s*(?:resource|item|record|data)\.user_id/gi,
|
|
31
|
+
/(?:resource|item|record|data)\.user_id\s*==\s*user_id/gi,
|
|
32
|
+
/current_user\.id\s*==\s*\w+\.(?:user_id|owner_id|created_by)/gi,
|
|
33
|
+
/request\.user\.id\s*==\s*\w+\.(?:user_id|owner_id)/gi,
|
|
34
|
+
];
|
|
35
|
+
export const OWNER_FIELD_PATTERNS = [
|
|
36
|
+
// TypeScript/JavaScript patterns
|
|
37
|
+
/\.ownerId\b/gi,
|
|
38
|
+
/\.owner\s*[=:]/gi,
|
|
39
|
+
/ownerId\s*[=:]/gi,
|
|
40
|
+
/ownerUserId/gi,
|
|
41
|
+
/resourceOwner/gi,
|
|
42
|
+
// Python patterns - snake_case
|
|
43
|
+
/\.owner_id\b/gi,
|
|
44
|
+
/owner_id\s*=/gi,
|
|
45
|
+
/owner_user_id/gi,
|
|
46
|
+
/resource_owner/gi,
|
|
47
|
+
/owned_by/gi,
|
|
48
|
+
];
|
|
49
|
+
export const TENANT_SCOPE_PATTERNS = [
|
|
50
|
+
// TypeScript/JavaScript patterns
|
|
51
|
+
/tenantId\s*[=:]/gi,
|
|
52
|
+
/organizationId\s*[=:]/gi,
|
|
53
|
+
/orgId\s*[=:]/gi,
|
|
54
|
+
/\.tenantId\b/gi,
|
|
55
|
+
/\.organizationId\b/gi,
|
|
56
|
+
/workspaceId\s*[=:]/gi,
|
|
57
|
+
// Python patterns - snake_case
|
|
58
|
+
/tenant_id\s*=/gi,
|
|
59
|
+
/organization_id\s*=/gi,
|
|
60
|
+
/org_id\s*=/gi,
|
|
61
|
+
/\.tenant_id\b/gi,
|
|
62
|
+
/\.organization_id\b/gi,
|
|
63
|
+
/workspace_id\s*=/gi,
|
|
64
|
+
/account_id\s*=/gi,
|
|
65
|
+
];
|
|
66
|
+
export const CREATED_BY_PATTERNS = [
|
|
67
|
+
/createdBy\s*[=:]/gi,
|
|
68
|
+
/\.createdBy\b/gi,
|
|
69
|
+
/authorId\s*[=:]/gi,
|
|
70
|
+
/\.authorId\b/gi,
|
|
71
|
+
];
|
|
72
|
+
export const OWNERSHIP_QUERY_PATTERNS = [
|
|
73
|
+
// TypeScript/JavaScript patterns
|
|
74
|
+
/WHERE\s+(?:user_?id|owner_?id|tenant_?id)\s*=/gi,
|
|
75
|
+
/\.where\s*\(\s*['"`]?(?:userId|ownerId|tenantId)['"`]?\s*,/gi,
|
|
76
|
+
/\.eq\s*\(\s*['"`](?:user_id|owner_id|tenant_id)['"`]/gi,
|
|
77
|
+
/findBy(?:User|Owner|Tenant)Id/gi,
|
|
78
|
+
// Python patterns - SQLAlchemy, Django ORM, Supabase
|
|
79
|
+
/\.filter\s*\(\s*\w+\.user_id\s*==/gi,
|
|
80
|
+
/\.filter\s*\(\s*\w+\.owner_id\s*==/gi,
|
|
81
|
+
/\.filter_by\s*\(\s*user_id\s*=/gi,
|
|
82
|
+
/\.filter_by\s*\(\s*owner_id\s*=/gi,
|
|
83
|
+
/objects\.filter\s*\(\s*user_id\s*=/gi,
|
|
84
|
+
/objects\.filter\s*\(\s*owner\s*=/gi,
|
|
85
|
+
/\.select\s*\(\s*\)\s*\.eq\s*\(\s*['"`]user_id['"`]/gi,
|
|
86
|
+
];
|
|
87
|
+
export const OWNERSHIP_TRANSFER_PATTERNS = [
|
|
88
|
+
/transferOwnership/gi,
|
|
89
|
+
/changeOwner/gi,
|
|
90
|
+
/setOwner/gi,
|
|
91
|
+
/updateOwner/gi,
|
|
92
|
+
];
|
|
93
|
+
export const SENSITIVE_OPERATION_PATTERNS = [
|
|
94
|
+
/\.delete\s*\(/gi,
|
|
95
|
+
/\.update\s*\(/gi,
|
|
96
|
+
/\.remove\s*\(/gi,
|
|
97
|
+
/\.destroy\s*\(/gi,
|
|
98
|
+
/DELETE\s+FROM/gi,
|
|
99
|
+
/UPDATE\s+\w+\s+SET/gi,
|
|
100
|
+
];
|
|
101
|
+
export const EXCLUDED_FILE_PATTERNS = [
|
|
102
|
+
/\.test\.[jt]sx?$/,
|
|
103
|
+
/\.spec\.[jt]sx?$/,
|
|
104
|
+
/node_modules\//,
|
|
105
|
+
/\.d\.ts$/,
|
|
106
|
+
/_test\.py$/,
|
|
107
|
+
/test_.*\.py$/,
|
|
108
|
+
/conftest\.py$/,
|
|
109
|
+
];
|
|
110
|
+
// ============================================================================
|
|
111
|
+
// Helper Functions
|
|
112
|
+
// ============================================================================
|
|
113
|
+
export function shouldExcludeFile(filePath) {
|
|
114
|
+
return EXCLUDED_FILE_PATTERNS.some(p => p.test(filePath));
|
|
115
|
+
}
|
|
116
|
+
function isInsideComment(content, index) {
|
|
117
|
+
const before = content.slice(0, index);
|
|
118
|
+
const lastNewline = before.lastIndexOf('\n');
|
|
119
|
+
const line = before.slice(lastNewline + 1);
|
|
120
|
+
if (line.includes('//') && index - lastNewline - 1 > line.indexOf('//'))
|
|
121
|
+
return true;
|
|
122
|
+
return before.lastIndexOf('/*') > before.lastIndexOf('*/');
|
|
123
|
+
}
|
|
124
|
+
function getPosition(content, index) {
|
|
125
|
+
const before = content.slice(0, index);
|
|
126
|
+
return { line: before.split('\n').length, column: index - before.lastIndexOf('\n') };
|
|
127
|
+
}
|
|
128
|
+
// ============================================================================
|
|
129
|
+
// Detection Functions
|
|
130
|
+
// ============================================================================
|
|
131
|
+
export function detectUserIdChecks(content, file) {
|
|
132
|
+
const results = [];
|
|
133
|
+
const lines = content.split('\n');
|
|
134
|
+
for (const pattern of USER_ID_CHECK_PATTERNS) {
|
|
135
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
136
|
+
let match;
|
|
137
|
+
while ((match = regex.exec(content)) !== null) {
|
|
138
|
+
if (isInsideComment(content, match.index))
|
|
139
|
+
continue;
|
|
140
|
+
const { line, column } = getPosition(content, match.index);
|
|
141
|
+
results.push({
|
|
142
|
+
type: 'user-id-check',
|
|
143
|
+
file, line, column,
|
|
144
|
+
matchedText: match[0],
|
|
145
|
+
context: lines[line - 1] || '',
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return results;
|
|
150
|
+
}
|
|
151
|
+
export function detectOwnerFields(content, file) {
|
|
152
|
+
const results = [];
|
|
153
|
+
const lines = content.split('\n');
|
|
154
|
+
for (const pattern of OWNER_FIELD_PATTERNS) {
|
|
155
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
156
|
+
let match;
|
|
157
|
+
while ((match = regex.exec(content)) !== null) {
|
|
158
|
+
if (isInsideComment(content, match.index))
|
|
159
|
+
continue;
|
|
160
|
+
const { line, column } = getPosition(content, match.index);
|
|
161
|
+
results.push({
|
|
162
|
+
type: 'owner-field',
|
|
163
|
+
file, line, column,
|
|
164
|
+
matchedText: match[0],
|
|
165
|
+
ownerField: match[0].replace(/[.:=\s]/g, ''),
|
|
166
|
+
context: lines[line - 1] || '',
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return results;
|
|
171
|
+
}
|
|
172
|
+
export function detectTenantScoping(content, file) {
|
|
173
|
+
const results = [];
|
|
174
|
+
const lines = content.split('\n');
|
|
175
|
+
for (const pattern of TENANT_SCOPE_PATTERNS) {
|
|
176
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
177
|
+
let match;
|
|
178
|
+
while ((match = regex.exec(content)) !== null) {
|
|
179
|
+
if (isInsideComment(content, match.index))
|
|
180
|
+
continue;
|
|
181
|
+
const { line, column } = getPosition(content, match.index);
|
|
182
|
+
results.push({
|
|
183
|
+
type: 'tenant-scope',
|
|
184
|
+
file, line, column,
|
|
185
|
+
matchedText: match[0],
|
|
186
|
+
context: lines[line - 1] || '',
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return results;
|
|
191
|
+
}
|
|
192
|
+
export function detectCreatedByPatterns(content, file) {
|
|
193
|
+
const results = [];
|
|
194
|
+
const lines = content.split('\n');
|
|
195
|
+
for (const pattern of CREATED_BY_PATTERNS) {
|
|
196
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
197
|
+
let match;
|
|
198
|
+
while ((match = regex.exec(content)) !== null) {
|
|
199
|
+
if (isInsideComment(content, match.index))
|
|
200
|
+
continue;
|
|
201
|
+
const { line, column } = getPosition(content, match.index);
|
|
202
|
+
results.push({
|
|
203
|
+
type: 'created-by',
|
|
204
|
+
file, line, column,
|
|
205
|
+
matchedText: match[0],
|
|
206
|
+
context: lines[line - 1] || '',
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return results;
|
|
211
|
+
}
|
|
212
|
+
export function detectOwnershipQueries(content, file) {
|
|
213
|
+
const results = [];
|
|
214
|
+
const lines = content.split('\n');
|
|
215
|
+
for (const pattern of OWNERSHIP_QUERY_PATTERNS) {
|
|
216
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
217
|
+
let match;
|
|
218
|
+
while ((match = regex.exec(content)) !== null) {
|
|
219
|
+
if (isInsideComment(content, match.index))
|
|
220
|
+
continue;
|
|
221
|
+
const { line, column } = getPosition(content, match.index);
|
|
222
|
+
results.push({
|
|
223
|
+
type: 'ownership-query',
|
|
224
|
+
file, line, column,
|
|
225
|
+
matchedText: match[0],
|
|
226
|
+
context: lines[line - 1] || '',
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return results;
|
|
231
|
+
}
|
|
232
|
+
export function detectMissingOwnershipViolations(patterns, content, file) {
|
|
233
|
+
const violations = [];
|
|
234
|
+
const lines = content.split('\n');
|
|
235
|
+
const hasOwnershipChecks = patterns.length > 0;
|
|
236
|
+
// Only check files that look like they handle resources
|
|
237
|
+
if (!file.includes('service') && !file.includes('repository') && !file.includes('controller')) {
|
|
238
|
+
return violations;
|
|
239
|
+
}
|
|
240
|
+
if (!hasOwnershipChecks) {
|
|
241
|
+
for (const pattern of SENSITIVE_OPERATION_PATTERNS) {
|
|
242
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
243
|
+
let match;
|
|
244
|
+
while ((match = regex.exec(content)) !== null) {
|
|
245
|
+
if (isInsideComment(content, match.index))
|
|
246
|
+
continue;
|
|
247
|
+
const { line, column } = getPosition(content, match.index);
|
|
248
|
+
violations.push({
|
|
249
|
+
type: 'missing-ownership-check',
|
|
250
|
+
file, line, column,
|
|
251
|
+
endLine: line,
|
|
252
|
+
endColumn: column + match[0].length,
|
|
253
|
+
value: match[0],
|
|
254
|
+
issue: 'Sensitive operation without visible ownership check',
|
|
255
|
+
suggestedFix: 'Add ownership validation before modifying resources',
|
|
256
|
+
lineContent: lines[line - 1] || '',
|
|
257
|
+
});
|
|
258
|
+
break; // Only flag once per file
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return violations;
|
|
263
|
+
}
|
|
264
|
+
// ============================================================================
|
|
265
|
+
// Main Analysis Function
|
|
266
|
+
// ============================================================================
|
|
267
|
+
export function analyzeOwnership(content, file) {
|
|
268
|
+
if (shouldExcludeFile(file)) {
|
|
269
|
+
return { patterns: [], violations: [], hasOwnershipChecks: false, dominantPattern: null, confidence: 1.0 };
|
|
270
|
+
}
|
|
271
|
+
const userIdChecks = detectUserIdChecks(content, file);
|
|
272
|
+
const ownerFields = detectOwnerFields(content, file);
|
|
273
|
+
const tenantScoping = detectTenantScoping(content, file);
|
|
274
|
+
const createdBy = detectCreatedByPatterns(content, file);
|
|
275
|
+
const ownershipQueries = detectOwnershipQueries(content, file);
|
|
276
|
+
const allPatterns = [...userIdChecks, ...ownerFields, ...tenantScoping, ...createdBy, ...ownershipQueries];
|
|
277
|
+
const violations = detectMissingOwnershipViolations(allPatterns, content, file);
|
|
278
|
+
// Determine dominant pattern
|
|
279
|
+
const typeCounts = {};
|
|
280
|
+
for (const p of allPatterns) {
|
|
281
|
+
typeCounts[p.type] = (typeCounts[p.type] || 0) + 1;
|
|
282
|
+
}
|
|
283
|
+
let dominantPattern = null;
|
|
284
|
+
let maxCount = 0;
|
|
285
|
+
for (const [type, count] of Object.entries(typeCounts)) {
|
|
286
|
+
if (count > maxCount) {
|
|
287
|
+
maxCount = count;
|
|
288
|
+
dominantPattern = type;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
const confidence = allPatterns.length > 0 ? Math.max(0.5, 1 - violations.length * 0.1) : 1.0;
|
|
292
|
+
return {
|
|
293
|
+
patterns: allPatterns,
|
|
294
|
+
violations,
|
|
295
|
+
hasOwnershipChecks: allPatterns.length > 0,
|
|
296
|
+
dominantPattern,
|
|
297
|
+
confidence,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
// ============================================================================
|
|
301
|
+
// Detector Class
|
|
302
|
+
// ============================================================================
|
|
303
|
+
export class ResourceOwnershipDetector extends RegexDetector {
|
|
304
|
+
id = 'auth/resource-ownership';
|
|
305
|
+
name = 'Resource Ownership Detector';
|
|
306
|
+
description = 'Detects resource ownership patterns and missing ownership checks';
|
|
307
|
+
category = 'auth';
|
|
308
|
+
subcategory = 'ownership';
|
|
309
|
+
supportedLanguages = ['typescript', 'javascript', 'python'];
|
|
310
|
+
async detect(context) {
|
|
311
|
+
const { content, file } = context;
|
|
312
|
+
if (shouldExcludeFile(file))
|
|
313
|
+
return this.createEmptyResult();
|
|
314
|
+
const analysis = analyzeOwnership(content, file);
|
|
315
|
+
return this.createResult([], [], analysis.confidence);
|
|
316
|
+
}
|
|
317
|
+
generateQuickFix() {
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
export function createResourceOwnershipDetector() {
|
|
322
|
+
return new ResourceOwnershipDetector();
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=resource-ownership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-ownership.js","sourceRoot":"","sources":["../../src/auth/resource-ownership.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,aAAa,EAA+C,MAAM,kBAAkB,CAAC;AAkD9F,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,iCAAiC;IACjC,4DAA4D;IAC5D,yDAAyD;IACzD,qEAAqE;IACrE,kDAAkD;IAClD,oDAAoD;IACpD,gDAAgD;IAChD,yDAAyD;IACzD,yDAAyD;IACzD,gEAAgE;IAChE,sDAAsD;CAC9C,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,iCAAiC;IACjC,eAAe;IACf,kBAAkB;IAClB,kBAAkB;IAClB,eAAe;IACf,iBAAiB;IACjB,+BAA+B;IAC/B,gBAAgB;IAChB,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;IAClB,YAAY;CACJ,CAAC;AAEX,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,iCAAiC;IACjC,mBAAmB;IACnB,yBAAyB;IACzB,gBAAgB;IAChB,gBAAgB;IAChB,sBAAsB;IACtB,sBAAsB;IACtB,+BAA+B;IAC/B,iBAAiB;IACjB,uBAAuB;IACvB,cAAc;IACd,iBAAiB;IACjB,uBAAuB;IACvB,oBAAoB;IACpB,kBAAkB;CACV,CAAC;AAEX,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,oBAAoB;IACpB,iBAAiB;IACjB,mBAAmB;IACnB,gBAAgB;CACR,CAAC;AAEX,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,iCAAiC;IACjC,iDAAiD;IACjD,8DAA8D;IAC9D,wDAAwD;IACxD,iCAAiC;IACjC,qDAAqD;IACrD,qCAAqC;IACrC,sCAAsC;IACtC,kCAAkC;IAClC,mCAAmC;IACnC,sCAAsC;IACtC,oCAAoC;IACpC,sDAAsD;CAC9C,CAAC;AAEX,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,qBAAqB;IACrB,eAAe;IACf,YAAY;IACZ,eAAe;CACP,CAAC;AAEX,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;IAClB,iBAAiB;IACjB,sBAAsB;CACd,CAAC;AAEX,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,kBAAkB;IAClB,kBAAkB;IAClB,gBAAgB;IAChB,UAAU;IACV,YAAY;IACZ,cAAc;IACd,eAAe;CAChB,CAAC;AAEF,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,KAAa;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACrF,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,KAAa;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACvC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;AACvF,CAAC;AAED,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,IAAY;IAC9D,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,MAAM,OAAO,IAAI,sBAAsB,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9C,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;gBAAE,SAAS;YACpD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,IAAI,EAAE,MAAM;gBAClB,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;gBACrB,OAAO,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,IAAY;IAC7D,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,MAAM,OAAO,IAAI,oBAAoB,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9C,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;gBAAE,SAAS;YACpD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,IAAI,EAAE,MAAM;gBAClB,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;gBACrB,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;gBAC5C,OAAO,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,IAAY;IAC/D,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,MAAM,OAAO,IAAI,qBAAqB,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9C,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;gBAAE,SAAS;YACpD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,IAAI,EAAE,MAAM;gBAClB,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;gBACrB,OAAO,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,IAAY;IACnE,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9C,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;gBAAE,SAAS;YACpD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,IAAI,EAAE,MAAM;gBAClB,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;gBACrB,OAAO,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,IAAY;IAClE,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,MAAM,OAAO,IAAI,wBAAwB,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9C,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;gBAAE,SAAS;YACpD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,IAAI,EAAE,MAAM;gBAClB,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;gBACrB,OAAO,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,QAAgC,EAChC,OAAe,EACf,IAAY;IAEZ,MAAM,UAAU,GAA6B,EAAE,CAAC;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAE/C,wDAAwD;IACxD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9F,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,KAAK,MAAM,OAAO,IAAI,4BAA4B,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YACxD,IAAI,KAAK,CAAC;YACV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC9C,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;oBAAE,SAAS;gBACpD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC3D,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,yBAAyB;oBAC/B,IAAI,EAAE,IAAI,EAAE,MAAM;oBAClB,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;oBACnC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;oBACf,KAAK,EAAE,qDAAqD;oBAC5D,YAAY,EAAE,qDAAqD;oBACnE,WAAW,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE;iBACnC,CAAC,CAAC;gBACH,MAAM,CAAC,0BAA0B;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,+EAA+E;AAC/E,yBAAyB;AACzB,+EAA+E;AAE/E,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,IAAY;IAC5D,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;IAC7G,CAAC;IAED,MAAM,YAAY,GAAG,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,uBAAuB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACzD,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE/D,MAAM,WAAW,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,WAAW,EAAE,GAAG,aAAa,EAAE,GAAG,SAAS,EAAE,GAAG,gBAAgB,CAAC,CAAC;IAC3G,MAAM,UAAU,GAAG,gCAAgC,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAEhF,6BAA6B;IAC7B,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,eAAe,GAAgC,IAAI,CAAC;IACxD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACvD,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;YACrB,QAAQ,GAAG,KAAK,CAAC;YACjB,eAAe,GAAG,IAA4B,CAAC;QACjD,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAE7F,OAAO;QACL,QAAQ,EAAE,WAAW;QACrB,UAAU;QACV,kBAAkB,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC;QAC1C,eAAe;QACf,UAAU;KACX,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,MAAM,OAAO,yBAA0B,SAAQ,aAAa;IACjD,EAAE,GAAG,yBAAyB,CAAC;IAC/B,IAAI,GAAG,6BAA6B,CAAC;IACrC,WAAW,GAAG,kEAAkE,CAAC;IACjF,QAAQ,GAAG,MAAM,CAAC;IAClB,WAAW,GAAG,WAAW,CAAC;IAC1B,kBAAkB,GAAe,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IAEjF,KAAK,CAAC,MAAM,CAAC,OAAyB;QACpC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QAClC,IAAI,iBAAiB,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE7D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,MAAM,UAAU,+BAA+B;IAC7C,OAAO,IAAI,yBAAyB,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Handling Detector - Token pattern detection
|
|
3
|
+
*
|
|
4
|
+
* Detects token handling patterns including JWT storage, refresh tokens,
|
|
5
|
+
* token validation, and secure token practices.
|
|
6
|
+
*
|
|
7
|
+
* Flags violations: Insecure token storage, missing refresh logic, exposed tokens.
|
|
8
|
+
*
|
|
9
|
+
* @requirements 11.2 - Token handling patterns
|
|
10
|
+
*/
|
|
11
|
+
import type { Language } from 'driftdetect-core';
|
|
12
|
+
import { RegexDetector, type DetectionContext, type DetectionResult } from '../base/index.js';
|
|
13
|
+
export type TokenPatternType = 'jwt-storage' | 'refresh-token' | 'token-validation' | 'token-extraction' | 'secure-cookie';
|
|
14
|
+
export type TokenViolationType = 'insecure-storage' | 'missing-refresh' | 'token-in-url' | 'token-logged';
|
|
15
|
+
export interface TokenPatternInfo {
|
|
16
|
+
type: TokenPatternType;
|
|
17
|
+
file: string;
|
|
18
|
+
line: number;
|
|
19
|
+
column: number;
|
|
20
|
+
matchedText: string;
|
|
21
|
+
storageType?: string;
|
|
22
|
+
context?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface TokenViolationInfo {
|
|
25
|
+
type: TokenViolationType;
|
|
26
|
+
file: string;
|
|
27
|
+
line: number;
|
|
28
|
+
column: number;
|
|
29
|
+
endLine: number;
|
|
30
|
+
endColumn: number;
|
|
31
|
+
value: string;
|
|
32
|
+
issue: string;
|
|
33
|
+
suggestedFix?: string;
|
|
34
|
+
lineContent: string;
|
|
35
|
+
}
|
|
36
|
+
export interface TokenAnalysis {
|
|
37
|
+
patterns: TokenPatternInfo[];
|
|
38
|
+
violations: TokenViolationInfo[];
|
|
39
|
+
usesSecureStorage: boolean;
|
|
40
|
+
hasRefreshLogic: boolean;
|
|
41
|
+
}
|
|
42
|
+
export declare const TOKEN_STORAGE_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp];
|
|
43
|
+
export declare const SECURE_COOKIE_PATTERNS: readonly [RegExp, RegExp, RegExp];
|
|
44
|
+
export declare const REFRESH_TOKEN_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp, RegExp];
|
|
45
|
+
export declare const TOKEN_VALIDATION_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp, RegExp, RegExp];
|
|
46
|
+
export declare const TOKEN_EXTRACTION_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp, RegExp];
|
|
47
|
+
export declare const INSECURE_STORAGE_PATTERNS: readonly [RegExp];
|
|
48
|
+
export declare const TOKEN_IN_URL_PATTERNS: readonly [RegExp, RegExp, RegExp];
|
|
49
|
+
export declare const TOKEN_LOGGED_PATTERNS: readonly [RegExp, RegExp, RegExp];
|
|
50
|
+
export declare const EXCLUDED_FILE_PATTERNS: RegExp[];
|
|
51
|
+
export declare function shouldExcludeFile(filePath: string): boolean;
|
|
52
|
+
export declare function analyzeTokenHandling(content: string, file: string): TokenAnalysis;
|
|
53
|
+
export declare class TokenHandlingDetector extends RegexDetector {
|
|
54
|
+
readonly id = "auth/token-handling";
|
|
55
|
+
readonly name = "Token Handling Detector";
|
|
56
|
+
readonly description = "Detects token handling patterns and security issues";
|
|
57
|
+
readonly category = "auth";
|
|
58
|
+
readonly subcategory = "tokens";
|
|
59
|
+
readonly supportedLanguages: Language[];
|
|
60
|
+
detect(context: DetectionContext): Promise<DetectionResult>;
|
|
61
|
+
generateQuickFix(): null;
|
|
62
|
+
}
|
|
63
|
+
export declare function createTokenHandlingDetector(): TokenHandlingDetector;
|
|
64
|
+
//# sourceMappingURL=token-handling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-handling.d.ts","sourceRoot":"","sources":["../../src/auth/token-handling.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE9F,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,eAAe,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,eAAe,CAAC;AAC3H,MAAM,MAAM,kBAAkB,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,cAAc,GAAG,cAAc,CAAC;AAE1G,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,kBAAkB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,sBAAsB,2CAKzB,CAAC;AAEX,eAAO,MAAM,sBAAsB,mCAIzB,CAAC;AAEX,eAAO,MAAM,sBAAsB,mDAMzB,CAAC;AAEX,eAAO,MAAM,yBAAyB,2DAO5B,CAAC;AAEX,eAAO,MAAM,yBAAyB,mDAM5B,CAAC;AAEX,eAAO,MAAM,yBAAyB,mBAE5B,CAAC;AAEX,eAAO,MAAM,qBAAqB,mCAIxB,CAAC;AAEX,eAAO,MAAM,qBAAqB,mCAIxB,CAAC;AAEX,eAAO,MAAM,sBAAsB,UAAyE,CAAC;AAE7G,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE3D;AAoDD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CA0BjF;AAED,qBAAa,qBAAsB,SAAQ,aAAa;IACtD,QAAQ,CAAC,EAAE,yBAAyB;IACpC,QAAQ,CAAC,IAAI,6BAA6B;IAC1C,QAAQ,CAAC,WAAW,yDAAyD;IAC7E,QAAQ,CAAC,QAAQ,UAAU;IAC3B,QAAQ,CAAC,WAAW,YAAY;IAChC,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,EAAE,CAA0C;IAE3E,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAUjE,gBAAgB,IAAI,IAAI;CAGzB;AAED,wBAAgB,2BAA2B,IAAI,qBAAqB,CAEnE"}
|