@sun-asterisk/sunlint 1.3.39 → 1.3.41
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/config/rules/rules-registry-generated.json +134 -108
- package/core/rule-selection-service.js +11 -0
- package/docs/GENERATED_FILES_QUICK_REFERENCE.md +96 -0
- package/docs/GENERATED_FILE_HANDLING_SUMMARY.md +152 -0
- package/docs/skills/CREATE_NEW_DART_RULE.md +161 -14
- package/origin-rules/dart-en.md +151 -163
- package/package.json +2 -1
- package/rules/dart/D002_dispose_resources/config.json +25 -0
- package/rules/dart/D003_prefer_widgets_over_methods/config.json +14 -0
- package/rules/dart/D004_avoid_shrinkwrap_listview/config.json +13 -0
- package/rules/dart/D005_limit_widget_nesting/config.json +13 -0
- package/rules/dart/D006_prefer_extracting_large_callbacks/config.json +25 -0
- package/rules/dart/D007_prefer_init_first_dispose_last/config.json +10 -0
- package/rules/dart/D008_avoid_long_functions/config.json +12 -0
- package/rules/dart/D009_limit_function_parameters/config.json +13 -0
- package/rules/dart/D010_limit_cyclomatic_complexity/config.json +12 -0
- package/rules/dart/D011_prefer_named_parameters/config.json +12 -0
- package/rules/dart/D012_prefer_named_boolean_parameters/config.json +9 -0
- package/rules/dart/D013_single_public_class/config.json +10 -0
- package/rules/dart/D014_unsafe_collection_access/config.json +10 -0
- package/rules/dart/D015_copywith_all_parameters/config.json +9 -0
- package/rules/dart/D016_project_should_have_tests/config.json +24 -0
- package/rules/dart/D017_pubspec_dependencies_review/config.json +23 -0
- package/rules/dart/D018_remove_commented_code/config.json +13 -0
- package/rules/dart/D019_avoid_single_child_multi_child_widget/config.json +21 -0
- package/rules/dart/D020_limit_if_else_branches/config.json +12 -0
- package/rules/dart/D021_avoid_negated_boolean_checks/config.json +14 -0
- package/rules/dart/D022_use_setstate_correctly/config.json +14 -0
- package/rules/dart/D023_avoid_unnecessary_method_overrides/config.json +13 -0
- package/rules/dart/D024_avoid_unnecessary_stateful_widget/config.json +9 -0
- package/rules/dart/D025_avoid_nested_conditional_expressions/config.json +9 -0
- package/skill-assets/sunlint-code-quality/AGENTS.md +80 -0
- package/skill-assets/sunlint-code-quality/SKILL.md +176 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C006-verb-noun-functions.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C013-no-dead-code.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C014-dependency-injection.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C017-no-constructor-logic.md +46 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C018-generic-errors.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C019-error-log-level.md +29 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C020-no-unused-imports.md +30 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C022-no-unused-variables.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C023-no-duplicate-names.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C024-centralize-constants.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C029-catch-log-root-cause.md +40 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C030-custom-error-classes.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C033-separate-data-access.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C035-error-context-logging.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C041-no-hardcoded-secrets.md +25 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C042-boolean-naming.md +27 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C052-controller-parsing.md +41 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C060-superclass-logic.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C067-no-hardcoded-config.md +24 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S003-open-redirect.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S004-no-log-credentials.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S005-server-authorization.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S006-default-credentials.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S007-output-encoding.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S009-approved-crypto.md +37 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S010-csprng.md +32 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S011-encrypted-client-hello.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S012-secrets-management.md +35 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S013-tls-connections.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S016-no-sensitive-query-string.md +39 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S017-parameterized-queries.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S019-email-input-sanitization.md +35 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S020-eval-code-execution.md +56 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S022-context-escaping.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S023-dynamic-js-encoding.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S025-server-validation.md +56 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S026-tls-encryption.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S027-mtls-validation.md +40 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S028-upload-limits.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S029-csrf-protection.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S030-directory-browsing.md +26 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S031-secure-cookie-flag.md +35 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S032-httponly-cookie.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S033-samesite-cookie.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S034-host-prefix-cookie.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S035-app-hostnames.md +26 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S036-internal-file-paths.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S037-anti-cache-headers.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S039-tls-certificate-validation.md +41 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S041-logout-invalidation.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S042-long-lived-sessions.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S044-critical-changes-reauth.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S045-brute-force-protection.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S047-oauth-csrf-protection.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S048-oauth-redirect-validation.md +37 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S049-auth-code-expiry.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S050-token-entropy.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S051-password-length.md +35 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S052-otp-entropy.md +26 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S053-generic-error-messages.md +32 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S054-no-default-admin.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S055-content-type-validation.md +44 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S056-log-injection.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S057-synchronized-time.md +27 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S058-ssrf-protection.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/go/C006-verb-noun-functions.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/go/C013-no-dead-code.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/go/C014-dependency-injection.md +85 -0
- package/skill-assets/sunlint-code-quality/rules/go/C017-no-constructor-logic.md +67 -0
- package/skill-assets/sunlint-code-quality/rules/go/C018-generic-errors.md +63 -0
- package/skill-assets/sunlint-code-quality/rules/go/C019-error-log-level.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/go/C020-no-unused-imports.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/go/C022-no-unused-variables.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/go/C023-no-duplicate-names.md +41 -0
- package/skill-assets/sunlint-code-quality/rules/go/C024-centralize-constants.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/go/C029-catch-log-root-cause.md +56 -0
- package/skill-assets/sunlint-code-quality/rules/go/C030-custom-error-classes.md +69 -0
- package/skill-assets/sunlint-code-quality/rules/go/C033-separate-data-access.md +68 -0
- package/skill-assets/sunlint-code-quality/rules/go/C035-error-context-logging.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/go/C041-no-hardcoded-secrets.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/go/C042-boolean-naming.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/go/C052-controller-parsing.md +62 -0
- package/skill-assets/sunlint-code-quality/rules/go/C060-superclass-logic.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/go/C067-no-hardcoded-config.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/go/S003-open-redirect.md +80 -0
- package/skill-assets/sunlint-code-quality/rules/go/S004-no-log-credentials.md +66 -0
- package/skill-assets/sunlint-code-quality/rules/go/S005-server-authorization.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/go/S006-default-credentials.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/go/S007-output-encoding.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/go/S009-approved-crypto.md +63 -0
- package/skill-assets/sunlint-code-quality/rules/go/S010-csprng.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/go/S011-encrypted-client-hello.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/go/S012-secrets-management.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/go/S013-tls-connections.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/go/S016-no-sensitive-query-string.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/go/S017-parameterized-queries.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/go/S019-email-input-sanitization.md +44 -0
- package/skill-assets/sunlint-code-quality/rules/go/S020-eval-code-execution.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/go/S022-context-escaping.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/go/S023-dynamic-js-encoding.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/go/S025-server-validation.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/go/S026-tls-encryption.md +46 -0
- package/skill-assets/sunlint-code-quality/rules/go/S027-mtls-validation.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/go/S028-upload-limits.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/go/S029-csrf-protection.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/go/S030-directory-browsing.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/go/S031-secure-cookie-flag.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/go/S032-httponly-cookie.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/go/S033-samesite-cookie.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/go/S034-host-prefix-cookie.md +44 -0
- package/skill-assets/sunlint-code-quality/rules/go/S035-app-hostnames.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/go/S036-internal-file-paths.md +56 -0
- package/skill-assets/sunlint-code-quality/rules/go/S037-anti-cache-headers.md +43 -0
- package/skill-assets/sunlint-code-quality/rules/go/S039-tls-certificate-validation.md +41 -0
- package/skill-assets/sunlint-code-quality/rules/go/S041-logout-invalidation.md +46 -0
- package/skill-assets/sunlint-code-quality/rules/go/S042-long-lived-sessions.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/go/S044-critical-changes-reauth.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/go/S045-brute-force-protection.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/go/S047-oauth-csrf-protection.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/go/S048-oauth-redirect-validation.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/go/S049-auth-code-expiry.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/go/S050-token-entropy.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/go/S051-password-length.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/go/S052-otp-entropy.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/go/S053-generic-error-messages.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/go/S054-no-default-admin.md +43 -0
- package/skill-assets/sunlint-code-quality/rules/go/S055-content-type-validation.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/go/S056-log-injection.md +40 -0
- package/skill-assets/sunlint-code-quality/rules/go/S057-synchronized-time.md +40 -0
- package/skill-assets/sunlint-code-quality/rules/go/S058-ssrf-protection.md +70 -0
- package/skill-assets/sunlint-code-quality/rules/java/C006-verb-noun-functions.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/java/C013-no-dead-code.md +175 -0
- package/skill-assets/sunlint-code-quality/rules/java/C014-dependency-injection.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/java/C017-no-constructor-logic.md +39 -0
- package/skill-assets/sunlint-code-quality/rules/java/C018-generic-errors.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/java/C019-error-log-level.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/java/C020-no-unused-imports.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/java/C022-no-unused-variables.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/java/C023-no-duplicate-names.md +37 -0
- package/skill-assets/sunlint-code-quality/rules/java/C024-centralize-constants.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/java/C029-catch-log-root-cause.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/java/C030-custom-error-classes.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/java/C033-separate-data-access.md +46 -0
- package/skill-assets/sunlint-code-quality/rules/java/C035-error-context-logging.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/java/C041-no-hardcoded-secrets.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/java/C042-boolean-naming.md +27 -0
- package/skill-assets/sunlint-code-quality/rules/java/C052-controller-parsing.md +39 -0
- package/skill-assets/sunlint-code-quality/rules/java/C060-superclass-logic.md +32 -0
- package/skill-assets/sunlint-code-quality/rules/java/C067-no-hardcoded-config.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/java/S003-open-redirect.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/java/S004-no-log-credentials.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/java/S005-server-authorization.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/java/S006-default-credentials.md +39 -0
- package/skill-assets/sunlint-code-quality/rules/java/S007-output-encoding.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/java/S009-approved-crypto.md +40 -0
- package/skill-assets/sunlint-code-quality/rules/java/S010-csprng.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/java/S011-encrypted-client-hello.md +27 -0
- package/skill-assets/sunlint-code-quality/rules/java/S012-secrets-management.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/java/S013-tls-connections.md +40 -0
- package/skill-assets/sunlint-code-quality/rules/java/S016-no-sensitive-query-string.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/java/S017-parameterized-queries.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/java/S019-email-input-sanitization.md +32 -0
- package/skill-assets/sunlint-code-quality/rules/java/S020-eval-code-execution.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/java/S022-context-escaping.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/java/S023-dynamic-js-encoding.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/java/S025-server-validation.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/java/S026-tls-encryption.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/java/S027-mtls-validation.md +26 -0
- package/skill-assets/sunlint-code-quality/rules/java/S028-upload-limits.md +35 -0
- package/skill-assets/sunlint-code-quality/rules/java/S029-csrf-protection.md +35 -0
- package/skill-assets/sunlint-code-quality/rules/java/S030-directory-browsing.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/java/S031-secure-cookie-flag.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/java/S032-httponly-cookie.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/java/S033-samesite-cookie.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/java/S034-host-prefix-cookie.md +35 -0
- package/skill-assets/sunlint-code-quality/rules/java/S035-app-hostnames.md +23 -0
- package/skill-assets/sunlint-code-quality/rules/java/S036-internal-file-paths.md +39 -0
- package/skill-assets/sunlint-code-quality/rules/java/S037-anti-cache-headers.md +37 -0
- package/skill-assets/sunlint-code-quality/rules/java/S039-tls-certificate-validation.md +43 -0
- package/skill-assets/sunlint-code-quality/rules/java/S041-logout-invalidation.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/java/S042-long-lived-sessions.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/java/S044-critical-changes-reauth.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/java/S045-brute-force-protection.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/java/S047-oauth-csrf-protection.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/java/S048-oauth-redirect-validation.md +25 -0
- package/skill-assets/sunlint-code-quality/rules/java/S049-auth-code-expiry.md +23 -0
- package/skill-assets/sunlint-code-quality/rules/java/S050-token-entropy.md +20 -0
- package/skill-assets/sunlint-code-quality/rules/java/S051-password-length.md +20 -0
- package/skill-assets/sunlint-code-quality/rules/java/S052-otp-entropy.md +23 -0
- package/skill-assets/sunlint-code-quality/rules/java/S053-generic-error-messages.md +21 -0
- package/skill-assets/sunlint-code-quality/rules/java/S054-no-default-admin.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/java/S055-content-type-validation.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/java/S056-log-injection.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/java/S057-synchronized-time.md +35 -0
- package/skill-assets/sunlint-code-quality/rules/java/S058-ssrf-protection.md +56 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C006-verb-noun-functions.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C013-no-dead-code.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C014-dependency-injection.md +64 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C017-no-constructor-logic.md +68 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C018-generic-errors.md +46 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C019-error-log-level.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C020-no-unused-imports.md +44 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C022-no-unused-variables.md +39 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C023-no-duplicate-names.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C024-centralize-constants.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C029-catch-log-root-cause.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C030-custom-error-classes.md +72 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C033-separate-data-access.md +69 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C035-error-context-logging.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C041-no-hardcoded-secrets.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C042-boolean-naming.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C052-controller-parsing.md +71 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C060-superclass-logic.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C067-no-hardcoded-config.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S003-open-redirect.md +66 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S004-no-log-credentials.md +59 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S005-server-authorization.md +75 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S006-default-credentials.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S007-output-encoding.md +62 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S009-approved-crypto.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S010-csprng.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S011-encrypted-client-hello.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S012-secrets-management.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S013-tls-connections.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S016-no-sensitive-query-string.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S017-parameterized-queries.md +41 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S019-email-input-sanitization.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S020-eval-code-execution.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S022-context-escaping.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S023-dynamic-js-encoding.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S025-server-validation.md +59 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S026-tls-encryption.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S027-mtls-validation.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S028-upload-limits.md +67 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S029-csrf-protection.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S030-directory-browsing.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S031-secure-cookie-flag.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S032-httponly-cookie.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S033-samesite-cookie.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S034-host-prefix-cookie.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S035-app-hostnames.md +59 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S036-internal-file-paths.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S037-anti-cache-headers.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S039-tls-certificate-validation.md +62 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S041-logout-invalidation.md +71 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S042-long-lived-sessions.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S044-critical-changes-reauth.md +64 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S045-brute-force-protection.md +64 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S047-oauth-csrf-protection.md +74 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S048-oauth-redirect-validation.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S049-auth-code-expiry.md +70 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S050-token-entropy.md +65 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S051-password-length.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S052-otp-entropy.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S053-generic-error-messages.md +66 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S054-no-default-admin.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S055-content-type-validation.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S056-log-injection.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S057-synchronized-time.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S058-ssrf-protection.md +69 -0
- package/skill-assets/sunlint-code-quality/rules/php/C006-verb-noun-functions.md +46 -0
- package/skill-assets/sunlint-code-quality/rules/php/C013-no-dead-code.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/php/C014-dependency-injection.md +71 -0
- package/skill-assets/sunlint-code-quality/rules/php/C017-no-constructor-logic.md +68 -0
- package/skill-assets/sunlint-code-quality/rules/php/C018-generic-errors.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/php/C019-error-log-level.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/php/C020-no-unused-imports.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/php/C022-no-unused-variables.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/php/C023-no-duplicate-names.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/php/C024-centralize-constants.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/php/C029-catch-log-root-cause.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/php/C030-custom-error-classes.md +62 -0
- package/skill-assets/sunlint-code-quality/rules/php/C033-separate-data-access.md +79 -0
- package/skill-assets/sunlint-code-quality/rules/php/C035-error-context-logging.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/php/C041-no-hardcoded-secrets.md +59 -0
- package/skill-assets/sunlint-code-quality/rules/php/C042-boolean-naming.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/php/C052-controller-parsing.md +66 -0
- package/skill-assets/sunlint-code-quality/rules/php/C060-superclass-logic.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/php/C067-no-hardcoded-config.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/php/S003-open-redirect.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/php/S004-no-log-credentials.md +67 -0
- package/skill-assets/sunlint-code-quality/rules/php/S005-server-authorization.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/php/S006-default-credentials.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/php/S007-output-encoding.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/php/S009-approved-crypto.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/php/S010-csprng.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/php/S011-encrypted-client-hello.md +41 -0
- package/skill-assets/sunlint-code-quality/rules/php/S012-secrets-management.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/php/S013-tls-connections.md +67 -0
- package/skill-assets/sunlint-code-quality/rules/php/S016-no-sensitive-query-string.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/php/S017-parameterized-queries.md +44 -0
- package/skill-assets/sunlint-code-quality/rules/php/S019-email-input-sanitization.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/php/S020-eval-code-execution.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/php/S022-context-escaping.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/php/S023-dynamic-js-encoding.md +62 -0
- package/skill-assets/sunlint-code-quality/rules/php/S025-server-validation.md +63 -0
- package/skill-assets/sunlint-code-quality/rules/php/S026-tls-encryption.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/php/S027-mtls-validation.md +62 -0
- package/skill-assets/sunlint-code-quality/rules/php/S028-upload-limits.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/php/S029-csrf-protection.md +65 -0
- package/skill-assets/sunlint-code-quality/rules/php/S030-directory-browsing.md +40 -0
- package/skill-assets/sunlint-code-quality/rules/php/S031-secure-cookie-flag.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/php/S032-httponly-cookie.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/php/S033-samesite-cookie.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/php/S034-host-prefix-cookie.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/php/S035-app-hostnames.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/php/S036-internal-file-paths.md +56 -0
- package/skill-assets/sunlint-code-quality/rules/php/S037-anti-cache-headers.md +56 -0
- package/skill-assets/sunlint-code-quality/rules/php/S039-tls-certificate-validation.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/php/S041-logout-invalidation.md +63 -0
- package/skill-assets/sunlint-code-quality/rules/php/S042-long-lived-sessions.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/php/S044-critical-changes-reauth.md +71 -0
- package/skill-assets/sunlint-code-quality/rules/php/S045-brute-force-protection.md +67 -0
- package/skill-assets/sunlint-code-quality/rules/php/S047-oauth-csrf-protection.md +72 -0
- package/skill-assets/sunlint-code-quality/rules/php/S048-oauth-redirect-validation.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/php/S049-auth-code-expiry.md +71 -0
- package/skill-assets/sunlint-code-quality/rules/php/S050-token-entropy.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/php/S051-password-length.md +59 -0
- package/skill-assets/sunlint-code-quality/rules/php/S052-otp-entropy.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/php/S053-generic-error-messages.md +59 -0
- package/skill-assets/sunlint-code-quality/rules/php/S054-no-default-admin.md +62 -0
- package/skill-assets/sunlint-code-quality/rules/php/S055-content-type-validation.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/php/S056-log-injection.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/php/S057-synchronized-time.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/php/S058-ssrf-protection.md +65 -0
- package/skill-assets/sunlint-code-quality/rules/python/C006-verb-noun-functions.md +30 -0
- package/skill-assets/sunlint-code-quality/rules/python/C013-no-dead-code.md +24 -0
- package/skill-assets/sunlint-code-quality/rules/python/C014-dependency-injection.md +68 -0
- package/skill-assets/sunlint-code-quality/rules/python/C017-no-constructor-logic.md +30 -0
- package/skill-assets/sunlint-code-quality/rules/python/C018-generic-errors.md +25 -0
- package/skill-assets/sunlint-code-quality/rules/python/C019-error-log-level.md +26 -0
- package/skill-assets/sunlint-code-quality/rules/python/C020-no-unused-imports.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/python/C022-no-unused-variables.md +24 -0
- package/skill-assets/sunlint-code-quality/rules/python/C023-no-duplicate-names.md +27 -0
- package/skill-assets/sunlint-code-quality/rules/python/C024-centralize-constants.md +27 -0
- package/skill-assets/sunlint-code-quality/rules/python/C029-catch-log-root-cause.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/python/C030-custom-error-classes.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/python/C033-separate-data-access.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/python/C035-error-context-logging.md +26 -0
- package/skill-assets/sunlint-code-quality/rules/python/C041-no-hardcoded-secrets.md +23 -0
- package/skill-assets/sunlint-code-quality/rules/python/C042-boolean-naming.md +24 -0
- package/skill-assets/sunlint-code-quality/rules/python/C052-controller-parsing.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/python/C060-superclass-logic.md +26 -0
- package/skill-assets/sunlint-code-quality/rules/python/C067-no-hardcoded-config.md +22 -0
- package/skill-assets/sunlint-code-quality/rules/python/S003-open-redirect.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S004-no-log-credentials.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S005-server-authorization.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S006-default-credentials.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S007-output-encoding.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S009-approved-crypto.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S010-csprng.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S011-encrypted-client-hello.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S012-secrets-management.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S013-tls-connections.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S016-no-sensitive-query-string.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S017-parameterized-queries.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/python/S019-email-input-sanitization.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S020-eval-code-execution.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/python/S022-context-escaping.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S023-dynamic-js-encoding.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S025-server-validation.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S026-tls-encryption.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S027-mtls-validation.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S028-upload-limits.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S029-csrf-protection.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S030-directory-browsing.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S031-secure-cookie-flag.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S032-httponly-cookie.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S033-samesite-cookie.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S034-host-prefix-cookie.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S035-app-hostnames.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S036-internal-file-paths.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/python/S037-anti-cache-headers.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S039-tls-certificate-validation.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S041-logout-invalidation.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S042-long-lived-sessions.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S044-critical-changes-reauth.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S045-brute-force-protection.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S047-oauth-csrf-protection.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S048-oauth-redirect-validation.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S049-auth-code-expiry.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S050-token-entropy.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S051-password-length.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S052-otp-entropy.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S053-generic-error-messages.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S054-no-default-admin.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S055-content-type-validation.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S056-log-injection.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S057-synchronized-time.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S058-ssrf-protection.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C006-verb-noun-functions.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C013-no-dead-code.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C014-dependency-injection.md +69 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C017-no-constructor-logic.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C018-generic-errors.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C019-error-log-level.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C020-no-unused-imports.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C022-no-unused-variables.md +59 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C023-no-duplicate-names.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C024-centralize-constants.md +56 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C029-catch-log-root-cause.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C030-custom-error-classes.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C033-separate-data-access.md +69 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C035-error-context-logging.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C041-no-hardcoded-secrets.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C042-boolean-naming.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C052-controller-parsing.md +64 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C060-superclass-logic.md +67 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C067-no-hardcoded-config.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S003-open-redirect.md +76 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S004-no-log-credentials.md +71 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S005-server-authorization.md +68 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S006-default-credentials.md +69 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S007-output-encoding.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S009-approved-crypto.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S010-csprng.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S011-encrypted-client-hello.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S012-secrets-management.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S013-tls-connections.md +70 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S016-no-sensitive-query-string.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S017-parameterized-queries.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S019-email-input-sanitization.md +56 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S020-eval-code-execution.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S022-context-escaping.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S023-dynamic-js-encoding.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S025-server-validation.md +62 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S026-tls-encryption.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S027-mtls-validation.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S028-upload-limits.md +65 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S029-csrf-protection.md +62 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S030-directory-browsing.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S031-secure-cookie-flag.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S032-httponly-cookie.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S033-samesite-cookie.md +46 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S034-host-prefix-cookie.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S035-app-hostnames.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S036-internal-file-paths.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S037-anti-cache-headers.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S039-tls-certificate-validation.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S041-logout-invalidation.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S042-long-lived-sessions.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S044-critical-changes-reauth.md +69 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S045-brute-force-protection.md +59 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S047-oauth-csrf-protection.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S048-oauth-redirect-validation.md +59 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S049-auth-code-expiry.md +73 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S050-token-entropy.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S051-password-length.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S052-otp-entropy.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S053-generic-error-messages.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S054-no-default-admin.md +64 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S055-content-type-validation.md +64 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S056-log-injection.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S057-synchronized-time.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S058-ssrf-protection.md +63 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: OTPs Must Have 20-bit Entropy
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: ensures that numeric OTPs are difficult to guess within their short lifespan
|
|
5
|
+
tags: otp, authentication, entropy, security, java
|
|
6
|
+
---
|
|
7
|
+
## OTPs Must Have 20-bit Entropy
|
|
8
|
+
|
|
9
|
+
Numeric One-Time Passwords (OTPs) must be long enough to prevent guessing. A 6-digit OTP has approximately 20 bits of entropy, which is the recommended minimum for a short-lived token.
|
|
10
|
+
|
|
11
|
+
**Correct (6-digit OTP):**
|
|
12
|
+
|
|
13
|
+
```java
|
|
14
|
+
SecureRandom random = new SecureRandom();
|
|
15
|
+
int otp = 100000 + random.nextInt(900000); // 6 digits
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Strategy:**
|
|
19
|
+
- Length: Minimum **6 digits**.
|
|
20
|
+
- Expiry: **1-5 minutes**.
|
|
21
|
+
- Rate limit attempts: Max **3-5 attempts** per OTP.
|
|
22
|
+
|
|
23
|
+
**Tools:** Google Authenticator, Twilio Authy
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Return Generic Error Messages To Users
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: prevents information disclosure that could help attackers map the system
|
|
5
|
+
tags: error-handling, security, java
|
|
6
|
+
---
|
|
7
|
+
## Return Generic Error Messages To Users
|
|
8
|
+
|
|
9
|
+
Avoid leaking system details (stack traces, DB versions) in HTTP responses.
|
|
10
|
+
|
|
11
|
+
**Correct (Spring Security Handler):**
|
|
12
|
+
|
|
13
|
+
```java
|
|
14
|
+
@ExceptionHandler(Exception.class)
|
|
15
|
+
public ResponseEntity<String> handle(Exception e) {
|
|
16
|
+
log.error("Internal Error", e);
|
|
17
|
+
return ResponseEntity.status(500).body("An internal error occurred.");
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Tools:** Spring Boot ControllerAdvice
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Avoid Default Admin/Root Accounts
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: prevents access via widely known default credentials
|
|
5
|
+
tags: authentication, security, best-practice, java
|
|
6
|
+
---
|
|
7
|
+
## Avoid Default Admin/Root Accounts
|
|
8
|
+
|
|
9
|
+
Systems should not ship with default, hardcoded administrator accounts.
|
|
10
|
+
|
|
11
|
+
**Correct:**
|
|
12
|
+
- Force password change on first login.
|
|
13
|
+
- Generate a unique random password during the installation/setup process.
|
|
14
|
+
- Do not use "admin" or "root" as default usernames.
|
|
15
|
+
|
|
16
|
+
**Tools:** Security Audit
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Validate Content-Type In REST Services
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: prevents content-type confusion attacks and parsing vulnerabilities
|
|
5
|
+
tags: rest, content-type, validation, api, security, java
|
|
6
|
+
---
|
|
7
|
+
## Validate Content-Type In REST Services
|
|
8
|
+
|
|
9
|
+
Accepting unexpected content types can lead to parsing vulnerabilities (like XML External Entity injection if XML is accidentally processed) or bypass security controls that only inspect certain media types.
|
|
10
|
+
|
|
11
|
+
**Incorrect (accepting any content):**
|
|
12
|
+
|
|
13
|
+
```java
|
|
14
|
+
// VULNERABLE: No restriction on Content-Type
|
|
15
|
+
@PostMapping("/api/data")
|
|
16
|
+
public void handleData(@RequestBody String data) {
|
|
17
|
+
// Parser might try to be "smart" and parse XML inside a String
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Correct (explicit Media Type):**
|
|
22
|
+
|
|
23
|
+
```java
|
|
24
|
+
// SECURE: Only accept JSON
|
|
25
|
+
@PostMapping(value = "/api/data", consumes = MediaType.APPLICATION_JSON_VALUE)
|
|
26
|
+
public ResponseEntity<?> handleData(@RequestBody MyDto dto) {
|
|
27
|
+
return ResponseEntity.ok().build();
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Implementation Details:**
|
|
32
|
+
- Use the `consumes` attribute in `@RequestMapping` / `@PostMapping`.
|
|
33
|
+
- Ensure the server returns `415 Unsupported Media Type` for invalid requests.
|
|
34
|
+
- Reject `multipart/form-data` unless specifically required for file uploads.
|
|
35
|
+
|
|
36
|
+
**Tools:** OWASP ZAP, Postman (testing 415), Manual Review
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Protect Against Log Injection
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: prevents attackers from forged log entries and corrupting audit trails
|
|
5
|
+
tags: logging, injection, log-injection, security, java
|
|
6
|
+
---
|
|
7
|
+
## Protect Against Log Injection
|
|
8
|
+
|
|
9
|
+
Log injection occurs when user-controlled data is written to a log file without sanitization. An attacker can insert newline characters to forge new log entries, confusing administrators or hiding malicious activity.
|
|
10
|
+
|
|
11
|
+
**Incorrect (direct logging of user input):**
|
|
12
|
+
|
|
13
|
+
```java
|
|
14
|
+
// VULNERABLE: User input can contain \n or \r
|
|
15
|
+
String username = request.getParameter("user");
|
|
16
|
+
log.error("Failed login for user: " + username);
|
|
17
|
+
// Input: admin\n[INFO] Login successful for user: admin
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Correct (sanitized logging):**
|
|
21
|
+
|
|
22
|
+
```java
|
|
23
|
+
// SECURE: Sanitize input by replacing newlines
|
|
24
|
+
String username = request.getParameter("user")
|
|
25
|
+
.replace('\n', '_')
|
|
26
|
+
.replace('\r', '_');
|
|
27
|
+
log.error("Failed login for user: {}", username);
|
|
28
|
+
|
|
29
|
+
// Better: Use a logging library/layout that handles encoding automatically
|
|
30
|
+
// (e.g., Logback's %replace or a JSON layout)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Prevention:**
|
|
34
|
+
- Replace `\r` and `\n` characters from all data before logging.
|
|
35
|
+
- Use structured logging (JSON) which naturally escapes these characters.
|
|
36
|
+
- Limit the length of data written to logs.
|
|
37
|
+
|
|
38
|
+
**Tools:** SonarQube (S5147), Veracode, Manual Review
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use Synchronized Time (UTC) In Logs
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: enables accurate incident correlation and audit trail reconstruction across distributed systems
|
|
5
|
+
tags: logging, time, utc, synchronization, security, java
|
|
6
|
+
---
|
|
7
|
+
## Use Synchronized Time (UTC) In Logs
|
|
8
|
+
|
|
9
|
+
Inconsistent timestamps across different servers make it nearly impossible to correlate events during a security incident. Always use UTC and ensure servers are synchronized via NTP.
|
|
10
|
+
|
|
11
|
+
**Incorrect (local time, inconsistent format):**
|
|
12
|
+
|
|
13
|
+
```java
|
|
14
|
+
// VULNERABLE: Local timezone - inconsistent across distributed servers
|
|
15
|
+
log.info("Event at: " + LocalDateTime.now());
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Correct (UTC and standardized format):**
|
|
19
|
+
|
|
20
|
+
```java
|
|
21
|
+
// SECURE: Use Instant (UTC) and ISO-8601
|
|
22
|
+
log.info("Event at: {}", Instant.now());
|
|
23
|
+
|
|
24
|
+
// Or configure the logging framework (logback-spring.xml):
|
|
25
|
+
// <encoder>
|
|
26
|
+
// <pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX, UTC} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
|
27
|
+
// </encoder>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Checklist:**
|
|
31
|
+
- Servers must use NTP (Network Time Protocol) to sync clocks.
|
|
32
|
+
- All application logs must use UTC (not server local time).
|
|
33
|
+
- Use ISO-8601 format for timestamps.
|
|
34
|
+
|
|
35
|
+
**Tools:** NTP, Manual Configuration Review
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Protect Against SSRF Attacks
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: prevents attackers from making requests to internal services or external systems from your server
|
|
5
|
+
tags: ssrf, validation, security, java
|
|
6
|
+
---
|
|
7
|
+
## Protect Against SSRF Attacks
|
|
8
|
+
|
|
9
|
+
Server-Side Request Forgery (SSRF) occurs when an application fetches a resource from a user-supplied URL without validation. Attackers can use this to scan internal networks, access cloud metadata (e.g., `169.254.169.254`), or bypass firewalls.
|
|
10
|
+
|
|
11
|
+
**Incorrect (trusting user URL):**
|
|
12
|
+
|
|
13
|
+
```java
|
|
14
|
+
@GetMapping("/api/fetch")
|
|
15
|
+
public void fetchImage(@RequestParam String url) {
|
|
16
|
+
// VULNERABLE: Attacker input: http://localhost:8080/admin
|
|
17
|
+
// or http://169.254.169.254/latest/meta-data/
|
|
18
|
+
HttpClient.newHttpClient().send(
|
|
19
|
+
HttpRequest.newBuilder().uri(URI.create(url)).build(),
|
|
20
|
+
BodyHandlers.ofString()
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Correct (allow-listing and validation):**
|
|
26
|
+
|
|
27
|
+
```java
|
|
28
|
+
private static final List<String> ALLOWED_DOMAINS = List.of("cdn.sun-asterisk.vn", "images.example.com");
|
|
29
|
+
|
|
30
|
+
@GetMapping("/api/fetch")
|
|
31
|
+
public void fetchImage(@RequestParam String url) {
|
|
32
|
+
URI uri = URI.create(url);
|
|
33
|
+
|
|
34
|
+
// 1. Validate Scheme
|
|
35
|
+
if (!"https".equals(uri.getScheme())) {
|
|
36
|
+
throw new SecurityException("Only HTTPS allowed");
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// 2. Validate Domain (Allow-list)
|
|
40
|
+
if (!ALLOWED_DOMAINS.contains(uri.getHost())) {
|
|
41
|
+
throw new SecurityException("Domain not allowed");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// 3. Prohibit internal/private IPs
|
|
45
|
+
// (Additional check against resolving the IP and checking if it's private)
|
|
46
|
+
|
|
47
|
+
httpClient.send(...);
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Prevention Strategies:**
|
|
52
|
+
- **Allow-listing:** Only allow requests to a small list of known-good domains.
|
|
53
|
+
- **Protocol Restriction:** Only allow `https://` (disable `file://`, `gopher://`, `http://`).
|
|
54
|
+
- **IP Validation:** Never allow requests to internal IP ranges (127.0.0.1, 10.x.x.x, 172.16.x.x, 192.168.x.x, 169.254.169.254).
|
|
55
|
+
|
|
56
|
+
**Tools:** OWASP ZAP, Snyk, Manual Architecture Review
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Function Names Verb-Noun
|
|
3
|
+
impact: LOW
|
|
4
|
+
impactDescription: makes code self-documenting
|
|
5
|
+
tags: naming, functions, readability, conventions, quality, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Function Names Verb-Noun
|
|
9
|
+
|
|
10
|
+
Functions do things. Action verbs make purpose clear. In Kotlin, use camelCase for function names and ensure they start with a verb.
|
|
11
|
+
|
|
12
|
+
**Incorrect (vague names):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
fun user() { } // Noun only
|
|
16
|
+
fun userData() { } // Noun only
|
|
17
|
+
fun doSomething() { } // Vague
|
|
18
|
+
fun handleStuff() { } // Vague
|
|
19
|
+
fun manager() { } // Noun only
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Correct (action verbs):**
|
|
23
|
+
|
|
24
|
+
```kotlin
|
|
25
|
+
fun getUser() { }
|
|
26
|
+
fun createUserAccount() { }
|
|
27
|
+
fun validateEmailFormat() { }
|
|
28
|
+
fun calculateTotalPrice() { }
|
|
29
|
+
fun sendConfirmationEmail() { }
|
|
30
|
+
fun convertCurrencyToUSD() { }
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Verb categories:**
|
|
34
|
+
|
|
35
|
+
| Category | Verbs |
|
|
36
|
+
|----------|-------|
|
|
37
|
+
| Retrieval | `get`, `fetch`, `find`, `load`, `query` |
|
|
38
|
+
| Creation | `create`, `build`, `make`, `generate` |
|
|
39
|
+
| Modification | `set`, `update`, `modify`, `change` |
|
|
40
|
+
| Deletion | `delete`, `remove`, `destroy`, `clear` |
|
|
41
|
+
| Validation | `validate`, `verify`, `check`, `ensure` |
|
|
42
|
+
| Computation | `calculate`, `compute`, `parse`, `format` |
|
|
43
|
+
| Boolean | `is`, `has`, `can`, `should`, `will` |
|
|
44
|
+
|
|
45
|
+
**Tools:** PR review, detekt, Android Studio Linter
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Do Not Use Dead Code
|
|
3
|
+
impact: LOW
|
|
4
|
+
impactDescription: reduces codebase noise and reduces cognitive load
|
|
5
|
+
tags: dead-code, cleanup, maintenance, quality, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Do Not Use Dead Code
|
|
9
|
+
|
|
10
|
+
Dead code confuses readers and makes maintenance harder. Git history preserves deleted code, so there is no need to keep it in the active codebase as comments or unused functions.
|
|
11
|
+
|
|
12
|
+
**Incorrect (keeping dead code):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
fun processOrder(order: Order): Double {
|
|
16
|
+
// Old implementation - keeping for reference
|
|
17
|
+
// val total = order.items.sumOf { it.price * it.quantity }
|
|
18
|
+
|
|
19
|
+
val total = calculateTotal(order)
|
|
20
|
+
return total
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Unused function - someone might need it later
|
|
24
|
+
fun legacyCalculation() { }
|
|
25
|
+
|
|
26
|
+
import com.sun.utils.unusedHelper // Never used
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Correct (clean code):**
|
|
30
|
+
|
|
31
|
+
```kotlin
|
|
32
|
+
fun processOrder(order: Order): Double {
|
|
33
|
+
val total = calculateTotal(order)
|
|
34
|
+
return total
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Delete unused functions - git history preserves them
|
|
38
|
+
// Delete commented code - git history preserves it
|
|
39
|
+
// Remove unused imports
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**Types of dead code:**
|
|
43
|
+
- Commented-out code
|
|
44
|
+
- Unused functions/classes/properties
|
|
45
|
+
- Unused imports
|
|
46
|
+
- Unreachable code
|
|
47
|
+
- Unused local variables
|
|
48
|
+
|
|
49
|
+
**Tools:** detekt (UnusedPrivateMember, UnusedPrivateClass), Android Studio Linter, IntelliJ IDEA
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use Dependency Injection
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: enables testability and loose coupling
|
|
5
|
+
tags: dependency-injection, testing, coupling, architecture, quality, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Use Dependency Injection
|
|
9
|
+
|
|
10
|
+
Direct instantiation of dependencies inside a class creates tight coupling, making unit testing difficult and modifications risky. Dependency Injection (DI) enables mockability, switchability, and better overall architecture.
|
|
11
|
+
|
|
12
|
+
**Incorrect (hardcoded dependencies):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
class OrderService {
|
|
16
|
+
private val db = DatabaseConnection() // Hardcoded dependency
|
|
17
|
+
private val mailer = EmailService() // Hardcoded dependency
|
|
18
|
+
|
|
19
|
+
fun createOrder(data: OrderData): Order {
|
|
20
|
+
val order = db.insert("orders", data)
|
|
21
|
+
mailer.send(data.email, "Order created")
|
|
22
|
+
return order
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Correct (injected dependencies):**
|
|
28
|
+
|
|
29
|
+
```kotlin
|
|
30
|
+
interface Database {
|
|
31
|
+
fun insert(table: String, data: OrderData): Order
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
interface Mailer {
|
|
35
|
+
fun send(to: String, message: String)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
class OrderService(
|
|
39
|
+
private val db: Database,
|
|
40
|
+
private val mailer: Mailer
|
|
41
|
+
) {
|
|
42
|
+
fun createOrder(data: OrderData): Order {
|
|
43
|
+
val order = db.insert("orders", data)
|
|
44
|
+
mailer.send(data.email, "Order created")
|
|
45
|
+
return order
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Usage (manual or via Dagger/Koin/Hilt)
|
|
50
|
+
val service = OrderService(PostgresDatabase(), SendGridMailer())
|
|
51
|
+
|
|
52
|
+
// Testing with MockK
|
|
53
|
+
val mockDb = mockk<Database>()
|
|
54
|
+
val mockMailer = mockk<Mailer>()
|
|
55
|
+
val testService = OrderService(mockDb, mockMailer)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Benefits:**
|
|
59
|
+
- Easy mocking and stubbing for unit tests
|
|
60
|
+
- Modular and reusable components
|
|
61
|
+
- Clear visibility of class dependencies
|
|
62
|
+
- Separation of concerns
|
|
63
|
+
|
|
64
|
+
**Tools:** Dagger-Hilt, Koin, MockK, PR review
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: No Business Logic In Constructors
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: ensures predictable object initialization and testability
|
|
5
|
+
tags: constructor, initialization, side-effects, patterns, quality, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## No Business Logic In Constructors
|
|
9
|
+
|
|
10
|
+
Constructors should only be used to assign dependencies and initialize simple state. Complex logic, I/O operations, or external system calls in constructors are hard to test, trap errors poorly, and can lead to uninitialized state issues.
|
|
11
|
+
|
|
12
|
+
**Incorrect (logic in constructor):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
class UserService(configPath: String) {
|
|
16
|
+
private val config: Config
|
|
17
|
+
|
|
18
|
+
init {
|
|
19
|
+
// BAD: Blocking I/O in constructor
|
|
20
|
+
val rawConfig = File(configPath).readText()
|
|
21
|
+
this.config = Json.decodeFromString<Config>(rawConfig)
|
|
22
|
+
|
|
23
|
+
// BAD: Starting threads or network calls
|
|
24
|
+
GlobalScope.launch {
|
|
25
|
+
initializeExternalSystem()
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// BAD: Non-trivial logging
|
|
29
|
+
println("UserService initialized")
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Correct (Factory pattern or Dependency Injection):**
|
|
35
|
+
|
|
36
|
+
```kotlin
|
|
37
|
+
class UserService(
|
|
38
|
+
private val config: Config,
|
|
39
|
+
private val httpClient: HttpClient
|
|
40
|
+
) {
|
|
41
|
+
// Only assignments, no complex logic in init
|
|
42
|
+
|
|
43
|
+
companion object {
|
|
44
|
+
// Factory method for complex initialization
|
|
45
|
+
suspend fun create(configPath: String): UserService {
|
|
46
|
+
val rawConfig = withContext(Dispatchers.IO) {
|
|
47
|
+
File(configPath).readText()
|
|
48
|
+
}
|
|
49
|
+
val config = Json.decodeFromString<Config>(rawConfig)
|
|
50
|
+
|
|
51
|
+
val httpClient = HttpClient()
|
|
52
|
+
httpClient.initialize()
|
|
53
|
+
|
|
54
|
+
return UserService(config, httpClient)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Usage
|
|
60
|
+
val service = UserService.create("./config.json")
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Recommended Practices:**
|
|
64
|
+
- Use `companion object` for factory methods.
|
|
65
|
+
- Inject dependencies via constructor.
|
|
66
|
+
- Move side effects to dedicated `init()` or `start()` methods called explicitly after object creation.
|
|
67
|
+
|
|
68
|
+
**Tools:** Static analyzer, detekt, Manual Review
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Do Not Throw Generic Exceptions
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: enables specific error handling and accurate monitoring
|
|
5
|
+
tags: error-handling, exceptions, custom-errors, debugging, quality, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Do Not Throw Generic Exceptions
|
|
9
|
+
|
|
10
|
+
Generic exceptions like `Exception`, `RuntimeException`, or `Throwable` lack specific context. They make it impossible for callers to catch specific error types and handle them appropriately (e.g., retrying a network error but failing on a validation error).
|
|
11
|
+
|
|
12
|
+
**Incorrect (generic exceptions):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
if (user == null) {
|
|
16
|
+
throw Exception("error")
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (!isValid) {
|
|
20
|
+
throw RuntimeException("Invalid")
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Correct (specific custom exceptions):**
|
|
25
|
+
|
|
26
|
+
```kotlin
|
|
27
|
+
if (user == null) {
|
|
28
|
+
throw UserNotFoundException("User with ID $userId not found in database")
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (!isValid) {
|
|
32
|
+
throw ValidationException(
|
|
33
|
+
field = "email",
|
|
34
|
+
message = "Email format is invalid",
|
|
35
|
+
value = email,
|
|
36
|
+
code = "INVALID_EMAIL_FORMAT"
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Custom exceptions should include:**
|
|
42
|
+
- Descriptive message with runtime context.
|
|
43
|
+
- Domain-specific naming (e.g., `InsufficientFundsException`).
|
|
44
|
+
- Optional error codes or structured data for debugging/API responses.
|
|
45
|
+
|
|
46
|
+
**Tools:** detekt (TooGenericExceptionThrown), Android Studio Linter, Manual Review
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Do Not Use Error Log For Non-critical
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: prevents alert fatigue and ensures meaningful monitoring
|
|
5
|
+
tags: logging, log-levels, error, observability, quality, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Do Not Use Error Log For Non-critical
|
|
9
|
+
|
|
10
|
+
Incorrect log levels cause alert fatigue and hide real issues. When non-critical business events are logged as "ERROR", it becomes difficult for SRE/Developers to identify actual system failures.
|
|
11
|
+
|
|
12
|
+
**Incorrect (overusing error level):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
// NOT an error - expected business case
|
|
16
|
+
logger.error("User entered wrong password")
|
|
17
|
+
|
|
18
|
+
// NOT an error - validation failure
|
|
19
|
+
logger.error("Email format invalid")
|
|
20
|
+
|
|
21
|
+
// NOT an error - expected retry
|
|
22
|
+
logger.error("Retry attempt 2 of 5")
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Correct (appropriate log levels):**
|
|
26
|
+
|
|
27
|
+
```kotlin
|
|
28
|
+
// WARN - recoverable, may need attention if repetitive
|
|
29
|
+
logger.warn("Payment retry attempt: {}, max: {}", current, max)
|
|
30
|
+
|
|
31
|
+
// INFO - normal business events
|
|
32
|
+
logger.info("Login failed - invalid password for user: {}", userId)
|
|
33
|
+
|
|
34
|
+
// DEBUG - detailed troubleshooting information
|
|
35
|
+
logger.debug("Validation failed for field: {}, value: {}", field, value)
|
|
36
|
+
|
|
37
|
+
// ERROR - only for actual system failures or unhandled exceptions
|
|
38
|
+
logger.error("Database connection lost to host: {}", dbHost, exception)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Log Level Guide:**
|
|
42
|
+
|
|
43
|
+
| Level | Use For |
|
|
44
|
+
|-------|---------|
|
|
45
|
+
| ERROR | System failures, unhandled exceptions, data loss, dependency down |
|
|
46
|
+
| WARN | Recoverable errors, degraded performance, deprecated API usage |
|
|
47
|
+
| INFO | Key business milestones, startup/shutdown, audit-level events |
|
|
48
|
+
| DEBUG | Detailed technical data for developers during troubleshooting |
|
|
49
|
+
|
|
50
|
+
**Tools:** Static analyzer, PR review, Log Monitoring (Sentry/Datadog) alerts configuration
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Do Not Import Unused Modules
|
|
3
|
+
impact: LOW
|
|
4
|
+
impactDescription: reduces codebase noise and improves build times
|
|
5
|
+
tags: imports, cleanup, maintenance, quality, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Do Not Import Unused Modules
|
|
9
|
+
|
|
10
|
+
Unused imports increase compilation time and create unnecessary noise in the codebase. Modern IDEs like IntelliJ or Android Studio can automatically clean these up.
|
|
11
|
+
|
|
12
|
+
**Incorrect (unused imports):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
package com.sun.service
|
|
16
|
+
|
|
17
|
+
import com.sun.models.User
|
|
18
|
+
import com.sun.models.Order // Unused
|
|
19
|
+
import com.sun.models.Product // Unused
|
|
20
|
+
import java.util.Date // Unused
|
|
21
|
+
|
|
22
|
+
// Only User is actually used
|
|
23
|
+
fun fetchUser(id: String): User {
|
|
24
|
+
return userRepository.findById(id)
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Correct (only needed imports):**
|
|
29
|
+
|
|
30
|
+
```kotlin
|
|
31
|
+
package com.sun.service
|
|
32
|
+
|
|
33
|
+
import com.sun.models.User
|
|
34
|
+
|
|
35
|
+
fun fetchUser(id: String): User {
|
|
36
|
+
return userRepository.findById(id)
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Auto-removal in IntelliJ/Android Studio:**
|
|
41
|
+
- Use **Optimize Imports** shortcut: `Ctrl + Alt + O` (Windows/Linux) or `Option + Command + O` (macOS).
|
|
42
|
+
- Enable "Optimize imports on the fly" in Settings -> Editor -> General -> Auto Import.
|
|
43
|
+
|
|
44
|
+
**Tools:** detekt (UnusedImport), ktlint, Android Studio / IntelliJ IDEA
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Do Not Leave Unused Variables
|
|
3
|
+
impact: LOW
|
|
4
|
+
impactDescription: reduces code noise and prevents potential logic bugs
|
|
5
|
+
tags: variables, cleanup, quality, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Do Not Leave Unused Variables
|
|
9
|
+
|
|
10
|
+
Unused variables suggest incomplete refactoring, abandoned logic, or potential bugs. They clutter the code and distract the reader.
|
|
11
|
+
|
|
12
|
+
**Incorrect (unused variables):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
fun processOrder(order: Order): List<String> {
|
|
16
|
+
val user = order.user // Never used
|
|
17
|
+
val total = order.total // Never used
|
|
18
|
+
val items = order.items
|
|
19
|
+
|
|
20
|
+
return items.map { it.name }
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Correct (only needed variables):**
|
|
25
|
+
|
|
26
|
+
```kotlin
|
|
27
|
+
fun processOrder(order: Order): List<String> {
|
|
28
|
+
return order.items.map { it.name }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// In lambdas or destructuring, use underscore (_) for intentionally ignored parameters
|
|
32
|
+
order.items.forEachIndexed { _, item ->
|
|
33
|
+
println(item.id)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
val (id, _) = getPair() // ignore second element
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Tools:** detekt (UnusedPrivateMember, UnusedLocalVariable), Android Studio Linter, Kotlin Compiler warnings
|