diff --git a/.cirrus.star b/.cirrus.star new file mode 100644 index 00000000000..41bb51108dd --- /dev/null +++ b/.cirrus.star @@ -0,0 +1,4 @@ +load("github.com/SonarSource/cirrus-modules@v1", "cirrus_auth") + +def main(ctx): + return cirrus_auth() diff --git a/.cirrus.yml b/.cirrus.yml index c8006e87499..b51db6b9ce3 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -1,55 +1,62 @@ -gcp_credentials: ENCRYPTED[!149d4005ecdba4cdd78bb5ba22756ebb98bf8e3367ee2e9ab08c5a1608c0d3e3b501904b67a1d67c0b63085e469d7dde!] - env: - ARTIFACTORY_URL: ENCRYPTED[!2f8fa307d3289faa0aa6791f18b961627ae44f1ef46b136e1a1e63b0b4c86454dbb25520d49b339e2d50a1e1e5f95c88!] - ARTIFACTORY_PRIVATE_USERNAME: repox-private-reader-lt-ef42e7 - ARTIFACTORY_PRIVATE_PASSWORD: ENCRYPTED[!9b954ad23535be51e04d7ad72d8f79b93141341f3b6fe5527140e1ffa9570694f23ddea6fc384b742e7ec956533765d6!] - ARTIFACTORY_DEPLOY_USERNAME: repox-qa-deployer-lt-ef42e7 - ARTIFACTORY_DEPLOY_PASSWORD: ENCRYPTED[!e9d67cbbb9ffaa6a05b863eae9d08292b431481ae920205c7cb42d8811c18a932f2a29f486a46171c9ac6c053bc51e73!] + CIRRUS_VAULT_URL: https://vault.sonar.build:8200 + CIRRUS_VAULT_AUTH_PATH: jwt-cirrusci + CIRRUS_VAULT_ROLE: cirrusci-${CIRRUS_REPO_OWNER}-${CIRRUS_REPO_NAME} + + ARTIFACTORY_URL: VAULT[development/kv/data/repox data.url] + ARTIFACTORY_PRIVATE_USERNAME: vault-${CIRRUS_REPO_OWNER}-${CIRRUS_REPO_NAME}-private-reader + ARTIFACTORY_PRIVATE_PASSWORD: VAULT[development/artifactory/token/${CIRRUS_REPO_OWNER}-${CIRRUS_REPO_NAME}-private-reader access_token] + ARTIFACTORY_DEPLOY_USERNAME: vault-${CIRRUS_REPO_OWNER}-${CIRRUS_REPO_NAME}-qa-deployer + ARTIFACTORY_DEPLOY_PASSWORD: VAULT[development/artifactory/token/${CIRRUS_REPO_OWNER}-${CIRRUS_REPO_NAME}-qa-deployer access_token] #Possible values for ARTIFACTORY_DEPLOY_REPO: sonarsource-private-qa, sonarsource-public-qa ARTIFACTORY_DEPLOY_REPO: sonarsource-public-qa - ARTIFACTORY_API_KEY: ENCRYPTED[!9b954ad23535be51e04d7ad72d8f79b93141341f3b6fe5527140e1ffa9570694f23ddea6fc384b742e7ec956533765d6!] + ARTIFACTORY_ACCESS_TOKEN: VAULT[development/artifactory/token/${CIRRUS_REPO_OWNER}-${CIRRUS_REPO_NAME}-private-reader access_token] + GITHUB_TOKEN: VAULT[development/github/token/licenses-ro token] # burgr notification - BURGR_URL: ENCRYPTED[!c7e294da94762d7bac144abef6310c5db300c95979daed4454ca977776bfd5edeb557e1237e3aa8ed722336243af2d78!] - BURGR_USERNAME: ENCRYPTED[!b29ddc7610116de511e74bec9a93ad9b8a20ac217a0852e94a96d0066e6e822b95e7bc1fe152afb707f16b70605fddd3!] - BURGR_PASSWORD: ENCRYPTED[!83e130718e92b8c9de7c5226355f730e55fb46e45869149a9223e724bb99656878ef9684c5f8cfef434aa716e87f4cf2!] - GITHUB_TOKEN: ENCRYPTED[!f458126aa9ed2ac526f220c5acb51dd9cc255726b34761a56fc78d4294c11089502a882888cef0ca7dd4085e72e611a5!] + BURGR_URL: VAULT[development/kv/data/burgr data.url] + BURGR_USERNAME: VAULT[development/kv/data/burgr data.cirrus_username] + BURGR_PASSWORD: VAULT[development/kv/data/burgr data.cirrus_password] # Use bash (instead of sh on linux or cmd.exe on windows) CIRRUS_SHELL: bash # Allows to run builds for the 50 last commits in a branch: CIRRUS_CLONE_DEPTH: 50 container_definition: &CONTAINER_DEFINITION - image: eu.gcr.io/release-engineering-ci-prod/base:j11-latest - cluster_name: cirrus-ci - zone: europe-west4-b + image: ${CIRRUS_AWS_ACCOUNT}.dkr.ecr.eu-central-1.amazonaws.com/base:j11-latest + cluster_name: ${CIRRUS_CLUSTER_NAME} + region: eu-central-1 namespace: default + nodeSelectorTerms: + - matchExpressions: + - key: node.kubernetes.io/instance-type + operator: In + values: + - m4.4xlarge win_vm_definition: &WINDOWS_VM_DEFINITION - gce_instance: - image_project: release-engineering-ci-prod - image_family: lt-base-windows-jdk17 + ec2_instance: + experimental: true # see https://github.com/cirruslabs/cirrus-ci-docs/issues/1051 + image: base-windows-jdk17-v* platform: windows - zone: europe-west4-b - preemptible: false + region: eu-central-1 disk: 128 - use_ssd: true - type: n2d-standard-16 + type: c5.4xlarge + subnet_id: ${CIRRUS_AWS_SUBNET} only_sonarsource_qa: &ONLY_SONARSOURCE_QA only_if: $CIRRUS_USER_COLLABORATOR == 'true' && $CIRRUS_TAG == "" && ($CIRRUS_PR != "" || $CIRRUS_BRANCH == "master" || $CIRRUS_BRANCH =~ "branch-.*" || $CIRRUS_BRANCH =~ "dogfood-on-.*") build_task: - gke_container: + eks_container: <<: *CONTAINER_DEFINITION - image: eu.gcr.io/release-engineering-ci-prod/base:j17-latest + image: ${CIRRUS_AWS_ACCOUNT}.dkr.ecr.eu-central-1.amazonaws.com/base:j17-latest cpu: 4 - memory: 8G + memory: 4G env: - SIGN_KEY: ENCRYPTED[!cc216dfe592f79db8006f2a591f8f98b40aa2b078e92025623594976fd32f6864c1e6b6ba74b50647f608e2418e6c336!] - PGP_PASSPHRASE: ENCRYPTED[!314a8fc344f45e462dd5e8dccd741d7562283a825e78ebca27d4ae9db8e65ce618e7f6aece386b2782a5abe5171467bd!] + SIGN_KEY: VAULT[development/kv/data/sign data.key] + PGP_PASSPHRASE: VAULT[development/kv/data/sign data.passphrase] # analysis on next - SONAR_TOKEN: ENCRYPTED[!b6fd814826c51e64ee61b0b6f3ae621551f6413383f7170f73580e2e141ac78c4b134b506f6288c74faa0dd564c05a29!] + SONAR_TOKEN: VAULT[development/kv/data/next data.token] SONAR_HOST_URL: https://next.sonarqube.com/sonarqube #allow deployment of pull request artifacts to repox DEPLOY_PULL_REQUEST: true @@ -65,14 +72,14 @@ ws_scan_task: depends_on: - build <<: *ONLY_SONARSOURCE_QA - gke_container: + eks_container: <<: *CONTAINER_DEFINITION cpu: 4 - memory: 8G + memory: 4G # run only on master and long-term branches only_if: $CIRRUS_USER_COLLABORATOR == 'true' && ($CIRRUS_BRANCH == "master" || $CIRRUS_BRANCH =~ "branch-.*") env: - WS_APIKEY: ENCRYPTED[cda363e6bcac3edd4c259dc05b3570e00152ad50f9ad3ec3cab72d57cda318a0d5472e37c656c3566c2cb8c752d2f5a0] + WS_APIKEY: VAULT[development/kv/data/mend data.apikey] maven_cache: folder: ${CIRRUS_WORKING_DIR}/.m2/repository whitesource_script: @@ -100,10 +107,10 @@ plugin_qa_task: depends_on: - build <<: *ONLY_SONARSOURCE_QA - gke_container: + eks_container: <<: *CONTAINER_DEFINITION - cpu: 8 - memory: 16G + cpu: 14 + memory: 6G env: matrix: - SQ_VERSION: LATEST_RELEASE[8.9] @@ -126,11 +133,11 @@ sanity_task: depends_on: - build <<: *ONLY_SONARSOURCE_QA - gke_container: + eks_container: <<: *CONTAINER_DEFINITION - image: eu.gcr.io/release-engineering-ci-prod/base:j17-latest + image: ${CIRRUS_AWS_ACCOUNT}.dkr.ecr.eu-central-1.amazonaws.com/base:j17-latest cpu: 4 - memory: 8G + memory: 2G maven_cache: folder: ${CIRRUS_WORKING_DIR}/.m2/repository sanity_script: @@ -144,11 +151,11 @@ ruling_task: depends_on: - build <<: *ONLY_SONARSOURCE_QA - gke_container: + eks_container: <<: *CONTAINER_DEFINITION - image: eu.gcr.io/release-engineering-ci-prod/base:j17-latest - cpu: 8 - memory: 16G + image: ${CIRRUS_AWS_ACCOUNT}.dkr.ecr.eu-central-1.amazonaws.com/base:j17-latest + cpu: 14 + memory: 6G maven_cache: folder: ${CIRRUS_WORKING_DIR}/.m2/repository submodules_script: @@ -185,14 +192,15 @@ promote_task: - plugin_qa - ws_scan <<: *ONLY_SONARSOURCE_QA - gke_container: + eks_container: <<: *CONTAINER_DEFINITION - cpu: 1 + cpu: 2 memory: 1G env: #promotion cloud function - GCF_ACCESS_TOKEN: ENCRYPTED[!1fb91961a5c01e06e38834e55755231d649dc62eca354593105af9f9d643d701ae4539ab6a8021278b8d9348ae2ce8be!] - PROMOTE_URL: ENCRYPTED[!e22ed2e34a8f7a1aea5cff653585429bbd3d5151e7201022140218f9c5d620069ec2388f14f83971e3fd726215bc0f5e!] + GCF_ACCESS_TOKEN: VAULT[development/kv/data/promote data.token] + PROMOTE_URL: VAULT[development/kv/data/promote data.url] + GITHUB_TOKEN: VAULT[development/github/token/${CIRRUS_REPO_OWNER}-${CIRRUS_REPO_NAME}-promotion token] #artifacts that will have downloadable links in burgr ARTIFACTS: org.sonarsource.java:sonar-java-plugin:jar maven_cache: diff --git a/.gitattributes b/.gitattributes index 7c57fc52512..62e15fa5e6e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,7 @@ java-frontend/src/test/files/highlighter/SonarSymTable.java eol=lf java-checks/src/test/files/checks/NonEmptyFile.java eol=cr +java-frontend/src/test/java/org/sonar/java/model/TreeTokenCompletenessTest.java eol=lf +java-checks/src/main/java/org/sonar/java/checks/helpers/ExpressionEvaluator.java eol=lf +java-checks-test-sources/src/main/java/checks/CounterModeIVShouldNotBeReusedCheck.java eol=lf +java-checks/src/main/java/org/sonar/java/checks/helpers/HardcodedStringExpressionChecker.java eol=lf +its/ruling/src/test/resources/autoscan/autoscan-diff-by-rules.json eol=lf diff --git a/.github/workflows/dogfood.yml b/.github/workflows/dogfood.yml index e8ddc862c30..3700a517688 100644 --- a/.github/workflows/dogfood.yml +++ b/.github/workflows/dogfood.yml @@ -11,15 +11,24 @@ on: # - 'dogfood/*' env: - SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} - SLACK_USERNAME: Dogfood build action - + SLACK_CHANNEL: team-lang-java-notifs + SLACK_USERNAME: Dogfood build action + jobs: dogfood_merge: runs-on: ubuntu-latest name: Update dogfood branch + permissions: + id-token: write # required for SonarSource/vault-action-wrapper + contents: write # required to grant GITHUB_TOKEN writing permission steps: - - name: git octopus step + - name: get secrets + id: secrets + uses: SonarSource/vault-action-wrapper@d1c1ab4ca5ad07fd9cdfe1eff038a39673dfca64 # tag=2.4.2-1 + with: + secrets: | + development/kv/data/slack webhook | SLACK_WEBHOOK; + - name: git octopus step env: GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} id: dogfood @@ -33,6 +42,7 @@ jobs: - name: Notify success on Slack uses: Ilshidur/action-slack@1.6.2 env: + SLACK_WEBHOOK: ${{ fromJSON(steps.secrets.outputs.vault).SLACK_WEBHOOK }} SLACK_OVERRIDE_MESSAGE: 'Dogfood build for `${{ steps.dogfood.outputs.sha1 }}`: *successful*' with: args: 'Succeed to build dogfood branch' @@ -40,9 +50,7 @@ jobs: uses: Ilshidur/action-slack@1.6.2 if: failure() env: - SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} - SLACK_USERNAME: Dogfood build action + SLACK_WEBHOOK: ${{ fromJSON(steps.secrets.outputs.vault).SLACK_WEBHOOK }} SLACK_OVERRIDE_MESSAGE: 'Dogfood build for `${{ steps.dogfood.outputs.sha1 }}`: *failed*, see the logs at https://github.com/SonarSource/sonar-java/actions' with: args: 'Fail to build dogfood branch' - diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml deleted file mode 100644 index 15e036d7a7b..00000000000 --- a/.github/workflows/nightly.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: nightly build -# This workflow is triggered on schedule -on: - schedule: - - cron: '0 1 * * *' - -env: - SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} - SLACK_USERNAME: Nightly build action - -jobs: - nightly_build: - runs-on: ubuntu-latest - name: Run a nightly build - steps: - - name: starts a build - env: - CIRRUS_TOKEN: ${{ secrets.CIRRUS_TOKEN }} - uses: SonarSource/gh-action_nightly_build@master - with: - branch: 'master' - #slack notifications - - name: Notify success on Slack - uses: Ilshidur/action-slack@1.6.2 - env: - SLACK_OVERRIDE_MESSAGE: 'Nightly build successful' - with: - args: 'Succeed to build dogfood branch' - - name: Notify failures on Slack - uses: Ilshidur/action-slack@1.6.2 - if: failure() - env: - SLACK_OVERRIDE_MESSAGE: 'Nightly build: *failed*, see the logs at https://github.com/SonarSource/sonar-java/actions' - with: - args: 'Fail to build dogfood branch' \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8d578780498..6a6b388ee83 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,86 +1,19 @@ +--- name: sonar-release # This workflow is triggered when publishing a new github release -on: +# yamllint disable-line rule:truthy +on: release: types: - published jobs: release: - runs-on: ubuntu-latest - name: Release - steps: - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.BINARIES_AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.BINARIES_AWS_SECRET_ACCESS_KEY }} - aws-region: ${{ secrets.BINARIES_AWS_REGION }} - - name: Release - id: release - env: - ARTIFACTORY_API_KEY: ${{ secrets.ARTIFACTORY_API_KEY }} - BINARIES_AWS_DEPLOY: ${{ secrets.BINARIES_AWS_DEPLOY }} # Required for pushing the binaries - BURGRX_USER: ${{ secrets.BURGRX_USER }} - BURGRX_PASSWORD: ${{ secrets.BURGRX_PASSWORD }} - CIRRUS_TOKEN: ${{ secrets.CIRRUS_TOKEN }} - PATH_PREFIX: ${{ secrets.BINARIES_PATH_PREFIX }} - GITHUB_TOKEN: ${{ secrets.RELEASE_GITHUB_TOKEN }} - RELEASE_SSH_USER: ${{ secrets.RELEASE_SSH_USER }} - RELEASE_SSH_KEY: ${{ secrets.RELEASE_SSH_KEY }} - SLACK_API_TOKEN: ${{secrets.SLACK_API_TOKEN }} - uses: SonarSource/gh-action_release/main@v4 - with: - publish_to_binaries: true # Used only if the binaries is delivered to costumers - slack_channel: team-lang-java-notifs - - name: Release action results - if: always() - run: | - echo "${{ steps.release.outputs.releasability }}" - echo "${{ steps.release.outputs.promote }}" - echo "${{ steps.release.outputs.publish_to_binaries }}" - echo "${{ steps.release.outputs.release }}" - - maven-central-sync: # Only required for OSS projects - runs-on: ubuntu-latest - name: Maven Central Sync - needs: - - release - steps: - - name: Setup JFrog CLI - uses: jfrog/setup-jfrog-cli@v1 - - name: JFrog config - run: jfrog rt config repox --url https://repox.jfrog.io/artifactory/ --apikey $ARTIFACTORY_API_KEY --basic-auth-only - env: - ARTIFACTORY_API_KEY: ${{ secrets.ARTIFACTORY_API_KEY }} - - name: Get the version - id: get_version - run: | - IFS=. read major minor patch build <<< "${{ github.event.release.tag_name }}" - echo ::set-output name=build::"${build}" - - name: Create local repository directory - id: local_repo - run: echo ::set-output name=dir::"$(mktemp -d repo.XXXXXXXX)" - - name: Download Artifacts - uses: SonarSource/gh-action_release/download-build@v4 - with: - build-number: ${{ steps.get_version.outputs.build }} - local-repo-dir: ${{ steps.local_repo.outputs.dir }} - - name: Maven Central Sync - id: maven-central-sync - continue-on-error: true - uses: SonarSource/gh-action_release/maven-central-sync@v4 - with: - local-repo-dir: ${{ steps.local_repo.outputs.dir }} - env: - OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} - OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} - - name: Notify on failure - if: ${{ failure() || steps.maven-central-sync.outcome == 'failure' }} - uses: 8398a7/action-slack@v3 - with: - text: 'Maven sync failed' - status: failure - fields: repo,author,eventName - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_BUILD_WEBHOOK }} + permissions: + id-token: write + contents: write + uses: SonarSource/gh-action_release/.github/workflows/main.yaml@v5 + with: + publishToBinaries: true + mavenCentralSync: true + slackChannel: team-lang-java-notifs diff --git a/README.md b/README.md index f333fa5be5e..909a91a3c1e 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,14 @@ To build the plugin and run its unit tests, execute this command from the projec mvn clean install +### Note that +Running unit tests within the IDE might incur in some issues because of the way the project is built with maven. +If you see something like this: + + java.lang.SecurityException: class ... signer information does not match signer information of other classes in the same package + +try removing the Maven nature of the 'jdt' module. + ### Integration Tests To run integration tests, you will need to create a properties file like the one shown below, and set the url pointing to its location in an environment variable named `ORCHESTRATOR_CONFIG_URL`. @@ -103,10 +111,14 @@ To run the test, first make sure the submodules are checked out: git submodule update --init --recursive -Launch ruling test: +Then, ensure that the `JAVA_HOME` environment variable is set for the ruling tests execution and that it points to your local JDK 17 installation. +Failing to do so will produce inconsistencies with the expected results. + +From the `its/ruling` folder, launch the ruling tests: - cd its/ruling mvn clean install -DskipTests=false + # Alternatively + JAVA_HOME=/my/local/java17/jdk/ mvn clean install -DskipTests=false This test gives you the opportunity to examine the issues created by each rule and make sure they're what you expect. Any implemented rule is highly likely to raise issues on the multiple projects we use as ruling code base. diff --git a/docs/java-custom-rules-example/pom.xml b/docs/java-custom-rules-example/pom.xml index 33915165838..8e83f674963 100644 --- a/docs/java-custom-rules-example/pom.xml +++ b/docs/java-custom-rules-example/pom.xml @@ -4,7 +4,7 @@ org.sonarsource.java docs - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT @@ -22,7 +22,7 @@ - org.sonarsource.sonarqube + org.sonarsource.api.plugin sonar-plugin-api provided diff --git a/docs/pom.xml b/docs/pom.xml index db2e0016ec3..ee32e12bda3 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.java java - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT docs diff --git a/external-reports/pom.xml b/external-reports/pom.xml index 29cddc3e3cd..e77dc04750b 100644 --- a/external-reports/pom.xml +++ b/external-reports/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.java java - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT external-reports @@ -14,7 +14,7 @@ - org.sonarsource.sonarqube + org.sonarsource.api.plugin sonar-plugin-api provided diff --git a/external-reports/src/main/java/org/sonar/java/externalreport/ExternalIssueUtils.java b/external-reports/src/main/java/org/sonar/java/externalreport/ExternalIssueUtils.java index d906089abf9..e8dfd08c350 100644 --- a/external-reports/src/main/java/org/sonar/java/externalreport/ExternalIssueUtils.java +++ b/external-reports/src/main/java/org/sonar/java/externalreport/ExternalIssueUtils.java @@ -57,7 +57,7 @@ public static void saveIssue(SensorContext context, ExternalRuleLoader ruleLoade .message(message) .on(inputFile); - if (!line.isEmpty() && !line.equals("0")) { + if (!line.isEmpty() && !"0".equals(line)) { primaryLocation.at(inputFile.selectLine(Integer.parseInt(line))); } diff --git a/its/plugin/plugins/java-extension-plugin/pom.xml b/its/plugin/plugins/java-extension-plugin/pom.xml index aa38520a3f3..9545485e0c5 100644 --- a/its/plugin/plugins/java-extension-plugin/pom.xml +++ b/its/plugin/plugins/java-extension-plugin/pom.xml @@ -4,7 +4,7 @@ org.sonarsource.java it-java-plugin-plugins - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT java-extension-plugin @@ -20,9 +20,8 @@ - org.sonarsource.sonarqube + org.sonarsource.api.plugin sonar-plugin-api - ${sonar.version} provided diff --git a/its/plugin/plugins/pom.xml b/its/plugin/plugins/pom.xml index 5efd0cd66fa..68781e5e925 100644 --- a/its/plugin/plugins/pom.xml +++ b/its/plugin/plugins/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.java it-java-plugin - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT it-java-plugin-plugins diff --git a/its/plugin/pom.xml b/its/plugin/pom.xml index 4864006dfd9..c71ceedc80e 100644 --- a/its/plugin/pom.xml +++ b/its/plugin/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.java java-its - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT it-java-plugin diff --git a/its/plugin/projects/package-info-annotations/pom.xml b/its/plugin/projects/package-info-annotations/pom.xml index 8a5ff05e481..52b7976744b 100644 --- a/its/plugin/projects/package-info-annotations/pom.xml +++ b/its/plugin/projects/package-info-annotations/pom.xml @@ -29,7 +29,7 @@ org.mongodb mongo-java-driver - 3.12.7 + 3.12.8 diff --git a/its/plugin/tests/pom.xml b/its/plugin/tests/pom.xml index 751da8920b4..717333e726c 100644 --- a/its/plugin/tests/pom.xml +++ b/its/plugin/tests/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.java it-java-plugin - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT it-java-plugin-tests @@ -80,6 +80,11 @@ jsr305 provided + + org.apache.commons + commons-lang3 + test + diff --git a/its/plugin/tests/src/test/java/com/sonar/it/java/JspTest.java b/its/plugin/tests/src/test/java/com/sonar/it/java/JspTest.java index 9fe1216b44a..d1ef565c4aa 100644 --- a/its/plugin/tests/src/test/java/com/sonar/it/java/JspTest.java +++ b/its/plugin/tests/src/test/java/com/sonar/it/java/JspTest.java @@ -44,6 +44,7 @@ public class JspTest { static { OrchestratorBuilder orchestratorBuilder = Orchestrator.builderEnv() + .useDefaultAdminCredentialsForBuilds(true) .setSonarVersion(System.getProperty("sonar.runtimeVersion", "LATEST_RELEASE")) .setEdition(Edition.ENTERPRISE) .addPlugin(JavaTestSuite.JAVA_PLUGIN_LOCATION) diff --git a/its/plugin/tests/src/test/java/com/sonar/it/java/suite/CacheEnabledTest.java b/its/plugin/tests/src/test/java/com/sonar/it/java/suite/CacheEnabledTest.java index 6dacd1758b7..931a902bea6 100644 --- a/its/plugin/tests/src/test/java/com/sonar/it/java/suite/CacheEnabledTest.java +++ b/its/plugin/tests/src/test/java/com/sonar/it/java/suite/CacheEnabledTest.java @@ -66,6 +66,7 @@ public void test_cache_is_disabled() { private static Orchestrator initServer() { return Orchestrator.builderEnv() + .useDefaultAdminCredentialsForBuilds(true) .setSonarVersion(System.getProperty("sonar.runtimeVersion", "LATEST_RELEASE[9.4]")) .addPlugin(JavaTestSuite.JAVA_PLUGIN_LOCATION) // for support of custom rules diff --git a/its/plugin/tests/src/test/java/com/sonar/it/java/suite/JavaClasspathTest.java b/its/plugin/tests/src/test/java/com/sonar/it/java/suite/JavaClasspathTest.java index 83380a85ded..f61b2ec5e34 100644 --- a/its/plugin/tests/src/test/java/com/sonar/it/java/suite/JavaClasspathTest.java +++ b/its/plugin/tests/src/test/java/com/sonar/it/java/suite/JavaClasspathTest.java @@ -28,7 +28,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; -import org.apache.commons.lang.SystemUtils; +import org.apache.commons.lang3.SystemUtils; import org.junit.Before; import org.junit.BeforeClass; import org.junit.ClassRule; diff --git a/its/plugin/tests/src/test/java/com/sonar/it/java/suite/JavaTestSuite.java b/its/plugin/tests/src/test/java/com/sonar/it/java/suite/JavaTestSuite.java index 709bc6b9a0e..cbbf6d138ad 100644 --- a/its/plugin/tests/src/test/java/com/sonar/it/java/suite/JavaTestSuite.java +++ b/its/plugin/tests/src/test/java/com/sonar/it/java/suite/JavaTestSuite.java @@ -66,6 +66,7 @@ public class JavaTestSuite { static { OrchestratorBuilder orchestratorBuilder = Orchestrator.builderEnv() + .useDefaultAdminCredentialsForBuilds(true) .setSonarVersion(System.getProperty("sonar.runtimeVersion", "LATEST_RELEASE[8.9]")) .addPlugin(JAVA_PLUGIN_LOCATION) // for support of custom rules diff --git a/its/pom.xml b/its/pom.xml index a04b489b57f..627eb651d81 100644 --- a/its/pom.xml +++ b/its/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.java java - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT java-its diff --git a/its/ruling/pom.xml b/its/ruling/pom.xml index 4ac88a58e43..483636f1bb1 100644 --- a/its/ruling/pom.xml +++ b/its/ruling/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.java java-its - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT it-java-ruling @@ -78,6 +78,11 @@ jsr305 provided + + org.apache.commons + commons-lang3 + test + diff --git a/its/ruling/src/test/java/org/sonar/java/it/AutoScanTest.java b/its/ruling/src/test/java/org/sonar/java/it/AutoScanTest.java index 8fcc05b2d61..10224b41ac0 100644 --- a/its/ruling/src/test/java/org/sonar/java/it/AutoScanTest.java +++ b/its/ruling/src/test/java/org/sonar/java/it/AutoScanTest.java @@ -66,6 +66,7 @@ public class AutoScanTest { @ClassRule public static Orchestrator orchestrator = Orchestrator.builderEnv() + .useDefaultAdminCredentialsForBuilds(true) .setSonarVersion(System.getProperty("sonar.runtimeVersion", "LATEST_RELEASE[9.3]")) .addPlugin(FileLocation.byWildcardMavenFilename(new File("../../sonar-java-plugin/target"), "sonar-java-plugin-*.jar")) .addPlugin(MavenLocation.of("org.sonarsource.sonar-lits-plugin", "sonar-lits-plugin", "0.10.0.2181")) @@ -151,9 +152,9 @@ public void javaCheckTestSources() throws Exception { Collection newDiffs = calculateDifferences(ruleKeys, mvnIssues, noBinariesIssues).values(); IssueDiff newTotal = IssueDiff.total(newDiffs); - LOG.info("Comparing results for both runs:\n- Rules={}\n- TPs={}\n- FNs={}\n- FPs={}\n- Differences={}\n", + LOG.info("Comparing results for both runs:\n- Rules={}\n- hasTP={}\n- FNs={}\n- FPs={}\n- Differences={}\n", newDiffs.size(), - newTotal.truePositives, + newTotal.hasTruePositives, newTotal.falseNegatives, newTotal.falsePositives, newTotal.falsePositives + newTotal.falseNegatives); @@ -187,7 +188,7 @@ public void javaCheckTestSources() throws Exception { * No differences would mean that we find the same issues with and without the bytecode and libraries */ String differences = Files.readString(pathFor(TARGET_ACTUAL + PROJECT_KEY + "-no-binaries_differences")); - assertThat(differences).isEqualTo("Issues differences: 3137"); + assertThat(differences).isEqualTo("Issues differences: 3203"); } private static Path pathFor(String path) { @@ -264,11 +265,11 @@ private List lines(String file) { } private static class IssueDiff { - private static final String COLUMN_TITLES = "Rule;TP;FN;FP\n"; + private static final String COLUMN_TITLES = "Rule;hasTP;FN;FP\n"; private static final String SEPARATORS = "-----;-----;-----;-----\n"; private final String ruleKey; - private int truePositives; + private boolean hasTruePositives; private int falseNegatives; private int falsePositives; @@ -281,16 +282,16 @@ boolean causesFPs() { } boolean notReporting() { - return (truePositives + falseNegatives + falsePositives) == 0; + return !hasTruePositives && (falseNegatives + falsePositives) == 0; } boolean onlyFNs() { - return (truePositives + falsePositives) == 0 && falseNegatives > 0; + return !hasTruePositives && falsePositives == 0 && falseNegatives > 0; } @Override public int hashCode() { - return Objects.hash(ruleKey, truePositives, falseNegatives, falsePositives); + return Objects.hash(ruleKey, hasTruePositives, falseNegatives, falsePositives); } @Override @@ -306,7 +307,7 @@ public boolean equals(Object obj) { } IssueDiff other = (IssueDiff) obj; return ruleKey.equals(other.ruleKey) - && truePositives == other.truePositives + && hasTruePositives == other.hasTruePositives && falseNegatives == other.falseNegatives && falsePositives == other.falsePositives; } @@ -326,7 +327,7 @@ private static IssueDiff onlyFalseNegatives(String ruleKey, int countFN) { public static IssueDiff total(Collection issueDiffs) { IssueDiff total = new IssueDiff("Total"); for (IssueDiff issueDiff : issueDiffs) { - total.truePositives += issueDiff.truePositives; + total.hasTruePositives |= issueDiff.hasTruePositives; total.falseNegatives += issueDiff.falseNegatives; total.falsePositives += issueDiff.falsePositives; } @@ -367,7 +368,7 @@ private static IssueDiff compare(String ruleKey, RuleIssues expected, RuleIssues List truePositives = new ArrayList<>(expectedLines); truePositives.removeAll(falseNegatives); - issueDiff.truePositives += truePositives.size(); + issueDiff.hasTruePositives |= !truePositives.isEmpty(); } return issueDiff; @@ -375,12 +376,12 @@ private static IssueDiff compare(String ruleKey, RuleIssues expected, RuleIssues @Override public String toString() { - return String.format("[%s;TP=%s;FN=%d;FP=%d]", ruleKey, truePositives, falseNegatives, falsePositives); + return String.format("[%s;hasTP=%s;FN=%d;FP=%d]", ruleKey, hasTruePositives, falseNegatives, falsePositives); } private static String prettyPrint(Collection diffs) { return diffs.stream() - .map(diff -> String.format("%s;%d;%d;%d", diff.ruleKey, diff.truePositives, diff.falseNegatives, diff.falsePositives)) + .map(diff -> String.format("%s;%b;%d;%d", diff.ruleKey, diff.hasTruePositives, diff.falseNegatives, diff.falsePositives)) .collect(Collectors.joining("\n", "", "\n")); } @@ -392,7 +393,7 @@ private static String prettyPrint(Collection diffs, IssueDiff total) .append(SEPARATORS) .append(COLUMN_TITLES) .append(SEPARATORS) - .append(String.format("%d;%d;%d;%d\n", diffs.size(), total.truePositives, total.falseNegatives, total.falsePositives)) + .append(String.format("%d;%b;%d;%d\n", diffs.size(), total.hasTruePositives, total.falseNegatives, total.falsePositives)) .toString(); } } diff --git a/its/ruling/src/test/java/org/sonar/java/it/JavaRulingTest.java b/its/ruling/src/test/java/org/sonar/java/it/JavaRulingTest.java index 0ec3cb43060..a5c860c3fcf 100644 --- a/its/ruling/src/test/java/org/sonar/java/it/JavaRulingTest.java +++ b/its/ruling/src/test/java/org/sonar/java/it/JavaRulingTest.java @@ -45,7 +45,7 @@ import java.util.Set; import java.util.stream.Collectors; import javax.annotation.Nullable; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.assertj.core.api.Assertions; import org.assertj.core.api.Fail; import org.junit.AfterClass; @@ -88,6 +88,7 @@ public class JavaRulingTest { @ClassRule public static Orchestrator orchestrator = Orchestrator.builderEnv() + .useDefaultAdminCredentialsForBuilds(true) .setSonarVersion(System.getProperty("sonar.runtimeVersion", "LATEST_RELEASE[9.4]")) .addPlugin(FileLocation.byWildcardMavenFilename(new File("../../sonar-java-plugin/target"), "sonar-java-plugin-*.jar")) .addPlugin(MavenLocation.of("org.sonarsource.sonar-lits-plugin", "sonar-lits-plugin", "0.10.0.2181")) diff --git a/its/ruling/src/test/resources/autoscan/autoscan-diff-by-rules.json b/its/ruling/src/test/resources/autoscan/autoscan-diff-by-rules.json index dce6325eac0..446cdeaa0cf 100644 --- a/its/ruling/src/test/resources/autoscan/autoscan-diff-by-rules.json +++ b/its/ruling/src/test/resources/autoscan/autoscan-diff-by-rules.json @@ -1,2864 +1,2876 @@ [ { "ruleKey": "S100", - "truePositives": 445, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S101", - "truePositives": 186, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S106", - "truePositives": 439, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S107", - "truePositives": 9, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S108", - "truePositives": 648, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S110", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S112", - "truePositives": 115, + "hasTruePositives": true, "falseNegatives": 15, "falsePositives": 0 }, { "ruleKey": "S114", - "truePositives": 16, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S115", - "truePositives": 39, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S116", - "truePositives": 160, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S117", - "truePositives": 156, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S119", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S120", - "truePositives": 89, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S125", - "truePositives": 2702, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S127", - "truePositives": 11, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S128", - "truePositives": 34, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S131", - "truePositives": 44, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S135", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S899", - "truePositives": 23, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1065", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1066", - "truePositives": 19, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1068", - "truePositives": 255, + "hasTruePositives": true, "falseNegatives": 2, "falsePositives": 0 }, { "ruleKey": "S1075", - "truePositives": 32, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1104", - "truePositives": 70, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1110", - "truePositives": 29, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1111", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1113", - "truePositives": 32, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1114", - "truePositives": 11, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1116", - "truePositives": 54, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1117", - "truePositives": 118, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1118", - "truePositives": 64, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1119", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1121", - "truePositives": 15, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1123", - "truePositives": 46, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1124", - "truePositives": 28, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1125", - "truePositives": 207, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1126", - "truePositives": 11, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1128", - "truePositives": 34, + "hasTruePositives": true, "falseNegatives": 20, "falsePositives": 0 }, { "ruleKey": "S1130", - "truePositives": 46, + "hasTruePositives": true, "falseNegatives": 30, "falsePositives": 0 }, { "ruleKey": "S1133", - "truePositives": 62, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1134", - "truePositives": 7, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1135", - "truePositives": 13, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1141", - "truePositives": 8, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1143", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1144", - "truePositives": 208, + "hasTruePositives": true, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S1149", - "truePositives": 61, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1150", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1153", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1155", - "truePositives": 18, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1157", - "truePositives": 13, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1158", - "truePositives": 34, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1161", - "truePositives": 74, + "hasTruePositives": true, "falseNegatives": 6, "falsePositives": 0 }, { "ruleKey": "S1163", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1165", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1168", - "truePositives": 89, + "hasTruePositives": true, "falseNegatives": 6, "falsePositives": 0 }, { "ruleKey": "S1170", - "truePositives": 24, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1171", - "truePositives": 20, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1172", - "truePositives": 318, + "hasTruePositives": true, "falseNegatives": 11, "falsePositives": 0 }, { "ruleKey": "S1174", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1175", - "truePositives": 8, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1181", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 10, "falsePositives": 0 }, { "ruleKey": "S1182", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1185", - "truePositives": 18, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1186", - "truePositives": 657, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1190", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1191", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1192", - "truePositives": 223, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1193", - "truePositives": 11, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1195", - "truePositives": 9, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1197", - "truePositives": 13, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1199", - "truePositives": 17, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1201", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1206", - "truePositives": 52, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1210", - "truePositives": 16, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1214", - "truePositives": 13, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1215", - "truePositives": 10, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1217", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1219", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1220", - "truePositives": 11, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1221", - "truePositives": 10, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1223", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1226", - "truePositives": 32, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1264", - "truePositives": 24, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1301", - "truePositives": 45, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1313", - "truePositives": 27, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1317", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1319", - "truePositives": 14, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1444", - "truePositives": 24, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1450", - "truePositives": 21, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1452", - "truePositives": 18, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1479", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1481", - "truePositives": 1343, + "hasTruePositives": true, "falseNegatives": 7, "falsePositives": 0 }, { "ruleKey": "S1488", - "truePositives": 53, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1596", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1598", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1602", - "truePositives": 42, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1604", - "truePositives": 54, + "hasTruePositives": true, "falseNegatives": 2, "falsePositives": 0 }, { "ruleKey": "S1607", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 11, "falsePositives": 0 }, { "ruleKey": "S1610", - "truePositives": 60, + "hasTruePositives": true, "falseNegatives": 4, "falsePositives": 0 }, { "ruleKey": "S1611", - "truePositives": 63, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1612", - "truePositives": 69, + "hasTruePositives": true, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S1640", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1643", - "truePositives": 11, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1656", - "truePositives": 11, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1659", - "truePositives": 74, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1700", - "truePositives": 10, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1710", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1751", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1764", - "truePositives": 136, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1844", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1845", - "truePositives": 48, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1849", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1854", - "truePositives": 1706, + "hasTruePositives": true, "falseNegatives": 3, "falsePositives": 0 }, { "ruleKey": "S1858", - "truePositives": 32, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1860", - "truePositives": 9, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1862", - "truePositives": 69, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1871", - "truePositives": 71, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1872", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1874", - "truePositives": 86, - "falseNegatives": 88, + "hasTruePositives": true, + "falseNegatives": 89, "falsePositives": 0 }, { "ruleKey": "S1905", - "truePositives": 70, + "hasTruePositives": true, "falseNegatives": 6, "falsePositives": 0 }, { "ruleKey": "S1940", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1948", - "truePositives": 43, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S1989", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 6, "falsePositives": 0 }, { "ruleKey": "S1994", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2053", - "truePositives": 7, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2055", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2060", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2061", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2062", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2065", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2066", - "truePositives": 7, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2068", - "truePositives": 58, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2077", - "truePositives": 25, + "hasTruePositives": true, "falseNegatives": 10, "falsePositives": 0 }, { "ruleKey": "S2092", - "truePositives": 56, + "hasTruePositives": true, "falseNegatives": 42, "falsePositives": 0 }, { "ruleKey": "S2093", - "truePositives": 7, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2094", - "truePositives": 207, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2095", - "truePositives": 112, + "hasTruePositives": true, "falseNegatives": 18, "falsePositives": 0 }, { "ruleKey": "S2097", - "truePositives": 8, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2109", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2110", - "truePositives": 29, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2111", - "truePositives": 19, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2112", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2114", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2115", - "truePositives": 15, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2116", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2118", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2119", - "truePositives": 15, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2121", - "truePositives": 46, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2122", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2123", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2127", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2129", - "truePositives": 88, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2130", - "truePositives": 12, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2133", - "truePositives": 17, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2134", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2139", - "truePositives": 10, + "hasTruePositives": true, "falseNegatives": 5, "falsePositives": 0 }, { "ruleKey": "S2140", - "truePositives": 9, + "hasTruePositives": true, "falseNegatives": 9, "falsePositives": 0 }, { "ruleKey": "S2142", - "truePositives": 14, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2147", - "truePositives": 54, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2151", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2153", - "truePositives": 47, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2154", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2157", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2159", - "truePositives": 22, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2160", - "truePositives": 8, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2165", - "truePositives": 15, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2166", - "truePositives": 10, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2167", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2168", - "truePositives": 9, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2175", - "truePositives": 37, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2176", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2177", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2178", - "truePositives": 7, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2183", - "truePositives": 34, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2184", - "truePositives": 22, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2185", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2186", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 9, "falsePositives": 0 }, { "ruleKey": "S2187", - "truePositives": 22, + "hasTruePositives": true, "falseNegatives": 11, "falsePositives": 1 }, { "ruleKey": "S2188", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 2, "falsePositives": 0 }, { "ruleKey": "S2189", - "truePositives": 31, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2200", - "truePositives": 26, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2201", - "truePositives": 1134, + "hasTruePositives": true, "falseNegatives": 5, "falsePositives": 0 }, { "ruleKey": "S2204", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2209", - "truePositives": 38, + "hasTruePositives": true, "falseNegatives": 17, "falsePositives": 0 }, { "ruleKey": "S2222", - "truePositives": 23, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2225", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2226", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 5, "falsePositives": 0 }, { "ruleKey": "S2229", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 52, "falsePositives": 0 }, { "ruleKey": "S2230", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2232", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2234", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2235", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2236", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2245", - "truePositives": 51, + "hasTruePositives": true, "falseNegatives": 24, "falsePositives": 0 }, { "ruleKey": "S2251", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2252", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2254", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2257", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2259", - "truePositives": 41, + "hasTruePositives": true, "falseNegatives": 0, - "falsePositives": 129 + "falsePositives": 140 }, { "ruleKey": "S2272", - "truePositives": 13, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2273", - "truePositives": 20, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2274", - "truePositives": 18, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2275", - "truePositives": 50, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2276", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2293", - "truePositives": 68, + "hasTruePositives": true, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S2326", - "truePositives": 87, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2386", - "truePositives": 41, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2387", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2388", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2390", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2437", - "truePositives": 7, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2438", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2440", - "truePositives": 10, + "hasTruePositives": true, "falseNegatives": 4, "falsePositives": 0 }, { "ruleKey": "S2441", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2442", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2445", - "truePositives": 9, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2446", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2447", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2479", - "truePositives": 125, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2583", - "truePositives": 145, - "falseNegatives": 8, + "hasTruePositives": true, + "falseNegatives": 18, "falsePositives": 1 }, { "ruleKey": "S2589", - "truePositives": 163, + "hasTruePositives": true, "falseNegatives": 3, "falsePositives": 0 }, { "ruleKey": "S2612", - "truePositives": 25, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2629", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 27, "falsePositives": 0 }, { "ruleKey": "S2637", - "truePositives": 22, - "falseNegatives": 18, + "hasTruePositives": true, + "falseNegatives": 19, "falsePositives": 0 }, { "ruleKey": "S2638", - "truePositives": 14, + "hasTruePositives": true, "falseNegatives": 7, "falsePositives": 0 }, { "ruleKey": "S2639", - "truePositives": 9, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2647", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 3, "falsePositives": 0 }, { "ruleKey": "S2674", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2675", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2676", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2677", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2681", - "truePositives": 13, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2689", - "truePositives": 7, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2692", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2695", - "truePositives": 24, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2696", - "truePositives": 47, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2699", - "truePositives": 28, + "hasTruePositives": true, "falseNegatives": 137, "falsePositives": 1 }, { "ruleKey": "S2718", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 12, "falsePositives": 0 }, { "ruleKey": "S2737", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2755", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 100, "falsePositives": 1 }, { "ruleKey": "S2757", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2761", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2786", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2789", - "truePositives": 19, + "hasTruePositives": true, "falseNegatives": 11, "falsePositives": 0 }, { "ruleKey": "S2864", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2885", - "truePositives": 9, + "hasTruePositives": true, "falseNegatives": 2, "falsePositives": 0 }, { "ruleKey": "S2886", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2924", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 8, "falsePositives": 0 }, { "ruleKey": "S2925", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S2970", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 63, "falsePositives": 0 }, { "ruleKey": "S2975", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3008", - "truePositives": 13, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3010", - "truePositives": 11, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3011", - "truePositives": 26, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3012", - "truePositives": 43, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3014", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3020", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3034", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3038", - "truePositives": 15, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3039", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3042", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3046", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3064", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3065", - "truePositives": 10, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3066", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3067", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3077", - "truePositives": 12, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3078", - "truePositives": 31, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3252", - "truePositives": 11, + "hasTruePositives": true, "falseNegatives": 2, "falsePositives": 0 }, { "ruleKey": "S3305", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 7, "falsePositives": 0 }, { "ruleKey": "S3329", - "truePositives": 15, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3330", - "truePositives": 45, + "hasTruePositives": true, "falseNegatives": 30, "falsePositives": 0 }, { "ruleKey": "S3346", - "truePositives": 8, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3358", - "truePositives": 16, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3398", - "truePositives": 8, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3400", - "truePositives": 102, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3415", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 280, "falsePositives": 0 }, { "ruleKey": "S3416", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 6, "falsePositives": 0 }, { "ruleKey": "S3436", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3457", - "truePositives": 166, + "hasTruePositives": true, "falseNegatives": 129, "falsePositives": 0 }, { "ruleKey": "S3516", - "truePositives": 22, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3518", - "truePositives": 73, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3551", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3577", - "truePositives": 19, + "hasTruePositives": true, "falseNegatives": 44, "falsePositives": 0 }, { "ruleKey": "S3599", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3626", - "truePositives": 41, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3631", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3655", - "truePositives": 26, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3740", - "truePositives": 210, + "hasTruePositives": true, "falseNegatives": 50, "falsePositives": 0 }, { "ruleKey": "S3751", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 12, "falsePositives": 0 }, { "ruleKey": "S3752", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 24, "falsePositives": 0 }, { "ruleKey": "S3753", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 2, "falsePositives": 0 }, { "ruleKey": "S3776", - "truePositives": 47, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3824", - "truePositives": 15, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3864", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3878", - "truePositives": 38, - "falseNegatives": 26, + "hasTruePositives": true, + "falseNegatives": 27, "falsePositives": 0 }, { "ruleKey": "S3923", - "truePositives": 42, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3958", - "truePositives": 60, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3959", - "truePositives": 8, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3972", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3973", - "truePositives": 30, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3981", - "truePositives": 10, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3984", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3985", - "truePositives": 16, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S3986", - "truePositives": 20, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4032", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4034", - "truePositives": 11, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4036", - "truePositives": 151, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4042", - "truePositives": 9, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4065", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4087", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4143", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4144", - "truePositives": 10, + "hasTruePositives": true, "falseNegatives": 3, "falsePositives": 7 }, { "ruleKey": "S4165", - "truePositives": 16, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4201", - "truePositives": 9, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4274", - "truePositives": 10, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4275", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4276", - "truePositives": 65, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4347", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4348", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4349", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4351", - "truePositives": 8, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4423", - "truePositives": 15, + "hasTruePositives": true, "falseNegatives": 7, "falsePositives": 0 }, { "ruleKey": "S4425", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4426", - "truePositives": 35, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4433", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4434", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4449", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 25, "falsePositives": 0 }, { "ruleKey": "S4454", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S4488", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 14, "falsePositives": 0 }, { "ruleKey": "S4502", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 5, "falsePositives": 0 }, { "ruleKey": "S4507", - "truePositives": 23, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4512", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 6, "falsePositives": 0 }, { "ruleKey": "S4517", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4524", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4544", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 8, "falsePositives": 0 }, { "ruleKey": "S4601", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 5, "falsePositives": 0 }, { "ruleKey": "S4602", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 21, "falsePositives": 0 }, { "ruleKey": "S4635", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4682", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4684", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 9, "falsePositives": 0 }, { "ruleKey": "S4719", - "truePositives": 43, + "hasTruePositives": true, "falseNegatives": 47, "falsePositives": 0 }, { "ruleKey": "S4738", - "truePositives": 0, - "falseNegatives": 48, + "hasTruePositives": false, + "falseNegatives": 55, "falsePositives": 0 }, { "ruleKey": "S4790", - "truePositives": 33, + "hasTruePositives": true, "falseNegatives": 37, "falsePositives": 0 }, { "ruleKey": "S4792", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 19, "falsePositives": 0 }, { "ruleKey": "S4830", - "truePositives": 10, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4838", - "truePositives": 13, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4925", - "truePositives": 18, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4929", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4968", - "truePositives": 23, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4970", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 12, "falsePositives": 0 }, { "ruleKey": "S4973", - "truePositives": 26, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S4977", - "truePositives": 15, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5042", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5122", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 15, "falsePositives": 0 }, { "ruleKey": "S5164", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5247", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 9, "falsePositives": 0 }, { "ruleKey": "S5261", - "truePositives": 11, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5301", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 9, "falsePositives": 0 }, { "ruleKey": "S5320", - "truePositives": 13, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5322", - "truePositives": 7, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5324", - "truePositives": 11, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5329", - "truePositives": 11, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5332", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 7, "falsePositives": 0 }, { "ruleKey": "S5344", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 15, "falsePositives": 0 }, { "ruleKey": "S5361", - "truePositives": 17, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5411", - "truePositives": 75, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5413", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5443", - "truePositives": 45, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5445", - "truePositives": 8, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5527", - "truePositives": 12, + "hasTruePositives": true, "falseNegatives": 7, "falsePositives": 0 }, { "ruleKey": "S5542", - "truePositives": 49, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5547", - "truePositives": 55, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5659", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 16, "falsePositives": 0 }, { "ruleKey": "S5663", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5664", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5665", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5669", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S5679", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 2, "falsePositives": 0 }, { "ruleKey": "S5689", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 12, "falsePositives": 0 }, { "ruleKey": "S5693", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 16, "falsePositives": 0 }, { "ruleKey": "S5738", - "truePositives": 104, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5776", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S5777", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 4, "falsePositives": 0 }, { "ruleKey": "S5778", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 31, "falsePositives": 0 }, { "ruleKey": "S5779", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 40, "falsePositives": 0 }, { "ruleKey": "S5783", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 24, "falsePositives": 0 }, { "ruleKey": "S5785", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 38, "falsePositives": 0 }, { "ruleKey": "S5786", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 63, "falsePositives": 0 }, { "ruleKey": "S5790", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 7, "falsePositives": 0 }, { "ruleKey": "S5803", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5804", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 9, "falsePositives": 0 }, { "ruleKey": "S5808", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 9, "falsePositives": 0 }, { "ruleKey": "S5810", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 11, "falsePositives": 0 }, { "ruleKey": "S5826", - "truePositives": 10, + "hasTruePositives": true, "falseNegatives": 2, "falsePositives": 0 }, { "ruleKey": "S5831", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S5833", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 53, "falsePositives": 0 }, { "ruleKey": "S5838", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 266, "falsePositives": 0 }, { "ruleKey": "S5841", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 23, "falsePositives": 0 }, { "ruleKey": "S5842", - "truePositives": 44, + "hasTruePositives": true, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S5843", - "truePositives": 7, + "hasTruePositives": true, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S5845", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 164, "falsePositives": 0 }, { "ruleKey": "S5846", - "truePositives": 27, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5850", - "truePositives": 11, + "hasTruePositives": true, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S5852", - "truePositives": 75, + "hasTruePositives": true, "falseNegatives": 3, "falsePositives": 0 }, { "ruleKey": "S5853", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 46, "falsePositives": 0 }, { "ruleKey": "S5854", - "truePositives": 36, + "hasTruePositives": true, "falseNegatives": 3, "falsePositives": 0 }, { "ruleKey": "S5855", - "truePositives": 20, + "hasTruePositives": true, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S5856", - "truePositives": 22, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5857", - "truePositives": 42, + "hasTruePositives": true, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S5860", - "truePositives": 23, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 2 }, { "ruleKey": "S5863", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 123, "falsePositives": 0 }, { "ruleKey": "S5866", - "truePositives": 14, + "hasTruePositives": true, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S5868", - "truePositives": 11, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5869", - "truePositives": 117, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5876", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S5917", - "truePositives": 10, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5958", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 2, "falsePositives": 0 }, { "ruleKey": "S5960", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 2, "falsePositives": 0 }, { "ruleKey": "S5961", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 5, "falsePositives": 0 }, { "ruleKey": "S5967", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 2, "falsePositives": 0 }, { "ruleKey": "S5969", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 7, "falsePositives": 0 }, { "ruleKey": "S5973", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S5976", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 6, "falsePositives": 0 }, { "ruleKey": "S5993", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5994", - "truePositives": 10, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S5996", - "truePositives": 86, + "hasTruePositives": true, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S5998", - "truePositives": 126, + "hasTruePositives": true, "falseNegatives": 3, "falsePositives": 0 }, { "ruleKey": "S6001", - "truePositives": 23, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6002", - "truePositives": 13, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6019", - "truePositives": 31, + "hasTruePositives": true, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S6035", - "truePositives": 43, + "hasTruePositives": true, "falseNegatives": 9, "falsePositives": 0 }, { "ruleKey": "S6068", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 11, "falsePositives": 0 }, { "ruleKey": "S6070", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S6103", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 19, "falsePositives": 0 }, { "ruleKey": "S6104", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6126", - "truePositives": 9, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6201", - "truePositives": 20, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6202", - "truePositives": 7, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6203", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6204", - "truePositives": 19, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6205", - "truePositives": 9, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6206", - "truePositives": 13, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6207", - "truePositives": 16, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6208", - "truePositives": 25, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6209", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6213", - "truePositives": 24, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6216", - "truePositives": 22, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6217", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6218", - "truePositives": 9, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6219", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6241", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 31, "falsePositives": 0 }, { "ruleKey": "S6242", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 45, "falsePositives": 0 }, { "ruleKey": "S6243", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 30, "falsePositives": 0 }, { "ruleKey": "S6244", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 9, "falsePositives": 0 }, { "ruleKey": "S6246", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 5, "falsePositives": 0 }, { "ruleKey": "S6262", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 2, "falsePositives": 0 }, { "ruleKey": "S6263", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S6288", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6291", - "truePositives": 12, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6293", - "truePositives": 2, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6300", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6301", - "truePositives": 10, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6326", - "truePositives": 3, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6331", - "truePositives": 52, + "hasTruePositives": true, "falseNegatives": 1, "falsePositives": 0 }, { "ruleKey": "S6353", - "truePositives": 50, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6355", - "truePositives": 45, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6362", - "truePositives": 1, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6363", - "truePositives": 4, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6373", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 15, "falsePositives": 0 }, { "ruleKey": "S6374", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 12, "falsePositives": 0 }, { "ruleKey": "S6376", - "truePositives": 0, + "hasTruePositives": false, "falseNegatives": 15, "falsePositives": 0 }, { "ruleKey": "S6377", - "truePositives": 6, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6395", - "truePositives": 71, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6396", - "truePositives": 5, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6397", - "truePositives": 29, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 }, { "ruleKey": "S6418", - "truePositives": 49, + "hasTruePositives": true, "falseNegatives": 0, "falsePositives": 0 + }, + { + "ruleKey": "S6432", + "hasTruePositives": true, + "falseNegatives": 2, + "falsePositives": 0 + }, + { + "ruleKey": "S6437", + "hasTruePositives": true, + "falseNegatives": 33, + "falsePositives": 0 } -] +] \ No newline at end of file diff --git a/its/ruling/src/test/resources/commons-beanutils/java-S2384.json b/its/ruling/src/test/resources/commons-beanutils/java-S2384.json index e4ce19131fa..f84189dcd14 100644 --- a/its/ruling/src/test/resources/commons-beanutils/java-S2384.json +++ b/its/ruling/src/test/resources/commons-beanutils/java-S2384.json @@ -2,10 +2,20 @@ 'commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/BaseDynaBeanMapDecorator.java':[ 215, ], +'commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/BasicDynaBean.java':[ +97, +], 'commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/BeanIntrospectionData.java':[ 69, +70, 79, ], +'commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/BeanMap.java':[ +718, +], +'commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/LazyDynaBean.java':[ +222, +], 'commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/MethodUtils.java':[ 1332, ], @@ -16,4 +26,7 @@ 186, 197, ], +'commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/locale/LocaleConvertUtilsBean.java':[ +505, +], } diff --git a/its/ruling/src/test/resources/commons-beanutils/java-S3776.json b/its/ruling/src/test/resources/commons-beanutils/java-S3776.json index 2217b4c8080..cf5cd3cc271 100644 --- a/its/ruling/src/test/resources/commons-beanutils/java-S3776.json +++ b/its/ruling/src/test/resources/commons-beanutils/java-S3776.json @@ -54,9 +54,6 @@ 1743, 2095, ], -'commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/WeakFastHashMap.java':[ -332, -], 'commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/converters/ArrayConverter.java':[ 435, ], diff --git a/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S2384.json b/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S2384.json index 96ecc245adf..51e8c38a2ca 100644 --- a/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S2384.json +++ b/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S2384.json @@ -9,6 +9,11 @@ 'org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpVersion.java':[ 118, ], +'org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/MimeTypes.java':[ +296, +538, +550, +], 'org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/pathmap/UriTemplatePathSpec.java':[ 422, ], @@ -19,10 +24,16 @@ 742, 955, ], +'org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/NegotiatingClientConnection.java':[ +45, +], 'org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/WriteFlusher.java':[ 217, 223, ], +'org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslClientConnectionFactory.java':[ +148, +], 'org.eclipse.jetty:jetty-project:jetty-jmx/src/main/java/org/eclipse/jetty/jmx/MetaData.java':[ 73, ], @@ -60,6 +71,11 @@ 'org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/NegotiatingServerConnectionFactory.java':[ 67, ], +'org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Request.java':[ +1066, +1071, +1076, +], 'org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/RequestLog.java':[ 58, ], @@ -79,6 +95,7 @@ ], 'org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java':[ 343, +623, 1730, 1741, 2055, diff --git a/its/ruling/src/test/resources/eclipse-jetty/java-S2384.json b/its/ruling/src/test/resources/eclipse-jetty/java-S2384.json index 7e590e73f41..8098a4aabce 100644 --- a/its/ruling/src/test/resources/eclipse-jetty/java-S2384.json +++ b/its/ruling/src/test/resources/eclipse-jetty/java-S2384.json @@ -9,6 +9,11 @@ 'org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpVersion.java':[ 118, ], +'org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/MimeTypes.java':[ +296, +538, +550, +], 'org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/pathmap/UriTemplatePathSpec.java':[ 422, ], @@ -19,10 +24,16 @@ 742, 955, ], +'org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/NegotiatingClientConnection.java':[ +45, +], 'org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/WriteFlusher.java':[ 217, 223, ], +'org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslClientConnectionFactory.java':[ +148, +], 'org.eclipse.jetty:jetty-project:jetty-jmx/src/main/java/org/eclipse/jetty/jmx/MetaData.java':[ 73, ], @@ -60,6 +71,11 @@ 'org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/NegotiatingServerConnectionFactory.java':[ 67, ], +'org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Request.java':[ +1066, +1071, +1076, +], 'org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/RequestLog.java':[ 58, ], @@ -79,6 +95,7 @@ ], 'org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java':[ 343, +623, 1730, 1741, 2055, @@ -144,11 +161,18 @@ 'org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/security/Credential.java':[ 202, ], +'org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/ssl/SslContextFactory.java':[ +460, +465, +470, +], 'org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/thread/QueuedThreadPool.java':[ 143, 798, ], 'org.eclipse.jetty:jetty-project:jetty-xml/src/main/java/org/eclipse/jetty/xml/XmlConfiguration.java':[ +285, +296, 1611, 1612, ], diff --git a/its/ruling/src/test/resources/guava/java-S1186.json b/its/ruling/src/test/resources/guava/java-S1186.json index 46f842bd144..34c80aee7ee 100644 --- a/its/ruling/src/test/resources/guava/java-S1186.json +++ b/its/ruling/src/test/resources/guava/java-S1186.json @@ -78,6 +78,9 @@ 228, 232, ], +'com.google.guava:guava:src/com/google/common/util/concurrent/AbstractFuture.java':[ +151, +], 'com.google.guava:guava:src/com/google/common/util/concurrent/CycleDetectingLockFactory.java':[ 237, ], diff --git a/its/ruling/src/test/resources/guava/java-S2272.json b/its/ruling/src/test/resources/guava/java-S2272.json index 742d4d83b1b..0e362232295 100644 --- a/its/ruling/src/test/resources/guava/java-S2272.json +++ b/its/ruling/src/test/resources/guava/java-S2272.json @@ -1,9 +1,4 @@ { -'com.google.guava:guava:src/com/google/common/cache/LocalCache.java':[ -4376, -4384, -4444, -], 'com.google.guava:guava:src/com/google/common/collect/BinaryTreeTraverser.java':[ 113, 150, @@ -16,11 +11,6 @@ 428, 498, ], -'com.google.guava:guava:src/com/google/common/collect/MapMakerInternalMap.java':[ -3707, -3715, -3770, -], 'com.google.guava:guava:src/com/google/common/collect/TreeTraverser.java':[ 209, ], diff --git a/its/ruling/src/test/resources/guava/java-S2384.json b/its/ruling/src/test/resources/guava/java-S2384.json index 12ff83742c5..b1696205f95 100644 --- a/its/ruling/src/test/resources/guava/java-S2384.json +++ b/its/ruling/src/test/resources/guava/java-S2384.json @@ -10,6 +10,25 @@ 'com.google.guava:guava:src/com/google/common/base/SmallCharMatcher.java':[ 40, ], +'com.google.guava:guava:src/com/google/common/cache/LocalCache.java':[ +4498, +], +'com.google.guava:guava:src/com/google/common/collect/AbstractBiMap.java':[ +63, +69, +96, +], +'com.google.guava:guava:src/com/google/common/collect/AbstractMapBasedMultimap.java':[ +125, +130, +174, +], +'com.google.guava:guava:src/com/google/common/collect/AbstractMapBasedMultiset.java':[ +67, +], +'com.google.guava:guava:src/com/google/common/collect/ConcurrentHashMultiset.java':[ +144, +], 'com.google.guava:guava:src/com/google/common/collect/Constraints.java':[ 69, 112, @@ -17,6 +36,12 @@ 'com.google.guava:guava:src/com/google/common/collect/EvictingQueue.java':[ 80, ], +'com.google.guava:guava:src/com/google/common/collect/HashBiMap.java':[ +684, +], +'com.google.guava:guava:src/com/google/common/collect/ImmutableEnumMap.java':[ +52, +], 'com.google.guava:guava:src/com/google/common/collect/ImmutableEnumSet.java':[ 57, ], @@ -27,6 +52,7 @@ 813, ], 'com.google.guava:guava:src/com/google/common/collect/MapConstraints.java':[ +309, 653, 658, ], @@ -34,6 +60,11 @@ 767, 1316, 1320, +3118, +3133, +3174, +3179, +3180, ], 'com.google.guava:guava:src/com/google/common/collect/Multisets.java':[ 1041, @@ -68,7 +99,18 @@ 58, ], 'com.google.guava:guava:src/com/google/common/collect/Synchronized.java':[ +1116, 1128, +1146, +], +'com.google.guava:guava:src/com/google/common/collect/TreeRangeSet.java':[ +268, +274, +433, +], +'com.google.guava:guava:src/com/google/common/collect/WellBehavedMap.java':[ +43, +57, ], 'com.google.guava:guava:src/com/google/common/escape/ArrayBasedEscaperMap.java':[ 64, @@ -83,8 +125,14 @@ 'com.google.guava:guava:src/com/google/common/net/PercentEscaper.java':[ 181, ], +'com.google.guava:guava:src/com/google/common/reflect/MutableTypeToInstanceMap.java':[ +87, +], 'com.google.guava:guava:src/com/google/common/reflect/TypeToken.java':[ 677, 927, ], +'com.google.guava:guava:src/com/google/common/util/concurrent/CycleDetectingLockFactory.java':[ +429, +], } diff --git a/its/ruling/src/test/resources/jboss-ejb3-tutorial/java-S2384.json b/its/ruling/src/test/resources/jboss-ejb3-tutorial/java-S2384.json index 983291be35c..2a752080088 100644 --- a/its/ruling/src/test/resources/jboss-ejb3-tutorial/java-S2384.json +++ b/its/ruling/src/test/resources/jboss-ejb3-tutorial/java-S2384.json @@ -3,4 +3,16 @@ 59, 64, ], +'jboss-ejb3-tutorial:injection/src/org/jboss/tutorial/injection/bean/ShoppingCartBean.java':[ +66, +], +'jboss-ejb3-tutorial:jboss_deployment_descriptor/src/org/jboss/tutorial/jboss_deployment_descriptor/bean/ShoppingCartBean.java':[ +52, +], +'jboss-ejb3-tutorial:stateful/src/org/jboss/tutorial/stateful/bean/ShoppingCartBean.java':[ +53, +], +'jboss-ejb3-tutorial:stateful_deployment_descriptor/src/org/jboss/tutorial/stateful_deployment_descriptor/bean/ShoppingCartBean.java':[ +47, +], } diff --git a/its/ruling/src/test/resources/sonar-server/java-S2384.json b/its/ruling/src/test/resources/sonar-server/java-S2384.json index 7f1b0bcb827..a0037819704 100644 --- a/its/ruling/src/test/resources/sonar-server/java-S2384.json +++ b/its/ruling/src/test/resources/sonar-server/java-S2384.json @@ -1,13 +1,32 @@ { +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/ce/queue/CeQueueImpl.java':[ +192, +], +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/authentication/JwtHttpHandler.java':[ +193, +201, +], +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/authentication/JwtSerializer.java':[ +169, +181, +], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/authentication/ws/AuthenticationWs.java':[ 31, ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/batch/BatchWs.java':[ 33, ], +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/batch/ProjectDataLoader.java':[ +225, +226, +], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/ce/ws/CeWs.java':[ 31, ], +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/ce/ws/TaskFormatter.java':[ +152, +153, +], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/component/ComponentService.java':[ 43, ], @@ -27,13 +46,23 @@ 142, ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/component/ws/SearchProjectsAction.java':[ +411, +413, 414, 460, 461, +464, ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/api/measurecomputer/MeasureComputerContextImpl.java':[ 183, ], +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/api/posttask/ConditionToCondition.java':[ +41, +], +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/api/posttask/ScannerContextImpl.java':[ +35, +40, +], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/DisabledComponentsHolderImpl.java':[ 33, 39, @@ -43,6 +72,7 @@ ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/filemove/ScoreMatrix.java':[ 33, +34, 35, ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/ComponentIssuesRepositoryImpl.java':[ @@ -54,9 +84,6 @@ 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/IssueVisitors.java':[ 30, ], -'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/RuleImpl.java':[ -79, -], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/commonrule/CommonRuleEngineImpl.java':[ 33, ], @@ -81,6 +108,10 @@ ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadMeasureComputersStep.java':[ 58, +144, +], +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistComponentsStep.java':[ +170, ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStep.java':[ 216, @@ -92,9 +123,16 @@ 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/UnitTestMeasuresStep.java':[ 127, ], +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/ValidateProjectStep.java':[ +110, +], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/taskprocessor/ReportTaskProcessor.java':[ 53, ], +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/debt/DebtModelPluginRepository.java':[ +74, +131, +], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/duplication/ws/DuplicationsParser.java':[ 202, 206, @@ -102,12 +140,24 @@ 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/email/ws/EmailsWs.java':[ 29, ], +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/Facets.java':[ +51, +161, +], +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/IndexDefinition.java':[ +42, +], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/IndexDefinitions.java':[ 94, +99, ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/IndexerStartupTask.java':[ 50, ], +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/NewIndex.java':[ +78, +185, +], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/ResiliencyIndexingListener.java':[ 45, ], @@ -121,6 +171,9 @@ 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/SearchResult.java':[ 41, ], +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/StickyFacetBuilder.java':[ +60, +], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/textsearch/ComponentTextSearchQueryFactory.java':[ 106, 118, @@ -135,6 +188,7 @@ ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/favorite/ws/SearchAction.java':[ 121, +122, ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/Action.java':[ 62, @@ -187,6 +241,9 @@ 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/index/IssueIteratorForSingleChunk.java':[ 118, ], +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/notification/NewIssuesStatistics.java':[ +60, +], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/workflow/State.java':[ 43, ], @@ -226,11 +283,13 @@ ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/measure/ws/ComponentTreeData.java':[ 61, +71, 76, 81, 112, 122, 127, +137, ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/measure/ws/MeasuresWs.java':[ 29, @@ -308,6 +367,7 @@ ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/plugins/ServerPluginRepository.java':[ 107, +349, ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/plugins/ws/PluginsWs.java':[ 31, @@ -360,6 +420,9 @@ 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWs.java':[ 42, ], +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/ActiveRuleChange.java':[ +86, +], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/BuiltInQProfileRepositoryImpl.java':[ 84, ], @@ -370,6 +433,12 @@ 34, 58, ], +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/QProfileComparison.java':[ +117, +121, +125, +129, +], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/QProfileExporters.java':[ 70, 71, @@ -381,8 +450,11 @@ ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/RuleActivatorContext.java':[ 101, +105, +186, ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/ws/ChangelogLoader.java':[ +155, 193, ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/ws/CreateAction.java':[ @@ -397,6 +469,9 @@ 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/ws/QProfilesWs.java':[ 34, ], +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/ws/SearchData.java':[ +65, +], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/root/ws/RootsWs.java':[ 28, ], @@ -409,6 +484,10 @@ 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/RuleUpdate.java':[ 71, 78, +173, +], +'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/RuleUpdater.java':[ +275, ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/index/RuleQuery.java':[ 103, @@ -434,6 +513,7 @@ 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/ws/SearchAction.java':[ 488, 492, +509, ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/serverid/ws/ServerIdWs.java':[ 29, @@ -449,6 +529,7 @@ ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/setting/ws/ValuesAction.java':[ 187, +189, ], 'org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/source/CharactersReader.java':[ 71, diff --git a/java-checks-test-sources/pom.xml b/java-checks-test-sources/pom.xml index eea7808b371..b02a3566201 100644 --- a/java-checks-test-sources/pom.xml +++ b/java-checks-test-sources/pom.xml @@ -7,7 +7,7 @@ org.sonarsource.java java - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT java-checks-test-sources @@ -25,7 +25,7 @@ io.vertx vertx-stack-depchain - 4.3.1 + 4.3.5 pom import @@ -229,7 +229,7 @@ org.apache.commons commons-email - 1.3.2 + 1.5 jar provided @@ -243,7 +243,7 @@ org.springframework.data spring-data-mongodb - 2.0.8.RELEASE + 3.3.5 provided @@ -286,7 +286,7 @@ org.springframework spring-jdbc - 4.3.7.RELEASE + 5.2.10.RELEASE provided @@ -855,6 +855,48 @@ 1.12.244 provided + + com.h2database + h2 + 2.1.212 + provided + + + com.azure + azure-security-keyvault-secrets + 4.4.3 + provided + + + com.azure + azure-identity + 1.5.2 + provided + + + org.aspectj + aspectjweaver + 1.9.9.1 + provided + + + io.micronaut + micronaut-http + 3.7.2 + provided + + + com.fasterxml.woodstox + woodstox-core + 6.4.0 + provided + + + org.bouncycastle + bcprov-jdk15on + 1.70 + provided + diff --git a/java-checks-test-sources/src/main/files/non-compiling/checks/ArrayForVarArgCheck.java b/java-checks-test-sources/src/main/files/non-compiling/checks/ArrayForVarArgCheck.java index deae6ae4b20..590cd3770eb 100644 --- a/java-checks-test-sources/src/main/files/non-compiling/checks/ArrayForVarArgCheck.java +++ b/java-checks-test-sources/src/main/files/non-compiling/checks/ArrayForVarArgCheck.java @@ -7,7 +7,7 @@ class ArrayForVarArgCheck { public void callTheThing(String s) { ArrayForVarArgCheckFoo foo = new ArrayForVarArgCheckFoo(); - doTheThing2(new ArrayForVarArgCheckFoo[] {foo, foo}); // Noncompliant {{Disambiguate this call by either casting as "ArrayForVarArgCheckBar" or "ArrayForVarArgCheckBar[]".}} + doTheThing2(new ArrayForVarArgCheckFoo[] {foo, foo}); // Noncompliant {{Remove this array creation and simply pass the elements.}} unknown(new ArrayForVarArgCheckFoo[0]); // Compliant doTheThing2(new Unknown[0]); // Compliant diff --git a/java-checks-test-sources/src/main/files/non-compiling/checks/ForLoopFalseConditionCheck.java b/java-checks-test-sources/src/main/files/non-compiling/checks/ForLoopFalseConditionCheck.java new file mode 100644 index 00000000000..0eafc79dc6a --- /dev/null +++ b/java-checks-test-sources/src/main/files/non-compiling/checks/ForLoopFalseConditionCheck.java @@ -0,0 +1,14 @@ +class A { + void myMethod(int x, int y, int z) { + int j = 0, k = 0; + + for (int i = x; !(y=1); ) {} + + for (int i ; i < 5; ) {} + + for (int i = x; false; ) {} // Noncompliant [[sc=21;ec=26]] {{This loop will never execute.}} + + for (int i = x; !true; ) {} // Noncompliant + + } +} diff --git a/java-checks-test-sources/src/main/files/non-compiling/checks/LeastSpecificTypeCheck.java b/java-checks-test-sources/src/main/files/non-compiling/checks/LeastSpecificTypeCheck.java index 5f57b6fe4e1..774b365e6cb 100644 --- a/java-checks-test-sources/src/main/files/non-compiling/checks/LeastSpecificTypeCheck.java +++ b/java-checks-test-sources/src/main/files/non-compiling/checks/LeastSpecificTypeCheck.java @@ -1,6 +1,11 @@ +package checks; + import java.util.*; +import javax.annotation.Resource; +import javax.inject.Inject; +import org.springframework.beans.factory.annotation.Autowired; -class A { +class LeastSpecificTypeCheck { @SomethingUnknown public void resourceAnnotatedMethod1(List list) { // Compliant - Unknown annotation, could be Spring, we do not report anything for (Object o : list) { @@ -14,4 +19,95 @@ public void resourceAnnotatedMethod2(Collection list) { // Compliant - U o.toString(); } } + + public interface II1 {} + + public interface I1 extends II1 { + void m(); + } + + public interface I2 extends I1 { + void m(); + } + + public static class T1 { + void m() {} + void mt1() {} + } + + public static class T2 extends T1 implements I2 { + void ma(); + } + + public interface IMB { + void ma(); + void ma_1(Unknown u); + + interface Inner {} + void ma_2(Inner i); + } + + public interface IMA { + void ma(); + void ma_1(Unknown u); + + interface Inner {} + void ma_2(Inner i); + } + + static class T extends T2 implements IMB, IMA {} + + public static void bla(T t) { // Noncompliant {{Use 'checks.LeastSpecificTypeCheck.I1' here; it is a more general type than 'T'.}} + t.m(); + } + + public static void foo(T t) { // Noncompliant {{Use 'checks.LeastSpecificTypeCheck.T1' here; it is a more general type than 'T'.}} + t.m(); + t.mt1(); + } + + public static void ma(T t) { // Noncompliant {{Use 'checks.LeastSpecificTypeCheck.IMA' here; it is a more general type than 'T'.}} + // defined in both T2 and IMA, interface is preferred + t.ma(); + } + + public static void ma_1(T t) { // Compliant - ambiguous as Unknown type is unknown + // defined in both T2 and IMA, unknow makes it indecidable + t.ma_1(null); + } + + public static void ma_2(T t) { // Noncompliant {{Use 'checks.LeastSpecificTypeCheck.IMB' here; it is a more general type than 'T'.}} + // defined in both T2 and IMA, but call is ambiguous + t.ma_2(null); + } + + public interface IG { + T get(); + } + + public abstract class GImpl implements IG { + GImpl get(); + } + + class GImplSub extends GImpl { + + } + + public static void generics(GImplSub s) { // Noncompliant {{Use 'checks.LeastSpecificTypeCheck.GImpl' here; it is a more general type than 'GImplSub'.}} + s.get(); + } + + class Generic implements IG { + + } + + public static void generics2(Generic g) { // Noncompliant {{Use 'checks.LeastSpecificTypeCheck.IG' here; it is a more general type than 'Generic'.}} + g.get(); + } + + public static void stringBuilder(final StringBuilder name) { + name.charAt(0); + name.substring(0, 1); + } + } diff --git a/java-checks-test-sources/src/main/files/non-compiling/checks/MutableMembersUsageCheck.java b/java-checks-test-sources/src/main/files/non-compiling/checks/MutableMembersUsageCheck.java index 39e32d70e7a..f4fe6f14e82 100644 --- a/java-checks-test-sources/src/main/files/non-compiling/checks/MutableMembersUsageCheck.java +++ b/java-checks-test-sources/src/main/files/non-compiling/checks/MutableMembersUsageCheck.java @@ -6,33 +6,8 @@ import java.util.Set; class Fields { - private static final List MODIFIABLE = new ArrayList<>(); - private static final List IMMUTABLE_LIST = List.of(1, 2, 3); - private static final List IMMUTABLE_COPY_LIST = List.copyOf(new ArrayList<>()); - private static final Set IMMUTABLE_SET = Set.of("a"); - private static final Set IMMUTABLE_COPY_SET = Set.copyOf(new HashSet<>()); private static final Set UNKNOWN_SET = unknownMethod(new HashSet<>()); - public List immutableList() { - return IMMUTABLE_LIST; // Compliant - } - - public List immutableListCopy() { - return IMMUTABLE_COPY_LIST; // Compliant - } - - public Set immutableSet() { - return IMMUTABLE_SET; // Compliant - } - - public Set immutableSetCopy() { - return IMMUTABLE_COPY_SET; // Compliant - } - - public List modifiable() { - return MODIFIABLE; // Noncompliant - } - public Set unknownSet() { return UNKNOWN_SET; // Compliant } diff --git a/java-checks-test-sources/src/main/files/non-compiling/checks/PublicStaticMutableMembersCheck.java b/java-checks-test-sources/src/main/files/non-compiling/checks/PublicStaticMutableMembersCheck.java index f68d8ec237d..79f515fa9b3 100644 --- a/java-checks-test-sources/src/main/files/non-compiling/checks/PublicStaticMutableMembersCheck.java +++ b/java-checks-test-sources/src/main/files/non-compiling/checks/PublicStaticMutableMembersCheck.java @@ -10,38 +10,15 @@ import java.util.Set; public class PublicStaticMutableMembersCheck { - public static final List LIST = Arrays.asList("a"); // Noncompliant public static final List UNKNOWN_LIST = unknownMethod("a"); // Compliant public static final List noInitializer; // we don't know the type of foo public static final List unknown = foo(); - // Java 9 - public static final Map IMMUTABLE_MAP = Map.of("a", "A"); - public static final Map IMMUTABLE_MAP_COPY = Map.copyOf(new HashMap<>()); - public static final Map IMMUTABLE_MAP_OF_ENTRIES = Map.ofEntries(Map.entry("1", "2")); - public static final List IMMUTABLE_LIST = List.of("hello"); - public static final List IMMUTABLE_LIST_COPY = List.copyOf(new ArrayList<>()); - public static final Set IMMUTABLE_SET = Set.of("hello"); - public static final Set IMMUTABLE_SET_COPY = Set.copyOf(new HashSet<>()); - - // guava (Forbidden API) - public static final List immutableList = ImmutableList.of("a"); - public static final Set immutableSet = ImmutableSet.of("a"); - public static final Map immutableMap = ImmutableMap.of("a", "a"); - - public static final Set otherImmutableSet = immutableSet; - public static final Map otherImmutableMap = immutableMap; } interface I { public static MyImmutableCollection immutableList2; //Compliant : immutable collection - - // guava (Forbidden API) - public static final List immutableList3 = ImmutableList.of("a"); - public static final Set immutableSet2 = ImmutableSet.of("a"); - public static final Map immutableMap2 = ImmutableMap.of("a", "a"); - public static final Set otherImmutableSet2 = immutableSet2; } class MyImmutableCollection extends ImmutableCollection { } diff --git a/java-checks-test-sources/src/main/files/non-compiling/checks/SunPackagesUsedCheck.java b/java-checks-test-sources/src/main/files/non-compiling/checks/SunPackagesUsedCheck.java index 0a9fe8214f2..cf5bb075f58 100644 --- a/java-checks-test-sources/src/main/files/non-compiling/checks/SunPackagesUsedCheck.java +++ b/java-checks-test-sources/src/main/files/non-compiling/checks/SunPackagesUsedCheck.java @@ -1,7 +1,9 @@ -import com.sun.imageio.plugins; // Noncompliant [[sc=8;ec=31;secondary=2,9,10,12,13,15,19]] {{Use classes from the Java API instead of Sun classes.}} +import com.sun.imageio.plugins; // Noncompliant [[sc=8;ec=31;secondary=2,11,12,14,15,17,21]] {{Use classes from the Java API instead of Sun classes.}} import com.sun.security.ntlm.Client; // secondary import com.sun.jersey.api.client.ClientHandlerException; // com.sun.jersey is excluded by default since it has nothing to do with Java interal import com.sun.faces.application.ApplicationAssociate; // Excluded by default +import com.sun.xml.ws.developer.JAXWSProperties; // Excluded by default because not part of the JDK +import com.sun.xml.ws.transport.http.HttpAdapter; // Excluded by default because not part of the JDK import java.util.ArrayList; class SunPackagesUsedCheck { @@ -18,4 +20,11 @@ private void f() { new Foo() {}; // secondary } + + public Object uselessMethod() { + if (com.sun.xml.ws.developer.JAXWSProperties.CONNECT_TIMEOUT.equals("com.sun.xml.ws.connect.timeout")) { // compliant + return new com.sun.xml.ws.transport.http.HttpAdapter(null, null, null); // compliant + } + return null; + } } diff --git a/java-checks-test-sources/src/main/files/non-compiling/checks/security/HardCodedCredentialsShouldNotBeUsedCheck.java b/java-checks-test-sources/src/main/files/non-compiling/checks/security/HardCodedCredentialsShouldNotBeUsedCheck.java new file mode 100644 index 00000000000..8a8d046582d --- /dev/null +++ b/java-checks-test-sources/src/main/files/non-compiling/checks/security/HardCodedCredentialsShouldNotBeUsedCheck.java @@ -0,0 +1,15 @@ +class HardCodedCredentialsShouldNotBeUsedCheck { + + void test_unknow_identifier() { + + byte[] knownIdentifier = new byte[]{0xC, 0xA}; + + org.h2.security.SHA256.getHMAC(knownIdentifier, message); // Noncompliant + org.h2.security.SHA256.getHMAC(unknownIdentifier, message); // compliant unknown + + int obj1, obj2; + obj1 = obj2; + obj2 = obj1; + new Pbkdf2PasswordEncoder("", obj1); // compliant, and should not raise a StackOverflowError + } +} diff --git a/java-checks-test-sources/src/main/java/annotations/nullability/no_default/NullabilityAtMethodLevel.java b/java-checks-test-sources/src/main/java/annotations/nullability/no_default/NullabilityAtMethodLevel.java index 0ed169d4673..4428585b9b3 100644 --- a/java-checks-test-sources/src/main/java/annotations/nullability/no_default/NullabilityAtMethodLevel.java +++ b/java-checks-test-sources/src/main/java/annotations/nullability/no_default/NullabilityAtMethodLevel.java @@ -86,3 +86,17 @@ int id2021_type_NO_ANNOTATION_level_PACKAGE() { }; } } + +abstract class NullabilityFromInheritance { + @Nonnull + abstract Object id2023_type_NON_NULL_level_METHOD(); + + Object id2024_type_NO_ANNOTATION_level_PACKAGE() { + return new NullabilityFromInheritance() { + @Override + Object id2023_type_NON_NULL_level_METHOD() { + return ""; + } + }; + } +} diff --git a/java-checks-test-sources/src/main/java/checks/ArrayForVarArgCheck.java b/java-checks-test-sources/src/main/java/checks/ArrayForVarArgCheck.java index 65ffac5fa9f..54b8bcdc629 100644 --- a/java-checks-test-sources/src/main/java/checks/ArrayForVarArgCheck.java +++ b/java-checks-test-sources/src/main/java/checks/ArrayForVarArgCheck.java @@ -10,15 +10,21 @@ class ArrayForVarArgCheck { ArrayForVarArgCheck(String ... params) { } ArrayForVarArgCheck(int i, X ... xs) { } public void callTheThing(String s) throws IOException { + doTrickyThing(new String[][]{new String[]{"hello", "world"}}); // Noncompliant {{Remove this array creation and simply pass the elements.}} + doTrickyThing(new String[]{"hello", "world"}); // Compliant + + doTrickyThing(new ArrayForVarArgCheckFoo[][]{new ArrayForVarArgCheckFoo[]{foo, foo}}); // Noncompliant {{Remove this array creation and simply pass the elements.}} + doTrickyThing(new ArrayForVarArgCheckFoo[]{foo, foo}); // Compliant + doTheThing(new String[] { "s1", "s2"}); // Noncompliant {{Remove this array creation and simply pass the elements.}} [[sc=16;ec=42]] doTheThing(new String[12]); doTheThing(new String[0]); // Noncompliant {{Remove this array creation.}} doTheThing(new String[] {}); // Noncompliant {{Remove this array creation.}} doTheThing("s1", "s2"); doTheThing("s1"); - doTheThing2(new ArrayForVarArgCheckFoo[] {foo, foo}); // Noncompliant {{Disambiguate this call by either casting as "ArrayForVarArgCheckBar" or "ArrayForVarArgCheckBar[]".}} - doTheThing2(new ArrayForVarArgCheckFoo[12]); // Noncompliant {{Disambiguate this call by either casting as "ArrayForVarArgCheckBar" or "ArrayForVarArgCheckBar[]".}} - doTheThing2(new ArrayForVarArgCheckFoo[0]); // Noncompliant {{Disambiguate this call by either casting as "ArrayForVarArgCheckBar" or "ArrayForVarArgCheckBar[]".}} + doTheThing2(new ArrayForVarArgCheckFoo[] {foo, foo}); // Noncompliant {{Remove this array creation and simply pass the elements.}} + doTheThing2(new ArrayForVarArgCheckFoo[12]); + doTheThing2(new ArrayForVarArgCheckFoo[0]); // Noncompliant {{Remove this array creation.}} doTheThing2(new ArrayForVarArgCheckFoo(), new ArrayForVarArgCheckBar()); callTheThing(""); new ArrayForVarArgCheck(); @@ -40,8 +46,18 @@ public void callTheThing(String s) throws IOException { java.nio.file.Files.write(java.nio.file.Paths.get("myPath"), new byte[0]); // Compliant, byte array is not a varargs java.nio.file.Files.write(java.nio.file.Paths.get("myPath"), new byte[] {' ', 'A', 'B', 'C'}); // Compliant, byte array is not a varargs + + + ambiguous(new String[] {}); // Noncompliant {{Disambiguate this call by either casting as "Object" or "Object[]".}} + ambiguous(new String[0]); // Noncompliant {{Disambiguate this call by either casting as "Object" or "Object[]".}} + ambiguous(new String[12]); // Noncompliant {{Disambiguate this call by either casting as "Object" or "Object[]".}} + ambiguous(new String[] {"A", "B"}); // Noncompliant {{Disambiguate this call by either casting as "Object" or "Object[]".}} } + public void doTrickyThing(String[]... args) { + } + public void doTrickyThing(ArrayForVarArgCheckBar[]... args) { + } public void doTheThing (String ... args) { } public void doTheThing2 (ArrayForVarArgCheckBar... args) { @@ -52,6 +68,10 @@ public void arrayThenVarargs (int[] array, String... args) { public static void foo(T... ts) { return; } + + public void ambiguous(Object...obj) { + return; + } } class Overload{ diff --git a/java-checks-test-sources/src/main/java/checks/BooleanLiteralCheck.java b/java-checks-test-sources/src/main/java/checks/BooleanLiteralCheck.java index fb95e33fe95..272fcfad0e1 100644 --- a/java-checks-test-sources/src/main/java/checks/BooleanLiteralCheck.java +++ b/java-checks-test-sources/src/main/java/checks/BooleanLiteralCheck.java @@ -41,8 +41,8 @@ false && foo(), // Noncompliant // edit@qf_cond3 [[sc=17;ec=25]] {{||}} var = foo() ? false : exp; // Noncompliant [[sc=19;ec=24;quickfixes=qf_cond4]] // fix@qf_cond4 {{Simplify the expression}} - // edit@qf_cond4 [[sc=11;ec=11]] {{!}} // edit@qf_cond4 [[sc=17;ec=26]] {{&&}} + // edit@qf_cond4 [[sc=11;ec=11]] {{!}} var = foo() ? exp : true; // Noncompliant [[sc=25;ec=29;quickfixes=qf_cond5]] // fix@qf_cond5 {{Simplify the expression}} // edit@qf_cond5 [[sc=22;ec=29]] {{}} @@ -194,6 +194,70 @@ void quickFixForAndAndOr(boolean var, boolean var2) { } + boolean isNotNull(Object s, boolean exp) { + boolean result; + result = s == null ? false : exp; // Noncompliant [[sc=26;ec=31;quickfixes=qf_proper_fix]] + // result = s != null && exp; + // fix@qf_proper_fix {{Simplify the expression}} + // edit@qf_proper_fix [[sc=24;ec=33]]{{&&}} + // edit@qf_proper_fix [[sc=16;ec=18]]{{!=}} + return result; + } + + boolean externalConditionisFalse(boolean externalCondition, boolean exp) { + boolean result; + result = externalCondition ? false : exp; // Noncompliant [[sc=34;ec=39;quickfixes=regular_fix]] + // result = !externalCondition && exp; + // fix@regular_fix {{Simplify the expression}} + // edit@regular_fix [[sc=32;ec=41]]{{&&}} + // edit@regular_fix [[sc=14;ec=14]]{{!}} + return result; + } + + boolean doesNotStartWithA(String s, boolean exp) { + return (s != null) && s.startsWith("a") ? false : exp; // Noncompliant[[sc=47;ec=52;quickfixes=complex_fix]] + // return ((s == null) || !s.startsWith("a")) && exp; + // fix@complex_fix {{Simplify the expression}} + // edit@complex_fix [[sc=45;ec=54]]{{&&}} + // edit@complex_fix [[sc=44;ec=44]]{{)}} + // edit@complex_fix [[sc=27;ec=27]]{{!}} + // edit@complex_fix [[sc=24;ec=26]]{{||}} + // edit@complex_fix [[sc=15;ec=17]]{{==}} + // edit@complex_fix [[sc=12;ec=12]]{{(}} + } + + boolean isNotADuck(String s, boolean exp) { + return s != null && s.startsWith("d") && s.endsWith("uck") ? false : exp; // Noncompliant[[sc=66;ec=71;quickfixes=duck_fix]] + // return (s == null || !s.startsWith("d") || !s.endsWith("uck")) && exp; + // fix@duck_fix {{Simplify the expression}} + // edit@duck_fix [[sc=64;ec=73]]{{&&}} + // edit@duck_fix [[sc=63;ec=63]]{{)}} + // edit@duck_fix [[sc=46;ec=46]]{{!}} + // edit@duck_fix [[sc=43;ec=45]]{{||}} + // edit@duck_fix [[sc=25;ec=25]]{{!}} + // edit@duck_fix [[sc=22;ec=24]]{{||}} + // edit@duck_fix [[sc=14;ec=16]]{{==}} + // edit@duck_fix [[sc=12;ec=12]]{{(}} + } + + boolean isADuck(String s, boolean exp) { + return !isNotADuck(s, exp); + } + + boolean doesNotHaveWings(String s, boolean isMammal, boolean exp) { + return isADuck(s, exp) || (isMammal && s != null && s.equals("bat")) ? false : exp; // Noncompliant [[sc=76;ec=81;quickfixes=wings_qf]] + // return !isADuck(s, exp) && (!isMammal || s == null || !s.equals("bat")) && exp; + // fix@wings_qf {{Simplify the expression}} + // edit@wings_qf [[sc=74;ec=83]]{{&&}} + // edit@wings_qf [[sc=57;ec=57]]{{!}} + // edit@wings_qf [[sc=54;ec=56]]{{||}} + // edit@wings_qf [[sc=46;ec=48]]{{==}} + // edit@wings_qf [[sc=41;ec=43]]{{||}} + // edit@wings_qf [[sc=32;ec=32]]{{!}} + // edit@wings_qf [[sc=28;ec=30]]{{&&}} + // edit@wings_qf [[sc=12;ec=12]]{{!}} + } + boolean foo() { return true; } boolean foo(boolean b) { return b; } boolean bar() { return true; } diff --git a/java-checks-test-sources/src/main/java/checks/CounterModeIVShouldNotBeReusedCheck.java b/java-checks-test-sources/src/main/java/checks/CounterModeIVShouldNotBeReusedCheck.java new file mode 100644 index 00000000000..18924dfbe32 --- /dev/null +++ b/java-checks-test-sources/src/main/java/checks/CounterModeIVShouldNotBeReusedCheck.java @@ -0,0 +1,94 @@ +package checks; + +import java.io.ByteArrayOutputStream; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import javax.crypto.Cipher; +import javax.crypto.spec.GCMParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import org.bouncycastle.crypto.BlockCipher; +import org.bouncycastle.crypto.engines.AESEngine; +import org.bouncycastle.crypto.modes.CCMBlockCipher; +import org.bouncycastle.crypto.modes.GCMBlockCipher; +import org.bouncycastle.crypto.params.AEADParameters; +import org.bouncycastle.crypto.params.KeyParameter; + +public class CounterModeIVShouldNotBeReusedCheck { + + Charset utf8 = StandardCharsets.UTF_8; + + void testJca(String unknownString, byte[] unkownBytes) { + try { + Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); + SecretKeySpec skeySpec = new SecretKeySpec(new byte[] {}, "AES"); + + + char[] chars = "testme".toCharArray(); + byte[] bytes = String.valueOf(chars).getBytes(utf8); + GCMParameterSpec params5 = new GCMParameterSpec(128, bytes); + cipher.init(1, skeySpec, params5); // Noncompliant [[sc=14;ec=18;secondary=+0,-1,-2,-3]] + cipher.init(Cipher.DECRYPT_MODE, skeySpec, params5); // Compliant decrypt mode + + byte[] KEY_BYTES = {0x41, 0x70, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x73, 0x56, 0x46, 0x53}; + GCMParameterSpec params4 = new GCMParameterSpec(128, KEY_BYTES); + cipher.init(1, skeySpec, params4); // Noncompliant [[sc=14;ec=18;secondary=+0,-1,-2]] + + byte[] src = "7cVgr5cbdCZV".getBytes(utf8); + GCMParameterSpec params = new GCMParameterSpec(128, src); + cipher.init(1, skeySpec, params); // Noncompliant [[secondary=+0,-1,-2]] {{Use a dynamically-generated initialization vector (IV) to avoid IV-key pair reuse.}} + cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new GCMParameterSpec(128, src)); // Noncompliant [[secondary=+0,-3]] + cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new GCMParameterSpec(128, new byte[]{})); + + String staticPiece1 = "imjustthefirsthalf"; + String staticPiece2 = "secondhalf"; + byte[] bytes1 = (staticPiece1+staticPiece2).getBytes(); + GCMParameterSpec gcm = new GCMParameterSpec(128, bytes1); + cipher.init(1, skeySpec, gcm); // Noncompliant [[secondary=+0,-1,-2,-3,-4]] + + GCMParameterSpec gcm3 = new GCMParameterSpec(128, unkownBytes); + cipher.init(1, skeySpec, gcm3); + + GCMParameterSpec gcm4 = new GCMParameterSpec(128, unknownString.getBytes()); + cipher.init(1, skeySpec, gcm4); + + + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream( ); + outputStream.write( "7cVgr5cbdCZV".getBytes(utf8) ); + byte[] c = outputStream.toByteArray(); + GCMParameterSpec gcm2 = new GCMParameterSpec(128, c); + cipher.init(1, skeySpec, gcm2); // FALSE NEGATIVE + + } catch (Exception e) { + + } + } + + void bouncyCastle(byte[] byteArrayFromElsewhere, String stringFromSomewhere) { + try { + + byte[] key = "qqqqqqqqqqqqqqqq".getBytes(utf8); + + /* Encryption AES CCM */ + BlockCipher engine = new AESEngine(); + CCMBlockCipher ccmCipher = new CCMBlockCipher(engine); + GCMBlockCipher gcmCipher = new GCMBlockCipher(engine); + byte[] nonce = "7cVgr5cbdCZV".getBytes(utf8); // Secondary location: The initialization vector is a static value + AEADParameters params = new AEADParameters(new KeyParameter(key), 128, nonce); // Secondary location: The initialization vector is configured here. + ccmCipher.init(true, params); // Noncompliant + gcmCipher.init(true, params); // Noncompliant [[sc=17;ec=21;secondary=+0,-2,-3]] + gcmCipher.init(false, params); // Compliant + + AEADParameters staticParams = new AEADParameters(new KeyParameter(key), 0, byteArrayFromElsewhere); + gcmCipher.init(true, staticParams); // Compliant We cannot define if the method param 'byteArrayFromElsewhere' is static or not + + byte[] staticByteArray = stringFromSomewhere.getBytes(); + AEADParameters staticParams2 = new AEADParameters(new KeyParameter(key), 0, staticByteArray); + gcmCipher.init(true, staticParams2); // Compliant We cannot define if the method param 'stringFromSomewhere' is static or not + + } catch (Exception e) { + + } + } + +} diff --git a/java-checks-test-sources/src/main/java/checks/EmptyMethodsCheck.java b/java-checks-test-sources/src/main/java/checks/EmptyMethodsCheck.java index a6686131aa8..7bfd5f6c02e 100644 --- a/java-checks-test-sources/src/main/java/checks/EmptyMethodsCheck.java +++ b/java-checks-test-sources/src/main/java/checks/EmptyMethodsCheck.java @@ -1,11 +1,15 @@ package checks; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; + class EmptyMethodsCheck { class A { // Compliant - there is other constructors public A() { } + // Noncompliant@+1 - if the constructor takes an argument it should do something with it (or explain why it doesn't) public A(int c) { } @@ -175,4 +179,17 @@ private void emptyMethod2() { // fix@qf2 {{Insert placeholder comment}} // edit@qf2 [[sl=+0;el=+2;sc=34;ec=5]] {{\n // TODO document why this method is empty\n }} } + + private class ExceptionalCompliantCases { + @org.aspectj.lang.annotation.Pointcut() + void foo() { + + } + + @Pointcut() + void bar() {} + + @Before("") + void stillTriggerOnOtherAnnotations() {} // Noncompliant + } } diff --git a/java-checks-test-sources/src/main/java/checks/EmptyMethodsCheckNoSemantics.java b/java-checks-test-sources/src/main/java/checks/EmptyMethodsCheckNoSemantics.java new file mode 100644 index 00000000000..91078b505d7 --- /dev/null +++ b/java-checks-test-sources/src/main/java/checks/EmptyMethodsCheckNoSemantics.java @@ -0,0 +1,195 @@ +package checks; + +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; + +class EmptyMethodsCheckNoSemantics { + class A { + // Compliant - there is other constructors + public A() { + } + + // Noncompliant@+1 - if the constructor takes an argument it should do something with it (or explain why it doesn't) + public A(int c) { + } + + // Noncompliant@+1 [[sc=18;ec=19]] {{Add a nested comment explaining why this method is empty, throw an UnsupportedOperationException or complete the implementation.}} + private void f() { + } + + // Compliant + private void g() { + /* hmm */ + } + + // Compliant + private void h() { + throw new UnsupportedOperationException(); + } + + // Compliant + private int i() { + return 0; + } + + // Noncompliant@+1 + private void j() { + ; + } + } + + class AwithGenerics { + // Compliant + private AwithGenerics() { + } + + // Noncompliant@+1 + private void f() { + } + } + + abstract class Abstract { + // Compliant + private void f() { + abstract class B { + // Compliant + private void g() { + } + } + + class C { + // Noncompliant@+1 + private void g() { + } + } + } + + IFoo bar = new IFoo() { + // Noncompliant@+1 + public void f() { + } + }; + } + + enum AEnum { + ; + + // Noncompliant@+1 + public void f() { + } + + public void g() { + // Compliant + } + } + + class ANestedEnum { + enum B { + ; + + // Noncompliant@+1 + public void f() { + } + } + } + + public interface IFoo { + + static IFoo FOO = new IFoo() { + // Noncompliant@+1 + public void foo() { + } + + // Compliant + public void bar() { + System.out.println(); + } + }; + + } + + enum Foo { + + FOO { + // Noncompliant@+1 + public void foo() { + } + + // Compliant + public int bar() { + return 0; + } + }; + + // Noncompliant@+1 + public void foo() { + } + + } + + class Constructors { + class C { + // Noncompliant@+1 + public C() { + } + } + + class D { + // Compliant + public D() { + // usefull comment + } + } + + class E { + // Compliant - not public + E() { + } + } + + class F { + // Compliant - not a no-arg constructor + public F(int i) { + } + } + } + + record MyRecord() { + // Noncompliant@+1 + void foo() { + } + } + + class QuickFixes { + // Noncompliant@+1 [[sc=12;ec=22;quickfixes=qf0]] + public QuickFixes() {} + // fix@qf0 {{Insert placeholder comment}} + // edit@qf0 [[sc=26;ec=26]] {{ /* TODO document why this constructor is empty */ }} + + // Noncompliant@+1 [[sc=18;ec=29;quickfixes=qf1]] + private void emptyMethod() { + } + // fix@qf1 {{Insert placeholder comment}} + // edit@qf1 [[sl=+0;el=+1;sc=33;ec=5]] {{\n // TODO document why this method is empty\n }} + + // Noncompliant@+1 [[sc=18;ec=30;quickfixes=qf2]] + private void emptyMethod2() { + + } + // fix@qf2 {{Insert placeholder comment}} + // edit@qf2 [[sl=+0;el=+2;sc=34;ec=5]] {{\n // TODO document why this method is empty\n }} + } + + private class ExceptionalCompliantCases { + @org.aspectj.lang.annotation.Pointcut() + void foo() { + + } + + @Pointcut() + void bar() {} + + @Before("") + void stillTriggerOnOtherAnnotations() {} // Noncompliant + } +} diff --git a/java-checks-test-sources/src/main/java/checks/ForLoopFalseConditionCheck.java b/java-checks-test-sources/src/main/java/checks/ForLoopFalseConditionCheck.java new file mode 100644 index 00000000000..32ba732cd5a --- /dev/null +++ b/java-checks-test-sources/src/main/java/checks/ForLoopFalseConditionCheck.java @@ -0,0 +1,48 @@ +package checks; + +public class ForLoopFalseConditionCheck { + void myMethod(int x, int y, int z) { + + for(int i = 0; i < ZERO; i++) {} // Noncompliant + for(int i = 1; i < 0 + 1; i++) {} // Noncompliant + for(int i = 10; i < 0 + 1 + 1; i++) {} // Noncompliant + for(int i = 0; i < 0 + 1 - 1; i++) {} // Noncompliant + for(int i = 12; i > 1 + 2 * 5; i++) {} // Compliant + for(int i = 12; i > (1 + 2) * 5; i++) {} // Noncompliant + for(int i = 2; i > (1 + 5) / 5; i++) {} // Compliant + for(int i = 2; i > 1 + 5 / 5; i++) {} // Noncompliant + + + int j = 0, k = 0; + for (int i = x; true; ) {break;} + + for (int i = x; true; ) {break;} + + + for (int i = 1; i < 5; ) {} + for (int i = 9; i < 5; ) {} // Noncompliant + for (int i = 9; i > 5; ) {} + for (int i = 1; i > 5; ) {} // Noncompliant + for (int i = 1; i <=5; ) {} + for (int i = 9; i <=5; ) {} // Noncompliant + for (int i = 9; i >=5; ) {} + for (int i = 1; i >=5; ) {} // Noncompliant + for (int i = x; i < 5; ) {} + for (int i = 1; i < x; ) {} + for (int i = 1; i <-x; ) {} + for ( ; j < 5; ) {} + for ( j = 9; j < 5; ) {} // Noncompliant + for ( x += 1; j < 5; ) {} + + for (int i = 1; ; ) {break;} + for (int i = 0; i < 0x10; ) {} + for (int i = 0; i < 0b10; ) {} + for (int i = 1; i <= 0Xffff; i++) {} + } + + static final int ZERO = 0; + void foo() { + for(int i = 0; i < 0; i++) {} // Noncompliant + + } +} diff --git a/java-checks-test-sources/src/main/java/checks/HardCodedPasswordCheck.java b/java-checks-test-sources/src/main/java/checks/HardCodedPasswordCheck.java index 153775c712f..2d0bbb3c2cb 100644 --- a/java-checks-test-sources/src/main/java/checks/HardCodedPasswordCheck.java +++ b/java-checks-test-sources/src/main/java/checks/HardCodedPasswordCheck.java @@ -183,8 +183,8 @@ private void a(char[] pwd, String var) throws SQLException { // ========== 4.2 API setting password ========== // The second argument of "getConnection" contains a password: report an issue if it is hardcoded java.sql.Connection conn = DriverManager.getConnection("jdbc:mysql://xxx/", "root", var); - conn = DriverManager.getConnection("jdbc:mysql://xxx/", "root", "whateverpassword"); // Noncompliant [[sc=69;ec=87]] - conn = DriverManager.getConnection("jdbc:mysql://xxx/", "root", PASSED); // Noncompliant [[sc=69;ec=75]] + conn = DriverManager.getConnection("jdbc:mysql://xxx/", "root", "whateverpassword"); // Compliant, handled by S6437 + conn = DriverManager.getConnection("jdbc:mysql://xxx/", "root", PASSED); // Compliant, handled by S6437 conn = DriverManager.getConnection("jdbc:mysql://xxx/"); // Password not set as argument, but it is still detected in the string itself is detected thanks to (1.) conn = DriverManager.getConnection("jdbc:db2://myhost:5021/mydb:user=dbadm;password=foo"); // Noncompliant [[sc=40;ec=93]] @@ -229,7 +229,7 @@ private void a(char[] pwd, String var) throws SQLException { // ========== 5. Constructors ========== // Second argument of "PasswordAuthentication" is setting explicitly a password PasswordAuthentication pa; - pa = new PasswordAuthentication("userName", "1234".toCharArray()); // Noncompliant {{Remove this hard-coded password.}} + pa = new PasswordAuthentication("userName", "1234".toCharArray()); // Compliant, handled by S6437 // Not hardcoded pa = new PasswordAuthentication("userName", var.toCharArray()); pa = new PasswordAuthentication("userName", pwd); // Compliant diff --git a/java-checks-test-sources/src/main/java/checks/HardCodedPasswordCheckCustom.java b/java-checks-test-sources/src/main/java/checks/HardCodedPasswordCheckCustom.java index a66de209203..8e02a193dcc 100644 --- a/java-checks-test-sources/src/main/java/checks/HardCodedPasswordCheckCustom.java +++ b/java-checks-test-sources/src/main/java/checks/HardCodedPasswordCheckCustom.java @@ -28,7 +28,7 @@ private void a(char[] pwd, String var) { myA.setProperty("pwd", "xxxxx"); // Compliant - new PasswordAuthentication("userName", "1234".toCharArray()); // Noncompliant {{Remove this hard-coded password.}} + new PasswordAuthentication("userName", "1234".toCharArray()); // Compliant, handled by S6437 new PasswordAuthentication("userName", pwd); // Compliant new PasswordAuthentication("userName", getPwd(var)); // Compliant new PasswordAuthentication("userName", var.toCharArray()); // Compliant diff --git a/java-checks-test-sources/src/main/java/checks/IteratorNextExceptionCheck.java b/java-checks-test-sources/src/main/java/checks/IteratorNextExceptionCheck.java index dae29b21363..860e64bd63a 100644 --- a/java-checks-test-sources/src/main/java/checks/IteratorNextExceptionCheck.java +++ b/java-checks-test-sources/src/main/java/checks/IteratorNextExceptionCheck.java @@ -1,8 +1,10 @@ package checks; import java.util.Iterator; +import java.util.ListIterator; import java.util.NoSuchElementException; import java.util.Optional; +import java.util.PrimitiveIterator; class IteratorNextExceptionCheckA implements Iterator { @@ -157,3 +159,25 @@ Optional getOptional() { return Optional.empty(); } } + +class IteratorNextExceptionCheckM implements Iterator { + ListIterator a; + public String next() { + return a.previous(); // Compliant + } + @Override + public boolean hasNext() { + return a.hasPrevious(); + } +} + +class IteratorNextExceptionCheckN implements Iterator { + PrimitiveIterator.OfDouble a; + public Double next() { + return a.nextDouble(); // Compliant + } + @Override + public boolean hasNext() { + return a.hasNext(); + } +} diff --git a/java-checks/src/test/files/checks/LeastSpecificTypeCheck.java b/java-checks-test-sources/src/main/java/checks/LeastSpecificTypeCheck.java similarity index 67% rename from java-checks/src/test/files/checks/LeastSpecificTypeCheck.java rename to java-checks-test-sources/src/main/java/checks/LeastSpecificTypeCheck.java index 880e7814ee2..e9894414697 100644 --- a/java-checks/src/test/files/checks/LeastSpecificTypeCheck.java +++ b/java-checks-test-sources/src/main/java/checks/LeastSpecificTypeCheck.java @@ -1,9 +1,18 @@ -import java.util.*; +package checks; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.function.UnaryOperator; +import java.util.function.Function; import javax.annotation.Resource; import javax.inject.Inject; import org.springframework.beans.factory.annotation.Autowired; -class A { +class LeastSpecificTypeCheck { public void test1(ArrayList list) { // Noncompliant {{Use 'java.util.Collection' here; it is a more general type than 'ArrayList'.}} System.out.println(list.size()); @@ -30,7 +39,7 @@ public void ignoreStringParams(String s) { // Compliant } @Resource - public void resourceAnnotatedMethod1(List list) { // Noncompliant {{Use 'java.util.Collection' here; it is a more general type than 'List'.}} + public void resourceAnnotatedMethod3(List list) { // Noncompliant {{Use 'java.util.Collection' here; it is a more general type than 'List'.}} for (Object o : list) { o.toString(); } @@ -51,7 +60,7 @@ public void ignoreStringParams(String s) { // Compliant } @Resource - public void resourceAnnotatedMethod2(Collection list) { // Compliant - since Spring annotated methods cannot take 'Iterable' as argument + public void resourceAnnotatedMethod4(Collection list) { // Compliant - since Spring annotated methods cannot take 'Iterable' as argument for (Object o : list) { o.toString(); } @@ -109,7 +118,7 @@ public class S implements IA, IB { public class C extends S { } - public void test4(C arg) { // Noncompliant {{Use 'A.S' here; it is a more general type than 'C'.}} + public void test4(C arg) { // Noncompliant {{Use 'checks.LeastSpecificTypeCheck.S' here; it is a more general type than 'C'.}} arg.a(); arg.b(); } @@ -139,7 +148,11 @@ abstract static class Base implements IBase { } protected static class ProtectedBase extends Base { + @Override + public void b2() { } + @Override + public void b() { } } public static class Visibility extends ProtectedBase { @@ -183,98 +196,10 @@ public static void fieldsAreIgnored(E e) { // Compliant e.field.toString(); } - public interface II1 {} - - public interface I1 extends II1 { - void m(); - } - - public interface I2 extends I1 { - void m(); - } - - public static class T1 { - void m() {} - void mt1() {} - } - - public static class T2 extends T1 implements I2 { - void ma(); - } - - public interface IMB { - void ma(); - void ma_1(Unknown u); - - interface Inner {} - void ma_2(Inner i); - } - - public interface IMA { - void ma(); - void ma_1(Unknown u); - - interface Inner {} - void ma_2(Inner i); - } - - static class T extends T2 implements IMB, IMA {} - - public static void bla(T t) { // Noncompliant {{Use 'A.I1' here; it is a more general type than 'T'.}} - t.m(); - } - - public static void foo(T t) { // Noncompliant {{Use 'A.T1' here; it is a more general type than 'T'.}} - t.m(); - t.mt1(); - } - - public static void ma(T t) { // Noncompliant {{Use 'A.IMA' here; it is a more general type than 'T'.}} - // defined in both T2 and IMA, interface is preferred - t.ma(); - } - - public static void ma_1(T t) { // Compliant - ambiguous as Unknown type is unknown - // defined in both T2 and IMA, unknow makes it indecidable - t.ma_1(null); - } - - public static void ma_2(T t) { // Noncompliant {{Use 'A.IMB' here; it is a more general type than 'T'.}} - // defined in both T2 and IMA, but call is ambiguous - t.ma_2(null); - } - - public interface IG { - T get(); - } - - public abstract class GImpl implements IG { - GImpl get(); - } - - class GImplSub extends GImpl { - - } - - public static void generics(GImplSub s) { // Noncompliant {{Use 'A.GImpl' here; it is a more general type than 'GImplSub'.}} - s.get(); - } - - class Generic implements IG { - - } - - public static void generics2(Generic g) { // Noncompliant {{Use 'A.IG' here; it is a more general type than 'Generic'.}} - g.get(); - } - - public static void stringBuilder(final StringBuilder name) { - name.charAt(0); - name.substring(0, 1); - } - private static class PrivateClass implements IBase { void m2() {} + @Override + public void b2() { } } protected static class ProtectedClass extends PrivateClass { @@ -285,7 +210,7 @@ static class PackageClass extends ProtectedClass { } - public static void coverage(PrivateClass c) { // Noncompliant {{Use 'A.IBase' here; it is a more general type than 'PrivateClass'.}} + public static void coverage(PrivateClass c) { // Noncompliant {{Use 'checks.LeastSpecificTypeCheck.IBase' here; it is a more general type than 'PrivateClass'.}} c.b2(); } @@ -295,4 +220,13 @@ public static void coverage2(PackageClass c) { public static void primitiveTypesAreIgnored(int i, long l, double d, float f, byte b, short s, char c, boolean boo) { } + public BigDecimal getUnaryOperator(UnaryOperator func) { // Compliant + // issue exception because UnaryOperator is a better functional interface usage than Function + return func.apply(BigDecimal.ONE); + } + + public BigDecimal getFunction(Function func) { // S4276 issue to promote UnaryOperator + return func.apply(BigDecimal.ONE); + } + } diff --git a/java-checks-test-sources/src/main/java/checks/MutableMembersUsageCheck.java b/java-checks-test-sources/src/main/java/checks/MutableMembersUsageCheck.java index 3cdcad51f37..5428f6fc4a4 100644 --- a/java-checks-test-sources/src/main/java/checks/MutableMembersUsageCheck.java +++ b/java-checks-test-sources/src/main/java/checks/MutableMembersUsageCheck.java @@ -1,11 +1,18 @@ package checks; import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import com.google.common.collect.ImmutableCollection; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import static checks.MutableMembersUsageCheck.CustomImmutableList.staticallyImportedMethod; class MutableMembersUsageCheck { + private String[] strings; public String[] properties; private List list = new LinkedList<>(); @@ -26,6 +33,93 @@ class MutableMembersUsageCheck { private List customUnmodifiableList1 = customUnmodifiableList(mutableList); private List customUnmodifiableList2 = CustomUnmodifiableList.create(mutableList); + private Map hashMap = new HashMap<>(); + + public Map getHashMap() { + return hashMap; // Noncompliant + } + + private ImmutableMap immutableMap; + + public Map getImmutableMap() { + return immutableMap; // Compliant + } + + private Map immutableMap2 = ImmutableMap.of("abc", "abc"); + + public Map getImmutableMap2() { + return immutableMap2; // Compliant + } + + private static final Set unmodifiableFromStream = + Stream.of( + "first", + "second") + .collect(Collectors.toUnmodifiableSet()); + + + private static final List unmodifiableFromStream2 = + Arrays.asList( + "first", + "second") + .stream() + .collect(Collectors.toUnmodifiableList()); + + private static final Map> unmodifiableFromStream4 = + Stream.of("first", "second", "second", "thirteen", "thirteen", "thirteen") + .collect( + Collectors.collectingAndThen( + Collectors.groupingBy( + String::length, Collectors.toUnmodifiableSet() + ), + Collections::unmodifiableMap + ) + ); + + private static final Map unmodifiableFromStream3 = + Stream.of("first", "second", "thirteen") + .collect(Collectors.toUnmodifiableMap(String::length, e -> e)); + + public Set getUnmodifiableFromStream() { + return unmodifiableFromStream; + } + + public List getUnmodifiableFromStream2() { + return unmodifiableFromStream2; + } + + public Map getUnmodifiableFromStream3() { + return unmodifiableFromStream3; + } + + // A known false-positive as it's hard to identify that the result of the stream.collect() is actually unmodifiable + public Map> getUnmodifiableFromStream4() { + return unmodifiableFromStream4; // Noncompliant + } + + // The following collections are immutable and therefore compliant. + private static final Set UNION = Sets.union(Collections.emptySet(), Set.of("Java")); + private static final Set DIFF = Sets.difference(Collections.emptySet(), Set.of("Java")); + private static final Set INTER = Sets.intersection(Collections.emptySet(), Set.of("Java")); + private static final Set SYM_DIFF = Sets.symmetricDifference(Collections.emptySet(), Set.of("Java")); + private static final List AS_LIST = Lists.asList("ABC", new String[] {"", ""}); + + public Set getUnion() { + return UNION; + } + public Set getDiff() { + return DIFF; + } + public Set getInter() { + return INTER; + } + public Set getSymDiff() { + return SYM_DIFF; + } + public List getAsList() { + return AS_LIST; + } + public MutableMembersUsageCheck () { strings = new String[]{"first", "second"}; properties = new String[]{"a"}; @@ -423,3 +517,32 @@ class MyClassWithAMutableMember { this.arg = arg; // Noncompliant } } + +class Java9Methods { + private static final List MODIFIABLE = new ArrayList<>(); + private static final List IMMUTABLE_LIST = List.of(1, 2, 3); + private static final List IMMUTABLE_COPY_LIST = List.copyOf(new ArrayList<>()); + private static final Set IMMUTABLE_SET = Set.of("a"); + private static final Set IMMUTABLE_COPY_SET = Set.copyOf(new HashSet<>()); + + public List immutableList() { + return IMMUTABLE_LIST; // Compliant + } + + public List immutableListCopy() { + return IMMUTABLE_COPY_LIST; // Compliant + } + + public Set immutableSet() { + return IMMUTABLE_SET; // Compliant + } + + public Set immutableSetCopy() { + return IMMUTABLE_COPY_SET; // Compliant + } + + public List modifiable() { + return MODIFIABLE; // Noncompliant + } + +} diff --git a/java-checks-test-sources/src/main/java/checks/PublicStaticMutableMembersCheck.java b/java-checks-test-sources/src/main/java/checks/PublicStaticMutableMembersCheck.java index 69a95bf3e91..4eb79d498ae 100644 --- a/java-checks-test-sources/src/main/java/checks/PublicStaticMutableMembersCheck.java +++ b/java-checks-test-sources/src/main/java/checks/PublicStaticMutableMembersCheck.java @@ -1,5 +1,12 @@ package checks; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; + import java.awt.*; import java.util.ArrayList; import java.util.Arrays; @@ -13,6 +20,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class PublicStaticMutableMembersCheck { public static String [] strings1 = {"first","second"}; // Noncompliant [[sc=27;ec=35]] {{Make this member "protected".}} @@ -132,6 +141,43 @@ private static List customImmutableList() { private static List customUnmodifiableList() { return Collections.emptyList(); } + + + public static final Set unmodifiableFromStream = + Stream.of( + "first", + "second") + .collect(Collectors.toUnmodifiableSet()); + + + public static final List unmodifiableFromStream2 = + Arrays.asList( + "first", + "second") + .stream() + .collect(Collectors.toUnmodifiableList()); + + // A known false-positive, hard to detect + public static final Map> unmodifiableFromStream4 = // Noncompliant + Stream.of("first", "second", "second", "thirteen", "thirteen", "thirteen") + .collect( + Collectors.collectingAndThen( + Collectors.groupingBy( + String::length, Collectors.toUnmodifiableSet() + ), + Collections::unmodifiableMap + ) + ); + + public static final Map unmodifiableFromStream3 = + Stream.of("first", "second", "thirteen") + .collect(Collectors.toUnmodifiableMap(String::length, e -> e)); + + public static final Set UNION = Sets.union(Collections.emptySet(), Set.of("Java")); + public static final Set DIFF = Sets.difference(Collections.emptySet(), Set.of("Java")); + public static final Set INTER = Sets.intersection(Collections.emptySet(), Set.of("Java")); + public static final Set SYM_DIFF = Sets.symmetricDifference(Collections.emptySet(), Set.of("Java")); + public static final List AS_LIST = Lists.asList("ABC", new String[] {"", ""}); } interface PublicStaticMutableMembersCheck_I { @@ -174,3 +220,30 @@ class PublicStaticMutableMembersCheckB { class PublicStaticMutableMembersCheckC { } + +class Java9 { + + public static final Map IMMUTABLE_MAP = Map.of("a", "A"); + public static final Map IMMUTABLE_MAP_COPY = Map.copyOf(new HashMap<>()); + public static final Map IMMUTABLE_MAP_OF_ENTRIES = Map.ofEntries(Map.entry("1", "2")); + public static final List IMMUTABLE_LIST = List.of("hello"); + public static final List IMMUTABLE_LIST_COPY = List.copyOf(new ArrayList<>()); + public static final Set IMMUTABLE_SET = Set.of("hello"); + public static final Set IMMUTABLE_SET_COPY = Set.copyOf(new HashSet<>()); + +} + +class Guava { + public static final List immutableList = ImmutableList.of("a"); + public static final Set immutableSet = ImmutableSet.of("a"); + public static final Map immutableMap = ImmutableMap.of("a", "a"); + + public static final Set otherImmutableSet = immutableSet; + public static final Map otherImmutableMap = immutableMap; + + + public static final List immutableList3 = ImmutableList.of("a"); + public static final Set immutableSet2 = ImmutableSet.of("a"); + public static final Map immutableMap2 = ImmutableMap.of("a", "a"); + public static final Set otherImmutableSet2 = immutableSet2; +} diff --git a/java-checks-test-sources/src/main/java/checks/TooManyParametersCheck.java b/java-checks-test-sources/src/main/java/checks/TooManyParametersCheck.java index 78f3a2f6be8..26368089139 100644 --- a/java-checks-test-sources/src/main/java/checks/TooManyParametersCheck.java +++ b/java-checks-test-sources/src/main/java/checks/TooManyParametersCheck.java @@ -4,9 +4,25 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Repository; +import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PatchMapping; import com.fasterxml.jackson.annotation.JsonCreator; +import io.micronaut.http.annotation.Get; +import io.micronaut.http.annotation.Post; +import io.micronaut.http.annotation.Put; +import io.micronaut.http.annotation.Delete; +import io.micronaut.http.annotation.Options; +import io.micronaut.http.annotation.Patch; +import io.micronaut.http.annotation.Head; +import io.micronaut.http.annotation.Trace; + + + public class TooManyParametersCheck { TooManyParametersCheck(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8) { // Noncompliant {{Constructor has 8 parameters, which is greater than 7 authorized.}} @@ -103,3 +119,95 @@ public void foo4(String p1, String p2, String p3, String p4, String p5, String p @javax.inject.Inject public void foo5(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Compliant } + +@Component +class SpringComponent{ + public SpringComponent(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Compliant + + public void foo5(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Noncompliant +} + +@Component +class SpringComponentMoreThanOneConstructor{ + public SpringComponentMoreThanOneConstructor(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Noncompliant + public SpringComponentMoreThanOneConstructor(String p1, String p2, String p3) {} // Compliant + + public void foo5(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Noncompliant +} + +@Configuration +class SpringConfiguration{ + public SpringConfiguration(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Compliant + + public void foo5(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Noncompliant +} + +@Configuration +class SpringConfigurationMoreThanOneConstructor{ + public SpringConfigurationMoreThanOneConstructor(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Noncompliant + public SpringConfigurationMoreThanOneConstructor(String p1, String p2, String p3) {}; // Compliant + + @Bean + public void testBean(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Compliant + + public void foo5(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Noncompliant + +} + +@Repository +class SpringRepository{ + public SpringRepository(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Compliant + + public void foo5(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Noncompliant +} + +@Repository +class SpringRepositoryMoreThanOneConstructor{ + public SpringRepositoryMoreThanOneConstructor(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Noncompliant + public SpringRepositoryMoreThanOneConstructor(String p1, String p2, String p3) {}; // Compliant + + public void foo5(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Noncompliant +} + +@Service +class SpringService{ + public SpringService(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Compliant + + public void foo5(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Noncompliant +} + +@Service +class SpringServiceMoreThanOneConstructor{ + public SpringServiceMoreThanOneConstructor(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Noncompliant + public SpringServiceMoreThanOneConstructor(String p1, String p2, String p3) {}; // Compliant + + public void foo5(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Noncompliant +} + +class MicronautHttpAnnotations{ + + @Get + public void get(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Compliant + @Post + public void post(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Compliant + @Put + public void put(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Compliant + @Delete + public void delete(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Compliant + @Options + public void options(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Compliant + @Patch + public void patch(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Compliant + @Head + public void head(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Compliant + @Trace + public void trace(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Compliant + +} + +/* + * Exceptions to the rule : RECORD, ANNOTATION_TYPE (annotations cannot have method params nor constructors) + */ +record Record1(String p1, String p2, String p3, String p4, String p5, String p6, String p7, String p8) {} // Compliant + + \ No newline at end of file diff --git a/java-checks-test-sources/src/main/java/checks/regex/ImpossibleBoundariesCheck.java b/java-checks-test-sources/src/main/java/checks/regex/ImpossibleBoundariesCheck.java index a8706e04b56..12146450190 100644 --- a/java-checks-test-sources/src/main/java/checks/regex/ImpossibleBoundariesCheck.java +++ b/java-checks-test-sources/src/main/java/checks/regex/ImpossibleBoundariesCheck.java @@ -29,7 +29,7 @@ void noncompliant(String str) { str.matches("abc(?[0-9]{1,9})?(\\.(?[0-9]{1,9})(\\.$|[.-](?[0-9]{1,9}))?)?)([.-]?(?.+?))??([.-]redhat-(?[0-9]{1,9}))?$"); } - void withMultilineFlag() { + void consideringNewLines() { Pattern.compile("a\\n^b$", Pattern.MULTILINE); // Compliant, matches "a\nb" Pattern.compile("(?m)a\\n^b$"); // Compliant Pattern.compile("a\\n^b$"); // Noncompliant @@ -95,6 +95,11 @@ void withMultilineFlag() { Pattern.compile("(?m)a$\nb"); // Compliant Pattern.compile("(?m)^1$\n2"); // Compliant Pattern.compile("a$\nb"); // Noncompliant + + Pattern.compile("^a$\r?\n?"); + Pattern.compile("^a$\r?\n?b"); // Noncompliant + Pattern.compile("^a$.*", Pattern.DOTALL); + Pattern.compile("^a$.*"); // Noncompliant } } diff --git a/java-checks-test-sources/src/main/java/checks/regex/PossessiveQuantifierContinuationCheck.java b/java-checks-test-sources/src/main/java/checks/regex/PossessiveQuantifierContinuationCheck.java index 9ec44f26537..5cdc21aefbb 100644 --- a/java-checks-test-sources/src/main/java/checks/regex/PossessiveQuantifierContinuationCheck.java +++ b/java-checks-test-sources/src/main/java/checks/regex/PossessiveQuantifierContinuationCheck.java @@ -18,7 +18,7 @@ public void f(Pattern pattern) { f(compile("aa++bc")); f(compile("\\d*+(?<=[02468])")); f(compile("(xx++)+x")); // Noncompliant [[sc=23;ec=24]] - f(compile("(bx++)+x")); // false-negative, limitation of the algorithm when there's infinite loop + f(compile("(bx++)+x")); // Noncompliant [[sc=23;ec=24]] f(compile("(?:xx++)+x")); // Noncompliant [[sc=25;ec=26]] f(compile("(xx++)x")); // Noncompliant [[sc=22;ec=23]] f(compile(".*+\\w")); // Noncompliant [[sc=19;ec=22]] diff --git a/java-checks-test-sources/src/main/java/checks/regex/UnusedGroupNamesCheck.java b/java-checks-test-sources/src/main/java/checks/regex/UnusedGroupNamesCheck.java index 1b0da538fdb..c1cd3cebfb6 100644 --- a/java-checks-test-sources/src/main/java/checks/regex/UnusedGroupNamesCheck.java +++ b/java-checks-test-sources/src/main/java/checks/regex/UnusedGroupNamesCheck.java @@ -11,7 +11,9 @@ void noncompliant(String input) { Matcher m0 = p0.matcher(input); if (m0.matches()) { - m0.group(1); // Noncompliant [[secondary=8]] {{Directly use 'g1' instead of its group number.}} + m0.group(1); // Noncompliant [[secondary=-6]] {{Directly use 'g1' instead of its group number.}} + m0.start(1); // Noncompliant [[secondary=-7]] {{Directly use 'g1' instead of its group number.}} + m0.end(1); // Noncompliant [[secondary=-8]] {{Directly use 'g1' instead of its group number.}} } Pattern p1 = Pattern @@ -21,7 +23,9 @@ void noncompliant(String input) { + "(?[0-9]+)"); Matcher m1 = p1.matcher(input); if (m1.matches()) { - m1.group("g3"); // Noncompliant [[secondary=19,21]] {{There is no group named 'g3' in the regular expression.}} + m1.group("g3"); // Noncompliant [[secondary=-3,-5]] {{There is no group named 'g3' in the regular expression.}} + m1.start("g3"); // Noncompliant [[secondary=-4,-6]] {{There is no group named 'g3' in the regular expression.}} + m1.end("g3"); // Noncompliant [[secondary=-5,-7]] {{There is no group named 'g3' in the regular expression.}} } Matcher m2 = Pattern.compile( @@ -34,10 +38,10 @@ void noncompliant(String input) { new Bar(m2); // Same. Bar takes Object as its argument type if (m2.matches()) { m2.group( - 1 // Noncompliant [[secondary=28]] {{Directly use 'month' instead of its group number.}} + 1 // Noncompliant [[secondary=-9]] {{Directly use 'month' instead of its group number.}} ); m2.group( - 2 // Noncompliant [[secondary=30]] {{Directly use 'year' instead of its group number.}} + 2 // Noncompliant [[secondary=-10]] {{Directly use 'year' instead of its group number.}} ); } @@ -164,10 +168,25 @@ Object compliant(String input, String groupName, int groupNumber) { someMethod(p13); someOtherMethod().group(1); // This should be ignored since we don't know which regex we're calling group for + someOtherMethod().start("group"); // This should be ignored since we don't know which regex we're calling group for + someOtherMethod().end(3); // This should be ignored since we don't know which regex we're calling group for Pattern p14 = Pattern.compile("(?test)"); // Compliant because passed to constructor new Foo(p14); + Pattern p15 = Pattern.compile("(?[0-9]{2})/(?[0-9]{2})"); + Matcher m15 = p15.matcher(input); + if (m15.matches()) { + m15.start("month"); + m15.start("year"); + } + + Pattern p16 = Pattern.compile("(?\\d+(?:\\.\\d{2})?)CHF"); + Matcher m16 = p16.matcher(input); + if (m16.matches()) { + System.out.println(m16.end("price")); + } + // When patterns or matchers are directly passed to methods or constructors, they're considered as escaping the scope // even if the parameter type isn't Pattern/Matcher new Bar(Pattern.compile("(?test)")); diff --git a/java-checks-test-sources/src/main/java/checks/security/CipherBlockChainingCheck.java b/java-checks-test-sources/src/main/java/checks/security/CipherBlockChainingCheck.java index df4da449f52..229b41bac25 100644 --- a/java-checks-test-sources/src/main/java/checks/security/CipherBlockChainingCheck.java +++ b/java-checks-test-sources/src/main/java/checks/security/CipherBlockChainingCheck.java @@ -1,6 +1,7 @@ package checks.security; import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; import java.security.SecureRandom; import java.security.spec.AlgorithmParameterSpec; import javax.crypto.Cipher; @@ -53,7 +54,7 @@ void foo6() throws UnsupportedEncodingException { } void foo7(byte[] bytes) { - IvParameterSpec iv = new IvParameterSpec(bytes); // Noncompliant + IvParameterSpec iv = new IvParameterSpec(bytes); // Compliant, we can't tell what "bytes" contains } void foo8() throws UnsupportedEncodingException { @@ -165,8 +166,8 @@ static void decryptImpl2(byte[] biv, SecretKeySpec ks) throws Exception { .init(Cipher.DECRYPT_MODE, ks, new IvParameterSpec(biv)); // compliant } - static void decryptImpl3(byte[] biv, SecretKeySpec ks) throws Exception { - new IvParameterSpec(biv); // Noncompliant - not used... + static void decryptImpl3(SecretKeySpec ks) throws Exception { + new IvParameterSpec("111".getBytes("UTF-8")); // Noncompliant - not used Cipher .getInstance(OPERATION_MODE, "BC") .init(Cipher.DECRYPT_MODE, ks); @@ -180,23 +181,23 @@ static void decryptImpl4(SecretKeySpec ks) throws Exception { .init(Cipher.ENCRYPT_MODE, ks, iv); } - static void decryptImpl5(byte[] biv, SecretKeySpec ks, IvParameterSpec iv) throws Exception { - new IvParameterSpec(biv); // Noncompliant - not used... + static void decryptImpl5(SecretKeySpec ks, IvParameterSpec iv) throws Exception { + new IvParameterSpec("111".getBytes("UTF-8")); // Noncompliant - not used Cipher .getInstance(OPERATION_MODE, "BC") .init(Cipher.DECRYPT_MODE, ks, iv); } - static void decryptImpl6(byte[] biv, SecretKeySpec ks, IvParameterSpec iv) throws Exception { - IvParameterSpec iv2 = new IvParameterSpec(biv); // Noncompliant - not used... + static void decryptImpl6(SecretKeySpec ks, IvParameterSpec iv) throws Exception { + IvParameterSpec iv2 = new IvParameterSpec("111".getBytes("UTF-8")); // Noncompliant - not used Cipher .getInstance(OPERATION_MODE, "BC") .init(Cipher.DECRYPT_MODE, ks, iv); } - static void decryptImpl17(byte[] biv, SecretKeySpec ks) throws Exception { + static void decryptImpl17(SecretKeySpec ks) throws Exception { AlgorithmParameterSpec spec; - spec = new IvParameterSpec(biv); // Compliant + spec = new IvParameterSpec("111".getBytes("UTF-8")); // Compliant, not random but used by Cipher#init with Cipher.DECRYPT_MODE Cipher .getInstance(OPERATION_MODE, "BC") .init(Cipher.DECRYPT_MODE, ks, spec); @@ -213,6 +214,35 @@ static void decryptImpl18(byte[] biv, SecretKeySpec ks) throws Exception { .getInstance(OPERATION_MODE, "BC") .init(Cipher.DECRYPT_MODE, ks, spec); } + + static void byteBufferUsedAsIv(ByteBuffer ivBuffer) { + final byte[] biv1 = new byte[16]; + ivBuffer.get(biv1); + IvParameterSpec iv1 = new IvParameterSpec(biv1); // Compliant + + final byte[] biv2 = new byte[16]; + IvParameterSpec iv2 = new IvParameterSpec(biv2); // Noncompliant + + final byte[] biv3 = new byte[16]; + ivBuffer.get(biv3, 0, 16); + IvParameterSpec iv3 = new IvParameterSpec(biv3); // Compliant + + final byte[] biv4 = new byte[16]; + ivBuffer.get(256, biv4); + IvParameterSpec iv4 = new IvParameterSpec(biv4); // Compliant + + final byte[] biv5 = new byte[16]; + ivBuffer.get(256, biv5, 0, 16); + IvParameterSpec iv5 = new IvParameterSpec(biv5); // Compliant + } + + static void byteBufferNotUsedAsIv(ByteBuffer ivBuffer) { + final byte[] biv = new byte[16]; + final byte[] other = new byte[16]; + ivBuffer.get(other); + IvParameterSpec iv = new IvParameterSpec(biv); // Noncompliant + } + } interface CipherBlockChainingCheckI { diff --git a/java-checks-test-sources/src/main/java/checks/security/EncryptionAlgorithmCheck.java b/java-checks-test-sources/src/main/java/checks/security/EncryptionAlgorithmCheck.java index 054d4a2358e..94cdfd7e383 100644 --- a/java-checks-test-sources/src/main/java/checks/security/EncryptionAlgorithmCheck.java +++ b/java-checks-test-sources/src/main/java/checks/security/EncryptionAlgorithmCheck.java @@ -13,39 +13,39 @@ abstract class EncryptionAlgorithmCheck { public void foo(java.util.Properties props) { /* should complain: - - everytime ECB mode is used whatever the encryption algorithm + - everytime ECB mode is used - By default without specifying operation mode ECB is chosen - - when CBC mode is used with PKCS5Padding or PKCS7Padding + - when CBC mode is used with padding different from "NoPadding" - when RSA is used without OAEPWithSHA-1AndMGF1Padding or OAEPWITHSHA-256ANDMGF1PADDING padding scheme */ try { // First case - Cipher.getInstance("AES"); // Noncompliant [[sc=26;ec=31]] {{Use secure mode and padding scheme.}} + Cipher.getInstance("AES"); // Noncompliant [[sc=26;ec=31]] {{Use a secure padding scheme.}} - Cipher.getInstance("AES/ECB/NoPadding"); // Noncompliant + Cipher.getInstance("AES/ECB/NoPadding"); // Noncompliant {{Use a secure cipher mode.}} Cipher.getInstance("AES" + "/ECB/NoPadding"); // Noncompliant Cipher.getInstance("AES/ECB/NoPadding", getProvider()); // Noncompliant Cipher.getInstance("AES/ECB/NoPadding", "someProvider"); // Noncompliant - Cipher.getInstance("Blowfish/ECB/PKCS5Padding"); // Noncompliant + Cipher.getInstance("Blowfish/ECB/PKCS5Padding"); // Noncompliant {{Use a secure cipher mode.}} Cipher.getInstance("DES/ECB/PKCS5Padding"); // Noncompliant Cipher.getInstance("AES/GCM/NoPadding"); // Compliant // Second case - Cipher.getInstance("AES/CBC/PKCS5Padding"); // Compliant - CBC considered as safe - Cipher.getInstance("Blowfish/CBC/PKCS5Padding"); // Compliant - CBC considered as safe - Cipher.getInstance("DES/CBC/PKCS5Padding"); // Compliant - CBC considered as safe - Cipher.getInstance("AES/CBC/PKCS7Padding"); // Compliant - CBC considered as safe - Cipher.getInstance("Blowfish/CBC/PKCS7Padding"); // Compliant - CBC considered as safe - Cipher.getInstance("DES/CBC/PKCS7Padding"); // Compliant - CBC considered as safe - Cipher.getInstance("DES/CBC/NoPadding"); // Compliant - CBC considered as safe + Cipher.getInstance("AES/CBC/PKCS5Padding"); // Noncompliant {{Use another cipher mode or disable padding.}} + Cipher.getInstance("Blowfish/CBC/PKCS5Padding"); // Noncompliant + Cipher.getInstance("DES/CBC/PKCS5Padding"); // Noncompliant + Cipher.getInstance("AES/CBC/PKCS7Padding"); // Noncompliant + Cipher.getInstance("Blowfish/CBC/PKCS7Padding"); // Noncompliant + Cipher.getInstance("DES/CBC/PKCS7Padding"); // Noncompliant + Cipher.getInstance("DES/CBC/NoPadding"); // Compliant Cipher.getInstance("AES/GCM/NoPadding"); // Compliant Cipher.getInstance("Blowfish/GCM/NoPadding"); // Compliant // Third case - Cipher.getInstance("RSA/NONE/NoPadding"); // Noncompliant + Cipher.getInstance("RSA/NONE/NoPadding"); // Noncompliant {{Use a secure padding scheme.}} Cipher.getInstance("RSA/GCM/NoPadding"); // Noncompliant Cipher.getInstance("RSA/ECB/NoPadding"); // Noncompliant @@ -78,6 +78,7 @@ public void foo(java.util.Properties props) { Cipher.getInstance("DES/CBC/NOPADDING"); // Compliant Cipher.getInstance("RSA/NONE/OAEPWITHSHA-1AndMGF1Padding"); // Compliant String algoUpperCase = props.getProperty("myAlgo", "AES/ECB/PKCS5PADDING"); + Cipher.getInstance(algoUpperCase); // Noncompliant [[sc=26;ec=39;secondary=80]] } catch (Exception e) { } diff --git a/java-checks-test-sources/src/main/java/checks/security/HardCodedCredentialsShouldNotBeUsedCheck.java b/java-checks-test-sources/src/main/java/checks/security/HardCodedCredentialsShouldNotBeUsedCheck.java new file mode 100644 index 00000000000..acec8260f5a --- /dev/null +++ b/java-checks-test-sources/src/main/java/checks/security/HardCodedCredentialsShouldNotBeUsedCheck.java @@ -0,0 +1,238 @@ +package checks.security; + + +import com.azure.security.keyvault.secrets.SecretClient; +import com.azure.security.keyvault.secrets.models.KeyVaultSecret; +import com.google.api.client.json.Json; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; +import java.util.Locale; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import org.h2.security.SHA256; +import org.springframework.security.crypto.encrypt.Encryptors; +import org.springframework.security.crypto.password.Pbkdf2PasswordEncoder; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; +import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest; +import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse; + +import static java.lang.System.getProperty; + +public class HardCodedCredentialsShouldNotBeUsedCheck { + static final String FINAL_SECRET_STRING = "hunter2"; + static final byte[] FINAL_SECRET_BYTE_ARRAY = FINAL_SECRET_STRING.getBytes(StandardCharsets.UTF_8); + private static String secretStringField = "hunter2"; + private static byte[] secretByteArrayField = new byte[]{0xC, 0xA, 0xF, 0xE}; + private static char[] secretCharArrayField = new char[]{0xC, 0xA, 0xF, 0xE}; + private static CharSequence secretCharSequenceField = "Hello, World!".subSequence(0, 12); + + public static void nonCompliant(byte[] message, boolean condition, Charset encoding) throws ServletException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, UnsupportedEncodingException { + String effectivelyConstantString = "s3cr37"; + byte[] key = effectivelyConstantString.getBytes(); + + // byte array based + SHA256.getHMAC(FINAL_SECRET_BYTE_ARRAY, message); // Noncompliant [[sc=20;ec=43;secondary=-11,-12]] {{Revoke and change this password, as it is compromised.}} + SHA256.getHMAC(key, message); // Noncompliant [[sc=20;ec=23;secondary=-4,-5]] + SHA256.getHMAC(effectivelyConstantString.getBytes(), message); // Noncompliant + SHA256.getHMAC("anotherS3cr37".getBytes(), message); // Noncompliant + SHA256.getHMAC(FINAL_SECRET_STRING.getBytes(), message); // Noncompliant + SHA256.getHMAC(FINAL_SECRET_STRING.getBytes(StandardCharsets.UTF_8), message); // Noncompliant + SHA256.getHMAC(FINAL_SECRET_STRING.getBytes("UTF-8"), message); // Noncompliant + SHA256.getHMAC((FINAL_SECRET_STRING).getBytes("UTF-8"), message); // Noncompliant + SHA256.getHMAC(new byte[]{(byte) 0xC, (byte) 0xA, (byte) 0xF, (byte) 0xE}, message); // Noncompliant + + // String based + HttpServletRequest request = new HttpServletRequestWrapper(null); + request.login("user", "password"); // Noncompliant + request.login("user", effectivelyConstantString); // Noncompliant [[sc=27;ec=52;secondary=39]] + request.login("user", FINAL_SECRET_STRING); // Noncompliant [[sc=27;ec=46;secondary=31]] + String plainTextSecret = new String("BOOM"); + request.login("user", plainTextSecret); // Noncompliant + request.login("user", new String("secret")); // Noncompliant + request.login("user", new String(FINAL_SECRET_BYTE_ARRAY, 0, 7)); // Noncompliant + request.login("user", new String(FINAL_SECRET_BYTE_ARRAY, encoding)); // Noncompliant + String conditionalButPredictable = condition ? FINAL_SECRET_STRING : plainTextSecret; + request.login("user", conditionalButPredictable); // Noncompliant [[sc=27;ec=52;secondary=31,-6,-1]] + request.login("user", Json.MEDIA_TYPE); // Noncompliant [[sc=27;ec=42]] + String concatenatedPassword = "abc" + true + ":" + 12 + ":" + 43L + ":" + 'a' + ":" + 0.2f + ":" + 0.2d; + request.login("user", concatenatedPassword); // Noncompliant [[sc=27;ec=47;secondary=-1]] + + KeyStore store = KeyStore.getInstance(null); + + store.getKey("", new char[]{0xC, 0xA, 0xF, 0xE}); // Noncompliant + + char[] password = new char[]{0xC, 0xA, 0xF, 0xE}; + store.getKey("", password); // Noncompliant [[sc=22;ec=30;secondary=-1]] + + String passwordAsString = "hunter2"; + store.getKey("", passwordAsString.toCharArray()); // Noncompliant [[sc=22;ec=52]] + + char[] reassignedArray; + reassignedArray = new char[]{'a', 'b', 'c', 'd', 'e', 'f'}; + reassignedArray = new char[]{'a', 'b', 'c', 'd', 'e', 'f'}; + store.getKey("", reassignedArray); // Noncompliant [[sc=22;ec=37;secondary=-3]] + + Encryptors.delux(effectivelyConstantString.subSequence(0, effectivelyConstantString.length()), effectivelyConstantString); // Noncompliant [[sc=22;ec=98]] + Encryptors.delux("password".subSequence(0, 0), "salt"); // Noncompliant + + new Pbkdf2PasswordEncoder("secret"); // Noncompliant + new Pbkdf2PasswordEncoder(("secret")); // Noncompliant + + String notInitialized; + notInitialized = "abc"; + new Pbkdf2PasswordEncoder(notInitialized); // Noncompliant + + String longString = "abcdefghiklmnop"; + new Pbkdf2PasswordEncoder(longString.substring(2)); // Noncompliant + new Pbkdf2PasswordEncoder(longString.substring(0, 2)); // Noncompliant + new Pbkdf2PasswordEncoder(longString.trim()); // Noncompliant + new Pbkdf2PasswordEncoder(longString.strip()); // Noncompliant + new Pbkdf2PasswordEncoder(longString.stripIndent()); // Noncompliant + new Pbkdf2PasswordEncoder(longString.stripLeading()); // Noncompliant + new Pbkdf2PasswordEncoder(longString.stripTrailing()); // Noncompliant + new Pbkdf2PasswordEncoder(longString.translateEscapes()); // Noncompliant + new Pbkdf2PasswordEncoder(longString.intern()); // Noncompliant + new Pbkdf2PasswordEncoder(longString.toLowerCase()); // Noncompliant + new Pbkdf2PasswordEncoder(longString.toLowerCase(Locale.ROOT)); // Noncompliant + new Pbkdf2PasswordEncoder(longString.toUpperCase()); // Noncompliant + new Pbkdf2PasswordEncoder(longString.toUpperCase(Locale.ROOT)); // Noncompliant + new Pbkdf2PasswordEncoder(longString.toString()); // Noncompliant + + Object stringAsObject = "abc"; + new Pbkdf2PasswordEncoder(stringAsObject.toString()); // Noncompliant + + java.util.function.Consumer lambda = (arg) -> { + new Pbkdf2PasswordEncoder(arg); + String variableWithNullOwner = "abc"; + new Pbkdf2PasswordEncoder(variableWithNullOwner); // Noncompliant + }; + } + + public static void compliant(String message, String secretParameter, byte[] secretByteArrayParameter, char[] secretCharArrayParameter, CharSequence charSequenceParameter, char character) + throws ServletException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException { + final byte[] messageAsBytes = message.getBytes(StandardCharsets.UTF_8); + String secretReassginedVariable = "s3cr37"; + secretReassginedVariable = "very" + secretReassginedVariable; + byte[] secretReassignedAsBytesVariable = secretReassginedVariable.getBytes(StandardCharsets.UTF_8); + secretReassignedAsBytesVariable = message.getBytes(StandardCharsets.UTF_8); + + SHA256.getHMAC(secretByteArrayParameter, messageAsBytes); // compliant because we do not check parameters + SHA256.getHMAC(secretReassignedAsBytesVariable, messageAsBytes); // compliant because we do not check reassigned variables + SHA256.getHMAC(secretByteArrayField, messageAsBytes); // compliant because we do not check non-final fields + SHA256.getHMAC(convertToByteArray(secretParameter), messageAsBytes); // compliant because we do not check calls to methods defined out of String + SHA256.getHMAC(new byte[1], messageAsBytes); // compliant FN + SHA256.getHMAC(new byte[]{(byte) 0xC, (byte) 0xA, (byte) 0xF, (byte) character}, messageAsBytes); // Compliant + SHA256.getHMAC(Thread.currentThread().getName().getBytes(), messageAsBytes); // compliant + + HttpServletRequest request = new HttpServletRequestWrapper(null); + request.login("user", secretParameter); // compliant because we do not check parameters + request.login("user", secretStringField); // compliant because we do not check non-final fields + request.login("user", getAString()); // compliant + request.login("user", new String()); // compliant + request.login("user", getProperty("hope")); // compliant + request.login("user", ""); // compliant + String concatenatedPassword = "abc" + secretParameter; + request.login("user", concatenatedPassword); // compliant + request.login("user", concatenatedPassword + "abc"); // compliant + request.login("user", "abc" + concatenatedPassword); // compliant + final String emptyString = ""; + request.login("user", emptyString); // compliant + String[] allPasswords = { "abc" }; + request.login("user", allPasswords[0]); // false-negative, limitation, we don't follow values at each index of the array + request.login("user", new Object().toString()); // compliant + + KeyStore store = KeyStore.getInstance(null); + store.getKey("", secretCharArrayParameter); // compliant because we do not check parameters + store.getKey("", secretCharArrayField); // compliant because we do not check non-final fields + store.getKey("", convertToCharArray(secretParameter)); // compliant because we do not check calls to methods defined out of String + store.getKey("", new char[0]); // compliant because we don't consider empty arrays + + Encryptors.delux(charSequenceParameter, "salt"); // compliant because we do not check parameters + Encryptors.delux(secretCharSequenceField, "salt"); // compliant because we do not check non-final fields + Encryptors.delux(convertToCharSequence("password"), "salt"); // compliant because we do not check calls to methods defined out of String + + CharSequence stringHiddenInACharSequence = "abc"; + // method matcher doesn't resolve the "String" runtime type but only the CharSequence type + Encryptors.delux(stringHiddenInACharSequence.subSequence(0, 3), "salt"); // compliant, false-negative, CharSequence could be mutable like a StringBuilder + + StringBuilder constantStringBuilder = new StringBuilder(3); + constantStringBuilder.append("abc"); // limitation, we don't analyze all "append(...)" of mutable object + Encryptors.delux(constantStringBuilder, "salt"); // compliant, false-negative, mutable object are not supported + + StringBuilder nonConstantStringBuilder = new StringBuilder(3); + nonConstantStringBuilder.append(secretParameter); + Encryptors.delux(nonConstantStringBuilder, "salt"); // compliant + } + + public static void compliantAzure(SecretClient secretClient, String secretName, byte[] message) { + KeyVaultSecret retrievedSecret = secretClient.getSecret(secretName); + String secret = retrievedSecret.getValue(); + + byte[] key = secret.getBytes(); + SHA256.getHMAC(key, message); + } + + public static void compliantAws(SecretsManagerClient secretsClient, String secretName, byte[] message) { + GetSecretValueRequest valueRequest = GetSecretValueRequest.builder() + .secretId(secretName) + .build(); + + GetSecretValueResponse valueResponse = secretsClient.getSecretValue(valueRequest); + String secret = valueResponse.secretString(); + + byte[] key = secret.getBytes(); + SHA256.getHMAC(key, message); + } + + public static void compliantFromEnvironment(KeyStore keyStore, InputStream in, String parameter) throws CertificateException, IOException, NoSuchAlgorithmException { + String defaultKeyStorePassword = getProperty("MY_SECRET"); + + char[] passwd = defaultKeyStorePassword.toCharArray(); + keyStore.load(in, passwd); // Compliant, we should not raise when the password is recovered from an external source + + String withDefault = getProperty("MY_SECRET", "DEFAULT"); + char[] passwdWithDefaultFallback = withDefault.toCharArray(); + keyStore.load(in, passwdWithDefaultFallback); // Compliant, we should not raise when the password is recovered from an external source + + char[] conditionalPasswd = parameter == null ? defaultKeyStorePassword.toCharArray() : parameter.toCharArray(); + keyStore.load(in, conditionalPasswd); // Compliant, we should not raise when the password is recovered from a conditional + } + + public static void nonCompliantFromNewObject(String parameterSecret) throws ServletException { + // String based + HttpServletRequest request = new HttpServletRequestWrapper(null); + String secret = new String(parameterSecret); + request.login("user", secret); // Compliant + } + + private static byte[] convertToByteArray(final String string) { + return string.getBytes(StandardCharsets.UTF_8); + } + + private static char[] convertToCharArray(final String string) { + return string.toCharArray(); + } + + private static CharSequence convertToCharSequence(final String string) { + return string; + } + + private static String getAString() { + return "secret"; + } + + void fun() { + char[] chars = "testme".toCharArray(); + byte[] bytes = String.valueOf(chars).getBytes(StandardCharsets.UTF_8); + SHA256.getHMAC(bytes, bytes); // Noncompliant + } +} diff --git a/java-checks-test-sources/src/main/java/checks/spring/s4605/componentScan/ComponentScan.java b/java-checks-test-sources/src/main/java/checks/spring/s4605/componentScan/ComponentScan.java index 0df3db9df6e..665c76b6858 100644 --- a/java-checks-test-sources/src/main/java/checks/spring/s4605/componentScan/ComponentScan.java +++ b/java-checks-test-sources/src/main/java/checks/spring/s4605/componentScan/ComponentScan.java @@ -37,7 +37,7 @@ class Foo7 { } @Component -class Bar1 { } // Noncompliant [[sc=7;ec=11]] {{'Bar1' is not reachable by @ComponentsScan or @SpringBootApplication. Either move it to a package configured in @ComponentsScan or update your @ComponentsScan configuration.}} +class Bar1 { } // Noncompliant [[sc=7;ec=11]] {{'Bar1' is not reachable by @ComponentScan or @SpringBootApplication. Either move it to a package configured in @ComponentScan or update your @ComponentScan configuration.}} @Service class Bar2 { } // Noncompliant diff --git a/java-checks-test-sources/src/main/java/checks/spring/s4605/componentScan/packageC/ComponentC.java b/java-checks-test-sources/src/main/java/checks/spring/s4605/componentScan/packageC/ComponentC.java index 4a5be131006..cecf88cdb75 100644 --- a/java-checks-test-sources/src/main/java/checks/spring/s4605/componentScan/packageC/ComponentC.java +++ b/java-checks-test-sources/src/main/java/checks/spring/s4605/componentScan/packageC/ComponentC.java @@ -7,7 +7,7 @@ import org.springframework.web.bind.annotation.RestController; @Component -class ComponentC {} // Noncompliant [[sc=7;ec=17]] {{'ComponentC' is not reachable by @ComponentsScan or @SpringBootApplication. Either move it to a package configured in @ComponentsScan or update your @ComponentsScan configuration.}} +class ComponentC {} // Noncompliant [[sc=7;ec=17]] {{'ComponentC' is not reachable by @ComponentScan or @SpringBootApplication. Either move it to a package configured in @ComponentScan or update your @ComponentScan configuration.}} @Service class ComponentD {} // Noncompliant diff --git a/java-checks-test-sources/src/main/java/checks/spring/s4605/springBootApplication/Ko/Ko.java b/java-checks-test-sources/src/main/java/checks/spring/s4605/springBootApplication/Ko/Ko.java index 3649a1d56b6..5c0400e5ba9 100644 --- a/java-checks-test-sources/src/main/java/checks/spring/s4605/springBootApplication/Ko/Ko.java +++ b/java-checks-test-sources/src/main/java/checks/spring/s4605/springBootApplication/Ko/Ko.java @@ -6,7 +6,7 @@ // Different from root package hierarchy @Component -class Ko1 {} // Noncompliant [[sc=7;ec=10]] {{'Ko1' is not reachable by @ComponentsScan or @SpringBootApplication. Either move it to a package configured in @ComponentsScan or update your @ComponentsScan configuration.}} +class Ko1 {} // Noncompliant [[sc=7;ec=10]] {{'Ko1' is not reachable by @ComponentScan or @SpringBootApplication. Either move it to a package configured in @ComponentScan or update your @ComponentScan configuration.}} @Service class Ko2 {} // Noncompliant diff --git a/java-checks-test-sources/src/main/java/checks/spring/s4605/springBootApplication/fourthApp/controller/Controller.java b/java-checks-test-sources/src/main/java/checks/spring/s4605/springBootApplication/fourthApp/controller/Controller.java index e523a7a811c..63098a26125 100644 --- a/java-checks-test-sources/src/main/java/checks/spring/s4605/springBootApplication/fourthApp/controller/Controller.java +++ b/java-checks-test-sources/src/main/java/checks/spring/s4605/springBootApplication/fourthApp/controller/Controller.java @@ -3,4 +3,4 @@ import org.springframework.web.bind.annotation.RestController; @RestController -public class Controller { } // Noncompliant [[sc=14;ec=24]] {{'Controller' is not reachable by @ComponentsScan or @SpringBootApplication. Either move it to a package configured in @ComponentsScan or update your @ComponentsScan configuration.}} +public class Controller { } // Noncompliant [[sc=14;ec=24]] {{'Controller' is not reachable by @ComponentScan or @SpringBootApplication. Either move it to a package configured in @ComponentScan or update your @ComponentScan configuration.}} diff --git a/java-checks-test-sources/src/main/java/checks/spring/s4605/springBootApplication/thirdApp/controller/Controller.java b/java-checks-test-sources/src/main/java/checks/spring/s4605/springBootApplication/thirdApp/controller/Controller.java index 6f6bf9b023d..ceaf9104b11 100644 --- a/java-checks-test-sources/src/main/java/checks/spring/s4605/springBootApplication/thirdApp/controller/Controller.java +++ b/java-checks-test-sources/src/main/java/checks/spring/s4605/springBootApplication/thirdApp/controller/Controller.java @@ -3,4 +3,4 @@ import org.springframework.web.bind.annotation.RestController; @RestController -public class Controller { } // Noncompliant [[sc=14;ec=24]] {{'Controller' is not reachable by @ComponentsScan or @SpringBootApplication. Either move it to a package configured in @ComponentsScan or update your @ComponentsScan configuration.}} +public class Controller { } // Noncompliant [[sc=14;ec=24]] {{'Controller' is not reachable by @ComponentScan or @SpringBootApplication. Either move it to a package configured in @ComponentScan or update your @ComponentScan configuration.}} diff --git a/java-checks-test-sources/src/main/java/symbolicexecution/behaviorcache/CommonsLang2ArrayUtilsMethods.java b/java-checks-test-sources/src/main/java/symbolicexecution/behaviorcache/CommonsLang2ArrayUtilsMethods.java new file mode 100644 index 00000000000..bfc57cd7d81 --- /dev/null +++ b/java-checks-test-sources/src/main/java/symbolicexecution/behaviorcache/CommonsLang2ArrayUtilsMethods.java @@ -0,0 +1,23 @@ +package symbolicexecution.behaviorcache; + +import javax.annotation.Nullable; +import org.apache.commons.lang.ArrayUtils; + +class StringArrayMethodsLang2 { + void isEmpty(@Nullable int[] params) { + if (!ArrayUtils.isEmpty(params)) { + params[0] = 1; // params is not null + } + } + + void isNotEmpty(@Nullable int[] params) { + if (ArrayUtils.isNotEmpty(params)) { + params[0] = 1; // params is not null + } + } + + int getLength(@Nullable int[] params) { + int length = ArrayUtils.getLength(params); + return 42 / length; // FIXME SONARJAVA-4286: FN S3518 (div by zero) + } +} diff --git a/java-checks-test-sources/src/main/java/symbolicexecution/behaviorcache/CommonsLang3ArrayUtilsMethods.java b/java-checks-test-sources/src/main/java/symbolicexecution/behaviorcache/CommonsLang3ArrayUtilsMethods.java new file mode 100644 index 00000000000..d724bdd3e49 --- /dev/null +++ b/java-checks-test-sources/src/main/java/symbolicexecution/behaviorcache/CommonsLang3ArrayUtilsMethods.java @@ -0,0 +1,24 @@ +package symbolicexecution.behaviorcache; + +import javax.annotation.Nullable; +import org.apache.commons.lang3.ArrayUtils; + +class StringArrayMethodsLang3 { + void isEmpty(@Nullable int[] params) { + if (!ArrayUtils.isEmpty(params)) { + params[0] = 1; // params is not null + } + } + + void isNotEmpty(@Nullable int[] params) { + if (ArrayUtils.isNotEmpty(params)) { + params[0] = 1; // params is not null + } + } + + int getLength(@Nullable int[] params) { + int length = ArrayUtils.getLength(params); + return 42 / length; // FIXME SONARJAVA-4286: FN S3518 (div by zero) + } + +} diff --git a/java-checks-test-sources/src/main/java/symbolicexecution/behaviorcache/SpringStringUtilsMethods.java b/java-checks-test-sources/src/main/java/symbolicexecution/behaviorcache/SpringStringUtilsMethods.java new file mode 100644 index 00000000000..fc99914a70e --- /dev/null +++ b/java-checks-test-sources/src/main/java/symbolicexecution/behaviorcache/SpringStringUtilsMethods.java @@ -0,0 +1,48 @@ +package symbolicexecution.behaviorcache; + +import org.springframework.util.StringUtils; + +class SpringStringUtilsMethods { + String test_isEmpty() { + String fileName = null; + if (!StringUtils.isEmpty(fileName)) { + return fileName.substring(1); + } + return fileName; + } + + String test_string_hasLength() { + String fileName = null; + if (StringUtils.hasLength(fileName)) { + return fileName.substring(1); + } + return fileName; + } + + CharSequence test_chars_hasLength() { + CharSequence fileName = null; + if (StringUtils.hasLength(fileName)) { + return fileName.subSequence(0, 2); + } + return fileName; + } + + String test_string_hasText() { + String fileName = null; + if (StringUtils.hasText(fileName)) { + return fileName.substring(1); + } + return fileName; + } + + CharSequence test_chars_hasText() { + CharSequence fileName = null; + if (StringUtils.hasText(fileName)) { + return fileName.subSequence(0, 2); + } + return fileName; + } +} + + + diff --git a/java-checks-test-sources/src/main/java/symbolicexecution/checks/NonNullSetToNullCheck/noDefault/NonNullSetToNullCheck.java b/java-checks-test-sources/src/main/java/symbolicexecution/checks/NonNullSetToNullCheck/noDefault/NonNullSetToNullCheck.java index 54d07346508..3bbca110cb6 100644 --- a/java-checks-test-sources/src/main/java/symbolicexecution/checks/NonNullSetToNullCheck/noDefault/NonNullSetToNullCheck.java +++ b/java-checks-test-sources/src/main/java/symbolicexecution/checks/NonNullSetToNullCheck/noDefault/NonNullSetToNullCheck.java @@ -531,3 +531,9 @@ Object shouldNotReturnNull(Object o) { } } +record TestSonar(@Nonnull String arg1, String arg2, String arg3, String arg4, long arg5, String arg6) { + public TestSonar {} + public static void f() { + new TestSonar(null, null, null, null, 0L, null); // Noncompliant + } +} diff --git a/java-checks-test-sources/src/main/java/symbolicexecution/checks/NullFromBooleanValueCall.java b/java-checks-test-sources/src/main/java/symbolicexecution/checks/NullFromBooleanValueCall.java new file mode 100644 index 00000000000..1668b1a8703 --- /dev/null +++ b/java-checks-test-sources/src/main/java/symbolicexecution/checks/NullFromBooleanValueCall.java @@ -0,0 +1,25 @@ +package symbolicexecution.checks; + + +class NullFromBooleanValueCall { + private static void f(String nullableValue) { + Boolean isValid = true; + if (nullableValue == null) { + isValid = false; + } + if (isValid.booleanValue()) { + System.out.println(nullableValue.toLowerCase()); + } + } + + private static void g(String nullableValue) { + if (getIsValid().booleanValue()) { + System.out.println(nullableValue.toLowerCase()); + } + } + + private static Boolean getIsValid() { + Boolean isValid = false; + return isValid; + } +} diff --git a/java-checks-test-sources/src/main/java/symbolicexecution/checks/NullableInheritance.java b/java-checks-test-sources/src/main/java/symbolicexecution/checks/NullableInheritance.java new file mode 100644 index 00000000000..d18494cb310 --- /dev/null +++ b/java-checks-test-sources/src/main/java/symbolicexecution/checks/NullableInheritance.java @@ -0,0 +1,94 @@ +package symbolicexecution.checks; + +import org.eclipse.jdt.annotation.NonNull; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.lang.Nullable; + +public class NullableInheritance { + + public Long jdbcTemplate() { + // Method "org.springframework.jdbc.core.JdbcTemplate.queryForObject(String, Class, Object...)" + // In spring-jdbc < 5.0.0: Not annotated as Nullable but described as nullable in javadoc + // In spring-jdbc >= 5.0.0: super-implementation (defined in interface org.springframework.jdbc.core.JdbcOperations), annotated with spring's @Nullable + final Long a = new JdbcTemplate().queryForObject("a_query", Long.class, new Object[1]); + return a == null ? Long.MIN_VALUE : a.longValue(); // Compliant - no issue; null-check is required + } + + private class MultipleLevelOfInheritance { + interface ILevel1 { + @Nullable + Object m(); + } + + interface ILevel2 extends ILevel1 { + Object m(); + } + + @org.eclipse.jdt.annotation.NonNullByDefault + class C implements ILevel2 { + @Override + public Object m() { // No @Nullable annotation, but should be considered inherited from ILevel1 + return null; + } + } + + class Foo { + int foo() { + C c = new C(); + Object o = c.m(); + return o == null ? -1 : 42; // Compliant - here the null-check is mandatory + } + } + } + + private class NoDataFromOwnership { + interface ILevel1 { + @NonNull + Object m(); + } + + interface ILevel2 extends ILevel1 { + Object m(); + } + + class C implements ILevel2 { + @Override + public Object m() { // No @NonNull annotation, but should be considered inherited from ILevel1 + return null; + } + } + + class Foo { + int foo() { + C c = new C(); + Object o = c.m(); + return o == null ? -1 : 42; // Noncompliant + } + } + } + + private class NoAnnotationAtAll { + interface ILevel1 { + Object m(); + } + + interface ILevel2 extends ILevel1 { + Object m(); + } + + class C implements ILevel2 { + @Override + public Object m() { + return null; + } + } + + class Foo { + int foo() { + C c = new C(); + Object o = c.m(); + return o == null ? -1 : 42; // Compliant + } + } + } +} diff --git a/java-checks-test-sources/src/main/java/symbolicexecution/checks/OptionalGetBeforeIsPresentCheck_ofNullable.java b/java-checks-test-sources/src/main/java/symbolicexecution/checks/OptionalGetBeforeIsPresentCheck_ofNullable.java new file mode 100644 index 00000000000..36d0f2052f1 --- /dev/null +++ b/java-checks-test-sources/src/main/java/symbolicexecution/checks/OptionalGetBeforeIsPresentCheck_ofNullable.java @@ -0,0 +1,18 @@ +package symbolicexecution.checks; + +import java.util.HashMap; +import java.util.Map; + +import static java.util.Optional.ofNullable; + +class Optionable { + private static String getHeader(Map headers) { + return ofNullable(headers) + .orElse(new HashMap<>()) + .get("Some header"); + } + + void main() { + getHeader(null); // Compliant + } +} diff --git a/java-checks-test-sources/src/main/java/symbolicexecution/checks/S3958_StreamNotConsumedCheck.java b/java-checks-test-sources/src/main/java/symbolicexecution/checks/S3958_StreamNotConsumedCheck.java index 4217dd4426f..7059db6d4e3 100644 --- a/java-checks-test-sources/src/main/java/symbolicexecution/checks/S3958_StreamNotConsumedCheck.java +++ b/java-checks-test-sources/src/main/java/symbolicexecution/checks/S3958_StreamNotConsumedCheck.java @@ -1,5 +1,6 @@ package symbolicexecution.checks; +import java.util.function.DoubleBinaryOperator; import java.util.stream.*; import java.util.List; @@ -155,3 +156,15 @@ public StreamParamInConstructor(IntStream stream) { } } } + +class S3958_A { + void foo(java.util.stream.Stream stream, Object identity, DoubleBinaryOperator op) { + try { + stream // Noncompliant + .mapToDouble(Number::doubleValue) + .reduce(((Number) identity).doubleValue(), op); + } catch (ClassCastException x) { // Compliant - we should raise the issue on line 163, not here (SONARJAVA-3529) + System.out.println("foo"); + } + } +} diff --git a/java-checks-testkit/pom.xml b/java-checks-testkit/pom.xml index 153cd35ebc4..9bd0ff0970b 100644 --- a/java-checks-testkit/pom.xml +++ b/java-checks-testkit/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.java java - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT java-checks-testkit @@ -19,7 +19,7 @@ ${project.version} - org.sonarsource.sonarqube + org.sonarsource.api.plugin sonar-plugin-api provided diff --git a/java-checks-testkit/src/main/java/org/sonar/java/checks/verifier/internal/Expectations.java b/java-checks-testkit/src/main/java/org/sonar/java/checks/verifier/internal/Expectations.java index 1c3d705326f..d7ee01a4324 100644 --- a/java-checks-testkit/src/main/java/org/sonar/java/checks/verifier/internal/Expectations.java +++ b/java-checks-testkit/src/main/java/org/sonar/java/checks/verifier/internal/Expectations.java @@ -55,10 +55,8 @@ import org.apache.commons.lang3.StringUtils; import org.sonar.api.utils.AnnotationUtils; import org.sonar.check.Rule; -import org.sonar.java.RspecKey; import org.sonar.java.annotations.VisibleForTesting; import org.sonar.java.checks.verifier.CheckVerifier; -import org.sonarsource.analyzer.commons.collections.MapBuilder; import org.sonar.java.reporting.AnalyzerMessage; import org.sonar.java.reporting.JavaQuickFix; import org.sonar.java.reporting.JavaTextEdit; @@ -66,6 +64,7 @@ import org.sonar.plugins.java.api.JavaFileScannerContext; import org.sonar.plugins.java.api.tree.SyntaxTrivia; import org.sonar.plugins.java.api.tree.Tree; +import org.sonarsource.analyzer.commons.collections.MapBuilder; import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.toList; @@ -760,19 +759,12 @@ private static RuleJSON getRuleJSON(String ruleKey) throws IOException { } private static String ruleKey(AnalyzerMessage issue) { - String ruleKey; - RspecKey rspecKeyAnnotation = AnnotationUtils.getAnnotation(issue.getCheck().getClass(), RspecKey.class); - if (rspecKeyAnnotation != null) { - ruleKey = rspecKeyAnnotation.value(); + Rule ruleAnnotation = AnnotationUtils.getAnnotation(issue.getCheck().getClass(), Rule.class); + if (ruleAnnotation != null) { + return ruleAnnotation.key(); } else { - Rule ruleAnnotation = AnnotationUtils.getAnnotation(issue.getCheck().getClass(), Rule.class); - if (ruleAnnotation != null) { - ruleKey = ruleAnnotation.key(); - } else { - throw new AssertionError("Rules should be annotated with '@Rule(key = \"...\")' annotation (org.sonar.check.Rule)."); - } + throw new AssertionError("Rules should be annotated with '@Rule(key = \"...\")' annotation (org.sonar.check.Rule)."); } - return ruleKey; } } diff --git a/java-checks-testkit/src/test/java/org/sonar/java/checks/verifier/internal/InternalCheckVerifierTest.java b/java-checks-testkit/src/test/java/org/sonar/java/checks/verifier/internal/InternalCheckVerifierTest.java index daaf4a81d9c..b872d716803 100644 --- a/java-checks-testkit/src/test/java/org/sonar/java/checks/verifier/internal/InternalCheckVerifierTest.java +++ b/java-checks-testkit/src/test/java/org/sonar/java/checks/verifier/internal/InternalCheckVerifierTest.java @@ -32,8 +32,6 @@ import org.sonar.api.batch.sensor.cache.WriteCache; import org.sonar.check.Rule; import org.sonar.java.AnalysisException; -import org.sonar.plugins.java.api.internal.EndOfAnalysis; -import org.sonar.java.RspecKey; import org.sonar.java.caching.DummyCache; import org.sonar.java.caching.JavaReadCacheImpl; import org.sonar.java.caching.JavaWriteCacheImpl; @@ -49,13 +47,13 @@ import org.sonar.plugins.java.api.caching.CacheContext; import org.sonar.plugins.java.api.caching.JavaReadCache; import org.sonar.plugins.java.api.caching.JavaWriteCache; +import org.sonar.plugins.java.api.internal.EndOfAnalysis; import org.sonar.plugins.java.api.tree.ClassTree; import org.sonar.plugins.java.api.tree.Tree; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.catchThrowable; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; @@ -359,7 +357,7 @@ public void scanFile(JavaFileScannerContext context) { @Test void test_rspec_key_with_no_metadata_should_not_fail() throws Exception { - @RspecKey("Dummy_fake_JSON") + @Rule(key = "Dummy_fake_JSON") class DoesntExistsMetadataCheck implements JavaFileScanner { @Override public void scanFile(JavaFileScannerContext context) { diff --git a/java-checks/pom.xml b/java-checks/pom.xml index 29e5138739c..d0477880a35 100644 --- a/java-checks/pom.xml +++ b/java-checks/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.java java - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT java-checks @@ -14,7 +14,7 @@ - org.sonarsource.sonarqube + org.sonarsource.api.plugin sonar-plugin-api @@ -48,6 +48,10 @@ org.sonarsource.analyzer-commons sonar-analyzer-recognizers + + org.apache.commons + commons-lang3 + org.junit.jupiter diff --git a/java-checks/src/main/java/org/sonar/java/checks/AbstractHardCodedCredentialChecker.java b/java-checks/src/main/java/org/sonar/java/checks/AbstractHardCodedCredentialChecker.java index 84d72ebf6c0..83dda4c8d1e 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/AbstractHardCodedCredentialChecker.java +++ b/java-checks/src/main/java/org/sonar/java/checks/AbstractHardCodedCredentialChecker.java @@ -27,7 +27,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.sonar.java.checks.helpers.ExpressionsHelper; import org.sonar.java.model.LiteralUtils; import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; diff --git a/java-checks/src/main/java/org/sonar/java/checks/AbstractPackageInfoChecker.java b/java-checks/src/main/java/org/sonar/java/checks/AbstractPackageInfoChecker.java index bba21a36e28..50a431f2a12 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/AbstractPackageInfoChecker.java +++ b/java-checks/src/main/java/org/sonar/java/checks/AbstractPackageInfoChecker.java @@ -63,7 +63,7 @@ private void processFileAndCacheIfApplicable(InputFileScannerContext context, @N writePackageNameToCache(context, packageName == null ? "" : packageName); } - if (packageName == null || packageName.equals("")) { + if (packageName == null || packageName.isEmpty()) { // default package return; } diff --git a/java-checks/src/main/java/org/sonar/java/checks/AbstractPrintfChecker.java b/java-checks/src/main/java/org/sonar/java/checks/AbstractPrintfChecker.java index 5a516816abb..e8b589b2a73 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/AbstractPrintfChecker.java +++ b/java-checks/src/main/java/org/sonar/java/checks/AbstractPrintfChecker.java @@ -31,7 +31,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import javax.annotation.Nullable; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.sonar.java.checks.methods.AbstractMethodDetection; import org.sonar.java.model.LiteralUtils; import org.sonar.plugins.java.api.semantic.MethodMatchers; diff --git a/java-checks/src/main/java/org/sonar/java/checks/ArrayForVarArgCheck.java b/java-checks/src/main/java/org/sonar/java/checks/ArrayForVarArgCheck.java index 1764fecc1b3..5d4b98b9bcf 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/ArrayForVarArgCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/ArrayForVarArgCheck.java @@ -76,11 +76,10 @@ private void checkInvokedMethod(Symbol.MethodSymbol methodSymbol, ExpressionTree if (lastParamType.isUnknown() || lastArgType.isUnknown()) { return; } - if (lastArgType.equals(lastParamType)) { + if ("java.lang.Object[]".equals(lastParamType.fullyQualifiedName())) { + reportIssue(lastArg, "Disambiguate this call by either casting as \"Object\" or \"Object[]\"."); + } else if (lastArgType.isSubtypeOf(lastParamType)) { reportIssueForSameType(methodSymbol, (NewArrayTree) lastArg); - } else { - String type = ((Type.ArrayType) lastParamType).elementType().name(); - reportIssue(lastArg, "Disambiguate this call by either casting as \"" + type + "\" or \"" + type + "[]\"."); } } } diff --git a/java-checks/src/main/java/org/sonar/java/checks/BooleanLiteralCheck.java b/java-checks/src/main/java/org/sonar/java/checks/BooleanLiteralCheck.java index c7cdf885bb7..53f4c9d48a0 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/BooleanLiteralCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/BooleanLiteralCheck.java @@ -39,6 +39,7 @@ import org.sonar.plugins.java.api.tree.ExpressionTree; import org.sonar.plugins.java.api.tree.LiteralTree; import org.sonar.plugins.java.api.tree.MethodInvocationTree; +import org.sonar.plugins.java.api.tree.ParenthesizedTree; import org.sonar.plugins.java.api.tree.Tree; import org.sonar.plugins.java.api.tree.Tree.Kind; import org.sonar.plugins.java.api.tree.UnaryExpressionTree; @@ -128,16 +129,15 @@ private static List editsForConditionalExpression(ConditionalExpre if (right != null) { edits = editsForConditionalBothLiterals(tree, left, right); } else { - String operator; if (left) { // cond() ? true : expr --> cond() || expr - operator = "||"; + edits.add(JavaTextEdit.replaceBetweenTree(tree.questionToken(), tree.colonToken(), "||")); } else { // cond() ? false : expr --> !cond() && expr - operator = "&&"; - edits.add(JavaTextEdit.insertBeforeTree(tree.condition(), "!")); + edits.add(JavaTextEdit.replaceBetweenTree(tree.questionToken(), tree.colonToken(), "&&")); + List collection = computeNegatingTextEdits(tree.condition(), true); + edits.addAll(collection); } - edits.add(JavaTextEdit.replaceBetweenTree(tree.questionToken(), tree.colonToken(), operator)); } } else if (right != null) { // Defensive programming, if we reached this point, right must be a boolean literal @@ -156,6 +156,41 @@ private static List editsForConditionalExpression(ConditionalExpre return edits; } + private static List computeNegatingTextEdits(ExpressionTree tree, boolean followedByConjunction) { + List edits = new ArrayList<>(); + + if (tree.is(Kind.PARENTHESIZED_EXPRESSION)) { + ParenthesizedTree expression = (ParenthesizedTree) tree; + edits.addAll(computeNegatingTextEdits(expression.expression(), false)); + } else if (tree.is(Kind.EQUAL_TO)) { + BinaryExpressionTree condition = (BinaryExpressionTree) tree; + edits.add(JavaTextEdit.replaceTree(condition.operatorToken(), "!=")); + } else if (tree.is(Kind.NOT_EQUAL_TO)) { + BinaryExpressionTree condition = (BinaryExpressionTree) tree; + edits.add(JavaTextEdit.replaceTree(condition.operatorToken(), "==")); + } else if (tree.is(Kind.CONDITIONAL_AND)) { + BinaryExpressionTree condition = (BinaryExpressionTree) tree; + if (followedByConjunction) { + edits.add(JavaTextEdit.insertAfterTree(tree, ")")); + } + edits.addAll(computeNegatingTextEdits(condition.rightOperand(), followedByConjunction)); + edits.add(JavaTextEdit.replaceTree(condition.operatorToken(), "||")); + edits.addAll(computeNegatingTextEdits(condition.leftOperand(), false)); + if (followedByConjunction) { + edits.add(JavaTextEdit.insertBeforeTree(tree, "(")); + } + } else if (tree.is(Kind.CONDITIONAL_OR)) { + BinaryExpressionTree condition = (BinaryExpressionTree) tree; + edits.addAll(computeNegatingTextEdits(condition.rightOperand(), followedByConjunction)); + edits.add(JavaTextEdit.replaceTree(condition.operatorToken(), "&&")); + edits.addAll(computeNegatingTextEdits(condition.leftOperand(), true)); + } else { + edits.add(JavaTextEdit.insertBeforeTree(tree, "!")); + } + + return edits; + } + private static List editsForConditionalBothLiterals(ConditionalExpressionTree tree, Boolean left, Boolean right) { List edits = new ArrayList<>(); // Both side are literals. diff --git a/java-checks/src/main/java/org/sonar/java/checks/BoxedBooleanExpressionsCheck.java b/java-checks/src/main/java/org/sonar/java/checks/BoxedBooleanExpressionsCheck.java index 351a9086ad3..0982595327c 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/BoxedBooleanExpressionsCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/BoxedBooleanExpressionsCheck.java @@ -253,7 +253,7 @@ private static boolean isAnnotatedNonnull(MethodInvocationTree mit) { .stream() .map(SymbolMetadata.AnnotationInstance::symbol) .map(Symbol::name) - .anyMatch(name -> name.equalsIgnoreCase("nonNull") || name.equalsIgnoreCase("notNull")); + .anyMatch(name -> "nonNull".equalsIgnoreCase(name) || "notNull".equalsIgnoreCase(name)); } private static List getQuickFix(ExpressionTree tree, ExpressionTree boxedBoolean) { diff --git a/java-checks/src/main/java/org/sonar/java/checks/CORSCheck.java b/java-checks/src/main/java/org/sonar/java/checks/CORSCheck.java index ce191a9d278..33a8b9f09d4 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/CORSCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/CORSCheck.java @@ -131,8 +131,7 @@ private static boolean isStar(ExpressionTree expressionTree) { if (expressionTree.is(Tree.Kind.NEW_ARRAY)) { return ((NewArrayTree) expressionTree).initializers().stream().anyMatch(CORSCheck::isStar); } else { - String value = ExpressionsHelper.getConstantValueAsString(expressionTree).value(); - return value != null && value.equals("*"); + return "*".equals(ExpressionsHelper.getConstantValueAsString(expressionTree).value()); } } diff --git a/java-checks/src/main/java/org/sonar/java/checks/CheckList.java b/java-checks/src/main/java/org/sonar/java/checks/CheckList.java index b105324c893..9aff1f499ee 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/CheckList.java +++ b/java-checks/src/main/java/org/sonar/java/checks/CheckList.java @@ -91,6 +91,7 @@ import org.sonar.java.checks.security.CipherBlockChainingCheck; import org.sonar.java.checks.security.ClearTextProtocolCheck; import org.sonar.java.checks.security.CookieHttpOnlyCheck; +import org.sonar.java.checks.security.HardCodedCredentialsShouldNotBeUsedCheck; import org.sonar.java.checks.security.CryptographicKeySizeCheck; import org.sonar.java.checks.security.DataHashingCheck; import org.sonar.java.checks.security.DebugFeatureEnabledCheck; @@ -303,6 +304,7 @@ public final class CheckList { CatchOfThrowableOrErrorCheck.class, CatchRethrowingCheck.class, ChangeMethodContractCheck.class, + CounterModeIVShouldNotBeReusedCheck.class, ChildClassShadowFieldCheck.class, CipherBlockChainingCheck.class, ClassComparedByNameCheck.class, @@ -339,6 +341,7 @@ public final class CheckList { ControlCharacterInLiteralCheck.class, ControllerWithSessionAttributesCheck.class, CookieHttpOnlyCheck.class, + HardCodedCredentialsShouldNotBeUsedCheck.class, CryptographicKeySizeCheck.class, CustomCryptographicAlgorithmCheck.class, CustomSerializationMethodCheck.class, @@ -661,6 +664,7 @@ public final class CheckList { TooLongLineCheck.class, TooManyLinesOfCodeInFileCheck.class, TooManyMethodsCheck.class, + TooManyParametersCheck.class, TooManyStatementsPerLineCheck.class, TrailingCommentCheck.class, TransactionalMethodVisibilityCheck.class, @@ -735,7 +739,6 @@ public final class CheckList { LambdaTooBigCheck.class, CollectionImplementationReferencedCheck.class, NestedTryCatchCheck.class, - TooManyParametersCheck.class, BadLocalVariableNameCheck.class, StaticMethodCheck.class, AnonymousClassShouldBeLambdaCheck.class, diff --git a/java-checks/src/main/java/org/sonar/java/checks/CognitiveComplexityMethodCheck.java b/java-checks/src/main/java/org/sonar/java/checks/CognitiveComplexityMethodCheck.java index 76536c6063c..e8877708d80 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/CognitiveComplexityMethodCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/CognitiveComplexityMethodCheck.java @@ -22,6 +22,7 @@ import org.sonar.check.Rule; import org.sonar.check.RuleProperty; import org.sonar.java.ast.visitors.CognitiveComplexityVisitor; +import org.sonar.java.checks.helpers.MethodTreeUtils; import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; import org.sonar.plugins.java.api.tree.MethodTree; import org.sonar.plugins.java.api.tree.Tree; @@ -48,6 +49,9 @@ public List nodesToVisit() { @Override public void visitNode(Tree tree) { MethodTree method = (MethodTree) tree; + if (isExcluded(method)) { + return; + } CognitiveComplexityVisitor.Result result = CognitiveComplexityVisitor.methodComplexity(method); int total = result.complexity; if (total > max) { @@ -60,4 +64,7 @@ public void setMax(int max) { this.max = max; } + private static boolean isExcluded(MethodTree methodTree) { + return MethodTreeUtils.isEqualsMethod(methodTree) || MethodTreeUtils.isHashCodeMethod(methodTree); + } } diff --git a/java-checks/src/main/java/org/sonar/java/checks/CommentContainsPatternChecker.java b/java-checks/src/main/java/org/sonar/java/checks/CommentContainsPatternChecker.java index eb710aa0f1a..2970667a14a 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/CommentContainsPatternChecker.java +++ b/java-checks/src/main/java/org/sonar/java/checks/CommentContainsPatternChecker.java @@ -19,7 +19,7 @@ */ package org.sonar.java.checks; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; import org.sonar.plugins.java.api.tree.SyntaxTrivia; diff --git a/java-checks/src/main/java/org/sonar/java/checks/CommentedOutCodeLineCheck.java b/java-checks/src/main/java/org/sonar/java/checks/CommentedOutCodeLineCheck.java index e2525bb88e3..330c3329f45 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/CommentedOutCodeLineCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/CommentedOutCodeLineCheck.java @@ -23,7 +23,7 @@ import java.util.Collections; import java.util.List; import javax.annotation.Nullable; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.sonar.check.Rule; import org.sonar.java.model.DefaultJavaFileScannerContext; import org.sonar.java.reporting.AnalyzerMessage; diff --git a/java-checks/src/main/java/org/sonar/java/checks/CounterModeIVShouldNotBeReusedCheck.java b/java-checks/src/main/java/org/sonar/java/checks/CounterModeIVShouldNotBeReusedCheck.java new file mode 100644 index 00000000000..9d2f8a079f4 --- /dev/null +++ b/java-checks/src/main/java/org/sonar/java/checks/CounterModeIVShouldNotBeReusedCheck.java @@ -0,0 +1,142 @@ +/* + * SonarQube Java + * Copyright (C) 2012-2022 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.java.checks; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import javax.crypto.Cipher; +import org.sonar.check.Rule; +import org.sonar.java.checks.helpers.ExpressionsHelper; +import org.sonar.java.checks.helpers.HardcodedStringExpressionChecker; +import org.sonar.java.model.ExpressionUtils; +import org.sonar.java.model.expression.MemberSelectExpressionTreeImpl; +import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; +import org.sonar.plugins.java.api.JavaFileScannerContext; +import org.sonar.plugins.java.api.semantic.MethodMatchers; +import org.sonar.plugins.java.api.tree.ExpressionTree; +import org.sonar.plugins.java.api.tree.IdentifierTree; +import org.sonar.plugins.java.api.tree.MemberSelectExpressionTree; +import org.sonar.plugins.java.api.tree.MethodInvocationTree; +import org.sonar.plugins.java.api.tree.NewClassTree; +import org.sonar.plugins.java.api.tree.Tree; +import org.sonar.plugins.java.api.tree.Tree.Kind; + +@Rule(key = "S6432") +public class CounterModeIVShouldNotBeReusedCheck extends IssuableSubscriptionVisitor { + + private static final String PRIMARY_LOCATION_ISSUE_MESSAGE = "Use a dynamically-generated initialization vector (IV) to avoid IV-key pair reuse."; + private static final String SECONDARY_LOCATION_ISSUE_MESSAGE = "The static value is defined here."; + + private static final MethodMatchers JCA_CHIPER_INIT_METHODS = MethodMatchers.create() + .ofTypes("javax.crypto.Cipher") + .names("init") + .addParametersMatcher("int", MethodMatchers.ANY, "java.security.spec.AlgorithmParameterSpec") + .build(); + + private static final MethodMatchers BC_CHIPER_INIT_METHODS = MethodMatchers.create() + .ofTypes("org.bouncycastle.crypto.modes.GCMBlockCipher", "org.bouncycastle.crypto.modes.CCMBlockCipher") + .names("init") + .addParametersMatcher("boolean", "org.bouncycastle.crypto.CipherParameters") + .build(); + + private static final MethodMatchers GCM_CONSTRUCTOR = MethodMatchers.create() + .ofTypes("javax.crypto.spec.GCMParameterSpec") + .constructor() + .addParametersMatcher(parameters -> !parameters.isEmpty()) + .build(); + + private static final MethodMatchers AEAD_CONSTRUCTOR = MethodMatchers.create() + .ofTypes("org.bouncycastle.crypto.params.AEADParameters") + .constructor() + .addParametersMatcher(parameters -> !parameters.isEmpty()) + .build(); + + @Override + public List nodesToVisit() { + return Collections.singletonList(Tree.Kind.METHOD_INVOCATION); + } + + @Override + public void visitNode(Tree tree) { + MethodInvocationTree method = (MethodInvocationTree) tree; + var secondaryLocations = new ArrayList(); + + if (isJCAOperationModeEncrypt(method)) { + checkForHardcodedIVInitialization(method, 2, secondaryLocations); + } else if (isBCCipherForEncryption(method)) { + checkForHardcodedIVInitialization(method, 1, secondaryLocations); + } + + } + + private void checkForHardcodedIVInitialization(MethodInvocationTree method, int constructorParamIndex, List secondaryLocations) { + if (checkForJCAHardcodedIVInitialization(method.arguments().get(constructorParamIndex), secondaryLocations)) { + MemberSelectExpressionTree methodSelect = (MemberSelectExpressionTreeImpl) method.methodSelect(); + reportIssue(methodSelect.identifier(), PRIMARY_LOCATION_ISSUE_MESSAGE, secondaryLocations, null); + } + } + + private static boolean isJCAOperationModeEncrypt(MethodInvocationTree method) { + if (JCA_CHIPER_INIT_METHODS.matches(method)) { + Optional value = method.arguments().get(0).asConstant(Integer.class); + return value.isPresent() && value.get() == Cipher.ENCRYPT_MODE; + } + return false; + } + + private static boolean isBCCipherForEncryption(MethodInvocationTree method) { + if (BC_CHIPER_INIT_METHODS.matches(method)) { + Optional value = method.arguments().get(0).asConstant(Boolean.class); + return value.isPresent() && value.get(); + } + return false; + } + + // argument here is going to be a GCMParameterSpec + private static boolean checkForJCAHardcodedIVInitialization(ExpressionTree expression, List secondaryLocations) { + ExpressionTree argument = ExpressionUtils.skipParentheses(expression); + switch (argument.kind()) { + case IDENTIFIER: + List assignments = ExpressionsHelper.getIdentifierAssignments((IdentifierTree) argument); + secondaryLocations.add(new JavaFileScannerContext.Location(SECONDARY_LOCATION_ISSUE_MESSAGE, argument)); + return assignments.stream() + .allMatch(assignment -> checkForJCAHardcodedIVInitialization(assignment, secondaryLocations)); + case NEW_CLASS: + NewClassTree constructor = (NewClassTree) argument; + if (GCM_CONSTRUCTOR.matches(constructor)) { + ExpressionTree arg = constructor.arguments().get(1); + secondaryLocations.add(new JavaFileScannerContext.Location(SECONDARY_LOCATION_ISSUE_MESSAGE, arg)); + return HardcodedStringExpressionChecker.isExpressionDerivedFromPlainText(arg, secondaryLocations, new HashSet<>()); + } else if (AEAD_CONSTRUCTOR.matches(constructor)) { + ExpressionTree arg = constructor.arguments().get(2); + secondaryLocations.add(new JavaFileScannerContext.Location(SECONDARY_LOCATION_ISSUE_MESSAGE, arg)); + return HardcodedStringExpressionChecker.isExpressionDerivedFromPlainText(arg, secondaryLocations, new HashSet<>()); + } + return false; + default: + return false; + } + + } + +} diff --git a/java-checks/src/main/java/org/sonar/java/checks/DateFormatWeekYearCheck.java b/java-checks/src/main/java/org/sonar/java/checks/DateFormatWeekYearCheck.java index ffb23818dff..852fab9567e 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/DateFormatWeekYearCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/DateFormatWeekYearCheck.java @@ -21,7 +21,7 @@ import java.util.Locale; import java.util.Optional; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.sonar.check.Rule; import org.sonar.java.checks.helpers.QuickFixHelper; import org.sonar.java.checks.methods.AbstractMethodDetection; diff --git a/java-checks/src/main/java/org/sonar/java/checks/DateTimeFormatterMismatchCheck.java b/java-checks/src/main/java/org/sonar/java/checks/DateTimeFormatterMismatchCheck.java index 78a2b900053..38bd918841d 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/DateTimeFormatterMismatchCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/DateTimeFormatterMismatchCheck.java @@ -28,7 +28,6 @@ import org.sonar.plugins.java.api.semantic.MethodMatchers; import org.sonar.plugins.java.api.tree.BaseTreeVisitor; import org.sonar.plugins.java.api.tree.ExpressionTree; -import org.sonar.plugins.java.api.tree.IdentifierTree; import org.sonar.plugins.java.api.tree.MemberSelectExpressionTree; import org.sonar.plugins.java.api.tree.MethodInvocationTree; import org.sonar.plugins.java.api.tree.Tree; @@ -160,8 +159,7 @@ private static boolean isChronoFieldWeek(ExpressionTree argument) { if (!select.symbolType().is("java.time.temporal.ChronoField")) { return false; } - IdentifierTree identifier = select.identifier(); - return identifier.name().equals("ALIGNED_WEEK_OF_YEAR"); + return "ALIGNED_WEEK_OF_YEAR".equals(select.identifier().name()); } private static boolean refersToYear(ExpressionTree argument) { @@ -179,9 +177,8 @@ private static boolean isWeekBasedYearUsed(ExpressionTree argument) { private static boolean isChronoFieldYear(ExpressionTree argument) { if (argument.is(Tree.Kind.MEMBER_SELECT)) { MemberSelectExpressionTree select = (MemberSelectExpressionTree) argument; - IdentifierTree identifier = select.identifier(); - return select.symbolType().is("java.time.temporal.ChronoField") && - (identifier.name().equals("YEAR") || identifier.name().equals("YEAR_OF_ERA")); + String name = select.identifier().name(); + return select.symbolType().is("java.time.temporal.ChronoField") && ("YEAR".equals(name) || "YEAR_OF_ERA".equals(name)); } return false; } diff --git a/java-checks/src/main/java/org/sonar/java/checks/DiamondOperatorCheck.java b/java-checks/src/main/java/org/sonar/java/checks/DiamondOperatorCheck.java index 1df1b27318a..64b98eb558b 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/DiamondOperatorCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/DiamondOperatorCheck.java @@ -23,7 +23,7 @@ import java.util.List; import javax.annotation.CheckForNull; import javax.annotation.Nullable; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.sonar.check.Rule; import org.sonar.java.JavaVersionAwareVisitor; import org.sonar.java.ast.visitors.SubscriptionVisitor; @@ -63,9 +63,9 @@ public class DiamondOperatorCheck extends SubscriptionVisitor implements JavaVer Tree.Kind.VARIABLE, Tree.Kind.TYPE_CAST, Tree.Kind.RETURN_STATEMENT, - Tree.Kind.ASSIGNMENT}; - private static final Tree.Kind[] JAVA_8_KINDS = (Tree.Kind[]) ArrayUtils.addAll(JAVA_7_KINDS, new Tree.Kind[] { - Tree.Kind.CONDITIONAL_EXPRESSION}); + Tree.Kind.ASSIGNMENT + }; + private static final Tree.Kind[] JAVA_8_KINDS = ArrayUtils.add(JAVA_7_KINDS, Tree.Kind.CONDITIONAL_EXPRESSION); private Tree.Kind[] expressionKindsToCheck = JAVA_7_KINDS; @Override diff --git a/java-checks/src/main/java/org/sonar/java/checks/DisallowedConstructorCheck.java b/java-checks/src/main/java/org/sonar/java/checks/DisallowedConstructorCheck.java index a93b4ad1958..0f5d58aaecc 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/DisallowedConstructorCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/DisallowedConstructorCheck.java @@ -19,7 +19,7 @@ */ package org.sonar.java.checks; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.sonar.check.Rule; import org.sonar.check.RuleProperty; import org.sonar.java.checks.methods.AbstractMethodDetection; diff --git a/java-checks/src/main/java/org/sonar/java/checks/DisallowedMethodCheck.java b/java-checks/src/main/java/org/sonar/java/checks/DisallowedMethodCheck.java index ea978d9750f..0932e68cd5e 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/DisallowedMethodCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/DisallowedMethodCheck.java @@ -19,7 +19,7 @@ */ package org.sonar.java.checks; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.sonar.check.Rule; import org.sonar.check.RuleProperty; import org.sonar.java.checks.methods.AbstractMethodDetection; diff --git a/java-checks/src/main/java/org/sonar/java/checks/EmptyMethodsCheck.java b/java-checks/src/main/java/org/sonar/java/checks/EmptyMethodsCheck.java index 0f87c3bcc79..e5452bbe7f7 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/EmptyMethodsCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/EmptyMethodsCheck.java @@ -19,6 +19,9 @@ */ package org.sonar.java.checks; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; import org.sonar.check.Rule; import org.sonar.java.checks.helpers.QuickFixHelper; import org.sonar.java.model.ModifiersUtils; @@ -26,6 +29,7 @@ import org.sonar.java.reporting.JavaQuickFix; import org.sonar.java.reporting.JavaTextEdit; import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; +import org.sonar.plugins.java.api.tree.AnnotationTree; import org.sonar.plugins.java.api.tree.BlockTree; import org.sonar.plugins.java.api.tree.ClassTree; import org.sonar.plugins.java.api.tree.MethodTree; @@ -34,13 +38,13 @@ import org.sonar.plugins.java.api.tree.Tree; import org.sonar.plugins.java.api.tree.Tree.Kind; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - @Rule(key = "S1186") public class EmptyMethodsCheck extends IssuableSubscriptionVisitor { + // Some methods may legitimately be left empty, e.g. methods annotated with org.aspectj.lang.annotation.Pointcut. We ignore them here. + private static final String IGNORED_METHODS_ANNOTATION = "org.aspectj.lang.annotation.Pointcut"; + private static final String IGNORED_METHODS_ANNOTATION_UNQUALIFIED = "Pointcut"; + @Override public List nodesToVisit() { return Arrays.asList(Tree.Kind.CLASS, Tree.Kind.ENUM, Tree.Kind.RECORD); @@ -52,7 +56,7 @@ public void visitNode(Tree tree) { if (!ModifiersUtils.hasModifier(classTree.modifiers(), Modifier.ABSTRACT)) { List members = classTree.members(); checkMethods(members); - checkSingleNoArgPublicConstructor(members); + checkConstructors(members); } } @@ -60,16 +64,36 @@ private void checkMethods(List members) { members.stream() .filter(member -> member.is(Tree.Kind.METHOD)) .map(MethodTree.class::cast) + .filter(methodTree -> { + var annotations = methodTree.modifiers().annotations(); + return annotations.isEmpty() || annotations.stream().noneMatch(EmptyMethodsCheck::isExceptedAnnotation); + }) .forEach(this::checkMethod); } - private void checkSingleNoArgPublicConstructor(List members) { + /** + * Returns true if the annotation indicates that the method body can legitimately be empty. + */ + private static boolean isExceptedAnnotation(AnnotationTree annotationTree) { + return annotationTree.symbolType().is(IGNORED_METHODS_ANNOTATION) || + (annotationTree.symbolType().isUnknown() && annotationTree.symbolType().name().equals(IGNORED_METHODS_ANNOTATION_UNQUALIFIED)); + } + + private void checkConstructors(List members) { List constructors = members.stream() .filter(member -> member.is(Tree.Kind.CONSTRUCTOR)) .map(MethodTree.class::cast) .collect(Collectors.toList()); if (constructors.size() == 1 && isPublicNoArgConstructor(constructors.get(0))) { + // In case that there is only a single public default constructor with empty body, we raise an issue, as this is equivalent to not + // defining a constructor at all and hence redundant. checkMethod(constructors.get(0)); + } else if(constructors.size() > 1) { + // If there are several constructors, it may be valid to have a no-args constructor with an empty body. However, constructors that + // take arguments should do something with those or say why they don't using a comment. + constructors.stream() + .filter(constructor -> !constructor.parameters().isEmpty()) + .forEach(this::checkMethod); } } diff --git a/java-checks/src/main/java/org/sonar/java/checks/ForLoopFalseConditionCheck.java b/java-checks/src/main/java/org/sonar/java/checks/ForLoopFalseConditionCheck.java index 851004072c4..292a6133bba 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/ForLoopFalseConditionCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/ForLoopFalseConditionCheck.java @@ -19,9 +19,10 @@ */ package org.sonar.java.checks; -import org.apache.commons.lang.BooleanUtils; +import javax.annotation.CheckForNull; +import org.apache.commons.lang3.BooleanUtils; import org.sonar.check.Rule; -import org.sonar.java.model.LiteralUtils; +import org.sonar.java.model.ExpressionUtils; import org.sonar.plugins.java.api.tree.BinaryExpressionTree; import org.sonar.plugins.java.api.tree.ExpressionTree; import org.sonar.plugins.java.api.tree.ForStatementTree; @@ -29,8 +30,6 @@ import org.sonar.plugins.java.api.tree.Tree; import org.sonar.plugins.java.api.tree.UnaryExpressionTree; -import javax.annotation.CheckForNull; - @Rule(key = "S2252") public class ForLoopFalseConditionCheck extends AbstractForLoopRule { @@ -98,7 +97,8 @@ private static boolean evaluateCondition(ExpressionTree condition, int leftOpera } private static Integer eval(ExpressionTree expression, Iterable initializers) { - Integer intLiteralValue = LiteralUtils.intLiteralValue(expression); + Object resolvedConstant = ExpressionUtils.resolveAsConstant(expression); + Integer intLiteralValue = resolvedConstant instanceof Integer? ((Integer) resolvedConstant) : null; if (intLiteralValue == null) { for (ForLoopInitializer initializer : initializers) { if (initializer.hasSameIdentifier(expression)) { diff --git a/java-checks/src/main/java/org/sonar/java/checks/HardCodedPasswordCheck.java b/java-checks/src/main/java/org/sonar/java/checks/HardCodedPasswordCheck.java index 80f3b4100bf..94db10ecb22 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/HardCodedPasswordCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/HardCodedPasswordCheck.java @@ -30,13 +30,11 @@ import org.sonar.java.checks.helpers.ExpressionsHelper; import org.sonar.java.model.ExpressionUtils; import org.sonar.java.model.LiteralUtils; -import org.sonar.plugins.java.api.semantic.MethodMatchers; import org.sonar.plugins.java.api.tree.AssignmentExpressionTree; import org.sonar.plugins.java.api.tree.ExpressionTree; import org.sonar.plugins.java.api.tree.LiteralTree; import org.sonar.plugins.java.api.tree.MemberSelectExpressionTree; import org.sonar.plugins.java.api.tree.MethodInvocationTree; -import org.sonar.plugins.java.api.tree.NewClassTree; import org.sonar.plugins.java.api.tree.Tree; import org.sonar.plugins.java.api.tree.Tree.Kind; import org.sonar.plugins.java.api.tree.VariableTree; @@ -45,24 +43,9 @@ public class HardCodedPasswordCheck extends AbstractHardCodedCredentialChecker { private static final String DEFAULT_PASSWORD_WORDS = "password,passwd,pwd,passphrase,java.naming.security.credentials"; - private static final String JAVA_LANG_STRING = "java.lang.String"; private static final Pattern URL_PREFIX = Pattern.compile("^\\w{1,8}://"); private static final Pattern NON_EMPTY_URL_CREDENTIAL = Pattern.compile("(?[^\\s:]*+):(?\\S++)"); - private static final MethodMatchers PASSWORD_AUTHENTICATION_CONSTRUCTOR = MethodMatchers.create() - .ofTypes("java.net.PasswordAuthentication") - .constructor() - .addParametersMatcher(JAVA_LANG_STRING, "char[]") - .build(); - - private static final MethodMatchers GET_CONNECTION_MATCHER = MethodMatchers.create() - .ofTypes("java.sql.DriverManager") - .names("getConnection") - .withAnyParameters() - .build(); - - private static final int GET_CONNECTION_PASSWORD_ARGUMENT = 2; - @RuleProperty( key = "credentialWords", description = "Comma separated list of words identifying potential passwords", @@ -76,7 +59,7 @@ protected String getCredentialWords() { @Override public List nodesToVisit() { - return Arrays.asList(Tree.Kind.STRING_LITERAL, Tree.Kind.VARIABLE, Tree.Kind.ASSIGNMENT, Tree.Kind.NEW_CLASS, Tree.Kind.METHOD_INVOCATION); + return Arrays.asList(Tree.Kind.STRING_LITERAL, Tree.Kind.VARIABLE, Tree.Kind.ASSIGNMENT, Tree.Kind.METHOD_INVOCATION); } @Override @@ -87,8 +70,6 @@ public void visitNode(Tree tree) { handleVariable((VariableTree) tree); } else if (tree.is(Tree.Kind.ASSIGNMENT)) { handleAssignment((AssignmentExpressionTree) tree); - } else if (tree.is(Tree.Kind.NEW_CLASS)) { - handleConstructor((NewClassTree) tree); } else { handleMethodInvocation((MethodInvocationTree) tree); } @@ -119,39 +100,15 @@ private static boolean isURLWithCredentials(String stringLiteral) { return false; } - private void handleConstructor(NewClassTree tree) { - if (!PASSWORD_AUTHENTICATION_CONSTRUCTOR.matches(tree)) { - return; - } - ExpressionTree secondArg = tree.arguments().get(1); - if (secondArg.is(Tree.Kind.METHOD_INVOCATION)) { - MethodInvocationTree mit = (MethodInvocationTree) secondArg; - if (STRING_TO_CHAR_ARRAY.matches(mit) && isCallOnStringLiteral(mit.methodSelect())) { - reportIssue(tree, "Remove this hard-coded password."); - } - } - } - private void handleMethodInvocation(MethodInvocationTree mit) { ExpressionTree methodSelect = mit.methodSelect(); if (EQUALS_MATCHER.matches(mit) && methodSelect.is(Kind.MEMBER_SELECT)) { handleEqualsMethod(mit, (MemberSelectExpressionTree) methodSelect); - } else if (GET_CONNECTION_MATCHER.matches(mit)) { - handleGetConnectionMethod(mit); } else { isSettingCredential(mit).ifPresent(settingPassword -> report(ExpressionUtils.methodName(mit), settingPassword)); } } - private void handleGetConnectionMethod(MethodInvocationTree mit) { - if (mit.arguments().size() > GET_CONNECTION_PASSWORD_ARGUMENT) { - ExpressionTree expression = mit.arguments().get(GET_CONNECTION_PASSWORD_ARGUMENT); - if (isPotentialCredential(expression)) { - reportIssue(expression, "Remove this hard-coded password."); - } - } - } - @Override protected void report(Tree tree, String match) { reportIssue(tree, "'" + match + "' detected in this expression, review this potentially hard-coded password."); diff --git a/java-checks/src/main/java/org/sonar/java/checks/HardcodedIpCheck.java b/java-checks/src/main/java/org/sonar/java/checks/HardcodedIpCheck.java index 30f0ff2d120..791ccb69e0b 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/HardcodedIpCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/HardcodedIpCheck.java @@ -24,7 +24,7 @@ import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.sonar.check.Rule; import org.sonar.java.model.LiteralUtils; import org.sonar.plugins.java.api.JavaFileScanner; @@ -81,11 +81,11 @@ private static boolean isLoopbackAddress(String ip) { } private static boolean isNonRoutableAddress(String ip) { - return ip.equals("0.0.0.0") || IP_V6_NON_ROUTABLE.matcher(ip).matches(); + return "0.0.0.0".equals(ip) || IP_V6_NON_ROUTABLE.matcher(ip).matches(); } private static boolean isBroadcastAddress(String ip) { - return ip.equals("255.255.255.255"); + return "255.255.255.255".equals(ip); } private static Optional extractIPV4(String value) { diff --git a/java-checks/src/main/java/org/sonar/java/checks/IdenticalCasesInSwitchCheck.java b/java-checks/src/main/java/org/sonar/java/checks/IdenticalCasesInSwitchCheck.java index 14c2c3255b8..01065ac2e89 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/IdenticalCasesInSwitchCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/IdenticalCasesInSwitchCheck.java @@ -162,7 +162,7 @@ private static boolean isTrivialIfStatement(StatementTree node) { protected static boolean hasDefaultClause(SwitchTree switchStatement) { return switchStatement.cases().stream() .flatMap(caseGroupTree -> caseGroupTree.labels().stream()) - .anyMatch(caseLabelTree -> caseLabelTree.caseOrDefaultKeyword().text().equals("default")); + .anyMatch(caseLabelTree -> "default".equals(caseLabelTree.caseOrDefaultKeyword().text())); } protected static boolean hasElseClause(IfStatementTree ifStatement) { diff --git a/java-checks/src/main/java/org/sonar/java/checks/IgnoredOperationStatusCheck.java b/java-checks/src/main/java/org/sonar/java/checks/IgnoredOperationStatusCheck.java index 1a8ced996e6..2e68f0f7a31 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/IgnoredOperationStatusCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/IgnoredOperationStatusCheck.java @@ -38,7 +38,7 @@ protected MethodMatchers getMethodInvocationMatchers() { return MethodMatchers.or( MethodMatchers.create().ofSubTypes("java.util.concurrent.locks.Lock").names("tryLock").addWithoutParametersMatcher().build(), MethodMatchers.create().ofTypes(FILE) - .name(name -> name.equals("delete") || name.equals("exists") || name.equals("createNewFile") || + .name(name -> "delete".equals(name) || "exists".equals(name) || "createNewFile".equals(name) || name.startsWith("can") || name.startsWith("is")) .addWithoutParametersMatcher() .build(), diff --git a/java-checks/src/main/java/org/sonar/java/checks/IgnoredReturnValueCheck.java b/java-checks/src/main/java/org/sonar/java/checks/IgnoredReturnValueCheck.java index c974beaa4f6..78a2e1300a9 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/IgnoredReturnValueCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/IgnoredReturnValueCheck.java @@ -190,7 +190,7 @@ private static boolean mayBeCollectingIntoVariable(MethodInvocationTree mit) { private static boolean isConstructor(ExpressionTree tree) { if (tree.is(Tree.Kind.METHOD_REFERENCE)) { - return ((MethodReferenceTree) tree).method().name().equals("new"); + return "new".equals(((MethodReferenceTree) tree).method().name()); } return (tree.is(Tree.Kind.LAMBDA_EXPRESSION)) && ((LambdaExpressionTree) tree).body().is(Tree.Kind.NEW_CLASS, Tree.Kind.NEW_ARRAY); diff --git a/java-checks/src/main/java/org/sonar/java/checks/ImmediatelyReturnedVariableCheck.java b/java-checks/src/main/java/org/sonar/java/checks/ImmediatelyReturnedVariableCheck.java index b1c0ca79cc6..70e17b3fd36 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/ImmediatelyReturnedVariableCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/ImmediatelyReturnedVariableCheck.java @@ -22,7 +22,7 @@ import java.util.List; import java.util.Map; import javax.annotation.CheckForNull; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.sonar.check.Rule; import org.sonar.java.checks.helpers.QuickFixHelper; import org.sonarsource.analyzer.commons.collections.MapBuilder; diff --git a/java-checks/src/main/java/org/sonar/java/checks/IsInstanceMethodCheck.java b/java-checks/src/main/java/org/sonar/java/checks/IsInstanceMethodCheck.java index 9a1db2bb562..d7accba8a13 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/IsInstanceMethodCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/IsInstanceMethodCheck.java @@ -64,7 +64,7 @@ private static Optional getClassIdentifier(ExpressionTree expression) { ExpressionTree originalExpression = ExpressionUtils.skipParentheses(expression); if (originalExpression.is(Tree.Kind.MEMBER_SELECT)) { MemberSelectExpressionTree memberSelect = (MemberSelectExpressionTree) originalExpression; - if (memberSelect.identifier().name().equals("class")) { + if ("class".equals(memberSelect.identifier().name())) { ExpressionTree selectedExpression = ExpressionUtils.skipParentheses(memberSelect.expression()); return getName(selectedExpression); } diff --git a/java-checks/src/main/java/org/sonar/java/checks/IteratorNextExceptionCheck.java b/java-checks/src/main/java/org/sonar/java/checks/IteratorNextExceptionCheck.java index 4713bf749c3..f6fb48136a5 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/IteratorNextExceptionCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/IteratorNextExceptionCheck.java @@ -40,7 +40,7 @@ public class IteratorNextExceptionCheck extends IssuableSubscriptionVisitor { private static final MethodMatchers NEXT_INVOCATION_MATCHER = MethodMatchers.create() .ofSubTypes("java.util.Iterator") - .names("next") + .name(name -> name.startsWith("next") || name.startsWith("previous")) .addWithoutParametersMatcher() .build(); diff --git a/java-checks/src/main/java/org/sonar/java/checks/JacksonDeserializationCheck.java b/java-checks/src/main/java/org/sonar/java/checks/JacksonDeserializationCheck.java index 533b192c159..5430d46e345 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/JacksonDeserializationCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/JacksonDeserializationCheck.java @@ -83,7 +83,7 @@ private static Optional findUseArgument(AnnotationTree annotatio for (ExpressionTree tree : annotationTree.arguments()) { if (tree.is(Tree.Kind.ASSIGNMENT)) { AssignmentExpressionTree assignment = (AssignmentExpressionTree) tree; - if (((IdentifierTree) assignment.variable()).name().equals("use") + if ("use".equals(((IdentifierTree) assignment.variable()).name()) && isJsonTypeIdEnumValue(assignment.expression())) { return Optional.of(assignment.expression()); } @@ -102,7 +102,7 @@ private static boolean isJsonTypeIdEnumValue(ExpressionTree tree) { } else { valueName = ((IdentifierTree) tree).name(); } - return valueName.equals("CLASS") || valueName.equals("MINIMAL_CLASS"); + return "CLASS".equals(valueName) || "MINIMAL_CLASS".equals(valueName); } private static boolean isJsonTypeId(ExpressionTree tree) { diff --git a/java-checks/src/main/java/org/sonar/java/checks/LeastSpecificTypeCheck.java b/java-checks/src/main/java/org/sonar/java/checks/LeastSpecificTypeCheck.java index fc9a2907888..f243fc98382 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/LeastSpecificTypeCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/LeastSpecificTypeCheck.java @@ -77,11 +77,16 @@ private static boolean isStringType(Type type) { } private void handleParameter(Symbol parameter, boolean springInjectionAnnotated) { + Type parameterType = parameter.type(); + if (parameterType.symbol().metadata().isAnnotatedWith("java.lang.FunctionalInterface")) { + // Exclude functional interface, it's wrong to have issues on UnaryOperator and ask the user to use Function instead + return; + } Type leastSpecificType = findLeastSpecificType(parameter); - if (parameter.type() != leastSpecificType + if (parameterType != leastSpecificType && !leastSpecificType.is("java.lang.Object")) { String suggestedType = getSuggestedType(springInjectionAnnotated, leastSpecificType); - reportIssue(parameter.declaration(), String.format("Use '%s' here; it is a more general type than '%s'.", suggestedType, parameter.type().erasure().name())); + reportIssue(parameter.declaration(), String.format("Use '%s' here; it is a more general type than '%s'.", suggestedType, parameterType.erasure().name())); } } diff --git a/java-checks/src/main/java/org/sonar/java/checks/LoggerClassCheck.java b/java-checks/src/main/java/org/sonar/java/checks/LoggerClassCheck.java index 066334871b1..c59990ceea1 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/LoggerClassCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/LoggerClassCheck.java @@ -101,7 +101,7 @@ private void checkField(Symbol.TypeSymbol clazz, ExpressionTree initializer) { private static Symbol classLiteral(ExpressionTree expression) { if (expression.is(Tree.Kind.MEMBER_SELECT)) { MemberSelectExpressionTree mset = (MemberSelectExpressionTree) expression; - if (mset.identifier().name().equals("class")) { + if ("class".equals(mset.identifier().name())) { return mset.expression().symbolType().symbol(); } } diff --git a/java-checks/src/main/java/org/sonar/java/checks/MethodComplexityCheck.java b/java-checks/src/main/java/org/sonar/java/checks/MethodComplexityCheck.java index 5ea3fb2f7b4..efdc35408a4 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/MethodComplexityCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/MethodComplexityCheck.java @@ -21,6 +21,7 @@ import org.sonar.check.Rule; import org.sonar.check.RuleProperty; +import org.sonar.java.checks.helpers.MethodTreeUtils; import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; import org.sonar.plugins.java.api.JavaFileScannerContext; import org.sonar.plugins.java.api.tree.MethodTree; @@ -70,13 +71,7 @@ public void visitNode(Tree tree) { } private static boolean isExcluded(MethodTree methodTree) { - String name = methodTree.simpleName().name(); - if ("equals".equals(name)) { - return methodTree.parameters().size() == 1; - } else if ("hashCode".equals(name)) { - return methodTree.parameters().isEmpty(); - } - return false; + return MethodTreeUtils.isEqualsMethod(methodTree) || MethodTreeUtils.isHashCodeMethod(methodTree); } public void setMax(int max) { diff --git a/java-checks/src/main/java/org/sonar/java/checks/MutableMembersUsageCheck.java b/java-checks/src/main/java/org/sonar/java/checks/MutableMembersUsageCheck.java index 3f4907d0db4..4dbc8d06344 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/MutableMembersUsageCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/MutableMembersUsageCheck.java @@ -28,6 +28,7 @@ import java.util.stream.Collectors; import javax.annotation.Nullable; import org.sonar.check.Rule; +import org.sonar.java.model.ExpressionUtils; import org.sonar.java.model.LiteralUtils; import org.sonar.plugins.java.api.JavaFileScanner; import org.sonar.plugins.java.api.JavaFileScannerContext; @@ -52,11 +53,12 @@ public class MutableMembersUsageCheck extends BaseTreeVisitor implements JavaFil private static final List MUTABLE_TYPES = Arrays.asList( "java.util.Collection", "java.util.Date", - "java.util.Hashtable"); + "java.util.Map"); private static final List IMMUTABLE_TYPES = Arrays.asList( "java.util.Collections.UnmodifiableCollection", "java.util.Collections.UnmodifiableMap", - "com.google.common.collect.ImmutableCollection"); + "com.google.common.collect.ImmutableCollection", + "com.google.common.collect.ImmutableMap"); private static final MethodMatchers UNMODIFIABLE_COLLECTION_CALL = MethodMatchers.or( MethodMatchers.create().ofType(type -> MutableMembersUsageCheck.containsImmutableLikeTerm(type.name())).anyName().withAnyParameters().build(), @@ -64,9 +66,23 @@ public class MutableMembersUsageCheck extends BaseTreeVisitor implements JavaFil MethodMatchers.create().ofTypes("java.util.Collections") .name(name -> name.startsWith("singleton") || name.startsWith("empty")) .withAnyParameters().build(), - MethodMatchers.create().ofTypes("java.util.Set", "java.util.List").names("of", "copyOf").withAnyParameters().build() + MethodMatchers.create().ofTypes("java.util.Set", "java.util.List").names("of", "copyOf").withAnyParameters().build(), + MethodMatchers.create().ofTypes("com.google.common.collect.Sets").names("union", "intersection", "difference", "symmetricDifference").withAnyParameters().build(), + MethodMatchers.create().ofTypes("com.google.common.collect.Lists").names("asList").withAnyParameters().build() ); + private static final MethodMatchers STREAM_COLLECT_CALL = MethodMatchers.create(). + ofTypes("java.util.stream.Stream") + .names("collect") + .addParametersMatcher("java.util.stream.Collector") + .build(); + + private static final MethodMatchers UNMODIFIABLE_COLLECTOR_CALL = MethodMatchers.create(). + ofTypes("java.util.stream.Collectors") + .names("toUnmodifiableSet", "toUnmodifiableList", "toUnmodifiableMap") + .withAnyParameters() + .build(); + private JavaFileScannerContext context; private Deque> parametersStack = new LinkedList<>(); @@ -133,7 +149,7 @@ public void visitReturnStatement(ReturnStatementTree tree) { private void checkReturnedExpression(ExpressionTree expression) { if (expression.is(Tree.Kind.MEMBER_SELECT)) { MemberSelectExpressionTree mse = (MemberSelectExpressionTree) expression; - if (isThis(mse.expression())) { + if (ExpressionUtils.isThis(mse.expression())) { checkReturnedExpression(mse.identifier()); } } @@ -145,10 +161,6 @@ private void checkReturnedExpression(ExpressionTree expression) { } } - private static boolean isThis(ExpressionTree expression) { - return expression.is(Tree.Kind.IDENTIFIER) && ((IdentifierTree) expression).name().equals("this"); - } - private static boolean isOnlyAssignedImmutableVariable(Symbol.VariableSymbol symbol) { VariableTree declaration = symbol.declaration(); if (declaration != null) { @@ -206,12 +218,23 @@ private static boolean isMutableType(ExpressionTree expressionTree) { // In case of incomplete semantic, working with "nulltype" returns strange results, we can return early as the null will never be mutable anyway. return false; } - if (expressionTree.is(Tree.Kind.METHOD_INVOCATION) && UNMODIFIABLE_COLLECTION_CALL.matches((MethodInvocationTree) expressionTree)) { - return false; + if (expressionTree.is(Tree.Kind.METHOD_INVOCATION)) { + MethodInvocationTree methodInvocationTree = (MethodInvocationTree) expressionTree; + if (UNMODIFIABLE_COLLECTION_CALL.matches(methodInvocationTree) || (isUnmodifiableCollector(methodInvocationTree))) { + return false; + } } return isMutableType(expressionTree.symbolType()); } + private static boolean isUnmodifiableCollector(MethodInvocationTree methodInvocationTree) { + if (STREAM_COLLECT_CALL.matches(methodInvocationTree) && methodInvocationTree.arguments().get(0).is(Tree.Kind.METHOD_INVOCATION)) { + MethodInvocationTree collector = (MethodInvocationTree) methodInvocationTree.arguments().get(0); + return UNMODIFIABLE_COLLECTOR_CALL.matches(collector); + } + return false; + } + private static boolean isMutableType(Type type) { if (type.isArray()) { return true; diff --git a/java-checks/src/main/java/org/sonar/java/checks/NoSonarCheck.java b/java-checks/src/main/java/org/sonar/java/checks/NoSonarCheck.java index 3c2cc6a425c..28a1e2c20ea 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/NoSonarCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/NoSonarCheck.java @@ -22,13 +22,11 @@ import java.util.Collections; import java.util.List; import org.sonar.check.Rule; -import org.sonar.java.RspecKey; import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; import org.sonar.plugins.java.api.tree.SyntaxTrivia; import org.sonar.plugins.java.api.tree.Tree; @Rule(key = "NoSonar") -@RspecKey("S1291") public class NoSonarCheck extends IssuableSubscriptionVisitor { private static final String PATTERN = "NOSONAR"; diff --git a/java-checks/src/main/java/org/sonar/java/checks/OperatorPrecedenceCheck.java b/java-checks/src/main/java/org/sonar/java/checks/OperatorPrecedenceCheck.java index 3aa61e7510a..8f4e15c1283 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/OperatorPrecedenceCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/OperatorPrecedenceCheck.java @@ -27,7 +27,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; -import org.apache.commons.lang.BooleanUtils; +import org.apache.commons.lang3.BooleanUtils; import org.sonar.check.Rule; import org.sonarsource.analyzer.commons.collections.SetUtils; import org.sonar.plugins.java.api.JavaFileScanner; diff --git a/java-checks/src/main/java/org/sonar/java/checks/PatternUtils.java b/java-checks/src/main/java/org/sonar/java/checks/PatternUtils.java index 835a39dbf94..2c614ec431e 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/PatternUtils.java +++ b/java-checks/src/main/java/org/sonar/java/checks/PatternUtils.java @@ -19,7 +19,7 @@ */ package org.sonar.java.checks; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.sonar.api.utils.WildcardPattern; public final class PatternUtils { diff --git a/java-checks/src/main/java/org/sonar/java/checks/PreferStreamAnyMatchCheck.java b/java-checks/src/main/java/org/sonar/java/checks/PreferStreamAnyMatchCheck.java index 12121b0489c..57af736c5bf 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/PreferStreamAnyMatchCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/PreferStreamAnyMatchCheck.java @@ -75,9 +75,9 @@ protected MethodMatchers getMethodInvocationMatchers() { @Override protected void onMethodInvocationFound(MethodInvocationTree mit) { String methodName = mit.symbol().name(); - if (methodName.equals("isPresent")) { + if ("isPresent".equals(methodName)) { handleIsPresent(mit); - } else if (methodName.equals("anyMatch")) { + } else if ("anyMatch".equals(methodName)) { handleAnyMatch(mit); } } diff --git a/java-checks/src/main/java/org/sonar/java/checks/PreparedStatementAndResultSetCheck.java b/java-checks/src/main/java/org/sonar/java/checks/PreparedStatementAndResultSetCheck.java index 2311ba0b3c4..9b48e05a626 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/PreparedStatementAndResultSetCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/PreparedStatementAndResultSetCheck.java @@ -22,7 +22,7 @@ import java.util.Optional; import javax.annotation.CheckForNull; import javax.annotation.Nullable; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.sonar.check.Rule; import org.sonar.java.checks.helpers.ReassignmentFinder; import org.sonar.java.checks.methods.AbstractMethodDetection; diff --git a/java-checks/src/main/java/org/sonar/java/checks/PublicStaticMutableMembersCheck.java b/java-checks/src/main/java/org/sonar/java/checks/PublicStaticMutableMembersCheck.java index d1a6d4f4571..f9cfef3492c 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/PublicStaticMutableMembersCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/PublicStaticMutableMembersCheck.java @@ -83,9 +83,23 @@ public class PublicStaticMutableMembersCheck extends IssuableSubscriptionVisitor "org.apache.commons.collections4.list.UnmodifiableList") .names(DECORATE) .withAnyParameters() - .build() + .build(), + MethodMatchers.create().ofTypes("com.google.common.collect.Sets").names("union", "intersection", "difference", "symmetricDifference").withAnyParameters().build(), + MethodMatchers.create().ofTypes("com.google.common.collect.Lists").names("asList").withAnyParameters().build() ); + private static final MethodMatchers STREAM_COLLECT_CALL = MethodMatchers.create(). + ofTypes("java.util.stream.Stream") + .names("collect") + .addParametersMatcher("java.util.stream.Collector") + .build(); + + private static final MethodMatchers UNMODIFIABLE_COLLECTOR_CALL = MethodMatchers.create(). + ofTypes("java.util.stream.Collectors") + .names("toUnmodifiableSet", "toUnmodifiableList", "toUnmodifiableMap") + .withAnyParameters() + .build(); + private static final MethodMatchers ARRAYS_AS_LIST = MethodMatchers.create() .ofTypes("java.util.Arrays").names("asList").withAnyParameters().build(); @@ -216,7 +230,15 @@ private static boolean returnValueIsMutable(MethodInvocationTree mit) { private static boolean isAcceptedTypeOrUnmodifiableMethodCall(MethodInvocationTree mit) { Type type = mit.symbolType(); - return isUnknownOrAcceptedType(type, ACCEPTED_TYPES) || UNMODIFIABLE_METHOD_CALLS.matches(mit); + return isUnknownOrAcceptedType(type, ACCEPTED_TYPES) || UNMODIFIABLE_METHOD_CALLS.matches(mit) || isUnmodifiableCollector(mit); + } + + private static boolean isUnmodifiableCollector(MethodInvocationTree methodInvocationTree) { + if (STREAM_COLLECT_CALL.matches(methodInvocationTree) && methodInvocationTree.arguments().get(0).is(Tree.Kind.METHOD_INVOCATION)) { + MethodInvocationTree collector = (MethodInvocationTree) methodInvocationTree.arguments().get(0); + return UNMODIFIABLE_COLLECTOR_CALL.matches(collector); + } + return false; } private static boolean isUnknownOrAcceptedType(Type type, List accepted) { diff --git a/java-checks/src/main/java/org/sonar/java/checks/ReflectionOnNonRuntimeAnnotationCheck.java b/java-checks/src/main/java/org/sonar/java/checks/ReflectionOnNonRuntimeAnnotationCheck.java index 6df1d394b6a..c9e35045881 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/ReflectionOnNonRuntimeAnnotationCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/ReflectionOnNonRuntimeAnnotationCheck.java @@ -50,7 +50,7 @@ protected void onMethodInvocationFound(MethodInvocationTree mit) { // For now ignore everything that is not a .class expression if (expressionTree.is(Tree.Kind.MEMBER_SELECT)) { MemberSelectExpressionTree memberSelect = (MemberSelectExpressionTree) expressionTree; - boolean isClassIdentifier = memberSelect.identifier().name().equals("class"); + boolean isClassIdentifier = "class".equals(memberSelect.identifier().name()); Type symbolType = memberSelect.expression().symbolType(); if (isClassIdentifier && !symbolType.isUnknown() && isNotRuntimeAnnotation(symbolType)) { reportIssue(expressionTree, "\"@" + symbolType.name() + "\" is not available at runtime and cannot be seen with reflection."); diff --git a/java-checks/src/main/java/org/sonar/java/checks/RegexPatternsNeedlesslyCheck.java b/java-checks/src/main/java/org/sonar/java/checks/RegexPatternsNeedlesslyCheck.java index 10854e9b13a..21618744def 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/RegexPatternsNeedlesslyCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/RegexPatternsNeedlesslyCheck.java @@ -20,7 +20,7 @@ package org.sonar.java.checks; import java.util.Optional; -import org.apache.commons.lang.StringEscapeUtils; +import org.apache.commons.lang3.StringEscapeUtils; import org.sonar.check.Rule; import org.sonar.java.checks.methods.AbstractMethodDetection; import org.sonar.java.model.ExpressionUtils; diff --git a/java-checks/src/main/java/org/sonar/java/checks/StringToPrimitiveConversionCheck.java b/java-checks/src/main/java/org/sonar/java/checks/StringToPrimitiveConversionCheck.java index 68071119d42..461f756c2df 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/StringToPrimitiveConversionCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/StringToPrimitiveConversionCheck.java @@ -19,7 +19,7 @@ */ package org.sonar.java.checks; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.sonar.check.Rule; import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; import org.sonar.plugins.java.api.semantic.MethodMatchers; diff --git a/java-checks/src/main/java/org/sonar/java/checks/SunPackagesUsedCheck.java b/java-checks/src/main/java/org/sonar/java/checks/SunPackagesUsedCheck.java index cb000fed5da..b4a31570e74 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/SunPackagesUsedCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/SunPackagesUsedCheck.java @@ -37,7 +37,7 @@ public class SunPackagesUsedCheck extends BaseTreeVisitor implements JavaFileSca private List reportedTrees = new ArrayList<>(); - private static final String DEFAULT_EXCLUDE = "com.sun.jersey,com.sun.faces"; + private static final String DEFAULT_EXCLUDE = "com.sun.jersey,com.sun.faces,com.sun.xml.ws"; @RuleProperty( key = "Exclude", diff --git a/java-checks/src/main/java/org/sonar/java/checks/SuppressWarningsCheck.java b/java-checks/src/main/java/org/sonar/java/checks/SuppressWarningsCheck.java index c9c05084c8c..4a25cae3487 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/SuppressWarningsCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/SuppressWarningsCheck.java @@ -26,7 +26,7 @@ import java.util.Set; import java.util.regex.Pattern; import java.util.stream.Collectors; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.sonar.check.Rule; import org.sonar.check.RuleProperty; import org.sonar.java.model.LiteralUtils; diff --git a/java-checks/src/main/java/org/sonar/java/checks/SwitchCasesShouldBeCommaSeparatedCheck.java b/java-checks/src/main/java/org/sonar/java/checks/SwitchCasesShouldBeCommaSeparatedCheck.java index 8d44ec68731..e313f468284 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/SwitchCasesShouldBeCommaSeparatedCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/SwitchCasesShouldBeCommaSeparatedCheck.java @@ -80,7 +80,7 @@ public void visitNode(Tree tree) { public static boolean usesColons(SwitchTree tree) { return !tree.cases().isEmpty() && - tree.cases().get(0).labels().get(0).colonOrArrowToken().text().equals(":"); + ":".equals(tree.cases().get(0).labels().get(0).colonOrArrowToken().text()); } @Override diff --git a/java-checks/src/main/java/org/sonar/java/checks/ThreadLocalCleanupCheck.java b/java-checks/src/main/java/org/sonar/java/checks/ThreadLocalCleanupCheck.java index ebc4f83107d..1ff8ee5133e 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/ThreadLocalCleanupCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/ThreadLocalCleanupCheck.java @@ -87,7 +87,7 @@ private void checkThreadLocalField(Symbol field) { private static boolean usageIsRemove(IdentifierTree usage) { return MethodTreeUtils.consecutiveMethodInvocation(usage) // At this point, we know that "usage" is of type ThreadLocal, we don't have to check the full type, the name is enough. - .filter(mit -> ExpressionUtils.methodName(mit).name().equals("remove")) + .filter(mit -> "remove".equals(ExpressionUtils.methodName(mit).name())) .isPresent(); } } diff --git a/java-checks/src/main/java/org/sonar/java/checks/ThreadStartedInConstructorCheck.java b/java-checks/src/main/java/org/sonar/java/checks/ThreadStartedInConstructorCheck.java index 5c948bd8575..5f4e279436c 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/ThreadStartedInConstructorCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/ThreadStartedInConstructorCheck.java @@ -23,7 +23,7 @@ import java.util.Deque; import java.util.LinkedList; import java.util.List; -import org.apache.commons.lang.BooleanUtils; +import org.apache.commons.lang3.BooleanUtils; import org.sonar.check.Rule; import org.sonar.java.model.ExpressionUtils; import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; diff --git a/java-checks/src/main/java/org/sonar/java/checks/ToStringReturningNullCheck.java b/java-checks/src/main/java/org/sonar/java/checks/ToStringReturningNullCheck.java index 88454eefd4f..7af3963a825 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/ToStringReturningNullCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/ToStringReturningNullCheck.java @@ -48,11 +48,7 @@ public void visitNode(Tree tree) { } else if (interestingMethodName != null) { ExpressionTree returnExpression = ExpressionUtils.skipParentheses(((ReturnStatementTree) tree).expression()); if (returnExpression.is(Kind.NULL_LITERAL)) { - if (interestingMethodName.equals("toString")) { - reportIssue(returnExpression, "Return empty string instead."); - } else { - reportIssue(returnExpression, "Return a non null object."); - } + reportIssue(returnExpression, "toString".equals(interestingMethodName) ? "Return empty string instead." : "Return a non null object."); } } } diff --git a/java-checks/src/main/java/org/sonar/java/checks/TooManyParametersCheck.java b/java-checks/src/main/java/org/sonar/java/checks/TooManyParametersCheck.java index 3148062fd97..b905ffbf836 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/TooManyParametersCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/TooManyParametersCheck.java @@ -23,10 +23,9 @@ import java.util.List; import org.sonar.check.Rule; import org.sonar.check.RuleProperty; -import org.sonar.plugins.java.api.JavaFileScanner; -import org.sonar.plugins.java.api.JavaFileScannerContext; +import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; import org.sonar.plugins.java.api.semantic.SymbolMetadata; -import org.sonar.plugins.java.api.tree.BaseTreeVisitor; +import org.sonar.plugins.java.api.tree.ClassTree; import org.sonar.plugins.java.api.tree.MethodTree; import org.sonar.plugins.java.api.tree.Tree; import org.sonarsource.analyzer.commons.annotations.DeprecatedRuleKey; @@ -35,7 +34,7 @@ @DeprecatedRuleKey(ruleKey = "S00107", repositoryKey = "squid") @Rule(key = "S107") -public class TooManyParametersCheck extends BaseTreeVisitor implements JavaFileScanner { +public class TooManyParametersCheck extends IssuableSubscriptionVisitor { private static final int DEFAULT_MAXIMUM = 7; @@ -51,9 +50,7 @@ public class TooManyParametersCheck extends BaseTreeVisitor implements JavaFileS defaultValue = "" + DEFAULT_MAXIMUM) public int constructorMax = DEFAULT_MAXIMUM; - private JavaFileScannerContext context; - - private static final List WHITE_LIST = Arrays.asList( + private static final List METHOD_ANNOTATION_EXCEPTIONS = Arrays.asList( "org.springframework.web.bind.annotation.RequestMapping", "org.springframework.web.bind.annotation.GetMapping", "org.springframework.web.bind.annotation.PostMapping", @@ -66,33 +63,60 @@ public class TooManyParametersCheck extends BaseTreeVisitor implements JavaFileS "javax.ws.rs.PUT", "javax.ws.rs.PATCH", "org.springframework.beans.factory.annotation.Autowired", - "javax.inject.Inject" - ); + "javax.inject.Inject", + "org.springframework.context.annotation.Bean", + "io.micronaut.http.annotation.Get", + "io.micronaut.http.annotation.Post", + "io.micronaut.http.annotation.Put", + "io.micronaut.http.annotation.Delete", + "io.micronaut.http.annotation.Options", + "io.micronaut.http.annotation.Patch", + "io.micronaut.http.annotation.Head", + "io.micronaut.http.annotation.Trace"); + + // if a class is annotated as one of these types, its constructor should be ignored if it's the only constructor + private static final List CLASS_ANNOTATION_CONSTRUCTOR_EXCEPTIONS = Arrays.asList( + "org.springframework.stereotype.Component", + "org.springframework.context.annotation.Configuration", + "org.springframework.stereotype.Service", + "org.springframework.stereotype.Repository"); @Override - public void scanFile(JavaFileScannerContext context) { - this.context = context; - scan(context.getTree()); + public List nodesToVisit() { + // This rule has the following exceptions: RECORD, ANNOTATION_TYPE + return Arrays.asList(Tree.Kind.CLASS, Tree.Kind.INTERFACE, Tree.Kind.ENUM); } @Override - public void visitMethod(MethodTree tree) { - super.visitMethod(tree); - if (isOverriding(tree) || usesAuthorizedAnnotation(tree)) { + public void visitNode(Tree tree) { + ClassTree classTree = (ClassTree) tree; + + // this is true only if the class has unknown annotations, or if it has a single constructor and + // it is annotated with one of CLASS_ANNOTATION_CONSTRUCTOR_EXCEPTIONS + // if TRUE, we can skip the analysis of constructors in the forEach below + Tree.Kind[] membersToVisit = classUsesAuthorizedAnnotation(classTree) ? new Tree.Kind[] {Tree.Kind.METHOD} : new Tree.Kind[] {Tree.Kind.METHOD, Tree.Kind.CONSTRUCTOR}; + + classTree.members().stream() + .filter(member -> member.is(membersToVisit)) + .forEach(member -> visitMethod((MethodTree) member)); + } + + private void visitMethod(MethodTree method) { + if (isOverriding(method) || usesAuthorizedAnnotation(method)) { return; } int max; String partialMessage; - if (tree.is(Tree.Kind.CONSTRUCTOR)) { + if (method.is(Tree.Kind.CONSTRUCTOR)) { max = constructorMax; partialMessage = "Constructor"; } else { max = maximum; partialMessage = "Method"; } - int size = tree.parameters().size(); + int size = method.parameters().size(); if (size > max) { - context.reportIssue(this, tree.simpleName(), partialMessage + " has " + size + " parameters, which is greater than " + max + " authorized."); + reportIssue(method.simpleName(), partialMessage + " has " + size + " parameters, which is greater than " + max + " authorized."); } } @@ -103,7 +127,21 @@ private static boolean isOverriding(MethodTree tree) { private static boolean usesAuthorizedAnnotation(MethodTree method) { SymbolMetadata metadata = method.symbol().metadata(); - return hasUnknownAnnotation(metadata) || WHITE_LIST.stream().anyMatch(metadata::isAnnotatedWith); + return hasUnknownAnnotation(metadata) || METHOD_ANNOTATION_EXCEPTIONS.stream().anyMatch(metadata::isAnnotatedWith); + } + + // As of Spring 4.3, classes (@Component, @Service, etc..) with a single constructor can omit the @Autowired annotation. + private static boolean classUsesAuthorizedAnnotation(ClassTree methodParentClass) { + SymbolMetadata parentClassMetadata = methodParentClass.symbol().metadata(); + // if the parent class is a Spring component or has unknown annotations + if (hasUnknownAnnotation(parentClassMetadata) || CLASS_ANNOTATION_CONSTRUCTOR_EXCEPTIONS.stream().anyMatch(parentClassMetadata::isAnnotatedWith)) { + long numberOfConstructors = methodParentClass.members().stream().filter(member -> member.is(Tree.Kind.CONSTRUCTOR)).count(); + // if it only has 1 constructor, @Autowired could be implicit, and it's an exception to the rule + if (numberOfConstructors == 1) { + return true; + } + } + return false; } } diff --git a/java-checks/src/main/java/org/sonar/java/checks/TrailingCommentCheck.java b/java-checks/src/main/java/org/sonar/java/checks/TrailingCommentCheck.java index a246b8c7f11..5587f64c144 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/TrailingCommentCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/TrailingCommentCheck.java @@ -24,7 +24,7 @@ import java.util.List; import java.util.Set; import java.util.regex.Pattern; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.sonar.check.Rule; import org.sonar.check.RuleProperty; import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; diff --git a/java-checks/src/main/java/org/sonar/java/checks/UndocumentedApiCheck.java b/java-checks/src/main/java/org/sonar/java/checks/UndocumentedApiCheck.java index f9c5caa55d5..27d3da9e931 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/UndocumentedApiCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/UndocumentedApiCheck.java @@ -24,7 +24,7 @@ import java.util.Set; import java.util.regex.Pattern; import java.util.stream.Collectors; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.sonar.api.utils.WildcardPattern; import org.sonar.check.Rule; import org.sonar.check.RuleProperty; diff --git a/java-checks/src/main/java/org/sonar/java/checks/UselessImportCheck.java b/java-checks/src/main/java/org/sonar/java/checks/UselessImportCheck.java index 0909ba5ba9b..23b079a4702 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/UselessImportCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/UselessImportCheck.java @@ -128,7 +128,7 @@ private boolean isImportFromSamePackage(String importName, Tree tree) { Tree qualifiedIdentifier = ((ImportTree) tree).qualifiedIdentifier(); // Defensive programming, the qualifiedIdentifier should always be a MemberSelectTree. if (qualifiedIdentifier.is(Tree.Kind.MEMBER_SELECT) && - ((MemberSelectExpressionTree) qualifiedIdentifier).identifier().name().equals("*")) { + "*".equals(((MemberSelectExpressionTree) qualifiedIdentifier).identifier().name())) { return importName.equals(currentPackage); } } diff --git a/java-checks/src/main/java/org/sonar/java/checks/VarCanBeUsedCheck.java b/java-checks/src/main/java/org/sonar/java/checks/VarCanBeUsedCheck.java index bae26132c1b..cd3a3cf0612 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/VarCanBeUsedCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/VarCanBeUsedCheck.java @@ -147,7 +147,7 @@ private boolean isMultiAssignment(VariableTree variableTree) { } typeAssignmentLine = line; SyntaxToken token = variableTree.endToken(); - return token != null && token.text().equals(","); + return token != null && ",".equals(token.text()); } private static boolean isArrayInitializerWithoutType(ExpressionTree initializer) { diff --git a/java-checks/src/main/java/org/sonar/java/checks/VisibleForTestingUsageCheck.java b/java-checks/src/main/java/org/sonar/java/checks/VisibleForTestingUsageCheck.java index 5e75eccd5f3..391b78352be 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/VisibleForTestingUsageCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/VisibleForTestingUsageCheck.java @@ -71,7 +71,7 @@ private static boolean isMisusedVisibleForTesting(Symbol symbol) { } private static boolean isVisibleForTestingAnnotation(AnnotationInstance annotationInstance) { - return annotationInstance.symbol().name().equals("VisibleForTesting"); + return "VisibleForTesting".equals(annotationInstance.symbol().name()); } private static boolean inTheSameFile(Symbol symbol) { diff --git a/java-checks/src/main/java/org/sonar/java/checks/aws/AwsConsumerBuilderUsageCheck.java b/java-checks/src/main/java/org/sonar/java/checks/aws/AwsConsumerBuilderUsageCheck.java index 7fff7ae12bb..546992682f5 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/aws/AwsConsumerBuilderUsageCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/aws/AwsConsumerBuilderUsageCheck.java @@ -55,7 +55,7 @@ protected void onMethodInvocationFound(MethodInvocationTree mit) { MethodSymbol methodSymbol = (MethodSymbol) mit.symbol(); Symbol parentClass = Optional.ofNullable(methodSymbol.owner()).orElse(Symbols.unknownTypeSymbol); Symbol.TypeSymbol returnType = methodSymbol.returnType(); - if (!returnType.isUnknown() && parentClass.name().equals("Builder")) { + if (!returnType.isUnknown() && "Builder".equals(parentClass.name())) { String returnTypeName = returnType.type().fullyQualifiedName(); // only focus on method of "Builder" class returning itself if (!returnTypeName.equals(parentClass.type().fullyQualifiedName())) { diff --git a/java-checks/src/main/java/org/sonar/java/checks/aws/AwsLambdaSyncCallCheck.java b/java-checks/src/main/java/org/sonar/java/checks/aws/AwsLambdaSyncCallCheck.java index 6e078e99e12..df75e44c4c7 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/aws/AwsLambdaSyncCallCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/aws/AwsLambdaSyncCallCheck.java @@ -175,12 +175,10 @@ private static boolean setsInvocationTypeToAsync(MethodInvocationTree methodCall if (INVOCATIONTYPE_MATCHERS.matches(methodCall)) { // From the matcher we know there is an argument and it is a string. String stringVal = ExpressionsHelper.getConstantValueAsString(arguments.get(0)).value(); - if (stringVal != null) { - return stringVal.equals("Event") || stringVal.equals("DryRun"); - } else { + return "Event".equals(stringVal) + || "DryRun".equals(stringVal) // Could not get the string real value, therefore sync calls are out of the picture. - return true; - } + || stringVal == null; } return false; } diff --git a/java-checks/src/main/java/org/sonar/java/checks/helpers/CredentialMethod.java b/java-checks/src/main/java/org/sonar/java/checks/helpers/CredentialMethod.java new file mode 100644 index 00000000000..880536f2117 --- /dev/null +++ b/java-checks/src/main/java/org/sonar/java/checks/helpers/CredentialMethod.java @@ -0,0 +1,63 @@ +/* + * SonarQube Java + * Copyright (C) 2012-2022 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.java.checks.helpers; + +import java.util.List; +import org.sonar.plugins.java.api.semantic.MethodMatchers; + +public class CredentialMethod { + public final String cls; + public final String name; + public final List args; + public final List indices; + + private MethodMatchers methodMatcher; + + public CredentialMethod(String cls, String name, List args, List indices) { + this.cls = cls; + this.name = name; + this.args = args; + this.indices = indices; + } + + public boolean isConstructor() { + int sep = Math.max(cls.lastIndexOf('.'), cls.lastIndexOf('$')); + if (sep == -1) { + return cls.equals(name); + } + return cls.substring(sep + 1).equals(name); + } + + public MethodMatchers methodMatcher() { + if (methodMatcher != null) { + return methodMatcher; + } + MethodMatchers.NameBuilder nameBuilder = MethodMatchers.create() + .ofTypes(this.cls); + + MethodMatchers.ParametersBuilder parametersBuilder = isConstructor() ? + nameBuilder.constructor() : nameBuilder.names(this.name); + + this.methodMatcher = parametersBuilder + .addParametersMatcher(args.toArray(new String[0])) + .build(); + return methodMatcher; + } +} diff --git a/java-checks/src/main/java/org/sonar/java/checks/helpers/CredentialMethodsLoader.java b/java-checks/src/main/java/org/sonar/java/checks/helpers/CredentialMethodsLoader.java new file mode 100644 index 00000000000..3641c825c9f --- /dev/null +++ b/java-checks/src/main/java/org/sonar/java/checks/helpers/CredentialMethodsLoader.java @@ -0,0 +1,47 @@ +/* + * SonarQube Java + * Copyright (C) 2012-2022 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.java.checks.helpers; + +import com.google.gson.Gson; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CredentialMethodsLoader { + private CredentialMethodsLoader() { + /* Should not be invoked */ + } + + public static Map> load(String resourcePath) throws IOException { + String rawData; + try (InputStream in = CredentialMethodsLoader.class.getResourceAsStream(resourcePath)) { + if (in == null) { + throw new IOException(String.format("Could not load methods from \"%s\".", resourcePath)); + } + rawData = new String(in.readAllBytes(), StandardCharsets.UTF_8); + } + CredentialMethod[] credentialMethods = new Gson().fromJson(rawData, CredentialMethod[].class); + return Arrays.stream(credentialMethods).collect(Collectors.groupingBy(m -> m.name)); + } +} diff --git a/java-checks/src/main/java/org/sonar/java/checks/helpers/ExpressionsHelper.java b/java-checks/src/main/java/org/sonar/java/checks/helpers/ExpressionsHelper.java index 29ec004a699..b3b614c719c 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/helpers/ExpressionsHelper.java +++ b/java-checks/src/main/java/org/sonar/java/checks/helpers/ExpressionsHelper.java @@ -47,6 +47,7 @@ import org.sonar.plugins.java.api.tree.ParenthesizedTree; import org.sonar.plugins.java.api.tree.Tree; import org.sonar.plugins.java.api.tree.TypeTree; +import org.sonar.plugins.java.api.tree.VariableTree; import static org.sonar.java.checks.helpers.ReassignmentFinder.getInitializerOrExpression; import static org.sonar.java.checks.helpers.ReassignmentFinder.getReassignments; @@ -57,7 +58,7 @@ private ExpressionsHelper() { } public static String concatenate(@Nullable ExpressionTree tree) { - if(tree == null) { + if (tree == null) { return ""; } Deque pieces = new LinkedList<>(); @@ -74,7 +75,7 @@ public static String concatenate(@Nullable ExpressionTree tree) { } StringBuilder sb = new StringBuilder(); - for (String piece: pieces) { + for (String piece : pieces) { sb.append(piece); } return sb.toString(); @@ -87,7 +88,7 @@ public static String concatenate(@Nullable ExpressionTree tree) { */ public static TypeTree reportOnClassTree(ClassTree classTree) { TypeTree reportTree = classTree.simpleName(); - if(reportTree == null) { + if (reportTree == null) { return ((NewClassTree) classTree.parent()).identifier(); } return reportTree; @@ -195,7 +196,7 @@ private static boolean isNonSerializable(Type type) { } // note: this is assuming that custom implementors of Collection // have the good sense to make it serializable just like all implementations in the JDK - if(type.isSubtypeOf("java.lang.Iterable") || + if (type.isSubtypeOf("java.lang.Iterable") || type.isSubtypeOf("java.util.Map") || type.isSubtypeOf("java.util.Enumeration")) { return false; @@ -206,11 +207,10 @@ private static boolean isNonSerializable(Type type) { private static boolean isAssignedToNonSerializable(ExpressionTree expression) { return ExpressionUtils.extractIdentifierSymbol(expression) - .filter(symbol -> - initializedAndAssignedExpressionStream(symbol) - .map(ExpressionTree::symbolType) - .filter(Predicate.not(Type::isUnknown)) - .anyMatch(ExpressionsHelper::isNonSerializable)) + .filter(symbol -> initializedAndAssignedExpressionStream(symbol) + .map(ExpressionTree::symbolType) + .filter(Predicate.not(Type::isUnknown)) + .anyMatch(ExpressionsHelper::isNonSerializable)) .isPresent(); } @@ -227,7 +227,7 @@ public static Stream initializedAndAssignedExpressionStream(Symb } else { return Stream.concat(Stream.of(initializer), assignedExpressionStream); } - } + } public static boolean alwaysReturnSameValue(ExpressionTree expression) { if (expression.is(Tree.Kind.METHOD_INVOCATION, Tree.Kind.NEW_CLASS)) { @@ -258,4 +258,17 @@ public static boolean isNotReassigned(Symbol symbol) { return symbol.isFinal() || (symbol.isVariableSymbol() && JUtils.isEffectivelyFinal(((Symbol.VariableSymbol) symbol))); } + public static List getIdentifierAssignments(IdentifierTree identifier) { + List assignments = new ArrayList<>(); + Symbol symbol = identifier.symbol(); + VariableTree variable = (VariableTree) symbol.declaration(); + if(variable.initializer() != null) { + assignments.add(variable.initializer()); + } + getReassignments(variable, symbol.usages()).stream() + .map(AssignmentExpressionTree::expression) + .forEach(assignments::add); + return assignments; + } + } diff --git a/java-checks/src/main/java/org/sonar/java/checks/helpers/HardcodedStringExpressionChecker.java b/java-checks/src/main/java/org/sonar/java/checks/helpers/HardcodedStringExpressionChecker.java new file mode 100644 index 00000000000..b200a32e73f --- /dev/null +++ b/java-checks/src/main/java/org/sonar/java/checks/helpers/HardcodedStringExpressionChecker.java @@ -0,0 +1,212 @@ +/* + * SonarQube Java + * Copyright (C) 2012-2022 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.java.checks.helpers; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import org.sonar.java.model.ExpressionUtils; +import org.sonar.java.model.JUtils; +import org.sonar.java.model.LiteralUtils; +import org.sonar.plugins.java.api.JavaFileScannerContext; +import org.sonar.plugins.java.api.semantic.MethodMatchers; +import org.sonar.plugins.java.api.semantic.Symbol; +import org.sonar.plugins.java.api.tree.BinaryExpressionTree; +import org.sonar.plugins.java.api.tree.ConditionalExpressionTree; +import org.sonar.plugins.java.api.tree.ExpressionTree; +import org.sonar.plugins.java.api.tree.IdentifierTree; +import org.sonar.plugins.java.api.tree.ListTree; +import org.sonar.plugins.java.api.tree.MemberSelectExpressionTree; +import org.sonar.plugins.java.api.tree.MethodInvocationTree; +import org.sonar.plugins.java.api.tree.NewArrayTree; +import org.sonar.plugins.java.api.tree.NewClassTree; +import org.sonar.plugins.java.api.tree.Tree; +import org.sonar.plugins.java.api.tree.TypeCastTree; +import org.sonar.plugins.java.api.tree.VariableTree; + +import static org.sonar.java.checks.helpers.ExpressionsHelper.getIdentifierAssignments; + +/** + * This class is used to determine if an expression evaluates to a static string. + * It recursively checks for the origin of the expression that it is currently evaluating. + */ +public class HardcodedStringExpressionChecker { + + private HardcodedStringExpressionChecker() { + } + + private static final String SECONDARY_LOCATION_ISSUE_MESSAGE = "The static value is defined here."; + + private static final String JAVA_LANG_STRING = "java.lang.String"; + + private static final MethodMatchers STRING_CONSTRUCTOR = MethodMatchers.create() + .ofTypes(JAVA_LANG_STRING) + .constructor() + .addParametersMatcher(parameters -> !parameters.isEmpty()) + .build(); + + private static final MethodMatchers STRING_TO_ARRAY_METHODS = MethodMatchers.or( + MethodMatchers.create() + .ofTypes(JAVA_LANG_STRING) + .names("getBytes", "toLowerCase", "toUpperCase") + .withAnyParameters() + .build(), + MethodMatchers.create() + .ofTypes(JAVA_LANG_STRING) + .names("toCharArray", "trim", "strip", "stripIndent", "stripLeading", "stripTrailing", "intern", "translateEscapes") + .addWithoutParametersMatcher() + .build(), + MethodMatchers.create() + .ofTypes(JAVA_LANG_STRING) + .names("subSequence", "substring") + .addParametersMatcher("int") + .addParametersMatcher("int", "int") + .build(), + MethodMatchers.create() + .ofAnyType() + .names("toString") + .addWithoutParametersMatcher() + .build()); + + private static final MethodMatchers STRING_VALUE_OF = MethodMatchers.create() + .ofTypes(JAVA_LANG_STRING) + .names("valueOf") + .withAnyParameters() + .build(); + + public static boolean isExpressionDerivedFromPlainText(ExpressionTree expression, List secondaryLocations, + Set visited) { + ExpressionTree arg = ExpressionUtils.skipParentheses(expression); + switch (arg.kind()) { + case IDENTIFIER: + IdentifierTree identifier = (IdentifierTree) arg; + return isDerivedFromPlainText(identifier, secondaryLocations, visited); + case NEW_ARRAY: + NewArrayTree newArrayTree = (NewArrayTree) arg; + return isDerivedFromPlainText(newArrayTree, secondaryLocations, visited); + case NEW_CLASS: + NewClassTree newClassTree = (NewClassTree) arg; + return isDerivedFromPlainText(newClassTree, secondaryLocations, visited); + case METHOD_INVOCATION: + MethodInvocationTree methodInvocationTree = (MethodInvocationTree) arg; + return isDerivedFromPlainText(methodInvocationTree, secondaryLocations, visited); + case CONDITIONAL_EXPRESSION: + ConditionalExpressionTree conditionalTree = (ConditionalExpressionTree) arg; + return isDerivedFromPlainText(conditionalTree, secondaryLocations, visited); + case MEMBER_SELECT: + MemberSelectExpressionTree memberSelect = (MemberSelectExpressionTree) arg; + return isDerivedFromPlainText(memberSelect.identifier(), secondaryLocations, visited); + case STRING_LITERAL: + return !LiteralUtils.isEmptyString(arg); + case TYPE_CAST: + TypeCastTree typeCast = (TypeCastTree) arg; + return isExpressionDerivedFromPlainText(typeCast.expression(), secondaryLocations, visited); + case BOOLEAN_LITERAL: + case CHAR_LITERAL: + case DOUBLE_LITERAL: + case FLOAT_LITERAL: + case INT_LITERAL: + case LONG_LITERAL: + return true; + default: + if (arg instanceof BinaryExpressionTree) { + BinaryExpressionTree binaryExpression = (BinaryExpressionTree) arg; + return isDerivedFromPlainText(binaryExpression, secondaryLocations, visited); + } + return false; + } + } + + private static boolean isDerivedFromPlainText(BinaryExpressionTree binaryExpression, List secondaryLocations, + Set visited) { + return isExpressionDerivedFromPlainText(binaryExpression.rightOperand(), secondaryLocations, visited) && + isExpressionDerivedFromPlainText(binaryExpression.leftOperand(), secondaryLocations, visited); + } + + private static boolean isDerivedFromPlainText(IdentifierTree identifier, List secondaryLocations, + Set visited) { + Symbol symbol = identifier.symbol(); + boolean firstVisit = visited.add(symbol); + if (!firstVisit || !symbol.isVariableSymbol() || JUtils.isParameter(symbol) || isNonFinalField(symbol)) { + return false; + } + VariableTree variable = (VariableTree) symbol.declaration(); + if (variable == null) { + return JUtils.constantValue((Symbol.VariableSymbol) symbol).isPresent(); + } + + List assignments = getIdentifierAssignments(identifier); + + List tempSecondaryLocations = new ArrayList<>(); + boolean identifierIsDerivedFromPlainText = !assignments.isEmpty() && + assignments.stream() + .allMatch(expression -> isExpressionDerivedFromPlainText(expression, tempSecondaryLocations, visited)); + + if (identifierIsDerivedFromPlainText) { + if (variable.initializer() == null) { + secondaryLocations.add(new JavaFileScannerContext.Location(SECONDARY_LOCATION_ISSUE_MESSAGE, variable)); + } else { + secondaryLocations.add(new JavaFileScannerContext.Location(SECONDARY_LOCATION_ISSUE_MESSAGE, variable.initializer())); + } + secondaryLocations.addAll(tempSecondaryLocations); + return true; + } + return false; + } + + private static boolean isNonFinalField(Symbol symbol) { + return symbol.isVariableSymbol() && symbol.owner().isTypeSymbol() && !symbol.isFinal(); + } + + private static boolean isDerivedFromPlainText(NewArrayTree invocation, List secondaryLocations, + Set visited) { + ListTree initializers = invocation.initializers(); + return !initializers.isEmpty() && initializers.stream() + .allMatch(expression -> isExpressionDerivedFromPlainText(expression, secondaryLocations, visited)); + } + + private static boolean isDerivedFromPlainText(NewClassTree invocation, List secondaryLocations, + Set visited) { + return STRING_CONSTRUCTOR.matches(invocation) && + isExpressionDerivedFromPlainText(invocation.arguments().get(0), secondaryLocations, visited); + } + + private static boolean isDerivedFromPlainText(MethodInvocationTree invocation, List secondaryLocations, + Set visited) { + + if (STRING_VALUE_OF.matches(invocation)) { + return isExpressionDerivedFromPlainText(invocation.arguments().get(0), secondaryLocations, visited); + } + + if (!STRING_TO_ARRAY_METHODS.matches(invocation)) { + return false; + } + ExpressionTree methodSelect = ExpressionUtils.skipParentheses(invocation.methodSelect()); + return methodSelect.is(Tree.Kind.MEMBER_SELECT) && + isExpressionDerivedFromPlainText(((MemberSelectExpressionTree) methodSelect).expression(), secondaryLocations, visited); + } + + private static boolean isDerivedFromPlainText(ConditionalExpressionTree conditionalTree, List secondaryLocations, + Set visited) { + return isExpressionDerivedFromPlainText(conditionalTree.trueExpression(), secondaryLocations, visited) && + isExpressionDerivedFromPlainText(conditionalTree.falseExpression(), secondaryLocations, visited); + } + +} diff --git a/java-checks/src/main/java/org/sonar/java/checks/helpers/UnitTestUtils.java b/java-checks/src/main/java/org/sonar/java/checks/helpers/UnitTestUtils.java index a7493926ead..6df191ce6e7 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/helpers/UnitTestUtils.java +++ b/java-checks/src/main/java/org/sonar/java/checks/helpers/UnitTestUtils.java @@ -54,8 +54,8 @@ public final class UnitTestUtils { "com.jayway.restassured.response.ValidatableResponseOptions", //restassured 2.x "io.restassured.response.ValidatableResponseOptions" //restassured 3.x and 4.x ) - .name(name -> name.equals("body") || - name.equals("time") || + .name(name -> "body".equals(name) || + "time".equals(name) || name.startsWith("time") || name.startsWith("content") || name.startsWith("status") || diff --git a/java-checks/src/main/java/org/sonar/java/checks/regex/AbstractRegexCheck.java b/java-checks/src/main/java/org/sonar/java/checks/regex/AbstractRegexCheck.java index ad1c5e1dabc..9a6705b4ae8 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/regex/AbstractRegexCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/regex/AbstractRegexCheck.java @@ -319,7 +319,7 @@ public final void reportIssue(Tree javaTree, String message, @Nullable Integer c protected static Optional getFlagsTree(ExpressionTree methodInvocationOrAnnotation) { if (methodInvocationOrAnnotation.is(Tree.Kind.METHOD_INVOCATION)) { MethodInvocationTree mit = (MethodInvocationTree) methodInvocationOrAnnotation; - if (mit.symbol().name().equals("compile") && mit.arguments().size() == 2) { + if ("compile".equals(mit.symbol().name()) && mit.arguments().size() == 2) { return Optional.of(mit.arguments().get(1)); } } else { diff --git a/java-checks/src/main/java/org/sonar/java/checks/regex/RegexComplexityCheck.java b/java-checks/src/main/java/org/sonar/java/checks/regex/RegexComplexityCheck.java index f75045629b8..275fcfab08d 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/regex/RegexComplexityCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/regex/RegexComplexityCheck.java @@ -23,7 +23,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.sonar.check.Rule; import org.sonar.check.RuleProperty; import org.sonar.java.model.ExpressionUtils; diff --git a/java-checks/src/main/java/org/sonar/java/checks/regex/UnusedGroupNamesCheck.java b/java-checks/src/main/java/org/sonar/java/checks/regex/UnusedGroupNamesCheck.java index 9c7f11047da..2bb2df13027 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/regex/UnusedGroupNamesCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/regex/UnusedGroupNamesCheck.java @@ -51,11 +51,12 @@ public class UnusedGroupNamesCheck extends AbstractRegexCheckTrackingMatchers { private static final Pattern GROUP_NUMBER_REPLACEMENT_REGEX = Pattern.compile("(?\\d++)"); private static final Pattern GROUP_NAME_REPLACEMENT_REGEX = Pattern.compile("(?[A-Za-z][0-9A-Za-z]*+)\\}"); + private static final List NAMES_OF_METHODS_WITH_GROUP_ARGUMENT = List.of("group", "start", "end"); + private static final MethodMatchers MATCHER_GROUP = MethodMatchers.or( MethodMatchers.create() .ofTypes(JAVA_UTIL_REGEX_MATCHER) - .names("group") - // covers both 'group(String)' and 'group(int)' + .names(NAMES_OF_METHODS_WITH_GROUP_ARGUMENT.toArray(String[]::new)) .addParametersMatcher(JAVA_LANG_STRING) .addParametersMatcher("int") .build(), @@ -92,7 +93,7 @@ protected void checkRegex(RegexParseResult regexForLiterals, ExpressionTree meth private void checkGroupUsage(MethodInvocationTree mit, KnownGroupsCollector knownGroups) { String methodName = ExpressionUtils.methodName(mit).name(); - if ("group".equals(methodName)) { + if (NAMES_OF_METHODS_WITH_GROUP_ARGUMENT.contains(methodName)) { ExpressionTree arg0 = mit.arguments().get(0); if (arg0.symbolType().is("int")) { arg0.asConstant(Integer.class).ifPresent(index -> checkUsingNumberInsteadOfName(knownGroups, arg0, index, false)); diff --git a/java-checks/src/main/java/org/sonar/java/checks/security/CipherBlockChainingCheck.java b/java-checks/src/main/java/org/sonar/java/checks/security/CipherBlockChainingCheck.java index 802694e4bc3..80c61dbcd80 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/security/CipherBlockChainingCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/security/CipherBlockChainingCheck.java @@ -23,6 +23,7 @@ import org.sonar.check.Rule; import org.sonar.java.checks.methods.AbstractMethodDetection; import org.sonar.java.model.ExpressionUtils; +import org.sonar.java.model.JUtils; import org.sonar.java.model.Symbols; import org.sonar.plugins.java.api.semantic.MethodMatchers; import org.sonar.plugins.java.api.semantic.Symbol; @@ -49,7 +50,9 @@ public class CipherBlockChainingCheck extends AbstractMethodDetection { @Override protected MethodMatchers getMethodInvocationMatchers() { - return MethodMatchers.create().ofTypes("javax.crypto.spec.IvParameterSpec").constructor().withAnyParameters().build(); + return MethodMatchers.create().ofTypes("javax.crypto.spec.IvParameterSpec").constructor() + .addParametersMatcher(types -> !types.isEmpty()) + .build(); } @Override @@ -71,10 +74,10 @@ protected void onConstructorFound(NewClassTree newClassTree) { private static boolean isDynamicallyGenerated(ExpressionTree tree) { if (tree.is(Tree.Kind.IDENTIFIER)) { Symbol symbol = ((IdentifierTree) tree).symbol(); - if (!symbol.isVariableSymbol()) { - return false; + if (JUtils.isParameter(symbol)) { + return true; } - VariableTree declaration = ((Symbol.VariableSymbol) symbol).declaration(); + VariableTree declaration = symbol.isVariableSymbol() ? ((Symbol.VariableSymbol) symbol).declaration() : null; return declaration != null && (isSecureRandomGenerateSeed(declaration.initializer()) || getReassignments(declaration, symbol.usages()).stream() @@ -106,6 +109,13 @@ private static class MethodInvocationVisitor extends BaseTreeVisitor { .names("init") .withAnyParameters() .build(); + + private static final MethodMatchers BYTEBUFFER_GET = MethodMatchers.create() + .ofTypes("java.nio.ByteBuffer") + .names("get") + .withAnyParameters() + .build(); + // value of javax.crypto.Cipher.DECRYPT_MODE private static final int CIPHER_INIT_DECRYPT_MODE = 2; @@ -129,9 +139,23 @@ public void visitMethodInvocation(MethodInvocationTree methodInvocation) { secureRandomFound = true; } } + if (isInitVectorCopiedFromByteBuffer(methodInvocation)) { + secureRandomFound = true; + } super.visitMethodInvocation(methodInvocation); } + private boolean isInitVectorCopiedFromByteBuffer(MethodInvocationTree methodInvocation) { + if (!BYTEBUFFER_GET.matches(methodInvocation)) { + return false; + } + Symbol initVector = symbol(ivParameterSpecInstantiation.arguments().get(0)); + return methodInvocation.arguments().stream() + .map(MethodInvocationVisitor::symbol) + .filter(argument -> argument.type().is("byte[]")) + .anyMatch(initVector::equals); + } + private boolean isPartOfArguments(MethodInvocationTree methodInvocation) { return isPartOfArguments(methodInvocation, ivParameterSpecInstantiation) || (!ivParameterSymbol.isUnknown() && isPartOfArguments(methodInvocation, ivParameterSymbol)); diff --git a/java-checks/src/main/java/org/sonar/java/checks/security/DisclosingTechnologyFingerprintsCheck.java b/java-checks/src/main/java/org/sonar/java/checks/security/DisclosingTechnologyFingerprintsCheck.java index 262b9e441b7..83e485c5982 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/security/DisclosingTechnologyFingerprintsCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/security/DisclosingTechnologyFingerprintsCheck.java @@ -71,8 +71,8 @@ public void visitNode(Tree tree) { if (SET_RESPONSE_HEADERS.matches(methodInvocationTree)) { methodInvocationTree.arguments().get(0).asConstant(String.class) .ifPresent(header -> { - if (header.equalsIgnoreCase("server") || - header.equalsIgnoreCase("x-powered-by")) { + if ("server".equalsIgnoreCase(header) || + "x-powered-by".equalsIgnoreCase(header)) { reportIssue(methodInvocationTree, MESSAGE); } }); diff --git a/java-checks/src/main/java/org/sonar/java/checks/security/EncryptionAlgorithmCheck.java b/java-checks/src/main/java/org/sonar/java/checks/security/EncryptionAlgorithmCheck.java index b0ab246e748..4bd68eaa07d 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/security/EncryptionAlgorithmCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/security/EncryptionAlgorithmCheck.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.sonar.check.Rule; @@ -43,10 +44,10 @@ public class EncryptionAlgorithmCheck extends AbstractMethodDetection { @Override protected MethodMatchers getMethodInvocationMatchers() { return MethodMatchers.create() - .ofTypes("javax.crypto.Cipher") - .names("getInstance") - .withAnyParameters() - .build(); + .ofTypes("javax.crypto.Cipher") + .names("getInstance") + .withAnyParameters() + .build(); } @Override @@ -73,12 +74,12 @@ protected void onMethodInvocationFound(MethodInvocationTree mit) { } } String algorithmName = ExpressionsHelper.getConstantValueAsString(algorithmTree).value(); - if (algorithmName != null && isInsecureAlgorithm(algorithmName)) { - reportIssue(firstArgument, "Use secure mode and padding scheme.", transformationDefinition, null); + if (algorithmName != null) { + getInsecureAlgorithmMessage(algorithmName).ifPresent(msg -> reportIssue(firstArgument, msg, transformationDefinition, null)); } } - private static boolean isInsecureAlgorithm(String algorithmName) { + private static Optional getInsecureAlgorithmMessage(String algorithmName) { Matcher matcher = ALGORITHM_PATTERN.matcher(algorithmName); if (matcher.matches()) { String algorithm = matcher.group(1); @@ -88,15 +89,20 @@ private static boolean isInsecureAlgorithm(String algorithmName) { boolean isRSA = "RSA".equalsIgnoreCase(algorithm); if ("ECB".equalsIgnoreCase(mode) && !isRSA) { - return true; + return Optional.of("Use a secure cipher mode."); } - if ("CBC".equalsIgnoreCase(mode)) { - return false; + + if ("CBC".equalsIgnoreCase(mode) && !"NoPadding".equalsIgnoreCase(padding)) { + return Optional.of("Use another cipher mode or disable padding."); + } + + if (isRSA && !(padding.toUpperCase(Locale.ROOT).startsWith("OAEP"))) { + return Optional.of("Use a secure padding scheme."); } - return isRSA && !(padding.toUpperCase(Locale.ROOT).startsWith("OAEP")); + return Optional.empty(); } // By default, ECB is used. - return true; + return Optional.of("Use a secure padding scheme."); } } diff --git a/java-checks/src/main/java/org/sonar/java/checks/security/HardCodedCredentialsShouldNotBeUsedCheck.java b/java-checks/src/main/java/org/sonar/java/checks/security/HardCodedCredentialsShouldNotBeUsedCheck.java new file mode 100644 index 00000000000..653f0a2a490 --- /dev/null +++ b/java-checks/src/main/java/org/sonar/java/checks/security/HardCodedCredentialsShouldNotBeUsedCheck.java @@ -0,0 +1,119 @@ +/* + * SonarQube Java + * Copyright (C) 2012-2022 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.java.checks.security; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import org.sonar.api.utils.log.Logger; +import org.sonar.api.utils.log.Loggers; +import org.sonar.check.Rule; +import org.sonar.java.annotations.VisibleForTesting; +import org.sonar.java.checks.helpers.CredentialMethod; +import org.sonar.java.checks.helpers.CredentialMethodsLoader; +import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; +import org.sonar.plugins.java.api.JavaFileScannerContext; +import org.sonar.plugins.java.api.semantic.MethodMatchers; +import org.sonar.plugins.java.api.tree.Arguments; +import org.sonar.plugins.java.api.tree.ExpressionTree; +import org.sonar.plugins.java.api.tree.MethodInvocationTree; +import org.sonar.plugins.java.api.tree.NewClassTree; +import org.sonar.plugins.java.api.tree.Tree; + +import static org.sonar.java.checks.helpers.HardcodedStringExpressionChecker.isExpressionDerivedFromPlainText; + +@Rule(key = "S6437") +public class HardCodedCredentialsShouldNotBeUsedCheck extends IssuableSubscriptionVisitor { + public static final String CREDENTIALS_METHODS_FILE = "/org/sonar/java/checks/security/S6437-methods.json"; + + private static final Logger LOG = Loggers.get(HardCodedCredentialsShouldNotBeUsedCheck.class); + + private static final String ISSUE_MESSAGE = "Revoke and change this password, as it is compromised."; + + private Map> methods; + + public HardCodedCredentialsShouldNotBeUsedCheck() { + this(CREDENTIALS_METHODS_FILE); + } + + @VisibleForTesting + HardCodedCredentialsShouldNotBeUsedCheck(String resourcePath) { + try { + methods = CredentialMethodsLoader.load(resourcePath); + } catch (IOException e) { + LOG.error(e.getMessage()); + methods = Collections.emptyMap(); + } + } + + public Map> getMethods() { + return this.methods; + } + + @Override + public List nodesToVisit() { + return List.of(Tree.Kind.METHOD_INVOCATION, Tree.Kind.NEW_CLASS); + } + + @Override + public void visitNode(Tree tree) { + String methodName; + boolean isConstructor = tree.is(Tree.Kind.NEW_CLASS); + if (isConstructor) { + NewClassTree newClass = (NewClassTree) tree; + methodName = newClass.symbolType().name(); + } else { + MethodInvocationTree invocation = (MethodInvocationTree) tree; + methodName = invocation.symbol().name(); + } + List candidates = methods.get(methodName); + if (candidates == null) { + return; + } + for (CredentialMethod candidate : candidates) { + MethodMatchers matcher = candidate.methodMatcher(); + if (isConstructor) { + NewClassTree constructor = (NewClassTree) tree; + if (matcher.matches(constructor)) { + checkArguments(constructor.arguments(), candidate); + } + } else { + MethodInvocationTree invocation = (MethodInvocationTree) tree; + if (matcher.matches(invocation)) { + checkArguments(invocation.arguments(), candidate); + } + } + } + } + + private void checkArguments(Arguments arguments, CredentialMethod method) { + for (int targetArgumentIndex : method.indices) { + ExpressionTree argument = arguments.get(targetArgumentIndex); + var secondaryLocations = new ArrayList(); + if (isExpressionDerivedFromPlainText(argument, secondaryLocations, new HashSet<>())) { + reportIssue(argument, ISSUE_MESSAGE, secondaryLocations, null); + } + } + } + +} diff --git a/java-checks/src/main/java/org/sonar/java/checks/security/LogConfigurationCheck.java b/java-checks/src/main/java/org/sonar/java/checks/security/LogConfigurationCheck.java index 67f47cb0b56..a07d6ebad9e 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/security/LogConfigurationCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/security/LogConfigurationCheck.java @@ -99,7 +99,7 @@ private void checkConfigurationFactoryExtension(ClassTree tree) { @Override protected void onMethodInvocationFound(MethodInvocationTree mit) { - if (mit.symbol().name().equals("setProperty")) { + if ("setProperty".equals(mit.symbol().name())) { String stringConstant = ExpressionsHelper.getConstantValueAsString(mit.arguments().get(0)).value(); if ("logback.configurationFile".equals(stringConstant)) { reportIssue(mit, MESSAGE); diff --git a/java-checks/src/main/java/org/sonar/java/checks/security/ServerCertificatesCheck.java b/java-checks/src/main/java/org/sonar/java/checks/security/ServerCertificatesCheck.java index 5821e17d6d3..50b39aa5a90 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/security/ServerCertificatesCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/security/ServerCertificatesCheck.java @@ -32,11 +32,11 @@ import org.sonar.plugins.java.api.tree.NewClassTree; import org.sonar.plugins.java.api.tree.ThrowStatementTree; import org.sonar.plugins.java.api.tree.Tree; -import org.sonarsource.analyzer.commons.annotations.DeprecatedRuleKey; -@DeprecatedRuleKey(ruleKey = "S4424", repositoryKey = "squid") -@DeprecatedRuleKey(ruleKey = "S4424", repositoryKey = "java") @Rule(key = "S4830") +// FIXME SONAR-17167: S4424 has been dropped and causes crashes in SQ - Only keeping the implicit "squid:S4830" (see JavaRulesDefinition) +// @DeprecatedRuleKey(ruleKey = "S4424", repositoryKey = "squid") +// @DeprecatedRuleKey(ruleKey = "S4424", repositoryKey = "java") public class ServerCertificatesCheck extends IssuableSubscriptionVisitor { private static final String JAVA_LANG_STRING = "java.lang.String"; private static final String X509_CERTIFICATE_ARRAY = "java.security.cert.X509Certificate[]"; diff --git a/java-checks/src/main/java/org/sonar/java/checks/serialization/SerialVersionUidInRecordCheck.java b/java-checks/src/main/java/org/sonar/java/checks/serialization/SerialVersionUidInRecordCheck.java index 382e107ff4e..3f91d8d5c3d 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/serialization/SerialVersionUidInRecordCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/serialization/SerialVersionUidInRecordCheck.java @@ -59,7 +59,7 @@ private static boolean isSerialVersionUIDField(VariableTree variable) { Symbol symbol = variable.symbol(); return symbol.isFinal() && symbol.type().is("long") && - symbol.name().equals("serialVersionUID"); + "serialVersionUID".equals(symbol.name()); } private static boolean setsTheValueToZero(VariableTree variable) { diff --git a/java-checks/src/main/java/org/sonar/java/checks/spring/SpringBeansShouldBeAccessibleCheck.java b/java-checks/src/main/java/org/sonar/java/checks/spring/SpringBeansShouldBeAccessibleCheck.java index 64f4150d13a..e0b92d9e40c 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/spring/SpringBeansShouldBeAccessibleCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/spring/SpringBeansShouldBeAccessibleCheck.java @@ -56,8 +56,8 @@ public class SpringBeansShouldBeAccessibleCheck extends IssuableSubscriptionVisi private static final Logger LOG = Loggers.get(SpringBeansShouldBeAccessibleCheck.class); - private static final String MESSAGE_FORMAT = "'%s' is not reachable by @ComponentsScan or @SpringBootApplication. " - + "Either move it to a package configured in @ComponentsScan or update your @ComponentsScan configuration."; + private static final String MESSAGE_FORMAT = "'%s' is not reachable by @ComponentScan or @SpringBootApplication. " + + "Either move it to a package configured in @ComponentScan or update your @ComponentScan configuration."; private static final String[] SPRING_BEAN_ANNOTATIONS = { "org.springframework.stereotype.Component", diff --git a/java-checks/src/main/java/org/sonar/java/checks/spring/SpringComponentWithNonAutowiredMembersCheck.java b/java-checks/src/main/java/org/sonar/java/checks/spring/SpringComponentWithNonAutowiredMembersCheck.java index 5e372d1a0ea..fc3d1e6c25e 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/spring/SpringComponentWithNonAutowiredMembersCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/spring/SpringComponentWithNonAutowiredMembersCheck.java @@ -125,7 +125,7 @@ private static List constructors(ClassTree clazzTree) { return clazzTree.symbol().memberSymbols().stream() .filter(Symbol::isMethodSymbol) .map(s -> (Symbol.MethodSymbol) s) - .filter(m -> m.name().equals("")) + .filter(m -> "".equals(m.name())) .filter(m -> m.declaration() != null) .collect(Collectors.toList()); } diff --git a/java-checks/src/main/java/org/sonar/java/checks/spring/SpringIncompatibleTransactionalCheck.java b/java-checks/src/main/java/org/sonar/java/checks/spring/SpringIncompatibleTransactionalCheck.java index 48f3db5f19a..bc1fb77c498 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/spring/SpringIncompatibleTransactionalCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/spring/SpringIncompatibleTransactionalCheck.java @@ -41,7 +41,6 @@ import org.sonar.plugins.java.api.tree.BlockTree; import org.sonar.plugins.java.api.tree.ClassTree; import org.sonar.plugins.java.api.tree.ExpressionTree; -import org.sonar.plugins.java.api.tree.IdentifierTree; import org.sonar.plugins.java.api.tree.MemberSelectExpressionTree; import org.sonar.plugins.java.api.tree.MethodInvocationTree; import org.sonar.plugins.java.api.tree.MethodTree; @@ -121,8 +120,7 @@ private static boolean methodInvocationOnThisInstance(MethodInvocationTree metho } ExpressionTree expression = methodInvocation.methodSelect(); if (expression.is(Tree.Kind.MEMBER_SELECT)) { - expression = ((MemberSelectExpressionTree) expression).expression(); - return expression.is(Tree.Kind.IDENTIFIER) && ((IdentifierTree) expression).name().equals("this"); + return ExpressionUtils.isThis(((MemberSelectExpressionTree) expression).expression()); } return expression.is(Tree.Kind.IDENTIFIER); } diff --git a/java-checks/src/main/java/org/sonar/java/checks/tests/AssertJConsecutiveAssertionCheck.java b/java-checks/src/main/java/org/sonar/java/checks/tests/AssertJConsecutiveAssertionCheck.java index ed4df5ac4a8..5e2f27b604a 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/tests/AssertJConsecutiveAssertionCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/tests/AssertJConsecutiveAssertionCheck.java @@ -58,7 +58,7 @@ public class AssertJConsecutiveAssertionCheck extends IssuableSubscriptionVisito public static final MethodMatchers ASSERTJ_SET_CONTEXT_METHODS = MethodMatchers.create() .ofSubTypes("org.assertj.core.api.AbstractAssert") .name(name -> name.startsWith("extracting") || name.startsWith("using") || name.startsWith("filtered") - || name.equals("flatExtracting") || name.equals("map") || name.equals("flatMap")) + || "flatExtracting".equals(name) || "map".equals(name) || "flatMap".equals(name)) .withAnyParameters() .build(); diff --git a/java-checks/src/main/java/org/sonar/java/checks/tests/AssertTrueInsteadOfDedicatedAssertCheck.java b/java-checks/src/main/java/org/sonar/java/checks/tests/AssertTrueInsteadOfDedicatedAssertCheck.java index 29f2c1e7bb0..8b4e37a3deb 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/tests/AssertTrueInsteadOfDedicatedAssertCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/tests/AssertTrueInsteadOfDedicatedAssertCheck.java @@ -102,7 +102,7 @@ protected void onMethodInvocationFound(MethodInvocationTree mit) { private void checkBooleanExpressionInAssertMethod(IdentifierTree problematicAssertionCallIdentifier, ExpressionTree argumentExpression) { Optional replacementAssertionOpt = getReplacementAssertion(argumentExpression); - if (problematicAssertionCallIdentifier.name().equals("assertFalse")) { + if ("assertFalse".equals(problematicAssertionCallIdentifier.name())) { replacementAssertionOpt = replacementAssertionOpt.map(COMPLEMENTS::get); } diff --git a/java-checks/src/main/java/org/sonar/java/checks/tests/AssertionTypesCheck.java b/java-checks/src/main/java/org/sonar/java/checks/tests/AssertionTypesCheck.java index 26bc6193cd8..3f7573d92f4 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/tests/AssertionTypesCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/tests/AssertionTypesCheck.java @@ -239,7 +239,7 @@ private void checkCompatibleTypes(MethodInvocationTree mit, Argument actual, Arg private static boolean isNotEqualsInTestRelatedToEquals(MethodInvocationTree mit) { String methodName = ExpressionUtils.methodName(mit).name(); - return (methodName.equals(ASSERT_NOT_EQUALS) || methodName.equals("isNotEqualTo")) && + return (ASSERT_NOT_EQUALS.equals(methodName) || "isNotEqualTo".equals(methodName)) && UnitTestUtils.isInUnitTestRelatedToObjectMethods(mit); } diff --git a/java-checks/src/main/java/org/sonar/java/checks/tests/AssertionsInTestsCheck.java b/java-checks/src/main/java/org/sonar/java/checks/tests/AssertionsInTestsCheck.java index a0ebac253f5..17fc2b85d0f 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/tests/AssertionsInTestsCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/tests/AssertionsInTestsCheck.java @@ -40,7 +40,7 @@ import org.sonar.plugins.java.api.tree.Modifier; import org.sonar.plugins.java.api.tree.Tree; -import static org.apache.commons.lang.StringUtils.isEmpty; +import static org.apache.commons.lang3.StringUtils.isEmpty; import static org.sonar.java.checks.helpers.UnitTestUtils.isUnitTest; @Rule(key = "S2699") diff --git a/java-checks/src/main/java/org/sonar/java/checks/tests/AssertionsWithoutMessageCheck.java b/java-checks/src/main/java/org/sonar/java/checks/tests/AssertionsWithoutMessageCheck.java index 0c50b8365d0..62013230adf 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/tests/AssertionsWithoutMessageCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/tests/AssertionsWithoutMessageCheck.java @@ -86,7 +86,7 @@ protected MethodMatchers getMethodInvocationMatchers() { MethodMatchers.create() .ofTypes("org.junit.jupiter.api.Assertions", "org.junit.Assert", "junit.framework.Assert", "org.fest.assertions.Fail", "org.assertj.core.api.Fail") - .name(name -> name.startsWith(ASSERT) || name.equals("fail")).withAnyParameters().build(), + .name(name -> name.startsWith(ASSERT) || "fail".equals(name)).withAnyParameters().build(), FEST_LIKE_ABSTRACT_ASSERT ); } @@ -149,7 +149,7 @@ private void checkJUnit5(MethodInvocationTree mit, IdentifierTree reportLocation if (mit.arguments().isEmpty()) { reportIssue(reportLocation, MESSAGE); - } else if (methodName.equals("fail")) { + } else if ("fail".equals(methodName)) { if (mit.arguments().size() == 1 && mit.arguments().get(0).symbolType().isSubtypeOf("java.lang.Throwable")) { reportIssue(reportLocation, MESSAGE); } diff --git a/java-checks/src/main/java/org/sonar/java/checks/tests/NoTestInTestClassCheck.java b/java-checks/src/main/java/org/sonar/java/checks/tests/NoTestInTestClassCheck.java index e69b0cab428..e3b59de3a3d 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/tests/NoTestInTestClassCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/tests/NoTestInTestClassCheck.java @@ -27,7 +27,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.sonar.check.Rule; import org.sonar.check.RuleProperty; import org.sonar.java.model.JUtils; diff --git a/java-checks/src/main/java/org/sonar/java/checks/tests/TestAnnotationWithExpectedExceptionCheck.java b/java-checks/src/main/java/org/sonar/java/checks/tests/TestAnnotationWithExpectedExceptionCheck.java index 944bc57d356..03836c3ce35 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/tests/TestAnnotationWithExpectedExceptionCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/tests/TestAnnotationWithExpectedExceptionCheck.java @@ -69,8 +69,7 @@ private static Optional findExpectedException(List getQuickFixTextSpan(VariableTr return Optional.of(AnalyzerMessage.textSpanFor(variable)); } // If the variable is not the last one in the list we can include the following comma - if (lastToken.text().equals(",")) { + if (",".equals(lastToken.text())) { return Optional.of(AnalyzerMessage.textSpanBetween(variable.simpleName(), lastToken)); } // If the variable is last in the list, we need to retrieve the preceding comma diff --git a/java-checks/src/main/resources/org/sonar/java/checks/security/S6437-methods.json b/java-checks/src/main/resources/org/sonar/java/checks/security/S6437-methods.json new file mode 100644 index 00000000000..98673dd4219 --- /dev/null +++ b/java-checks/src/main/resources/org/sonar/java/checks/security/S6437-methods.json @@ -0,0 +1,607 @@ +[ + {"cls":"com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties$StatViewServlet","name":"setLoginPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.auth0.jwt.algorithms.Algorithm","name":"HMAC256","args":["byte[]"],"indices":[0]}, + {"cls":"com.auth0.jwt.algorithms.Algorithm","name":"HMAC256","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.auth0.jwt.algorithms.Algorithm","name":"HMAC384","args":["byte[]"],"indices":[0]}, + {"cls":"com.auth0.jwt.algorithms.Algorithm","name":"HMAC384","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.auth0.jwt.algorithms.Algorithm","name":"HMAC512","args":["byte[]"],"indices":[0]}, + {"cls":"com.auth0.jwt.algorithms.Algorithm","name":"HMAC512","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.google.api.client.auth.oauth.OAuthHmacSha256Signer","name":"OAuthHmacSha256Signer","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.google.api.client.auth.oauth.OAuthHmacSha256Signer","name":"setTokenSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.google.api.client.auth.oauth2.ClientParametersAuthentication","name":"ClientParametersAuthentication","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"com.google.api.client.auth.oauth2.PasswordTokenRequest","name":"PasswordTokenRequest","args":["com.google.api.client.http.HttpTransport","com.google.api.client.json.JsonFactory","com.google.api.client.http.GenericUrl","java.lang.String","java.lang.String"],"indices":[4]}, + {"cls":"com.google.api.client.auth.oauth2.PasswordTokenRequest","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.google.auth.oauth2.ClientId","name":"of","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"com.google.auth.oauth2.ClientId$Builder","name":"setClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.google.auth.oauth2.ExternalAccountCredentials","name":"ExternalAccountCredentials","args":["com.google.auth.http.HttpTransportFactory","java.lang.String","java.lang.String","java.lang.String","com.google.auth.oauth2.ExternalAccountCredentials$CredentialSource","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.util.Collection","com.google.auth.oauth2.EnvironmentProvider"],"indices":[9]}, + {"cls":"com.google.auth.oauth2.ExternalAccountCredentials","name":"ExternalAccountCredentials","args":["com.google.auth.http.HttpTransportFactory","java.lang.String","java.lang.String","java.lang.String","com.google.auth.oauth2.ExternalAccountCredentials$CredentialSource","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.util.Collection"],"indices":[9]}, + {"cls":"com.google.auth.oauth2.ExternalAccountCredentials$Builder","name":"setClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.google.auth.oauth2.UserCredentials$Builder","name":"setClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.lambdaworks.redis.AbstractRedisAsyncCommands","name":"auth","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.lambdaworks.redis.AbstractRedisAsyncCommands","name":"authAsync","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.lambdaworks.redis.AbstractRedisReactiveCommands","name":"auth","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.lambdaworks.redis.ConnectionBuilder","name":"password","args":["char[]"],"indices":[0]}, + {"cls":"com.lambdaworks.redis.RedisURI","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.lambdaworks.redis.RedisURI$Builder","name":"withPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.lambdaworks.redis.SslOptions$Builder","name":"truststore","args":["java.io.File","java.lang.String"],"indices":[1]}, + {"cls":"com.lambdaworks.redis.SslOptions$Builder","name":"truststore","args":["java.net.URL","java.lang.String"],"indices":[1]}, + {"cls":"com.lambdaworks.redis.api.async.RedisAsyncCommands","name":"auth","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.lambdaworks.redis.api.reactive.RedisReactiveCommands","name":"auth","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.lambdaworks.redis.api.sync.RedisCommands","name":"auth","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.lambdaworks.redis.cluster.SlotHash","name":"getSlot","args":["byte[]"],"indices":[0]}, + {"cls":"com.lambdaworks.redis.cluster.api.async.RedisClusterAsyncCommands","name":"auth","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.lambdaworks.redis.cluster.api.reactive.RedisClusterReactiveCommands","name":"auth","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.lambdaworks.redis.cluster.api.sync.RedisClusterCommands","name":"auth","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.lambdaworks.redis.codec.ByteArrayCodec","name":"encodeKey","args":["byte[]"],"indices":[0]}, + {"cls":"com.lambdaworks.redis.protocol.CommandArgs$ExperimentalByteArrayCodec","name":"encodeKey","args":["io.netty.buffer.ByteBuf","byte[]"],"indices":[1]}, + {"cls":"com.lambdaworks.redis.support.LettuceFactoryBeanSupport","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.orientechnologies.orient.graph.batch.OGraphBatchInsert","name":"OGraphBatchInsert","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"com.orientechnologies.orient.graph.batch.OGraphBatchInsertBasic","name":"OGraphBatchInsertBasic","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"com.payneteasy.superfly.crypto.CryptoServiceImpl","name":"setCryptoSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"com.tinkerpop.blueprints.impls.orient.OrientBaseGraph","name":"OrientBaseGraph","args":["com.orientechnologies.orient.core.db.ODatabaseDocumentInternal","java.lang.String","java.lang.String","com.tinkerpop.blueprints.impls.orient.OrientConfigurableGraph$Settings"],"indices":[2]}, + {"cls":"com.tinkerpop.blueprints.impls.orient.OrientBaseGraph","name":"OrientBaseGraph","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"com.tinkerpop.blueprints.impls.orient.OrientGraph","name":"OrientGraph","args":["com.orientechnologies.orient.core.db.ODatabaseDocumentInternal","java.lang.String","java.lang.String","com.tinkerpop.blueprints.impls.orient.OrientConfigurableGraph$Settings"],"indices":[2]}, + {"cls":"com.tinkerpop.blueprints.impls.orient.OrientGraph","name":"OrientGraph","args":["java.lang.String","java.lang.String","java.lang.String","boolean"],"indices":[2]}, + {"cls":"com.tinkerpop.blueprints.impls.orient.OrientGraph","name":"OrientGraph","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"com.tinkerpop.blueprints.impls.orient.OrientGraphFactory","name":"OrientGraphFactory","args":["java.lang.String","java.lang.String","java.lang.String","boolean"],"indices":[2]}, + {"cls":"com.tinkerpop.blueprints.impls.orient.OrientGraphFactory","name":"OrientGraphFactory","args":["java.lang.String","java.lang.String","java.lang.String","com.orientechnologies.orient.core.db.OPartitionedDatabasePool"],"indices":[2]}, + {"cls":"com.tinkerpop.blueprints.impls.orient.OrientGraphFactory","name":"OrientGraphFactory","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"com.tinkerpop.blueprints.impls.orient.OrientGraphFactory$OrientGraphImplFactory","name":"getGraph","args":["com.orientechnologies.orient.core.db.ODatabaseDocumentInternal","java.lang.String","java.lang.String","com.tinkerpop.blueprints.impls.orient.OrientConfigurableGraph$Settings"],"indices":[2]}, + {"cls":"com.tinkerpop.blueprints.impls.orient.OrientGraphFactory$OrientGraphImplFactory","name":"getGraph","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"com.tinkerpop.blueprints.impls.orient.OrientGraphFactoryV2","name":"OrientGraphFactoryV2","args":["com.orientechnologies.orient.core.db.OrientDB","java.lang.String","java.lang.String","java.lang.String"],"indices":[3]}, + {"cls":"com.tinkerpop.blueprints.impls.orient.OrientGraphNoTx","name":"OrientGraphNoTx","args":["com.orientechnologies.orient.core.db.ODatabaseDocumentInternal","java.lang.String","java.lang.String","com.tinkerpop.blueprints.impls.orient.OrientConfigurableGraph$Settings"],"indices":[2]}, + {"cls":"com.tinkerpop.blueprints.impls.orient.OrientGraphNoTx","name":"OrientGraphNoTx","args":["com.orientechnologies.orient.core.db.ODatabaseDocumentInternal","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"com.tinkerpop.blueprints.impls.orient.OrientGraphNoTx","name":"OrientGraphNoTx","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"com.tinkerpop.blueprints.impls.orient.OrientTransactionalGraph","name":"OrientTransactionalGraph","args":["java.lang.String","java.lang.String","java.lang.String","boolean"],"indices":[2]}, + {"cls":"com.tinkerpop.blueprints.impls.orient.OrientTransactionalGraph","name":"OrientTransactionalGraph","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"com.wix.mysql.config.MysqldConfig$Builder","name":"withUser","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"de.mkammerer.easykrypto.symmetric.Keys","name":"createFromPassword","args":["char[]","de.mkammerer.easykrypto.symmetric.Salt","int"],"indices":[0]}, + {"cls":"de.mkammerer.easykrypto.symmetric.Keys","name":"createFromPassword","args":["char[]","de.mkammerer.easykrypto.symmetric.Salt"],"indices":[0]}, + {"cls":"de.mkammerer.easykrypto.symmetric.impl.KeysImpl","name":"createFromPassword","args":["char[]","de.mkammerer.easykrypto.symmetric.Salt","int"],"indices":[0]}, + {"cls":"de.mkammerer.easykrypto.symmetric.impl.KeysImpl","name":"createFromPassword","args":["char[]","de.mkammerer.easykrypto.symmetric.Salt"],"indices":[0]}, + {"cls":"io.vertx.ext.auth.HashingAlgorithm","name":"hash","args":["io.vertx.ext.auth.HashString","java.lang.String"],"indices":[1]}, + {"cls":"io.vertx.ext.auth.HashingStrategy","name":"hash","args":["java.lang.String","java.util.Map","java.lang.String","java.lang.String"],"indices":[3]}, + {"cls":"io.vertx.ext.auth.HashingStrategy","name":"verify","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"io.vertx.ext.auth.KeyStoreOptions","name":"putPasswordProtection","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"io.vertx.ext.auth.KeyStoreOptions","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"io.vertx.ext.auth.KeyStoreOptions","name":"setPasswordProtection","args":["java.util.Map"],"indices":[0]}, + {"cls":"io.vertx.ext.auth.PubSecKeyOptions","name":"setSecretKey","args":["java.lang.String"],"indices":[0]}, + {"cls":"io.vertx.ext.auth.authentication.UsernamePasswordCredentials","name":"UsernamePasswordCredentials","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"io.vertx.ext.auth.authentication.UsernamePasswordCredentials","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"io.vertx.ext.auth.oauth2.OAuth2Options","name":"setClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"io.vertx.ext.auth.oauth2.Oauth2Credentials","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.AmazonCognitoAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[3]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.AmazonCognitoAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[3]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.AzureADAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.AzureADAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.BoxAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.BoxAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.CloudFoundryAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.CloudFoundryAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.DropboxAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.DropboxAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.FacebookAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.FacebookAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.FoursquareAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.FoursquareAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.GitLabAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[3]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.GitLabAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","java.lang.String"],"indices":[3]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.GitLabAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.GiteeAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.GiteeAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.GithubAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.GithubAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.GoogleAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.GoogleAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.HerokuAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.HerokuAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.IBMCloudAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[3]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.IBMCloudAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[3]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.InstagramAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.InstagramAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.LinkedInAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.LinkedInAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.LiveAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.LiveAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.MailchimpAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.MailchimpAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.SalesforceAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.SalesforceAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.ShopifyAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.ShopifyAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.SoundcloudAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.SoundcloudAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.StripeAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.StripeAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.TwitterAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String","io.vertx.core.http.HttpClientOptions"],"indices":[2]}, + {"cls":"io.vertx.ext.auth.oauth2.providers.TwitterAuth","name":"create","args":["io.vertx.core.Vertx","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"jakarta.security.auth.message.callback.PasswordValidationCallback","name":"PasswordValidationCallback","args":["javax.security.auth.Subject","java.lang.String","char[]"],"indices":[2]}, + {"cls":"java.net.PasswordAuthentication","name":"PasswordAuthentication","args":["java.lang.String","char[]"],"indices":[1]}, + {"cls":"java.security.KeyStore","name":"getKey","args":["java.lang.String","char[]"],"indices":[1]}, + {"cls":"java.security.KeyStore","name":"load","args":["java.io.InputStream","char[]"],"indices":[1]}, + {"cls":"java.security.KeyStore","name":"setKeyEntry","args":["java.lang.String","byte[]","java.security.cert.Certificate[]"],"indices":[1]}, + {"cls":"java.security.KeyStore","name":"setKeyEntry","args":["java.lang.String","java.security.Key","char[]","java.security.cert.Certificate[]"],"indices":[2]}, + {"cls":"java.security.KeyStore","name":"store","args":["java.io.OutputStream","char[]"],"indices":[1]}, + {"cls":"java.security.KeyStore$PasswordProtection","name":"PasswordProtection","args":["char[]","java.lang.String","java.security.spec.AlgorithmParameterSpec"],"indices":[0]}, + {"cls":"java.security.KeyStore$PasswordProtection","name":"PasswordProtection","args":["char[]"],"indices":[0]}, + {"cls":"java.security.KeyStoreSpi","name":"engineGetKey","args":["java.lang.String","char[]"],"indices":[1]}, + {"cls":"java.security.KeyStoreSpi","name":"engineLoad","args":["java.io.InputStream","char[]"],"indices":[1]}, + {"cls":"java.security.KeyStoreSpi","name":"engineSetKeyEntry","args":["java.lang.String","byte[]","java.security.cert.Certificate[]"],"indices":[1]}, + {"cls":"java.security.KeyStoreSpi","name":"engineSetKeyEntry","args":["java.lang.String","java.security.Key","char[]","java.security.cert.Certificate[]"],"indices":[2]}, + {"cls":"java.security.KeyStoreSpi","name":"engineStore","args":["java.io.OutputStream","char[]"],"indices":[1]}, + {"cls":"java.security.cert.X509CertSelector","name":"setSubjectPublicKey","args":["byte[]"],"indices":[0]}, + {"cls":"java.sql.DriverManager","name":"getConnection","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"javax.crypto.KeyAgreement","name":"generateSecret","args":["byte[]","int"],"indices":[0]}, + {"cls":"javax.crypto.KeyAgreementSpi","name":"engineGenerateSecret","args":["byte[]","int"],"indices":[0]}, + {"cls":"javax.crypto.spec.DESKeySpec","name":"DESKeySpec","args":["byte[]","int"],"indices":[0]}, + {"cls":"javax.crypto.spec.DESKeySpec","name":"DESKeySpec","args":["byte[]"],"indices":[0]}, + {"cls":"javax.crypto.spec.DESKeySpec","name":"isParityAdjusted","args":["byte[]","int"],"indices":[0]}, + {"cls":"javax.crypto.spec.DESKeySpec","name":"isWeak","args":["byte[]","int"],"indices":[0]}, + {"cls":"javax.crypto.spec.DESedeKeySpec","name":"DESedeKeySpec","args":["byte[]","int"],"indices":[0]}, + {"cls":"javax.crypto.spec.DESedeKeySpec","name":"DESedeKeySpec","args":["byte[]"],"indices":[0]}, + {"cls":"javax.crypto.spec.DESedeKeySpec","name":"isParityAdjusted","args":["byte[]","int"],"indices":[0]}, + {"cls":"javax.crypto.spec.PBEKeySpec","name":"PBEKeySpec","args":["char[]","byte[]","int","int"],"indices":[0]}, + {"cls":"javax.crypto.spec.PBEKeySpec","name":"PBEKeySpec","args":["char[]","byte[]","int"],"indices":[0]}, + {"cls":"javax.crypto.spec.PBEKeySpec","name":"PBEKeySpec","args":["char[]"],"indices":[0]}, + {"cls":"javax.crypto.spec.SecretKeySpec","name":"SecretKeySpec","args":["byte[]","int","int","java.lang.String"],"indices":[0]}, + {"cls":"javax.crypto.spec.SecretKeySpec","name":"SecretKeySpec","args":["byte[]","java.lang.String"],"indices":[0]}, + {"cls":"javax.net.ssl.KeyManagerFactory","name":"init","args":["java.security.KeyStore","char[]"],"indices":[1]}, + {"cls":"javax.net.ssl.KeyManagerFactorySpi","name":"engineInit","args":["java.security.KeyStore","char[]"],"indices":[1]}, + {"cls":"javax.security.auth.callback.PasswordCallback","name":"setPassword","args":["char[]"],"indices":[0]}, + {"cls":"javax.security.auth.kerberos.KerberosKey","name":"KerberosKey","args":["javax.security.auth.kerberos.KerberosPrincipal","char[]","java.lang.String"],"indices":[1]}, + {"cls":"javax.security.auth.message.callback.PasswordValidationCallback","name":"PasswordValidationCallback","args":["javax.security.auth.Subject","java.lang.String","char[]"],"indices":[2]}, + {"cls":"javax.security.auth.message.callback.PasswordValidationCallback","name":"PasswordValidationCallback","args":["javax.security.auth.Subject","java.lang.String","char[]"],"indices":[2]}, + {"cls":"javax.servlet.http.HttpServletRequest","name":"login","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"javax.servlet.http.HttpServletRequestWrapper","name":"login","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"javax.sql.ConnectionPoolDataSource","name":"getPooledConnection","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"javax.sql.DataSource","name":"getConnection","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"javax.sql.RowSet","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"javax.sql.XADataSource","name":"getXAConnection","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"liquibase.database.DatabaseFactory","name":"openConnection","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","liquibase.resource.ResourceAccessor"],"indices":[2]}, + {"cls":"liquibase.database.DatabaseFactory","name":"openConnection","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","liquibase.resource.ResourceAccessor"],"indices":[2]}, + {"cls":"liquibase.database.DatabaseFactory","name":"openDatabase","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","liquibase.resource.ResourceAccessor"],"indices":[2]}, + {"cls":"liquibase.database.DatabaseFactory","name":"openDatabase","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","liquibase.resource.ResourceAccessor"],"indices":[2]}, + {"cls":"liquibase.integration.ant.type.DatabaseType","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"liquibase.integration.commandline.CommandLineUtils","name":"createDatabaseObject","args":["java.lang.ClassLoader","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","boolean","boolean","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[3]}, + {"cls":"liquibase.integration.commandline.CommandLineUtils","name":"createDatabaseObject","args":["liquibase.resource.ResourceAccessor","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","boolean","boolean","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[3]}, + {"cls":"net.theblackchamber.crypto.model.KeyConfig","name":"KeyConfig","args":["java.io.File","java.lang.String","java.lang.Integer","net.theblackchamber.crypto.constants.SupportedKeyGenAlgorithms","java.lang.String"],"indices":[1]}, + {"cls":"net.theblackchamber.crypto.model.KeyConfig","name":"setKeyStorePassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"net.theblackchamber.crypto.util.KeystoreUtils","name":"getSecretKey","args":["java.io.File","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"net.theblackchamber.crypto.util.KeystoreUtils","name":"getSecretKey","args":["java.io.InputStream","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"org.apache.cassandra.auth.PasswordAuthenticator","name":"checkpw","args":["java.lang.String","java.lang.String"],"indices":[0]}, + {"cls":"org.apache.cassandra.cache.RowCacheKey","name":"RowCacheKey","args":["org.apache.cassandra.schema.TableId","java.lang.String","byte[]"],"indices":[2]}, + {"cls":"org.apache.cassandra.config.EncryptionOptions","name":"EncryptionOptions","args":["org.apache.cassandra.config.ParameterizedClass","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.util.List","java.lang.String","java.util.List","java.lang.String","java.lang.String","boolean","boolean","java.lang.Boolean","java.lang.Boolean"],"indices":[2,4]}, + {"cls":"org.apache.cassandra.config.EncryptionOptions","name":"withKeyStorePassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.cassandra.config.EncryptionOptions","name":"withTrustStorePassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.cassandra.config.EncryptionOptions$ServerEncryptionOptions","name":"ServerEncryptionOptions","args":["org.apache.cassandra.config.ParameterizedClass","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.util.List","java.lang.String","java.util.List","java.lang.String","java.lang.String","boolean","boolean","java.lang.Boolean","org.apache.cassandra.config.EncryptionOptions$ServerEncryptionOptions$InternodeEncryption","boolean"],"indices":[2,4]}, + {"cls":"org.apache.cassandra.config.EncryptionOptions$ServerEncryptionOptions","name":"withKeyStorePassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.cassandra.config.EncryptionOptions$ServerEncryptionOptions","name":"withTrustStorePassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.cassandra.hadoop.ConfigHelper","name":"setInputKeyspacePassword","args":["org.apache.hadoop.conf.Configuration","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cassandra.hadoop.ConfigHelper","name":"setInputKeyspaceUserNameAndPassword","args":["org.apache.hadoop.conf.Configuration","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"org.apache.cassandra.hadoop.ConfigHelper","name":"setOutputKeyspacePassword","args":["org.apache.hadoop.conf.Configuration","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cassandra.hadoop.ConfigHelper","name":"setOutputKeyspaceUserNameAndPassword","args":["org.apache.hadoop.conf.Configuration","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"org.apache.cassandra.hadoop.cql3.CqlConfigHelper","name":"setUserNameAndPassword","args":["org.apache.hadoop.conf.Configuration","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"org.apache.cassandra.security.PEMReader","name":"extractPrivateKey","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cassandra.tools.AbstractJmxClient","name":"AbstractJmxClient","args":["java.lang.String","java.lang.Integer","java.lang.String","java.lang.String"],"indices":[3]}, + {"cls":"org.apache.cassandra.tools.INodeProbeFactory","name":"create","args":["java.lang.String","int","java.lang.String","java.lang.String"],"indices":[3]}, + {"cls":"org.apache.cassandra.tools.NodeProbe","name":"NodeProbe","args":["java.lang.String","int","java.lang.String","java.lang.String"],"indices":[3]}, + {"cls":"org.apache.cassandra.utils.NativeSSTableLoaderClient","name":"NativeSSTableLoaderClient","args":["java.util.Collection","int","java.lang.String","java.lang.String","com.datastax.driver.core.SSLOptions"],"indices":[3]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"HmacUtils","args":["java.lang.String","byte[]"],"indices":[1]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"HmacUtils","args":["org.apache.commons.codec.digest.HmacAlgorithms","byte[]"],"indices":[1]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"getHmacMd5","args":["byte[]"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"getHmacSha1","args":["byte[]"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"getHmacSha256","args":["byte[]"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"getHmacSha384","args":["byte[]"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"getHmacSha512","args":["byte[]"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"getInitializedMac","args":["java.lang.String","byte[]"],"indices":[1]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"getInitializedMac","args":["org.apache.commons.codec.digest.HmacAlgorithms","byte[]"],"indices":[1]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacMd5","args":["byte[]","byte[]"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacMd5","args":["byte[]","java.io.InputStream"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacMd5Hex","args":["byte[]","byte[]"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacMd5Hex","args":["byte[]","java.io.InputStream"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacSha1","args":["byte[]","byte[]"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacSha1","args":["byte[]","java.io.InputStream"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacSha1Hex","args":["byte[]","byte[]"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacSha1Hex","args":["byte[]","java.io.InputStream"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacSha256","args":["byte[]","byte[]"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacSha256","args":["byte[]","java.io.InputStream"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacSha256Hex","args":["byte[]","byte[]"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacSha256Hex","args":["byte[]","java.io.InputStream"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacSha384","args":["byte[]","byte[]"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacSha384","args":["byte[]","java.io.InputStream"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacSha384Hex","args":["byte[]","byte[]"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacSha384Hex","args":["byte[]","java.io.InputStream"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacSha512","args":["byte[]","byte[]"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacSha512","args":["byte[]","java.io.InputStream"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacSha512Hex","args":["byte[]","byte[]"],"indices":[0]}, + {"cls":"org.apache.commons.codec.digest.HmacUtils","name":"hmacSha512Hex","args":["byte[]","java.io.InputStream"],"indices":[0]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoInputStream","name":"CtrCryptoInputStream","args":["java.io.InputStream","org.apache.commons.crypto.cipher.CryptoCipher","int","byte[]","byte[]","long"],"indices":[3]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoInputStream","name":"CtrCryptoInputStream","args":["java.io.InputStream","org.apache.commons.crypto.cipher.CryptoCipher","int","byte[]","byte[]"],"indices":[3]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoInputStream","name":"CtrCryptoInputStream","args":["java.nio.channels.ReadableByteChannel","org.apache.commons.crypto.cipher.CryptoCipher","int","byte[]","byte[]","long"],"indices":[3]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoInputStream","name":"CtrCryptoInputStream","args":["java.nio.channels.ReadableByteChannel","org.apache.commons.crypto.cipher.CryptoCipher","int","byte[]","byte[]"],"indices":[3]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoInputStream","name":"CtrCryptoInputStream","args":["java.util.Properties","java.io.InputStream","byte[]","byte[]","long"],"indices":[2]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoInputStream","name":"CtrCryptoInputStream","args":["java.util.Properties","java.io.InputStream","byte[]","byte[]"],"indices":[2]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoInputStream","name":"CtrCryptoInputStream","args":["java.util.Properties","java.nio.channels.ReadableByteChannel","byte[]","byte[]","long"],"indices":[2]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoInputStream","name":"CtrCryptoInputStream","args":["java.util.Properties","java.nio.channels.ReadableByteChannel","byte[]","byte[]"],"indices":[2]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoInputStream","name":"CtrCryptoInputStream","args":["org.apache.commons.crypto.stream.input.Input","org.apache.commons.crypto.cipher.CryptoCipher","int","byte[]","byte[]","long"],"indices":[3]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoInputStream","name":"CtrCryptoInputStream","args":["org.apache.commons.crypto.stream.input.Input","org.apache.commons.crypto.cipher.CryptoCipher","int","byte[]","byte[]"],"indices":[3]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoOutputStream","name":"CtrCryptoOutputStream","args":["java.io.OutputStream","org.apache.commons.crypto.cipher.CryptoCipher","int","byte[]","byte[]","long"],"indices":[3]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoOutputStream","name":"CtrCryptoOutputStream","args":["java.io.OutputStream","org.apache.commons.crypto.cipher.CryptoCipher","int","byte[]","byte[]"],"indices":[3]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoOutputStream","name":"CtrCryptoOutputStream","args":["java.nio.channels.WritableByteChannel","org.apache.commons.crypto.cipher.CryptoCipher","int","byte[]","byte[]","long"],"indices":[3]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoOutputStream","name":"CtrCryptoOutputStream","args":["java.nio.channels.WritableByteChannel","org.apache.commons.crypto.cipher.CryptoCipher","int","byte[]","byte[]"],"indices":[3]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoOutputStream","name":"CtrCryptoOutputStream","args":["java.util.Properties","java.io.OutputStream","byte[]","byte[]","long"],"indices":[2]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoOutputStream","name":"CtrCryptoOutputStream","args":["java.util.Properties","java.io.OutputStream","byte[]","byte[]"],"indices":[2]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoOutputStream","name":"CtrCryptoOutputStream","args":["java.util.Properties","java.nio.channels.WritableByteChannel","byte[]","byte[]","long"],"indices":[2]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoOutputStream","name":"CtrCryptoOutputStream","args":["java.util.Properties","java.nio.channels.WritableByteChannel","byte[]","byte[]"],"indices":[2]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoOutputStream","name":"CtrCryptoOutputStream","args":["org.apache.commons.crypto.stream.output.Output","org.apache.commons.crypto.cipher.CryptoCipher","int","byte[]","byte[]","long"],"indices":[3]}, + {"cls":"org.apache.commons.crypto.stream.CtrCryptoOutputStream","name":"CtrCryptoOutputStream","args":["org.apache.commons.crypto.stream.output.Output","org.apache.commons.crypto.cipher.CryptoCipher","int","byte[]","byte[]"],"indices":[3]}, + {"cls":"org.apache.commons.crypto.stream.PositionedCryptoInputStream","name":"PositionedCryptoInputStream","args":["java.util.Properties","org.apache.commons.crypto.stream.input.Input","byte[]","byte[]","long"],"indices":[2]}, + {"cls":"org.apache.commons.crypto.stream.PositionedCryptoInputStream","name":"PositionedCryptoInputStream","args":["java.util.Properties","org.apache.commons.crypto.stream.input.Input","org.apache.commons.crypto.cipher.CryptoCipher","int","byte[]","byte[]","long"],"indices":[4]}, + {"cls":"org.apache.cxf.rs.security.oauth2.client.Consumer","name":"Consumer","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.client.Consumer","name":"setClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.cxf.rs.security.oauth2.common.Client","name":"Client","args":["java.lang.String","java.lang.String","boolean","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.common.Client","name":"Client","args":["java.lang.String","java.lang.String","boolean","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.common.Client","name":"Client","args":["java.lang.String","java.lang.String","boolean"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.grants.clientcred.ClientCredentialsGrant","name":"setClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.cxf.rs.security.oauth2.grants.code.JwtRequestCodeGrant","name":"setClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.cxf.rs.security.oauth2.grants.owner.JAASResourceOwnerLoginHandler","name":"createSubject","args":["org.apache.cxf.rs.security.oauth2.common.Client","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"org.apache.cxf.rs.security.oauth2.grants.owner.ResourceOwnerGrant","name":"ResourceOwnerGrant","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.grants.owner.ResourceOwnerGrant","name":"ResourceOwnerGrant","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.grants.owner.ResourceOwnerGrant","name":"ResourceOwnerGrant","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.grants.owner.ResourceOwnerLoginHandler","name":"createSubject","args":["org.apache.cxf.rs.security.oauth2.common.Client","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"org.apache.cxf.rs.security.oauth2.provider.AbstractOAuthDataProvider","name":"authenticateUnregisteredClient","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.provider.AbstractOAuthDataProvider","name":"createClientCredentialsClient","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.provider.ClientSecretHashVerifier","name":"validateClientSecret","args":["org.apache.cxf.rs.security.oauth2.common.Client","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.provider.ClientSecretVerifier","name":"validateClientSecret","args":["org.apache.cxf.rs.security.oauth2.common.Client","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.provider.OAuthJoseJwtConsumer","name":"getInitializedDecryptionProvider","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.cxf.rs.security.oauth2.provider.OAuthJoseJwtConsumer","name":"getInitializedSignatureVerifier","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.cxf.rs.security.oauth2.provider.OAuthJoseJwtConsumer","name":"getJwtToken","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.provider.OAuthJoseJwtProducer","name":"getInitializedEncryptionProvider","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.cxf.rs.security.oauth2.provider.OAuthJoseJwtProducer","name":"getInitializedSignatureProvider","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.cxf.rs.security.oauth2.provider.OAuthJoseJwtProducer","name":"processJwt","args":["org.apache.cxf.rs.security.jose.jwt.JwtToken","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.provider.ProviderAuthenticationStrategy","name":"authenticate","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.services.AbstractOAuthService","name":"getValidClient","args":["java.lang.String","java.lang.String","javax.ws.rs.core.MultivaluedMap"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.services.AbstractTokenService","name":"getAndValidateClientFromIdAndSecret","args":["java.lang.String","java.lang.String","javax.ws.rs.core.MultivaluedMap"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.services.AbstractTokenService","name":"getClient","args":["java.lang.String","java.lang.String","javax.ws.rs.core.MultivaluedMap"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.services.AbstractTokenService","name":"isConfidenatialClientSecretValid","args":["org.apache.cxf.rs.security.oauth2.common.Client","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.services.ClientRegistrationResponse","name":"setClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.cxf.rs.security.oauth2.tokens.hawk.HawkAuthorizationScheme","name":"toAuthorizationHeader","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.utils.OAuthUtils","name":"getClientSecretDecryptionProvider","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.cxf.rs.security.oauth2.utils.OAuthUtils","name":"getClientSecretEncryptionProvider","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.cxf.rs.security.oauth2.utils.OAuthUtils","name":"getClientSecretSignatureProvider","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.cxf.rs.security.oauth2.utils.OAuthUtils","name":"getClientSecretSignatureVerifier","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.cxf.rs.security.oauth2.utils.crypto.ModelEncryptionSupport","name":"decryptAccessToken","args":["org.apache.cxf.rs.security.oauth2.provider.OAuthDataProvider","java.lang.String","java.lang.String","org.apache.cxf.rt.security.crypto.KeyProperties"],"indices":[2]}, + {"cls":"org.apache.cxf.rs.security.oauth2.utils.crypto.ModelEncryptionSupport","name":"decryptAccessToken","args":["org.apache.cxf.rs.security.oauth2.provider.OAuthDataProvider","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"org.apache.cxf.rs.security.oauth2.utils.crypto.ModelEncryptionSupport","name":"decryptClient","args":["java.lang.String","java.lang.String","org.apache.cxf.rt.security.crypto.KeyProperties"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.utils.crypto.ModelEncryptionSupport","name":"decryptClient","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.cxf.rs.security.oauth2.utils.crypto.ModelEncryptionSupport","name":"decryptCodeGrant","args":["org.apache.cxf.rs.security.oauth2.provider.OAuthDataProvider","java.lang.String","java.lang.String","org.apache.cxf.rt.security.crypto.KeyProperties"],"indices":[2]}, + {"cls":"org.apache.cxf.rs.security.oauth2.utils.crypto.ModelEncryptionSupport","name":"decryptCodeGrant","args":["org.apache.cxf.rs.security.oauth2.provider.OAuthDataProvider","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"org.apache.cxf.rs.security.oauth2.utils.crypto.ModelEncryptionSupport","name":"decryptRefreshToken","args":["org.apache.cxf.rs.security.oauth2.provider.OAuthDataProvider","java.lang.String","java.lang.String","org.apache.cxf.rt.security.crypto.KeyProperties"],"indices":[2]}, + {"cls":"org.apache.cxf.rs.security.oauth2.utils.crypto.ModelEncryptionSupport","name":"decryptRefreshToken","args":["org.apache.cxf.rs.security.oauth2.provider.OAuthDataProvider","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"org.apache.hadoop.security.authentication.util.RolloverSignerSecretProvider","name":"initSecrets","args":["byte[]","byte[]"],"indices":[0,1]}, + {"cls":"org.apache.hadoop.security.authentication.util.Signer","name":"computeSignature","args":["byte[]","java.lang.String"],"indices":[0]}, + {"cls":"org.apache.logging.log4j.core.appender.SmtpAppender","name":"createAppender","args":["org.apache.logging.log4j.core.config.Configuration","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","org.apache.logging.log4j.core.Layout","org.apache.logging.log4j.core.Filter","java.lang.String"],"indices":[12]}, + {"cls":"org.apache.logging.log4j.core.appender.SmtpAppender$Builder","name":"setSmtpPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.logging.log4j.core.appender.db.jdbc.AbstractDriverManagerConnectionSource","name":"AbstractDriverManagerConnectionSource","args":["java.lang.String","java.lang.String","java.lang.String","char[]","char[]","org.apache.logging.log4j.core.config.Property[]"],"indices":[4]}, + {"cls":"org.apache.logging.log4j.core.appender.db.jdbc.AbstractDriverManagerConnectionSource$Builder","name":"setPassword","args":["char[]"],"indices":[0]}, + {"cls":"org.apache.logging.log4j.core.appender.db.jdbc.DriverManagerConnectionSource","name":"DriverManagerConnectionSource","args":["java.lang.String","java.lang.String","java.lang.String","char[]","char[]","org.apache.logging.log4j.core.config.Property[]"],"indices":[4]}, + {"cls":"org.apache.logging.log4j.core.appender.mom.JmsAppender$Builder","name":"setPassword","args":["char[]"],"indices":[0]}, + {"cls":"org.apache.logging.log4j.core.appender.mom.JmsAppender$Builder","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.logging.log4j.core.appender.mom.JmsManager","name":"getJmsManager","args":["java.lang.String","java.util.Properties","java.lang.String","java.lang.String","java.lang.String","char[]","boolean","long"],"indices":[5]}, + {"cls":"org.apache.logging.log4j.core.net.SmtpManager","name":"getSmtpManager","args":["org.apache.logging.log4j.core.config.Configuration","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","int","java.lang.String","java.lang.String","boolean","java.lang.String","int","org.apache.logging.log4j.core.net.ssl.SslConfiguration"],"indices":[11]}, + {"cls":"org.apache.logging.log4j.core.net.ssl.AbstractKeyStoreConfiguration","name":"AbstractKeyStoreConfiguration","args":["java.lang.String","char[]","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.logging.log4j.core.net.ssl.AbstractKeyStoreConfiguration","name":"AbstractKeyStoreConfiguration","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.logging.log4j.core.net.ssl.KeyStoreConfiguration","name":"KeyStoreConfiguration","args":["java.lang.String","char[]","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.logging.log4j.core.net.ssl.KeyStoreConfiguration","name":"KeyStoreConfiguration","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.logging.log4j.core.net.ssl.KeyStoreConfiguration","name":"createKeyStoreConfiguration","args":["java.lang.String","char[]","java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.logging.log4j.core.net.ssl.KeyStoreConfiguration","name":"createKeyStoreConfiguration","args":["java.lang.String","char[]","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.logging.log4j.core.net.ssl.KeyStoreConfiguration","name":"createKeyStoreConfiguration","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.logging.log4j.core.net.ssl.StoreConfiguration","name":"StoreConfiguration","args":["java.lang.String","char[]"],"indices":[1]}, + {"cls":"org.apache.logging.log4j.core.net.ssl.StoreConfiguration","name":"StoreConfiguration","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.logging.log4j.core.net.ssl.StoreConfiguration","name":"setPassword","args":["char[]"],"indices":[0]}, + {"cls":"org.apache.logging.log4j.core.net.ssl.StoreConfiguration","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.apache.logging.log4j.core.net.ssl.TrustStoreConfiguration","name":"TrustStoreConfiguration","args":["java.lang.String","char[]","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.logging.log4j.core.net.ssl.TrustStoreConfiguration","name":"TrustStoreConfiguration","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.logging.log4j.core.net.ssl.TrustStoreConfiguration","name":"createKeyStoreConfiguration","args":["java.lang.String","char[]","java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.logging.log4j.core.net.ssl.TrustStoreConfiguration","name":"createKeyStoreConfiguration","args":["java.lang.String","char[]","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.logging.log4j.core.net.ssl.TrustStoreConfiguration","name":"createKeyStoreConfiguration","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.apache.logging.log4j.core.util.PasswordDecryptor","name":"decryptPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.bouncycastle.cert.cmp.ProtectedPKIMessage","name":"verify","args":["org.bouncycastle.cert.crmf.PKMACBuilder","char[]"],"indices":[1]}, + {"cls":"org.bouncycastle.cert.crmf.CertificateRequestMessage","name":"isValidSigningKeyPOP","args":["org.bouncycastle.operator.ContentVerifierProvider","org.bouncycastle.cert.crmf.PKMACBuilder","char[]"],"indices":[2]}, + {"cls":"org.bouncycastle.cert.crmf.CertificateRequestMessageBuilder","name":"setAuthInfoPKMAC","args":["org.bouncycastle.cert.crmf.PKMACBuilder","char[]"],"indices":[1]}, + {"cls":"org.bouncycastle.cert.crmf.PKMACBuilder","name":"build","args":["char[]"],"indices":[0]}, + {"cls":"org.bouncycastle.cert.crmf.ProofOfPossessionSigningKeyBuilder","name":"setPublicKeyMac","args":["org.bouncycastle.cert.crmf.PKMACValueGenerator","char[]"],"indices":[1]}, + {"cls":"org.bouncycastle.cms.PasswordRecipientInfoGenerator","name":"PasswordRecipientInfoGenerator","args":["org.bouncycastle.asn1.ASN1ObjectIdentifier","char[]","int","int"],"indices":[1]}, + {"cls":"org.bouncycastle.cms.PasswordRecipientInfoGenerator","name":"PasswordRecipientInfoGenerator","args":["org.bouncycastle.asn1.ASN1ObjectIdentifier","char[]"],"indices":[1]}, + {"cls":"org.bouncycastle.cms.bc.BcPasswordEnvelopedRecipient","name":"BcPasswordEnvelopedRecipient","args":["char[]"],"indices":[0]}, + {"cls":"org.bouncycastle.cms.bc.BcPasswordRecipientInfoGenerator","name":"BcPasswordRecipientInfoGenerator","args":["org.bouncycastle.asn1.ASN1ObjectIdentifier","char[]"],"indices":[1]}, + {"cls":"org.bouncycastle.cms.jcajce.JcePasswordAuthenticatedRecipient","name":"JcePasswordAuthenticatedRecipient","args":["char[]"],"indices":[0]}, + {"cls":"org.bouncycastle.cms.jcajce.JcePasswordEnvelopedRecipient","name":"JcePasswordEnvelopedRecipient","args":["char[]"],"indices":[0]}, + {"cls":"org.bouncycastle.cms.jcajce.JcePasswordRecipientInfoGenerator","name":"JcePasswordRecipientInfoGenerator","args":["org.bouncycastle.asn1.ASN1ObjectIdentifier","char[]"],"indices":[1]}, + {"cls":"org.bouncycastle.openssl.bc.BcPEMDecryptorProvider","name":"BcPEMDecryptorProvider","args":["char[]"],"indices":[0]}, + {"cls":"org.bouncycastle.openssl.jcajce.JceOpenSSLPKCS8DecryptorProviderBuilder","name":"build","args":["char[]"],"indices":[0]}, + {"cls":"org.bouncycastle.openssl.jcajce.JceOpenSSLPKCS8EncryptorBuilder","name":"setPasssword","args":["char[]"],"indices":[0]}, + {"cls":"org.bouncycastle.openssl.jcajce.JceOpenSSLPKCS8EncryptorBuilder","name":"setPassword","args":["char[]"],"indices":[0]}, + {"cls":"org.bouncycastle.openssl.jcajce.JcePEMDecryptorProviderBuilder","name":"build","args":["char[]"],"indices":[0]}, + {"cls":"org.bouncycastle.openssl.jcajce.JcePEMEncryptorBuilder","name":"build","args":["char[]"],"indices":[0]}, + {"cls":"org.bouncycastle.pkcs.PKCS12MacCalculatorBuilder","name":"build","args":["char[]"],"indices":[0]}, + {"cls":"org.bouncycastle.pkcs.PKCS12PfxPdu","name":"isMacValid","args":["org.bouncycastle.pkcs.PKCS12MacCalculatorBuilderProvider","char[]"],"indices":[1]}, + {"cls":"org.bouncycastle.pkcs.PKCS12PfxPduBuilder","name":"build","args":["org.bouncycastle.pkcs.PKCS12MacCalculatorBuilder","char[]"],"indices":[1]}, + {"cls":"org.bouncycastle.pkcs.bc.BcPKCS12MacCalculatorBuilder","name":"build","args":["char[]"],"indices":[0]}, + {"cls":"org.bouncycastle.pkcs.bc.BcPKCS12PBEInputDecryptorProviderBuilder","name":"build","args":["char[]"],"indices":[0]}, + {"cls":"org.bouncycastle.pkcs.bc.BcPKCS12PBEOutputEncryptorBuilder","name":"build","args":["char[]"],"indices":[0]}, + {"cls":"org.bouncycastle.pkcs.jcajce.JcePKCS12MacCalculatorBuilder","name":"build","args":["char[]"],"indices":[0]}, + {"cls":"org.bouncycastle.pkcs.jcajce.JcePKCSPBEInputDecryptorProviderBuilder","name":"build","args":["char[]"],"indices":[0]}, + {"cls":"org.bouncycastle.pkcs.jcajce.JcePKCSPBEOutputEncryptorBuilder","name":"build","args":["char[]"],"indices":[0]}, + {"cls":"org.h2.command.ddl.CreateLinkedTable","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.h2.engine.ConnectionInfo","name":"setFileEncryptionKey","args":["byte[]"],"indices":[0]}, + {"cls":"org.h2.engine.Database","name":"getLinkConnection","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[3]}, + {"cls":"org.h2.engine.User","name":"setUserPasswordHash","args":["byte[]"],"indices":[0]}, + {"cls":"org.h2.jdbcx.JdbcConnectionPool","name":"create","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"org.h2.jdbcx.JdbcConnectionPool","name":"getConnection","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.h2.jdbcx.JdbcDataSource","name":"getConnection","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.h2.jdbcx.JdbcDataSource","name":"getPooledConnection","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.h2.jdbcx.JdbcDataSource","name":"getXAConnection","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.h2.jdbcx.JdbcDataSource","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.h2.jdbcx.JdbcDataSource","name":"setPasswordChars","args":["char[]"],"indices":[0]}, + {"cls":"org.h2.mvstore.MVStore$Builder","name":"encryptionKey","args":["char[]"],"indices":[0]}, + {"cls":"org.h2.mvstore.db.Store","name":"Store","args":["org.h2.engine.Database","byte[]"],"indices":[1]}, + {"cls":"org.h2.schema.Schema","name":"createTableLink","args":["int","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","boolean","boolean"],"indices":[5]}, + {"cls":"org.h2.security.AES","name":"setKey","args":["byte[]"],"indices":[0]}, + {"cls":"org.h2.security.BlockCipher","name":"setKey","args":["byte[]"],"indices":[0]}, + {"cls":"org.h2.security.CipherFactory","name":"getKeyStore","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.h2.security.Fog","name":"setKey","args":["byte[]"],"indices":[0]}, + {"cls":"org.h2.security.SHA256","name":"getHMAC","args":["byte[]","byte[]"],"indices":[0]}, + {"cls":"org.h2.security.SHA256","name":"getKeyPasswordHash","args":["java.lang.String","char[]"],"indices":[1]}, + {"cls":"org.h2.security.SHA256","name":"getPBKDF2","args":["byte[]","byte[]","int","int"],"indices":[0]}, + {"cls":"org.h2.security.SecureFileStore","name":"SecureFileStore","args":["org.h2.store.DataHandler","java.lang.String","java.lang.String","java.lang.String","byte[]","int"],"indices":[4]}, + {"cls":"org.h2.security.auth.impl.StaticUserCredentialsValidator","name":"StaticUserCredentialsValidator","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.h2.server.TcpServer","name":"shutdown","args":["java.lang.String","java.lang.String","boolean","boolean"],"indices":[1]}, + {"cls":"org.h2.server.TcpServer","name":"stopServer","args":["int","java.lang.String","int"],"indices":[1]}, + {"cls":"org.h2.store.FileStore","name":"open","args":["org.h2.store.DataHandler","java.lang.String","java.lang.String","java.lang.String","byte[]","int"],"indices":[4]}, + {"cls":"org.h2.store.FileStore","name":"open","args":["org.h2.store.DataHandler","java.lang.String","java.lang.String","java.lang.String","byte[]"],"indices":[4]}, + {"cls":"org.h2.store.fs.encrypt.FilePathEncrypt","name":"getPasswordBytes","args":["char[]"],"indices":[0]}, + {"cls":"org.h2.table.TableLink","name":"TableLink","args":["org.h2.schema.Schema","int","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","boolean","boolean"],"indices":[6]}, + {"cls":"org.h2.table.TableLinkConnection","name":"open","args":["java.util.HashMap","java.lang.String","java.lang.String","java.lang.String","java.lang.String","boolean"],"indices":[4]}, + {"cls":"org.h2.tools.ChangeFileEncryption","name":"execute","args":["java.lang.String","java.lang.String","java.lang.String","char[]","char[]","boolean"],"indices":[3,4]}, + {"cls":"org.h2.tools.CreateCluster","name":"execute","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[3]}, + {"cls":"org.h2.tools.RunScript","name":"execute","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.nio.charset.Charset","boolean"],"indices":[2]}, + {"cls":"org.h2.tools.Script","name":"process","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"org.h2.tools.Server","name":"shutdownTcpServer","args":["java.lang.String","java.lang.String","boolean","boolean"],"indices":[1]}, + {"cls":"org.h2.util.JdbcUtils","name":"getConnection","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","org.h2.util.NetworkConnectionInfo","boolean"],"indices":[3]}, + {"cls":"org.h2.util.JdbcUtils","name":"getConnection","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[3]}, + {"cls":"org.jasypt.encryption.pbe.CleanablePasswordBased","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.PasswordBased","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.PooledPBEBigDecimalEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.PooledPBEBigDecimalEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.PooledPBEBigIntegerEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.PooledPBEBigIntegerEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.PooledPBEByteEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.PooledPBEByteEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.PooledPBEStringEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.PooledPBEStringEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.StandardPBEBigDecimalEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.StandardPBEBigDecimalEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.StandardPBEBigIntegerEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.StandardPBEBigIntegerEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.StandardPBEByteEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.StandardPBEByteEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.StandardPBEStringEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.StandardPBEStringEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.config.EnvironmentPBEConfig","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.config.EnvironmentPBEConfig","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.config.SimplePBEConfig","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.encryption.pbe.config.SimplePBEConfig","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.intf.service.JasyptStatelessService","name":"decrypt","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.jasypt.intf.service.JasyptStatelessService","name":"encrypt","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.jasypt.spring31.xml.encryption.EncryptorFactoryBean","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.binary.AES256BinaryEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.binary.AES256BinaryEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.util.binary.BasicBinaryEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.binary.BasicBinaryEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.util.binary.StrongBinaryEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.binary.StrongBinaryEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.util.numeric.AES256DecimalNumberEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.numeric.AES256DecimalNumberEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.util.numeric.AES256IntegerNumberEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.numeric.AES256IntegerNumberEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.util.numeric.BasicDecimalNumberEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.numeric.BasicDecimalNumberEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.util.numeric.BasicIntegerNumberEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.numeric.BasicIntegerNumberEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.util.numeric.StrongDecimalNumberEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.numeric.StrongDecimalNumberEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.util.numeric.StrongIntegerNumberEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.numeric.StrongIntegerNumberEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.util.password.BasicPasswordEncryptor","name":"checkPassword","args":["java.lang.String","java.lang.String"],"indices":[0,1]}, + {"cls":"org.jasypt.util.password.BasicPasswordEncryptor","name":"encryptPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.password.ConfigurablePasswordEncryptor","name":"checkPassword","args":["java.lang.String","java.lang.String"],"indices":[0,1]}, + {"cls":"org.jasypt.util.password.ConfigurablePasswordEncryptor","name":"encryptPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.password.PasswordEncryptor","name":"checkPassword","args":["java.lang.String","java.lang.String"],"indices":[0,1]}, + {"cls":"org.jasypt.util.password.PasswordEncryptor","name":"encryptPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.password.StrongPasswordEncryptor","name":"checkPassword","args":["java.lang.String","java.lang.String"],"indices":[0,1]}, + {"cls":"org.jasypt.util.password.StrongPasswordEncryptor","name":"encryptPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.password.rfc2307.RFC2307MD5PasswordEncryptor","name":"checkPassword","args":["java.lang.String","java.lang.String"],"indices":[0,1]}, + {"cls":"org.jasypt.util.password.rfc2307.RFC2307MD5PasswordEncryptor","name":"encryptPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.password.rfc2307.RFC2307SHAPasswordEncryptor","name":"checkPassword","args":["java.lang.String","java.lang.String"],"indices":[0,1]}, + {"cls":"org.jasypt.util.password.rfc2307.RFC2307SHAPasswordEncryptor","name":"encryptPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.password.rfc2307.RFC2307SMD5PasswordEncryptor","name":"checkPassword","args":["java.lang.String","java.lang.String"],"indices":[0,1]}, + {"cls":"org.jasypt.util.password.rfc2307.RFC2307SMD5PasswordEncryptor","name":"encryptPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.password.rfc2307.RFC2307SSHAPasswordEncryptor","name":"checkPassword","args":["java.lang.String","java.lang.String"],"indices":[0,1]}, + {"cls":"org.jasypt.util.password.rfc2307.RFC2307SSHAPasswordEncryptor","name":"encryptPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.text.AES256TextEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.text.AES256TextEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.util.text.BasicTextEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.text.BasicTextEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.jasypt.util.text.StrongTextEncryptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.jasypt.util.text.StrongTextEncryptor","name":"setPasswordCharArray","args":["char[]"],"indices":[0]}, + {"cls":"org.neo4j.driver.AuthTokens","name":"basic","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.neo4j.driver.AuthTokens","name":"basic","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.postgresql.ds.PGConnectionPoolDataSource","name":"getPooledConnection","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.postgresql.ds.common.BaseDataSource","name":"setSslpassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.postgresql.jre7.sasl.ScramAuthenticator","name":"ScramAuthenticator","args":["java.lang.String","java.lang.String","org.postgresql.core.PGStream"],"indices":[1]}, + {"cls":"org.postgresql.util.MD5Digest","name":"encode","args":["byte[]","byte[]","byte[]"],"indices":[1]}, + {"cls":"org.scribe.builder.ServiceBuilder","name":"apiSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.scribe.model.OAuthConfig","name":"OAuthConfig","args":["java.lang.String","java.lang.String","java.lang.String","org.scribe.model.SignatureType","java.lang.String","java.io.OutputStream"],"indices":[1]}, + {"cls":"org.scribe.model.OAuthConfig","name":"OAuthConfig","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.scribe.model.Token","name":"Token","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.scribe.model.Token","name":"Token","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.scribe.services.HMACSha1SignatureService","name":"getSignature","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[1,2]}, + {"cls":"org.scribe.services.PlaintextSignatureService","name":"getSignature","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[1,2]}, + {"cls":"org.scribe.services.RSASha1SignatureService","name":"getSignature","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[1,2]}, + {"cls":"org.scribe.services.SignatureService","name":"getSignature","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[1,2]}, + {"cls":"org.springframework.boot.autoconfigure.amqp.RabbitProperties","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.amqp.RabbitProperties$Stream","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.cassandra.CassandraProperties","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.couchbase.CouchbaseProperties","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.couchbase.CouchbaseProperties$Ssl","name":"setKeyStorePassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.data.redis.RedisProperties","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.data.redis.RedisProperties$Sentinel","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchProperties","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.flyway.FlywayProperties","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.h2.H2ConsoleProperties$Settings","name":"setWebAdminPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.influx.InfluxDbProperties","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.jdbc.DataSourceProperties","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.jms.activemq.ActiveMQProperties","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.jms.artemis.ArtemisProperties","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.jms.artemis.ArtemisProperties$Embedded","name":"setClusterPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.kafka.KafkaProperties$Ssl","name":"setKeyPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.kafka.KafkaProperties$Ssl","name":"setKeyStorePassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.kafka.KafkaProperties$Ssl","name":"setTrustStorePassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.ldap.LdapProperties","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapProperties$Credential","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.mail.MailProperties","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.mongo.MongoProperties","name":"setPassword","args":["char[]"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.neo4j.Neo4jProperties$Authentication","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.r2dbc.R2dbcProperties","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.security.SecurityProperties$User","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.security.oauth2.OAuth2ClientProperties","name":"setClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.security.oauth2.client.ClientProperties","name":"setClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientProperties$Registration","name":"setClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.security.oauth2.resource.OAuth2ResourceServerProperties$Opaquetoken","name":"setClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.boot.autoconfigure.security.oauth2.resource.ResourceServerProperties","name":"ResourceServerProperties","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.springframework.boot.autoconfigure.sql.init.SqlInitializationProperties","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.http.HttpHeaders","name":"encodeBasicAuth","args":["java.lang.String","java.lang.String","java.nio.charset.Charset"],"indices":[1]}, + {"cls":"org.springframework.http.HttpHeaders","name":"setBasicAuth","args":["java.lang.String","java.lang.String","java.nio.charset.Charset"],"indices":[1]}, + {"cls":"org.springframework.http.HttpHeaders","name":"setBasicAuth","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.springframework.http.client.support.BasicAuthenticationInterceptor","name":"BasicAuthenticationInterceptor","args":["java.lang.String","java.lang.String","java.nio.charset.Charset"],"indices":[1]}, + {"cls":"org.springframework.http.client.support.BasicAuthenticationInterceptor","name":"BasicAuthenticationInterceptor","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.springframework.http.client.support.BasicAuthorizationInterceptor","name":"BasicAuthorizationInterceptor","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.springframework.mail.javamail.JavaMailSenderImpl","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.mock.web.MockHttpServletRequest","name":"login","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.springframework.remoting.caucho.HessianClientInterceptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.remoting.jaxws.JaxWsPortClientInterceptor","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.argon2.Argon2PasswordEncoder","name":"encode","args":["java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.argon2.Argon2PasswordEncoder","name":"matches","args":["java.lang.CharSequence","java.lang.String"],"indices":[0,1]}, + {"cls":"org.springframework.security.crypto.argon2.Argon2PasswordEncoder","name":"upgradeEncoding","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.bcrypt.BCrypt","name":"checkpw","args":["byte[]","java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.bcrypt.BCrypt","name":"hashpw","args":["byte[]","java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.bcrypt.BCrypt","name":"hashpw","args":["java.lang.String","java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder","name":"encode","args":["java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder","name":"matches","args":["java.lang.CharSequence","java.lang.String"],"indices":[0,1]}, + {"cls":"org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder","name":"upgradeEncoding","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.encrypt.AesBytesEncryptor","name":"AesBytesEncryptor","args":["java.lang.String","java.lang.CharSequence","org.springframework.security.crypto.keygen.BytesKeyGenerator","org.springframework.security.crypto.encrypt.AesBytesEncryptor$CipherAlgorithm"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.encrypt.AesBytesEncryptor","name":"AesBytesEncryptor","args":["java.lang.String","java.lang.CharSequence","org.springframework.security.crypto.keygen.BytesKeyGenerator"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.encrypt.AesBytesEncryptor","name":"AesBytesEncryptor","args":["java.lang.String","java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.encrypt.BouncyCastleAesCbcBytesEncryptor","name":"BouncyCastleAesCbcBytesEncryptor","args":["java.lang.String","java.lang.CharSequence","org.springframework.security.crypto.keygen.BytesKeyGenerator"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.encrypt.BouncyCastleAesCbcBytesEncryptor","name":"BouncyCastleAesCbcBytesEncryptor","args":["java.lang.String","java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.encrypt.BouncyCastleAesGcmBytesEncryptor","name":"BouncyCastleAesGcmBytesEncryptor","args":["java.lang.String","java.lang.CharSequence","org.springframework.security.crypto.keygen.BytesKeyGenerator"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.encrypt.BouncyCastleAesGcmBytesEncryptor","name":"BouncyCastleAesGcmBytesEncryptor","args":["java.lang.String","java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.encrypt.Encryptors","name":"delux","args":["java.lang.CharSequence","java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.encrypt.Encryptors","name":"queryableText","args":["java.lang.CharSequence","java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.encrypt.Encryptors","name":"standard","args":["java.lang.CharSequence","java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.encrypt.Encryptors","name":"stronger","args":["java.lang.CharSequence","java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.encrypt.Encryptors","name":"text","args":["java.lang.CharSequence","java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.password.AbstractPasswordEncoder","name":"encode","args":["java.lang.CharSequence","byte[]"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.password.AbstractPasswordEncoder","name":"encode","args":["java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.password.AbstractPasswordEncoder","name":"encodeAndConcatenate","args":["java.lang.CharSequence","byte[]"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.password.AbstractPasswordEncoder","name":"matches","args":["java.lang.CharSequence","java.lang.String"],"indices":[0,1]}, + {"cls":"org.springframework.security.crypto.password.DelegatingPasswordEncoder","name":"encode","args":["java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.password.DelegatingPasswordEncoder","name":"matches","args":["java.lang.CharSequence","java.lang.String"],"indices":[0,1]}, + {"cls":"org.springframework.security.crypto.password.DelegatingPasswordEncoder","name":"upgradeEncoding","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.password.LdapShaPasswordEncoder","name":"matches","args":["java.lang.CharSequence","java.lang.String"],"indices":[0,1]}, + {"cls":"org.springframework.security.crypto.password.Md4PasswordEncoder","name":"encode","args":["java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.password.Md4PasswordEncoder","name":"matches","args":["java.lang.CharSequence","java.lang.String"],"indices":[0,1]}, + {"cls":"org.springframework.security.crypto.password.MessageDigestPasswordEncoder","name":"encode","args":["java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.password.MessageDigestPasswordEncoder","name":"matches","args":["java.lang.CharSequence","java.lang.String"],"indices":[0,1]}, + {"cls":"org.springframework.security.crypto.password.NoOpPasswordEncoder","name":"encode","args":["java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.password.NoOpPasswordEncoder","name":"matches","args":["java.lang.CharSequence","java.lang.String"],"indices":[0,1]}, + {"cls":"org.springframework.security.crypto.password.PasswordEncoder","name":"encode","args":["java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.password.PasswordEncoder","name":"matches","args":["java.lang.CharSequence","java.lang.String"],"indices":[0,1]}, + {"cls":"org.springframework.security.crypto.password.PasswordEncoder","name":"upgradeEncoding","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.password.Pbkdf2PasswordEncoder","name":"Pbkdf2PasswordEncoder","args":["java.lang.CharSequence","int","int","int"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.password.Pbkdf2PasswordEncoder","name":"Pbkdf2PasswordEncoder","args":["java.lang.CharSequence","int","int"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.password.Pbkdf2PasswordEncoder","name":"Pbkdf2PasswordEncoder","args":["java.lang.CharSequence","int"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.password.Pbkdf2PasswordEncoder","name":"Pbkdf2PasswordEncoder","args":["java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.password.Pbkdf2PasswordEncoder","name":"encode","args":["java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.password.Pbkdf2PasswordEncoder","name":"matches","args":["java.lang.CharSequence","java.lang.String"],"indices":[0,1]}, + {"cls":"org.springframework.security.crypto.password.StandardPasswordEncoder","name":"StandardPasswordEncoder","args":["java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.password.StandardPasswordEncoder","name":"encode","args":["java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.password.StandardPasswordEncoder","name":"matches","args":["java.lang.CharSequence","java.lang.String"],"indices":[0,1]}, + {"cls":"org.springframework.security.crypto.scrypt.SCryptPasswordEncoder","name":"encode","args":["java.lang.CharSequence"],"indices":[0]}, + {"cls":"org.springframework.security.crypto.scrypt.SCryptPasswordEncoder","name":"matches","args":["java.lang.CharSequence","java.lang.String"],"indices":[0,1]}, + {"cls":"org.springframework.security.crypto.scrypt.SCryptPasswordEncoder","name":"upgradeEncoding","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.security.ldap.authentication.AbstractLdapAuthenticationProvider","name":"loadUserAuthorities","args":["org.springframework.ldap.core.DirContextOperations","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"org.springframework.security.ldap.authentication.LdapAuthenticationProvider","name":"loadUserAuthorities","args":["org.springframework.ldap.core.DirContextOperations","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"org.springframework.security.ldap.authentication.PasswordComparisonAuthenticator","name":"setPasswordAttributeName","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider","name":"loadUserAuthorities","args":["org.springframework.ldap.core.DirContextOperations","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"org.springframework.security.ldap.userdetails.LdapUserDetailsImpl$Essence","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.security.ldap.userdetails.LdapUserDetailsManager","name":"changePassword","args":["java.lang.String","java.lang.String"],"indices":[0,1]}, + {"cls":"org.springframework.security.ldap.userdetails.LdapUserDetailsManager","name":"setPasswordAttributeName","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.security.ldap.userdetails.LdapUserDetailsMapper","name":"setPasswordAttributeName","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.security.oauth2.client.resource.BaseOAuth2ProtectedResourceDetails","name":"setClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.security.oauth2.client.test.TestAccounts","name":"getClientCredentialsResource","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.springframework.security.oauth2.client.test.TestAccounts","name":"getResourceOwnerPasswordResource","args":["java.lang.String[]","java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[2,4]}, + {"cls":"org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordResourceDetails","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.security.oauth2.provider.ClientRegistrationService","name":"updateClientSecret","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.springframework.security.oauth2.provider.client.BaseClientDetails","name":"setClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.security.oauth2.provider.client.JdbcClientDetailsService","name":"setUpdateClientSecretSql","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.security.oauth2.provider.client.JdbcClientDetailsService","name":"updateClientSecret","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.springframework.security.oauth2.provider.token.RemoteTokenServices","name":"setClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.springframework.security.oauth2.provider.token.store.KeyStoreKeyFactory","name":"KeyStoreKeyFactory","args":["org.springframework.core.io.Resource","char[]"],"indices":[1]}, + {"cls":"org.springframework.security.oauth2.provider.token.store.KeyStoreKeyFactory","name":"getKeyPair","args":["java.lang.String","char[]"],"indices":[1]}, + {"cls":"org.wso2.carbon.identity.oauth.Parameters","name":"setAuthorizedbyUserPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.wso2.carbon.identity.oauth.Parameters","name":"setOauthTokenSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.wso2.carbon.identity.oauth.dao.OAuthAppDO","name":"setOauthConsumerSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.wso2.carbon.identity.oauth.dao.OAuthConsumerDAO","name":"createOAuthRequestToken","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"org.wso2.carbon.identity.oauth.dao.OAuthConsumerDAO","name":"getAuthenticatedUsername","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.wso2.carbon.identity.oauth.dao.OAuthConsumerDAO","name":"isConsumerSecretExist","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.wso2.carbon.identity.oauth.dao.OAuthConsumerDAO","name":"issueAccessToken","args":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"org.wso2.carbon.identity.oauth.dao.OAuthConsumerDAO","name":"updateSecretKey","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.wso2.carbon.identity.oauth.dto.OAuthConsumerAppDTO","name":"setOauthConsumerSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.wso2.carbon.identity.oauth.dto.OAuthRevocationRequestDTO","name":"setConsumerSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.wso2.carbon.identity.oauth.tokenprocessor.EncryptionDecryptionPersistenceProcessor","name":"getPreprocessedClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.wso2.carbon.identity.oauth.tokenprocessor.EncryptionDecryptionPersistenceProcessor","name":"getProcessedClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.wso2.carbon.identity.oauth.tokenprocessor.HashingPersistenceProcessor","name":"getPreprocessedClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.wso2.carbon.identity.oauth.tokenprocessor.HashingPersistenceProcessor","name":"getProcessedClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.wso2.carbon.identity.oauth.tokenprocessor.PlainTextPersistenceProcessor","name":"getPreprocessedClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.wso2.carbon.identity.oauth.tokenprocessor.PlainTextPersistenceProcessor","name":"getProcessedClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.wso2.carbon.identity.oauth.tokenprocessor.TokenPersistenceProcessor","name":"getPreprocessedClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.wso2.carbon.identity.oauth.tokenprocessor.TokenPersistenceProcessor","name":"getProcessedClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.wso2.carbon.identity.oauth2.dto.OAuth2AccessTokenReqDTO","name":"setClientSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.wso2.carbon.identity.oauth2.dto.OAuth2AccessTokenReqDTO","name":"setResourceOwnerPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.wso2.carbon.identity.oauth2.dto.OAuth2AuthorizeReqDTO","name":"setPassword","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.wso2.carbon.identity.oauth2.dto.OAuthRevocationRequestDTO","name":"setConsumerSecret","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.wso2.carbon.identity.oauth2.model.ClientCredentialDO","name":"ClientCredentialDO","args":["java.lang.String"],"indices":[0]}, + {"cls":"org.wso2.carbon.identity.oauth2.token.handlers.grant.saml.CarbonKeyStoreCredentialResolver","name":"CarbonKeyStoreCredentialResolver","args":["java.security.KeyStore","java.util.Map"],"indices":[1]}, + {"cls":"org.wso2.carbon.identity.oauth2.util.OAuth2Util","name":"authenticateClient","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"org.wso2.carbon.identity.oauth2.util.OAuth2Util","name":"getAuthenticatedUsername","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"ru.yandex.qatools.embed.postgresql.EmbeddedPostgres","name":"start","args":["de.flapdoodle.embed.process.config.IRuntimeConfig","java.lang.String","int","java.lang.String","java.lang.String","java.lang.String","java.util.List","java.util.List"],"indices":[5]}, + {"cls":"ru.yandex.qatools.embed.postgresql.EmbeddedPostgres","name":"start","args":["de.flapdoodle.embed.process.config.IRuntimeConfig","java.lang.String","int","java.lang.String","java.lang.String","java.lang.String","java.util.List"],"indices":[5]}, + {"cls":"ru.yandex.qatools.embed.postgresql.EmbeddedPostgres","name":"start","args":["java.lang.String","int","java.lang.String","java.lang.String","java.lang.String","java.util.List"],"indices":[4]}, + {"cls":"ru.yandex.qatools.embed.postgresql.EmbeddedPostgres","name":"start","args":["java.lang.String","int","java.lang.String","java.lang.String","java.lang.String"],"indices":[4]}, + {"cls":"ru.yandex.qatools.embed.postgresql.config.AbstractPostgresConfig$Credentials","name":"Credentials","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"ru.yandex.qatools.embed.postgresql.config.PostgresConfig","name":"defaultWithDbName","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[2]}, + {"cls":"software.amazon.awssdk.auth.credentials.AwsBasicCredentials","name":"AwsBasicCredentials","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"software.amazon.awssdk.auth.credentials.AwsBasicCredentials","name":"create","args":["java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"software.amazon.awssdk.auth.credentials.AwsSessionCredentials","name":"create","args":["java.lang.String","java.lang.String","java.lang.String"],"indices":[1]}, + {"cls":"software.amazon.awssdk.auth.signer.internal.AbstractAwsS3V4Signer","name":"processRequestPayload","args":["software.amazon.awssdk.http.SdkHttpFullRequest$Builder","byte[]","byte[]","software.amazon.awssdk.auth.signer.internal.Aws4SignerRequestParams","software.amazon.awssdk.auth.signer.params.AwsS3V4SignerParams","software.amazon.awssdk.core.checksums.SdkChecksum"],"indices":[2]}, + {"cls":"software.amazon.awssdk.auth.signer.internal.AbstractAwsS3V4Signer","name":"processRequestPayload","args":["software.amazon.awssdk.http.SdkHttpFullRequest$Builder","byte[]","byte[]","software.amazon.awssdk.auth.signer.internal.Aws4SignerRequestParams","software.amazon.awssdk.auth.signer.params.AwsS3V4SignerParams"],"indices":[2]}, + {"cls":"software.amazon.awssdk.auth.signer.internal.AbstractAwsSigner","name":"sign","args":["byte[]","byte[]","software.amazon.awssdk.auth.signer.internal.SigningAlgorithm"],"indices":[1]}, + {"cls":"software.amazon.awssdk.auth.signer.internal.AbstractAwsSigner","name":"sign","args":["java.lang.String","byte[]","software.amazon.awssdk.auth.signer.internal.SigningAlgorithm"],"indices":[1]}, + {"cls":"software.amazon.awssdk.auth.signer.internal.BaseAws4Signer","name":"processRequestPayload","args":["software.amazon.awssdk.http.SdkHttpFullRequest$Builder","byte[]","byte[]","software.amazon.awssdk.auth.signer.internal.Aws4SignerRequestParams","software.amazon.awssdk.auth.signer.params.Aws4SignerParams","software.amazon.awssdk.core.checksums.SdkChecksum"],"indices":[2]}, + {"cls":"software.amazon.awssdk.auth.signer.internal.BaseAws4Signer","name":"processRequestPayload","args":["software.amazon.awssdk.http.SdkHttpFullRequest$Builder","byte[]","byte[]","software.amazon.awssdk.auth.signer.internal.Aws4SignerRequestParams","software.amazon.awssdk.auth.signer.params.Aws4SignerParams"],"indices":[2]}, + {"cls":"software.amazon.awssdk.auth.signer.internal.SignerKey","name":"SignerKey","args":["java.time.Instant","byte[]"],"indices":[1]}, + {"cls":"software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsS3V4ChunkSigner","name":"AwsS3V4ChunkSigner","args":["byte[]","java.lang.String","java.lang.String"],"indices":[0]} +] diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1291_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/NoSonar.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1291_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/NoSonar.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1291_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/NoSonar.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1291_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/NoSonar.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S100_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S100.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S100_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S100.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S100_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S100.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S100_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S100.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S101_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S101.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S101_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S101.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S101_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S101.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S101_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S101.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S103_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S103.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S103_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S103.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S103_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S103.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S103_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S103.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S104_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S104.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S104_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S104.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S104_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S104.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S104_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S104.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S105_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S105.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S105_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S105.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S105_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S105.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S105_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S105.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S106_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S106.html similarity index 86% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S106_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S106.html index 36b4f96f946..946c75758b0 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S106_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S106.html @@ -19,8 +19,8 @@

See

diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S106_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S106.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S106_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S106.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1065_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1065.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1065_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1065.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1065_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1065.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1065_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1065.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1066_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1066.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1066_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1066.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1066_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1066.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1066_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1066.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1067_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1067.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1067_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1067.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1067_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1067.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1067_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1067.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1068_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1068.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1068_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1068.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1068_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1068.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1068_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1068.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S107_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S107.html similarity index 77% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S107_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S107.html index 552433098e5..43ca4638a38 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S107_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S107.html @@ -21,6 +21,9 @@

Exceptions

  • Bean constructor injection with @org.springframework.beans.factory.annotation.Autowired
  • CDI constructor injection with @javax.inject.Inject
  • @com.fasterxml.jackson.annotation.JsonCreator
  • +
  • Micronaut’s annotations (like @io.micronaut.http.annotation.Get)
  • may have a lot of parameters, encapsulation being possible. Such methods are therefore ignored.

    +

    Also, if a class annotated as a Spring component (like @org.springframework.stereotype.Component) has a single constructor, that +constructor will be considered @Autowired and ignored by the rule.

    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S107_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S107.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S107_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S107.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1075_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1075.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1075_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1075.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1075_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1075.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1075_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1075.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S108_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S108.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S108_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S108.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S108_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S108.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S108_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S108.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S109_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S109.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S109_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S109.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S109_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S109.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S109_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S109.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S110_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S110.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S110_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S110.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S110_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S110.json similarity index 93% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S110_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S110.json index 9756dde45c7..0c2102ea9d1 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S110_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S110.json @@ -6,7 +6,7 @@ "func": "Linear with offset", "linearDesc": "Number of parents above the defined threshold", "linearOffset": "4h", - "linearFactor": "30mn" + "linearFactor": "30min" }, "tags": [ "design" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1104_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1104.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1104_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1104.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1104_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1104.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1104_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1104.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1105_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1105.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1105_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1105.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1105_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1105.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1105_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1105.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1106_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1106.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1106_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1106.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1106_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1106.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1106_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1106.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1107_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1107.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1107_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1107.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1107_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1107.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1107_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1107.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1108_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1108.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1108_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1108.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1108_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1108.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1108_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1108.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1109_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1109.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1109_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1109.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1109_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1109.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1109_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1109.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1110_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1110.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1110_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1110.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1110_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1110.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1110_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1110.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1111_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1111.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1111_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1111.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1111_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1111.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1111_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1111.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1113_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1113.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1113_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1113.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1113_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1113.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1113_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1113.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1114_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1114.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1114_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1114.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1114_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1114.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1114_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1114.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1116_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1116.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1116_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1116.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1116_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1116.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1116_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1116.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1117_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1117.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1117_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1117.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1117_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1117.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1117_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1117.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1118_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1118.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1118_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1118.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1118_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1118.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1118_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1118.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1119_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1119.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1119_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1119.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1119_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1119.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1119_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1119.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S112_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S112.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S112_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S112.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S112_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S112.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S112_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S112.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1120_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1120.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1120_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1120.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1120_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1120.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1120_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1120.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1121_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1121.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1121_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1121.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1121_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1121.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1121_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1121.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1123_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1123.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1123_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1123.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1123_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1123.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1123_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1123.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1124_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1124.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1124_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1124.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1124_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1124.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1124_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1124.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1125_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1125.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1125_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1125.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1125_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1125.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1125_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1125.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1126_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1126.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1126_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1126.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1126_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1126.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1126_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1126.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1128_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1128.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1128_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1128.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1128_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1128.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1128_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1128.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S113_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S113.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S113_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S113.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S113_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S113.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S113_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S113.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1130_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1130.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1130_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1130.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1130_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1130.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1130_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1130.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1132_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1132.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1132_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1132.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1132_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1132.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1132_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1132.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1133_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1133.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1133_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1133.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1133_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1133.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1133_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1133.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1134_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1134.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1134_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1134.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1134_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1134.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1134_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1134.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1135_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1135.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1135_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1135.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1135_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1135.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1135_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1135.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S114_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S114.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S114_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S114.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S114_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S114.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S114_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S114.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1141_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1141.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1141_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1141.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1141_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1141.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1141_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1141.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1142_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1142.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1142_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1142.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1142_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1142.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1142_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1142.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1143_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1143.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1143_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1143.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1143_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1143.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1143_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1143.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1144_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1144.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1144_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1144.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1144_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1144.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1144_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1144.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1147_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1147.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1147_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1147.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1147_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1147.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1147_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1147.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1149_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1149.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1149_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1149.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1149_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1149.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1149_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1149.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S115_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S115.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S115_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S115.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S115_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S115.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S115_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S115.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1150_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1150.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1150_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1150.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1150_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1150.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1150_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1150.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1151_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1151.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1151_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1151.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1151_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1151.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1151_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1151.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1153_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1153.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1153_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1153.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1153_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1153.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1153_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1153.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1155_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1155.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1155_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1155.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1155_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1155.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1155_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1155.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1157_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1157.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1157_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1157.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1157_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1157.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1157_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1157.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1158_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1158.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1158_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1158.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1158_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1158.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1158_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1158.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S116_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S116.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S116_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S116.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S116_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S116.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S116_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S116.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1160_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1160.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1160_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1160.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1160_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1160.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1160_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1160.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1161_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1161.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1161_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1161.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1161_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1161.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1161_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1161.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1162_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1162.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1162_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1162.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1162_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1162.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1162_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1162.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1163_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1163.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1163_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1163.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1163_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1163.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1163_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1163.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1165_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1165.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1165_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1165.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1165_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1165.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1165_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1165.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1166_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1166.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1166_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1166.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1166_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1166.json similarity index 89% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1166_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1166.json index 2c21fd265f9..e514f0798bf 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1166_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1166.json @@ -29,6 +29,11 @@ ], "OWASP Top 10 2021": [ "A9" + ], + "ASVS 4.0": [ + "7.1.3", + "7.1.4", + "7.2.1" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1168_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1168.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1168_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1168.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1168_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1168.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1168_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1168.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S117_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S117.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S117_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S117.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S117_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S117.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S117_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S117.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1170_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1170.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1170_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1170.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1170_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1170.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1170_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1170.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1171_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1171.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1171_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1171.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1171_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1171.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1171_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1171.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1172_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1172.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1172_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1172.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1172_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1172.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1172_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1172.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1174_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1174.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1174_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1174.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1174_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1174.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1174_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1174.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1175_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1175.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1175_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1175.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1175_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1175.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1175_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1175.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1176_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1176.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1176_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1176.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1176_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1176.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1176_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1176.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S118_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S118.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S118_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S118.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S118_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S118.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S118_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S118.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1181_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1181.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1181_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1181.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1181_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1181.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1181_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1181.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1182_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1182.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1182_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1182.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1182_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1182.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1182_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1182.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1185_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1185.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1185_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1185.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1185_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1185.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1185_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1185.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1186_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1186.html similarity index 71% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1186_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1186.html index c91a3c76b72..ace7ee7f0dd 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1186_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1186.html @@ -25,7 +25,13 @@

    Compliant Solution

    }

    Exceptions

    -

    Default (no-argument) constructors are ignored when there are other constructors in the class, as are empty methods in abstract classes.

    +

    This does not raise an issue in the following cases:

    +
      +
    • Non-public default (no-argument) constructors
    • +
    • Public default (no-argument) constructors when there are other constructors in the class
    • +
    • Empty methods in abstract classes
    • +
    • Methods annotated with @org.aspectj.lang.annotation.Pointcut()
    • +
     public abstract class Animal {
       void speak() {  // default implementation ignored
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1186_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1186.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1186_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1186.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1188_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1188.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1188_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1188.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1188_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1188.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1188_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1188.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S119_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S119.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S119_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S119.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S119_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S119.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S119_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S119.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1190_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1190.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1190_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1190.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1190_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1190.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1190_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1190.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1191_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1191.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1191_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1191.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1191_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1191.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1191_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1191.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1192_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1192.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1192_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1192.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1192_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1192.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1192_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1192.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1193_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1193.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1193_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1193.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1193_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1193.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1193_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1193.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1194_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1194.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1194_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1194.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1194_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1194.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1194_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1194.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1195_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1195.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1195_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1195.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1195_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1195.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1195_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1195.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1197_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1197.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1197_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1197.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1197_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1197.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1197_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1197.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1199_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1199.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1199_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1199.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1199_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1199.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1199_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1199.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S120_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S120.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S120_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S120.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S120_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S120.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S120_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S120.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1200_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1200.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1200_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1200.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1200_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1200.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1200_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1200.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1201_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1201.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1201_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1201.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1201_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1201.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1201_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1201.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1206_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1206.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1206_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1206.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1206_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1206.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1206_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1206.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S121_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S121.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S121_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S121.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S121_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S121.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S121_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S121.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1210_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1210.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1210_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1210.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1210_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1210.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1210_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1210.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1213_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1213.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1213_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1213.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1213_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1213.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1213_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1213.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1214_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1214.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1214_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1214.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1214_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1214.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1214_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1214.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1215_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1215.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1215_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1215.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1215_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1215.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1215_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1215.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1217_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1217.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1217_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1217.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1217_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1217.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1217_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1217.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1219_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1219.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1219_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1219.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1219_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1219.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1219_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1219.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S122_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S122.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S122_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S122.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S122_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S122.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S122_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S122.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1220_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1220.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1220_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1220.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1220_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1220.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1220_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1220.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1221_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1221.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1221_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1221.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1221_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1221.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1221_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1221.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1223_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1223.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1223_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1223.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1223_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1223.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1223_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1223.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1226_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1226.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1226_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1226.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1226_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1226.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1226_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1226.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1228_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1228.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1228_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1228.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1228_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1228.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1228_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1228.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S124_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S124.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S124_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S124.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S124_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S124.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S124_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S124.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1244_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1244.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1244_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1244.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1244_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1244.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1244_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1244.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S125_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S125.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S125_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S125.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S125_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S125.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S125_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S125.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1258_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1258.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1258_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1258.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1258_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1258.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1258_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1258.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S126_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S126.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S126_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S126.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S126_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S126.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S126_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S126.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1264_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1264.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1264_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1264.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1264_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1264.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1264_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1264.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S127_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S127.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S127_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S127.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S127_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S127.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S127_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S127.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S128_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S128.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S128_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S128.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S128_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S128.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S128_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S128.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1301_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1301.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1301_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1301.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1301_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1301.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1301_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1301.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1309_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1309.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1309_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1309.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1309_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1309.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1309_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1309.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S131_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S131.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S131_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S131.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S131_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S131.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S131_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S131.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1310_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1310.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1310_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1310.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1310_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1310.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1310_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1310.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1312_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1312.html
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1312_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1312.html
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1312_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1312.json
    similarity index 100%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1312_java.json
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1312.json
    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1313_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1313.html
    similarity index 94%
    rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1313_java.html
    rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1313.html
    index 8f1ad651ca6..8648b39b783 100644
    --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1313_java.html
    +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1313.html
    @@ -47,8 +47,8 @@ 

    Exceptions

    See

    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1313_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1313.json similarity index 94% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1313_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1313.json index 695f1ebb5c8..efaab687f39 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1313_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1313.json @@ -24,5 +24,6 @@ "OWASP Top 10 2021": [ "A1" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1314_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1314.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1314_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1314.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1314_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1314.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1314_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1314.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1315_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1315.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1315_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1315.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1315_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1315.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1315_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1315.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1317_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1317.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1317_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1317.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1317_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1317.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1317_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1317.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1319_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1319.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1319_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1319.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1319_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1319.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1319_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1319.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S134_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S134.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S134_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S134.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S134_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S134.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S134_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S134.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S135_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S135.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S135_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S135.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S135_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S135.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S135_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S135.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S138_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S138.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S138_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S138.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S138_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S138.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S138_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S138.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S139_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S139.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S139_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S139.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S139_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S139.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S139_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S139.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1444_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1444.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1444_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1444.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1444_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1444.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1444_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1444.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1448_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1448.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1448_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1448.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1448_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1448.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1448_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1448.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1449_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1449.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1449_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1449.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1449_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1449.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1449_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1449.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1450_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1450.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1450_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1450.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1450_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1450.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1450_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1450.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1451_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1451.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1451_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1451.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1451_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1451.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1451_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1451.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1452_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1452.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1452_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1452.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1452_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1452.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1452_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1452.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1479_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1479.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1479_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1479.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1479_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1479.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1479_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1479.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1481_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1481.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1481_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1481.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1481_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1481.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1481_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1481.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1488_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1488.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1488_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1488.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1488_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1488.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1488_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1488.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1541_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1541.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1541_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1541.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1541_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1541.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1541_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1541.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1596_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1596.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1596_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1596.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1596_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1596.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1596_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1596.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1598_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1598.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1598_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1598.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1598_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1598.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1598_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1598.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1602_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1602.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1602_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1602.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1602_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1602.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1602_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1602.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1604_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1604.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1604_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1604.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1604_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1604.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1604_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1604.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1607_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1607.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1607_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1607.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1607_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1607.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1607_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1607.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1610_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1610.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1610_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1610.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1610_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1610.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1610_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1610.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1611_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1611.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1611_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1611.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1611_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1611.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1611_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1611.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1612_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1612.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1612_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1612.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1612_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1612.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1612_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1612.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1640_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1640.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1640_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1640.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1640_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1640.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1640_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1640.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1641_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1641.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1641_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1641.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1641_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1641.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1641_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1641.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1643_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1643.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1643_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1643.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1643_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1643.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1643_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1643.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1656_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1656.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1656_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1656.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1656_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1656.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1656_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1656.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1659_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1659.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1659_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1659.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1659_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1659.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1659_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1659.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1694_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1694.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1694_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1694.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1694_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1694.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1694_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1694.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1695_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1695.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1695_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1695.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1695_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1695.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1695_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1695.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1696_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1696.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1696_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1696.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1696_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1696.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1696_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1696.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1698_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1698.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1698_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1698.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1698_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1698.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1698_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1698.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1699_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1699.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1699_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1699.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1699_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1699.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1699_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1699.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1700_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1700.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1700_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1700.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1700_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1700.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1700_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1700.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1710_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1710.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1710_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1710.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1710_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1710.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1710_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1710.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1711_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1711.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1711_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1711.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1711_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1711.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1711_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1711.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1751_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1751.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1751_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1751.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1751_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1751.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1751_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1751.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1764_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1764.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1764_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1764.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1764_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1764.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1764_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1764.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1774_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1774.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1774_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1774.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1774_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1774.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1774_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1774.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1820_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1820.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1820_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1820.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1820_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1820.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1820_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1820.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1821_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1821.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1821_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1821.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1821_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1821.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1821_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1821.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1844_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1844.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1844_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1844.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1844_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1844.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1844_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1844.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1845_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1845.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1845_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1845.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1845_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1845.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1845_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1845.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1849_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1849.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1849_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1849.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1849_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1849.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1849_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1849.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1854_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1854.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1854_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1854.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1854_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1854.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1854_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1854.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1858_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1858.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1858_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1858.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1858_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1858.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1858_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1858.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1860_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1860.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1860_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1860.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1860_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1860.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1860_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1860.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1862_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1862.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1862_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1862.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1862_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1862.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1862_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1862.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1871_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1871.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1871_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1871.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1871_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1871.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1871_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1871.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1872_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1872.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1872_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1872.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1872_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1872.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1872_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1872.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1874_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1874.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1874_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1874.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1874_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1874.json similarity index 92% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1874_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1874.json index 36b963999f9..c3fa9b6a2eb 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1874_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1874.json @@ -21,6 +21,9 @@ ], "CWE": [ 477 + ], + "ASVS 4.0": [ + "1.14.6" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1905_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1905.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1905_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1905.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1905_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1905.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1905_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1905.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1939_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1939.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1939_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1939.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1939_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1939.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1939_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1939.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1940_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1940.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1940_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1940.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1940_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1940.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1940_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1940.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1941_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1941.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1941_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1941.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1941_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1941.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1941_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1941.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1942_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1942.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1942_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1942.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1942_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1942.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1942_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1942.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1943_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1943.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1943_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1943.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1943_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1943.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1943_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1943.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1948_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1948.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1948_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1948.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1948_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1948.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1948_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1948.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1989_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1989.html similarity index 90% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1989_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1989.html index f3ed4b18e8a..2e4d429bcb2 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1989_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1989.html @@ -28,8 +28,8 @@

    Compliant Solution

    See

    diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1989_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1989.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1989_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1989.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1994_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1994.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1994_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1994.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1994_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1994.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1994_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1994.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1996_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1996.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1996_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1996.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1996_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1996.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1996_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S1996.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2039_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2039.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2039_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2039.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2039_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2039.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2039_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2039.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2047_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2047.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2047_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2047.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2047_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2047.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2047_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2047.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2053_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2053.html similarity index 93% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2053_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2053.html index c13e5617fde..f02d36bd973 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2053_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2053.html @@ -30,8 +30,8 @@

    Compliant Solution

    See

    • OWASP Top 10 2021 Category A2 - Cryptographic Failures
    • -
    • OWASP Top 10 2017 Category A3 - Sensitive Data Exposure -
    • +
    • OWASP Top 10 2017 Category A3 - Sensitive Data + Exposure
    • MITRE, CWE-759 - Use of a One-Way Hash without a Salt
    • MITRE, CWE-760 - Use of a One-Way Hash with a Predictable Salt
    • SANS Top 25 - Porous Defenses
    • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2053_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2053.json similarity index 86% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2053_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2053.json index 79404b7f534..691f25cb837 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2053_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2053.json @@ -25,6 +25,12 @@ ], "OWASP Top 10 2021": [ "A2" + ], + "PCI DSS 3.2": [ + "6.5.10" + ], + "PCI DSS 4.0": [ + "6.2.4" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2055_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2055.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2055_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2055.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2055_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2055.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2055_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2055.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2057_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2057.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2057_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2057.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2057_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2057.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2057_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2057.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2059_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2059.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2059_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2059.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2059_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2059.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2059_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2059.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2060_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2060.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2060_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2060.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2060_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2060.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2060_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2060.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2061_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2061.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2061_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2061.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2061_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2061.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2061_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2061.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2062_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2062.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2062_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2062.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2062_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2062.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2062_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2062.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2063_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2063.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2063_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2063.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2063_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2063.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2063_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2063.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2065_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2065.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2065_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2065.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2065_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2065.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2065_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2065.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2066_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2066.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2066_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2066.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2066_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2066.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2066_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2066.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2068_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2068.html similarity index 73% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2068_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2068.html index 515ad72d22b..4ba14cc8434 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2068_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2068.html @@ -24,31 +24,24 @@

      Recommended Secure Coding Practices

    Sensitive Code Example

    -Connection conn = null;
    -try {
    -  conn = DriverManager.getConnection("jdbc:mysql://localhost/test?" +
    -        "user=steve&password=blue"); // Sensitive
    -  String uname = "steve";
    -  String password = "blue";
    -  conn = DriverManager.getConnection("jdbc:mysql://localhost/test?" +
    -        "user=" + uname + "&password=" + password); // Sensitive
    -
    -  java.net.PasswordAuthentication pa = new java.net.PasswordAuthentication("userName", "1234".toCharArray());  // Sensitive
    +String username = "steve";
    +String password = "blue";
    +Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test?" +
    +                  "user=" + uname + "&password=" + password); // Sensitive
     

    Compliant Solution

    -Connection conn = null;
    -try {
    -  String uname = getEncryptedUser();
    -  String password = getEncryptedPass();
    -  conn = DriverManager.getConnection("jdbc:mysql://localhost/test?" +
    -        "user=" + uname + "&password=" + password);
    +String username = getEncryptedUser();
    +String password = getEncryptedPassword();
    +Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test?" +
    +                  "user=" + uname + "&password=" + password);
     

    See

    • OWASP Top 10 2021 Category A7 - Identification and Authentication Failures
    • -
    • OWASP Top 10 2017 Category A2 - Broken Authentication
    • +
    • OWASP Top 10 2017 Category A2 - Broken Authentication +
    • MITRE, CWE-798 - Use of Hard-coded Credentials
    • MITRE, CWE-259 - Use of Hard-coded Password
    • CERT, MSC03-J. - Never hard code sensitive information
    • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2068_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2068.json similarity index 74% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2068_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2068.json index 0e817a8dd65..7cee1dd1abd 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2068_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2068.json @@ -28,6 +28,18 @@ ], "OWASP Top 10 2021": [ "A7" + ], + "PCI DSS 3.2": [ + "6.5.10" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "2.10.4", + "3.5.2", + "6.4.1" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2077_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2077.html similarity index 91% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2077_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2077.html index bf22d03fb72..4e0e13f92fa 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2077_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2077.html @@ -9,8 +9,8 @@

      Ask Yourself Whether

      There is a risk if you answered yes to any of those questions.

      Recommended Secure Coding Practices

      Sensitive Code Example

      @@ -73,7 +73,7 @@

      Compliant Solution

      See

      • OWASP Top 10 2021 Category A3 - Injection
      • -
      • OWASP Top 10 2017 Category A1 - Injection
      • +
      • OWASP Top 10 2017 Category A1 - Injection
      • MITRE, CWE-89 - Improper Neutralization of Special Elements used in an SQL Command
      • MITRE, CWE-564 - SQL Injection: Hibernate
      • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2077_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2077.json similarity index 74% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2077_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2077.json index 3c3cd2fd6ae..3cf9f36829f 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2077_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2077.json @@ -25,16 +25,27 @@ "IDS00-J." ], "CWE": [ - 564, - 89, 20, - 943 + 89 ], "OWASP": [ "A1" ], "OWASP Top 10 2021": [ "A3" + ], + "PCI DSS 3.2": [ + "6.5.1" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "5.1.3", + "5.1.4", + "5.3.4", + "5.3.5" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2092_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2092.html similarity index 94% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2092_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2092.html index 07080926aa5..afff950a96d 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2092_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2092.html @@ -33,8 +33,8 @@

        See

        • OWASP Top 10 2021 Category A4 - Insecure Design
        • OWASP Top 10 2021 Category A5 - Security Misconfiguration
        • -
        • OWASP Top 10 2017 Category A3 - Sensitive Data Exposure -
        • +
        • OWASP Top 10 2017 Category A3 - Sensitive Data + Exposure
        • MITRE, CWE-311 - Missing Encryption of Sensitive Data
        • MITRE, CWE-315 - Cleartext Storage of Sensitive Information in a Cookie
        • MITRE, CWE-614 - Sensitive Cookie in HTTPS Session Without 'Secure' Attribute
        • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2092_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2092.json similarity index 74% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2092_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2092.json index 67b1675e37e..096d4a8281e 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2092_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2092.json @@ -29,6 +29,19 @@ "OWASP Top 10 2021": [ "A4", "A5" + ], + "PCI DSS 3.2": [ + "6.5.10" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "3.4.1", + "6.1.1", + "6.1.2", + "6.1.3" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2093_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2093.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2093_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2093.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2093_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2093.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2093_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2093.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2094_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2094.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2094_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2094.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2094_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2094.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2094_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2094.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2095_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2095.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2095_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2095.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2095_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2095.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2095_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2095.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2096_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2096.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2096_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2096.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2096_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2096.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2096_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2096.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2097_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2097.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2097_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2097.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2097_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2097.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2097_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2097.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2109_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2109.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2109_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2109.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2109_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2109.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2109_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2109.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2110_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2110.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2110_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2110.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2110_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2110.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2110_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2110.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2111_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2111.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2111_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2111.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2111_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2111.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2111_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2111.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2112_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2112.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2112_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2112.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2112_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2112.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2112_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2112.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2114_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2114.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2114_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2114.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2114_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2114.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2114_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2114.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2115_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2115.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2115_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2115.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2115_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2115.json similarity index 79% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2115_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2115.json index 90d2a3a02ca..06f850109f2 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2115_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2115.json @@ -25,6 +25,16 @@ ], "OWASP Top 10 2021": [ "A7" + ], + "PCI DSS 3.2": [ + "6.5.10" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "9.2.2", + "9.2.3" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2116_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2116.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2116_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2116.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2116_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2116.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2116_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2116.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2118_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2118.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2118_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2118.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2118_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2118.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2118_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2118.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2119_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2119.html similarity index 90% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2119_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2119.html index bcd04fde318..07276f56135 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2119_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2119.html @@ -23,7 +23,7 @@

          Exceptions

          rule.

          See

          diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2119_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2119.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2119_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2119.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2121_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2121.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2121_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2121.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2121_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2121.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2121_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2121.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2122_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2122.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2122_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2122.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2122_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2122.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2122_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2122.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2123_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2123.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2123_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2123.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2123_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2123.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2123_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2123.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2127_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2127.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2127_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2127.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2127_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2127.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2127_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2127.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2129_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2129.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2129_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2129.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2129_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2129.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2129_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2129.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2130_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2130.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2130_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2130.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2130_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2130.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2130_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2130.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2131_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2131.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2131_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2131.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2131_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2131.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2131_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2131.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2133_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2133.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2133_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2133.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2133_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2133.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2133_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2133.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2134_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2134.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2134_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2134.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2134_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2134.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2134_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2134.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2139_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2139.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2139_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2139.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2139_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2139.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2139_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2139.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2140_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2140.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2140_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2140.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2140_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2140.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2140_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2140.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2141_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2141.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2141_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2141.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2141_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2141.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2141_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2141.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2142_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2142.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2142_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2142.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2142_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2142.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2142_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2142.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2143_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2143.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2143_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2143.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2143_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2143.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2143_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2143.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2147_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2147.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2147_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2147.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2147_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2147.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2147_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2147.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2148_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2148.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2148_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2148.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2148_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2148.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2148_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2148.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2151_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2151.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2151_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2151.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2151_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2151.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2151_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2151.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2153_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2153.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2153_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2153.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2153_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2153.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2153_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2153.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2154_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2154.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2154_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2154.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2154_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2154.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2154_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2154.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2156_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2156.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2156_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2156.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2156_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2156.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2156_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2156.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2157_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2157.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2157_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2157.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2157_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2157.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2157_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2157.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2159_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2159.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2159_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2159.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2159_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2159.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2159_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2159.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2160_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2160.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2160_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2160.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2160_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2160.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2160_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2160.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2162_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2162.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2162_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2162.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2162_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2162.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2162_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2162.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2164_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2164.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2164_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2164.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2164_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2164.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2164_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2164.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2165_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2165.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2165_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2165.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2165_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2165.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2165_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2165.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2166_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2166.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2166_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2166.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2166_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2166.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2166_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2166.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2167_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2167.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2167_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2167.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2167_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2167.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2167_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2167.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2168_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2168.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2168_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2168.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2168_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2168.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2168_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2168.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2175_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2175.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2175_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2175.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2175_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2175.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2175_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2175.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2176_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2176.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2176_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2176.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2176_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2176.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2176_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2176.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2177_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2177.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2177_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2177.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2177_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2177.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2177_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2177.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2178_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2178.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2178_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2178.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2178_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2178.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2178_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2178.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2183_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2183.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2183_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2183.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2183_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2183.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2183_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2183.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2184_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2184.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2184_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2184.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2184_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2184.json similarity index 92% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2184_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2184.json index 8871ea2b39d..fcbf8e631d6 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2184_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2184.json @@ -23,6 +23,9 @@ ], "CWE": [ 190 + ], + "ASVS 4.0": [ + "5.4.3" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2185_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2185.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2185_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2185.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2185_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2185.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2185_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2185.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2186_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2186.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2186_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2186.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2186_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2186.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2186_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2186.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2187_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2187.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2187_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2187.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2187_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2187.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2187_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2187.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2188_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2188.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2188_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2188.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2188_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2188.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2188_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2188.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2189_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2189.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2189_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2189.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2189_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2189.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2189_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2189.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2196_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2196.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2196_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2196.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2196_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2196.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2196_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2196.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2197_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2197.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2197_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2197.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2197_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2197.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2197_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2197.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2200_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2200.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2200_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2200.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2200_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2200.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2200_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2200.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2201_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2201.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2201_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2201.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2201_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2201.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2201_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2201.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2203_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2203.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2203_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2203.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2203_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2203.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2203_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2203.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2204_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2204.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2204_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2204.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2204_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2204.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2204_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2204.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2208_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2208.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2208_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2208.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2208_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2208.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2208_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2208.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2209_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2209.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2209_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2209.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2209_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2209.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2209_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2209.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2211_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2211.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2211_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2211.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2211_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2211.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2211_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2211.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2221_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2221.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2221_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2221.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2221_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2221.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2221_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2221.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2222_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2222.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2222_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2222.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2222_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2222.json similarity index 87% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2222_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2222.json index 7021ed7ff91..e98ac4fb8e0 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2222_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2222.json @@ -1,5 +1,5 @@ { - "title": "Locks should be released", + "title": "Locks should be released on all paths", "type": "BUG", "status": "ready", "remediation": { diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2225_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2225.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2225_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2225.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2225_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2225.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2225_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2225.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2226_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2226.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2226_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2226.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2226_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2226.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2226_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2226.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2229_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2229.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2229_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2229.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2229_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2229.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2229_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2229.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2230_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2230.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2230_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2230.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2230_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2230.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2230_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2230.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2232_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2232.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2232_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2232.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2232_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2232.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2232_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2232.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2234_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2234.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2234_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2234.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2234_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2234.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2234_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2234.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2235_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2235.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2235_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2235.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2235_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2235.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2235_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2235.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2236_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2236.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2236_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2236.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2236_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2236.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2236_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2236.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2245_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2245.html similarity index 96% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2245_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2245.html index 7f790e013bf..bf3581156a1 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2245_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2245.html @@ -39,8 +39,8 @@

          Compliant Solution

          See

          • OWASP Top 10 2021 Category A2 - Cryptographic Failures
          • -
          • OWASP Top 10 2017 Category A3 - Sensitive Data Exposure -
          • +
          • OWASP Top 10 2017 Category A3 - Sensitive Data + Exposure
          • Mobile AppSec Verification Standard - Cryptography Requirements
          • OWASP Mobile Top 10 2016 Category M5 - diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2245_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2245.json similarity index 91% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2245_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2245.json index 0b75e19b480..3647421a358 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2245_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2245.json @@ -38,6 +38,10 @@ ], "OWASP Top 10 2021": [ "A2" + ], + "ASVS 4.0": [ + "6.2.4" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2250_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2250.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2250_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2250.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2250_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2250.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2250_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2250.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2251_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2251.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2251_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2251.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2251_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2251.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2251_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2251.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2252_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2252.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2252_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2252.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2252_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2252.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2252_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2252.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2253_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2253.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2253_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2253.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2253_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2253.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2253_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2253.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2254_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2254.html similarity index 91% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2254_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2254.html index 585ef9d9832..b66e3a0ba1d 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2254_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2254.html @@ -24,7 +24,8 @@

            Noncompliant Code Example

            See

            diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2254_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2254.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2254_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2254.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2257_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2257.html similarity index 88% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2257_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2257.html index 51094c19e22..fdd1ded420b 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2257_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2257.html @@ -18,8 +18,8 @@

            Compliant Solution

            See

            • OWASP Top 10 2021 Category A2 - Cryptographic Failures
            • -
            • OWASP Top 10 2017 Category A3 - Sensitive Data Exposure -
            • +
            • OWASP Top 10 2017 Category A3 - Sensitive Data + Exposure
            • MITRE, CWE-327 - Use of a Broken or Risky Cryptographic Algorithm
            • SANS Top 25 - Porous Defenses
            • Derived from FindSecBugs rule MessageDigest is Custom diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2257_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2257.json similarity index 84% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2257_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2257.json index 78cc7d1521b..813db6040f3 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2257_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2257.json @@ -24,6 +24,12 @@ ], "OWASP Top 10 2021": [ "A2" + ], + "ASVS 4.0": [ + "2.9.3", + "6.2.2", + "8.3.7" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2259_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2259.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2259_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2259.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2259_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2259.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2259_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2259.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2260_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2260.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2260_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2260.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2260_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2260.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2260_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2260.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2272_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2272.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2272_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2272.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2272_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2272.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2272_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2272.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2273_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2273.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2273_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2273.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2273_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2273.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2273_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2273.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2274_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2274.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2274_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2274.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2274_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2274.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2274_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2274.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2275_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2275.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2275_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2275.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2275_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2275.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2275_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2275.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2276_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2276.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2276_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2276.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2276_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2276.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2276_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2276.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2293_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2293.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2293_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2293.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2293_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2293.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2293_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2293.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2301_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2301.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2301_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2301.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2301_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2301.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2301_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2301.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2308_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2308.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2308_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2308.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2308_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2308.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2308_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2308.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2309_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2309.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2309_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2309.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2309_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2309.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2309_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2309.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2325_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2325.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2325_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2325.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2325_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2325.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2325_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2325.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2326_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2326.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2326_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2326.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2326_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2326.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2326_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2326.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2333_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2333.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2333_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2333.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2333_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2333.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2333_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2333.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2384_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2384.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2384_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2384.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2384_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2384.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2384_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2384.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2386_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2386.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2386_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2386.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2386_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2386.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2386_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2386.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2387_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2387.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2387_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2387.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2387_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2387.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2387_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2387.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2388_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2388.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2388_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2388.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2388_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2388.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2388_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2388.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2390_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2390.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2390_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2390.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2390_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2390.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2390_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2390.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2437_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2437.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2437_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2437.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2437_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2437.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2437_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2437.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2438_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2438.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2438_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2438.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2438_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2438.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2438_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2438.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2440_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2440.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2440_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2440.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2440_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2440.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2440_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2440.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2441_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2441.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2441_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2441.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2441_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2441.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2441_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2441.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2442_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2442.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2442_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2442.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2442_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2442.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2442_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2442.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2444_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2444.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2444_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2444.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2444_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2444.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2444_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2444.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2445_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2445.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2445_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2445.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2445_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2445.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2445_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2445.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2446_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2446.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2446_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2446.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2446_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2446.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2446_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2446.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2447_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2447.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2447_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2447.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2447_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2447.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2447_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2447.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2479_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2479.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2479_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2479.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2479_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2479.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2479_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2479.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2583_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2583.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2583_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2583.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2583_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2583.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2583_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2583.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2589_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2589.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2589_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2589.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2589_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2589.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2589_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2589.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2612_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2612.html similarity index 90% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2612_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2612.html index 36069d2823e..2d7f24ffe8c 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2612_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2612.html @@ -61,8 +61,10 @@

              See

              • OWASP Top 10 2021 Category A1 - Broken Access Control
              • OWASP Top 10 2021 Category A4 - Insecure Design
              • -
              • OWASP Top 10 2017 Category A5 - Broken Access Control
              • -
              • OWASP File Permission
              • +
              • OWASP Top 10 2017 Category A5 - Broken Access Control +
              • +
              • OWASP File Permission
              • MITRE, CWE-732 - Incorrect Permission Assignment for Critical Resource
              • MITRE, CWE-266 - Incorrect Privilege Assignment
              • CERT, FIO01-J. - diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2612_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2612.json similarity index 79% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2612_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2612.json index 236da0af682..349eacc33d9 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2612_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2612.json @@ -31,6 +31,16 @@ "OWASP Top 10 2021": [ "A1", "A4" + ], + "PCI DSS 3.2": [ + "6.5.8" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "4.3.3" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2629_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2629.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2629_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2629.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2629_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2629.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2629_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2629.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2637_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2637.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2637_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2637.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2637_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2637.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2637_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2637.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2638_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2638.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2638_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2638.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2638_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2638.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2638_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2638.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2639_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2639.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2639_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2639.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2639_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2639.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2639_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2639.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2647_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2647.html similarity index 89% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2647_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2647.html index 52a51bb2766..a151ba8cf60 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2647_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2647.html @@ -19,8 +19,8 @@

                Noncompliant Code Example

                See

                • OWASP Top 10 2021 Category A4 - Insecure Design
                • -
                • OWASP Top 10 2017 Category A3 - Sensitive Data Exposure -
                • +
                • OWASP Top 10 2017 Category A3 - Sensitive Data + Exposure
                • OWASP Web Service Security Cheat Sheet
                • MITRE, CWE-522 - Insufficiently Protected Credentials
                • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2647_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2647.json similarity index 80% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2647_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2647.json index 97dd1ae2afb..c36c9b02fd1 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2647_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2647.json @@ -24,6 +24,15 @@ ], "OWASP Top 10 2021": [ "A4" + ], + "PCI DSS 3.2": [ + "6.5.10" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "2.10.3" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2658_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2658.html similarity index 85% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2658_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2658.html index 00a46139fb4..8b6acf79af9 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2658_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2658.html @@ -8,7 +8,7 @@

                  Noncompliant Code Example

                  See

                  diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2658_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2658.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2658_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2658.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2674_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2674.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2674_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2674.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2674_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2674.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2674_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2674.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2675_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2675.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2675_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2675.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2675_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2675.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2675_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2675.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2676_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2676.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2676_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2676.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2676_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2676.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2676_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2676.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2677_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2677.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2677_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2677.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2677_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2677.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2677_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2677.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2681_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2681.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2681_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2681.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2681_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2681.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2681_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2681.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2689_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2689.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2689_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2689.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2689_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2689.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2689_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2689.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2692_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2692.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2692_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2692.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2692_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2692.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2692_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2692.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2693_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2693.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2693_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2693.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2693_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2693.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2693_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2693.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2694_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2694.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2694_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2694.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2694_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2694.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2694_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2694.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2695_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2695.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2695_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2695.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2695_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2695.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2695_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2695.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2696_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2696.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2696_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2696.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2696_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2696.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2696_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2696.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2698_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2698.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2698_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2698.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2698_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2698.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2698_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2698.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2699_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2699.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2699_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2699.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2699_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2699.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2699_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2699.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2701_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2701.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2701_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2701.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2701_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2701.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2701_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2701.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2718_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2718.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2718_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2718.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2718_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2718.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2718_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2718.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2737_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2737.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2737_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2737.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2737_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2737.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2737_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2737.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2755_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2755.html similarity index 95% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2755_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2755.html index 1333e9ae770..4705531a01d 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2755_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2755.html @@ -2,7 +2,7 @@ href="https://www.w3.org/TR/xml/#sec-internal-ent">internal or external.

                  When parsing the XML file, the content of the external entities is retrieved from an external storage such as the file system or network, which may lead, if no restrictions are put in place, to arbitrary file disclosures or server-side request forgery (SSRF) vulnerabilities.

                  +href="https://owasp.org/www-community/attacks/Server_Side_Request_Forgery">server-side request forgery (SSRF) vulnerabilities.

                  It’s recommended to limit resolution of external entities by using one of these solutions:

                  • If DOCTYPE is not necessary, completely disable all DOCTYPE declarations.
                  • @@ -106,8 +106,8 @@

                    See

                  • OWASP Top 10 2021 Category A5 - Security Misconfiguration
                  • Oracle Java Documentation - XML External Entity Injection Attack
                  • -
                  • OWASP Top 10 2017 Category A4 - XML External Entities - (XXE)
                  • +
                  • OWASP Top 10 2017 Category A4 - XML External + Entities (XXE)
                  • OWASP XXE Prevention Cheat Sheet
                  • MITRE, CWE-611 - Information Exposure Through XML External Entity Reference
                  • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2755_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2755.json similarity index 81% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2755_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2755.json index 904ff355f54..8ef5a8f9b8b 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2755_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2755.json @@ -24,6 +24,15 @@ ], "OWASP Top 10 2021": [ "A5" + ], + "PCI DSS 3.2": [ + "6.5.1" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "5.5.2" ] }, "quickfix": "infeasible" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2757_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2757.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2757_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2757.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2757_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2757.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2757_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2757.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2761_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2761.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2761_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2761.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2761_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2761.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2761_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2761.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2786_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2786.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2786_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2786.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2786_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2786.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2786_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2786.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2789_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2789.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2789_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2789.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2789_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2789.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2789_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2789.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2864_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2864.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2864_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2864.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2864_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2864.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2864_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2864.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2885_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2885.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2885_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2885.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2885_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2885.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2885_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2885.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2886_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2886.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2886_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2886.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2886_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2886.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2886_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2886.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2924_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2924.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2924_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2924.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2924_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2924.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2924_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2924.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2925_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2925.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2925_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2925.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2925_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2925.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2925_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2925.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2959_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2959.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2959_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2959.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2959_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2959.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2959_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2959.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2970_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2970.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2970_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2970.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2970_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2970.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2970_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2970.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2972_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2972.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2972_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2972.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2972_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2972.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2972_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2972.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2973_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2973.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2973_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2973.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2973_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2973.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2973_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2973.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2974_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2974.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2974_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2974.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2974_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2974.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2974_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2974.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2975_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2975.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2975_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2975.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2975_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2975.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2975_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S2975.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3008_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3008.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3008_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3008.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3008_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3008.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3008_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3008.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3010_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3010.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3010_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3010.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3010_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3010.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3010_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3010.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3011_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3011.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3011_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3011.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3011_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3011.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3011_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3011.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3012_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3012.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3012_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3012.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3012_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3012.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3012_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3012.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3014_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3014.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3014_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3014.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3014_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3014.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3014_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3014.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3020_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3020.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3020_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3020.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3020_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3020.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3020_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3020.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3030_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3030.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3030_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3030.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3030_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3030.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3030_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3030.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3032_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3032.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3032_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3032.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3032_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3032.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3032_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3032.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3034_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3034.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3034_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3034.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3034_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3034.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3034_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3034.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3038_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3038.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3038_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3038.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3038_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3038.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3038_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3038.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3039_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3039.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3039_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3039.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3039_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3039.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3039_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3039.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3042_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3042.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3042_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3042.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3042_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3042.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3042_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3042.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3046_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3046.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3046_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3046.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3046_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3046.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3046_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3046.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3047_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3047.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3047_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3047.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3047_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3047.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3047_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3047.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3052_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3052.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3052_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3052.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3052_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3052.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3052_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3052.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3064_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3064.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3064_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3064.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3064_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3064.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3064_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3064.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3065_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3065.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3065_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3065.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3065_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3065.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3065_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3065.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3066_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3066.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3066_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3066.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3066_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3066.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3066_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3066.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3067_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3067.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3067_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3067.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3067_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3067.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3067_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3067.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3077_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3077.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3077_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3077.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3077_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3077.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3077_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3077.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3078_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3078.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3078_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3078.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3078_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3078.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3078_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3078.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3242_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3242.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3242_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3242.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3242_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3242.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3242_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3242.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3252_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3252.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3252_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3252.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3252_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3252.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3252_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3252.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3254_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3254.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3254_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3254.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3254_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3254.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3254_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3254.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3305_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3305.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3305_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3305.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3305_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3305.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3305_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3305.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3306_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3306.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3306_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3306.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3306_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3306.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3306_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3306.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3329_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3329.html similarity index 95% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3329_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3329.html index 6bf235bde84..a63b3ec59f0 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3329_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3329.html @@ -48,7 +48,7 @@

                    Compliant Solution

                    See

                    • OWASP Top 10 2021 Category A2 - Cryptographic Failures
                    • -
                    • OWASP Top 10 2017 Category A6 - Security +
                    • OWASP Top 10 2017 Category A6 - Security Misconfiguration
                    • MITRE, CWE-329 - CWE-329: Not Using an Unpredictable IV with CBC Mode
                    • MITRE, CWE-330 - Use of Insufficiently Random Values
                    • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3329_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3329.json similarity index 90% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3329_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3329.json index d51ca028f74..25800fe2967 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3329_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3329.json @@ -33,6 +33,11 @@ ], "OWASP Top 10 2021": [ "A2" + ], + "ASVS 4.0": [ + "2.3.1", + "2.6.2", + "2.9.2" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3330_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3330.html similarity index 92% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3330_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3330.html index 3005a388f84..e8d3047ff78 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3330_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3330.html @@ -34,9 +34,9 @@

                      Compliant Solution

                      See

                      • OWASP Top 10 2021 Category A5 - Security Misconfiguration
                      • -
                      • OWASP HttpOnly
                      • -
                      • OWASP Top 10 2017 Category A7 - Cross-Site Scripting - (XSS)
                      • +
                      • OWASP HttpOnly
                      • +
                      • OWASP Top 10 2017 Category A7 - Cross-Site + Scripting (XSS)
                      • MITRE, CWE-1004 - Sensitive Cookie Without 'HttpOnly' Flag
                      • SANS Top 25 - Insecure Interaction Between Components
                      • Derived from FindSecBugs rule HTTPONLY_COOKIE
                      • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3330_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3330.json similarity index 78% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3330_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3330.json index ba01c60ef50..11d90a8fcde 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3330_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3330.json @@ -25,6 +25,16 @@ ], "OWASP Top 10 2021": [ "A5" + ], + "PCI DSS 3.2": [ + "6.5.10" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "3.4.2" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3346_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3346.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3346_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3346.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3346_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3346.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3346_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3346.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3358_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3358.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3358_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3358.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3358_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3358.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3358_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3358.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3366_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3366.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3366_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3366.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3366_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3366.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3366_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3366.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3398_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3398.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3398_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3398.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3398_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3398.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3398_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3398.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3400_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3400.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3400_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3400.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3400_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3400.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3400_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3400.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3414_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3414.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3414_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3414.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3414_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3414.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3414_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3414.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3415_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3415.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3415_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3415.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3415_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3415.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3415_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3415.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3416_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3416.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3416_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3416.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3416_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3416.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3416_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3416.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3436_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3436.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3436_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3436.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3436_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3436.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3436_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3436.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3437_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3437.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3437_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3437.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3437_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3437.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3437_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3437.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3457_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3457.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3457_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3457.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3457_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3457.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3457_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3457.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3516_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3516.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3516_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3516.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3516_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3516.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3516_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3516.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3518_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3518.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3518_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3518.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3518_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3518.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3518_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3518.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3546_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3546.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3546_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3546.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3546_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3546.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3546_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3546.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3551_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3551.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3551_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3551.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3551_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3551.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3551_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3551.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3553_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3553.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3553_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3553.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3553_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3553.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3553_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3553.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3577_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3577.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3577_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3577.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3577_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3577.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3577_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3577.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3578_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3578.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3578_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3578.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3578_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3578.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3578_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3578.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3599_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3599.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3599_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3599.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3599_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3599.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3599_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3599.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3626_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3626.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3626_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3626.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3626_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3626.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3626_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3626.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3631_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3631.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3631_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3631.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3631_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3631.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3631_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3631.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3655_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3655.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3655_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3655.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3655_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3655.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3655_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3655.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3658_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3658.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3658_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3658.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3658_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3658.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3658_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3658.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3688_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3688.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3688_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3688.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3688_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3688.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3688_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3688.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3725_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3725.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3725_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3725.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3725_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3725.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3725_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3725.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3740_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3740.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3740_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3740.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3740_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3740.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3740_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3740.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3749_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3749.html similarity index 91% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3749_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3749.html index 1f59430cc44..e30e4c0c163 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3749_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3749.html @@ -32,7 +32,7 @@

                        Noncompliant Code Example

                        See

                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3749_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3749.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3749_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3749.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3750_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3750.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3750_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3750.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3750_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3750.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3750_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3750.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3751_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3751.html similarity index 91% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3751_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3751.html index ce8b345f847..da81f36ee35 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3751_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3751.html @@ -19,7 +19,7 @@

                        Compliant Solution

                        See

                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3751_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3751.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3751_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3751.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3752_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3752.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3752_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3752.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3752_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3752.json similarity index 76% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3752_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3752.json index e5cd259cff6..f1f66851e6a 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3752_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3752.json @@ -26,6 +26,17 @@ "OWASP Top 10 2021": [ "A1", "A4" + ], + "PCI DSS 3.2": [ + "6.5.8" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "13.2.3", + "4.2.2" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3753_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3753.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3753_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3753.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3753_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3753.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3753_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3753.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3776_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3776.html similarity index 57% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3776_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3776.html index 6782c3070de..eeb64e3208e 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3776_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3776.html @@ -1,5 +1,8 @@

                        Cognitive Complexity is a measure of how hard the control flow of a method is to understand. Methods with high Cognitive Complexity will be difficult to maintain.

                        +

                        Exceptions

                        +

                        equals and hashCode methods are ignored because they might be automatically generated and might end up being difficult to +understand, especially in presence of many fields.

                        See

                        • Cognitive Complexity
                        • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3776_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3776.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3776_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3776.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3824_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3824.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3824_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3824.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3824_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3824.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3824_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3824.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3864_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3864.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3864_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3864.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3864_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3864.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3864_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3864.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3878_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3878.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3878_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3878.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3878_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3878.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3878_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3878.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3923_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3923.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3923_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3923.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3923_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3923.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3923_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3923.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3937_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3937.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3937_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3937.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3937_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3937.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3937_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3937.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3958_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3958.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3958_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3958.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3958_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3958.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3958_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3958.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3959_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3959.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3959_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3959.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3959_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3959.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3959_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3959.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3972_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3972.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3972_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3972.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3972_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3972.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3972_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3972.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3973_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3973.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3973_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3973.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3973_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3973.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3973_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3973.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3981_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3981.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3981_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3981.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3981_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3981.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3981_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3981.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3984_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3984.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3984_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3984.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3984_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3984.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3984_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3984.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3985_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3985.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3985_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3985.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3985_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3985.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3985_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3985.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3986_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3986.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3986_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3986.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3986_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3986.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3986_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3986.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4011_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4011.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4011_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4011.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4011_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4011.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4011_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4011.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4032_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4032.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4032_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4032.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4032_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4032.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4032_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4032.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4034_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4034.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4034_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4034.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4034_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4034.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4034_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4034.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4036_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4036.html similarity index 94% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4036_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4036.html index b4147e9472a..92e2895b049 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4036_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4036.html @@ -36,7 +36,7 @@

                          See

                          diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4036_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4036.json similarity index 94% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4036_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4036.json index 0bea9671384..a0a9d7ad0d4 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4036_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4036.json @@ -25,5 +25,6 @@ "OWASP Top 10 2021": [ "A8" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4042_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4042.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4042_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4042.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4042_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4042.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4042_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4042.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4065_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4065.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4065_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4065.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4065_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4065.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4065_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4065.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4087_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4087.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4087_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4087.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4087_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4087.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4087_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4087.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4143_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4143.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4143_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4143.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4143_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4143.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4143_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4143.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4144_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4144.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4144_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4144.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4144_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4144.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4144_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4144.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4165_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4165.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4165_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4165.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4165_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4165.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4165_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4165.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4174_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4174.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4174_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4174.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4174_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4174.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4174_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4174.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4201_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4201.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4201_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4201.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4201_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4201.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4201_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4201.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4248_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4248.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4248_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4248.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4248_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4248.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4248_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4248.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4266_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4266.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4266_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4266.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4266_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4266.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4266_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4266.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4274_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4274.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4274_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4274.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4274_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4274.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4274_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4274.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4275_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4275.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4275_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4275.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4275_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4275.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4275_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4275.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4276_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4276.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4276_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4276.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4276_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4276.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4276_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4276.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4288_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4288.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4288_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4288.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4288_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4288.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4288_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4288.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4347_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4347.html similarity index 92% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4347_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4347.html index 830096b22c1..18523b18ced 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4347_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4347.html @@ -24,7 +24,7 @@

                          Compliant Solution

                          See

                          • OWASP Top 10 2021 Category A2 - Cryptographic Failures
                          • -
                          • OWASP Top 10 2017 Category A6 - Security +
                          • OWASP Top 10 2017 Category A6 - Security Misconfiguration
                          • MITRE, CWE-330 - Use of Insufficiently Random Values
                          • MITRE, CWE-332 - Insufficient Entropy in PRNG
                          • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4347_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4347.json similarity index 89% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4347_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4347.json index ae8daa79fd2..6ca4a2f1f71 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4347_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4347.json @@ -28,6 +28,11 @@ ], "OWASP Top 10 2021": [ "A2" + ], + "ASVS 4.0": [ + "2.3.1", + "2.6.2", + "2.9.2" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4348_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4348.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4348_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4348.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4348_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4348.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4348_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4348.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4349_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4349.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4349_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4349.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4349_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4349.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4349_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4349.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4351_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4351.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4351_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4351.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4351_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4351.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4351_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4351.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4423_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4423.html similarity index 88% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4423_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4423.html index e594650cc19..8031c6f1212 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4423_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4423.html @@ -30,9 +30,9 @@

                            See

                          • OWASP Top 10 2021 Category A2 - Cryptographic Failures
                          • OWASP Top 10 2021 Category A7 - Identification and Authentication Failures
                          • -
                          • OWASP Top 10 2017 Category A3 - Sensitive Data Exposure -
                          • -
                          • OWASP Top 10 2017 Category A6 - Security +
                          • OWASP Top 10 2017 Category A3 - Sensitive Data + Exposure
                          • +
                          • OWASP Top 10 2017 Category A6 - Security Misconfiguration
                          • MITRE, CWE-327 - Inadequate Encryption Strength
                          • MITRE, CWE-326 - Use of a Broken or Risky Cryptographic Algorithm
                          • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4423_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4423.json similarity index 79% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4423_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4423.json index 3bf1564cdb7..73a990fefd9 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4423_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4423.json @@ -37,6 +37,19 @@ "OWASP Top 10 2021": [ "A2", "A7" + ], + "PCI DSS 3.2": [ + "4.1", + "6.5.4" + ], + "PCI DSS 4.0": [ + "4.2.1", + "6.2.4" + ], + "ASVS 4.0": [ + "8.3.7", + "9.1.2", + "9.1.3" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4425_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4425.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4425_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4425.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4425_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4425.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4425_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4425.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4426_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4426.html similarity index 90% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4426_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4426.html index 3668e5fe4b4..5db4e832bcc 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4426_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4426.html @@ -44,9 +44,9 @@

                            Compliant Solution

                            See

                            • OWASP Top 10 2021 Category A2 - Cryptographic Failures
                            • -
                            • OWASP Top 10 2017 Category A3 - Sensitive Data Exposure -
                            • -
                            • OWASP Top 10 2017 Category A6 - Security +
                            • OWASP Top 10 2017 Category A3 - Sensitive Data + Exposure
                            • +
                            • OWASP Top 10 2017 Category A6 - Security Misconfiguration
                            • Mobile AppSec Verification Standard - Cryptography Requirements
                            • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4426_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4426.json similarity index 94% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4426_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4426.json index 7f41304e8c6..6c3d5447290 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4426_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4426.json @@ -33,6 +33,9 @@ ], "OWASP Top 10 2021": [ "A2" + ], + "ASVS 4.0": [ + "6.2.3" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4433_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4433.html similarity index 94% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4433_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4433.html index cb85461a8ac..eb0593a8af7 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4433_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4433.html @@ -41,7 +41,8 @@

                              See

                              diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4433_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4433.json similarity index 78% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4433_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4433.json index 86a0cdc15e7..266b04a149e 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4433_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4433.json @@ -23,6 +23,16 @@ ], "OWASP Top 10 2021": [ "A7" + ], + "PCI DSS 3.2": [ + "6.5.10" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "9.2.2", + "9.2.3" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4434_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4434.html similarity index 91% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4434_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4434.html index 58e6c175449..d317c7d879f 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4434_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4434.html @@ -31,8 +31,8 @@

                              See

                            • OWASP Top 10 2021 Category A8 - Software and Data Integrity Failures
                            • MITRE, CWE-502 - Deserialization of Untrusted Data
                            • -
                            • OWASP Top 10 2017 Category A8 - Insecure Deserialization -
                            • +
                            • OWASP Top 10 2017 Category A8 - Insecure + Deserialization
                            • BlackHat presentation
                            • Derived from FindSecBugs rule LDAP_ENTRY_POISONING
                            • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4434_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4434.json similarity index 83% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4434_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4434.json index 3008ace559e..7d4433ec870 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4434_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4434.json @@ -23,6 +23,12 @@ ], "OWASP Top 10 2021": [ "A8" + ], + "ASVS 4.0": [ + "1.5.2", + "5.5.1", + "5.5.3" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4449_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4449.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4449_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4449.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4449_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4449.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4449_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4449.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4454_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4454.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4454_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4454.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4454_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4454.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4454_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4454.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4488_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4488.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4488_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4488.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4488_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4488.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4488_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4488.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4502_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4502.html similarity index 95% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4502_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4502.html index 6596feec886..fdf5774e822 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4502_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4502.html @@ -54,7 +54,7 @@

                              See

                              • OWASP Top 10 2021 Category A1 - Broken Access Control
                              • MITRE, CWE-352 - Cross-Site Request Forgery (CSRF)
                              • -
                              • OWASP Top 10 2017 Category A6 - Security +
                              • OWASP Top 10 2017 Category A6 - Security Misconfiguration
                              • OWASP: Cross-Site Request Forgery
                              • SANS Top 25 - Insecure Interaction Between Components
                              • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4502_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4502.json similarity index 75% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4502_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4502.json index a649fb43b79..e82a197812e 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4502_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4502.json @@ -25,6 +25,17 @@ ], "OWASP Top 10 2021": [ "A1" + ], + "PCI DSS 3.2": [ + "6.5.9" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "13.2.3", + "4.2.2" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4507_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4507.html similarity index 96% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4507_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4507.html index 1f25d6410c0..1bc98410e0b 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4507_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4507.html @@ -80,8 +80,8 @@

                                Compliant Solution

                                See

                                diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4507_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4507.json similarity index 95% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4507_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4507.json index 0ffed0b22da..a5d4a775bb3 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4507_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4507.json @@ -29,5 +29,6 @@ "OWASP Top 10 2021": [ "A5" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4512_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4512.html similarity index 95% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4512_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4512.html index bce903746f6..d03c26cb918 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4512_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4512.html @@ -40,7 +40,7 @@

                                See

                              • OWASP Top 10 2021 Category A3 - Injection
                              • OWASP Top 10 2021 Category A8 - Software and Data Integrity Failures
                              • -
                              • OWASP Top 10 2017 Category A1 - Injection
                              • +
                              • OWASP Top 10 2017 Category A1 - Injection
                              • MITRE, CWE-915 - Improperly Controlled Modification of Dynamically-Determined Object Attributes
                              • CERT, MSC61-J. - Do not use insecure or weak cryptographic algorithms
                              • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4512_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4512.json similarity index 78% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4512_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4512.json index 4072acdb755..85e538f30dd 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4512_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4512.json @@ -28,6 +28,16 @@ "OWASP Top 10 2021": [ "A3", "A8" + ], + "PCI DSS 3.2": [ + "6.5.1" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "5.1.2" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4517_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4517.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4517_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4517.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4517_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4517.json similarity index 91% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4517_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4517.json index 5a5364674a7..f2ac437e824 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4517_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4517.json @@ -4,7 +4,7 @@ "status": "ready", "remediation": { "func": "Constant\/Issue", - "constantCost": "10 mn" + "constantCost": "10min" }, "tags": [], "defaultSeverity": "Major", diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4524_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4524.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4524_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4524.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4524_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4524.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4524_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4524.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4544_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4544.html similarity index 90% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4544_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4544.html index dd246f26acf..cf253042b2a 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4544_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4544.html @@ -39,9 +39,9 @@

                                See

                                • OWASP Top 10 2021 Category A8 - Software and Data Integrity Failures
                                • -
                                • OWASP Top 10 2017 Category A8 - Insecure Deserialization -
                                • -
                                • OWASP - Deserialization of untrusted data
                                • +
                                • OWASP Top 10 2017 Category A8 - Insecure + Deserialization
                                • +
                                • OWASP - Deserialization of untrusted data
                                • MITRE, CWE-502 - Deserialization of Untrusted Data
                                • On Jackson CVEs: Don’t Panic
                                • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4544_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4544.json similarity index 73% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4544_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4544.json index 89bb8b8b9c6..986ae1f6f56 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4544_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4544.json @@ -23,6 +23,18 @@ ], "OWASP Top 10 2021": [ "A8" + ], + "PCI DSS 3.2": [ + "6.5.1" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "1.5.2", + "5.5.1", + "5.5.3" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4551_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4551.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4551_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4551.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4551_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4551.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4551_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4551.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4601_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4601.html similarity index 94% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4601_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4601.html index 1809d4b29f0..8caf953a7ae 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4601_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4601.html @@ -35,7 +35,7 @@

                                  Compliant Solution

                                  See

                                  diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4601_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4601.json similarity index 85% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4601_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4601.json index 8e4c0c73486..9b9b5d49d18 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4601_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4601.json @@ -20,6 +20,12 @@ ], "OWASP Top 10 2021": [ "A1" + ], + "PCI DSS 3.2": [ + "6.5.8" + ], + "PCI DSS 4.0": [ + "6.2.4" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4602_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4602.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4602_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4602.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4602_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4602.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4602_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4602.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4604_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4604.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4604_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4604.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4604_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4604.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4604_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4604.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4605_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4605.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4605_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4605.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4605_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4605.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4605_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4605.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4635_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4635.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4635_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4635.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4635_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4635.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4635_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4635.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4682_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4682.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4682_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4682.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4682_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4682.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4682_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4682.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4684_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4684.html similarity index 95% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4684_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4684.html index 52d032ab175..127d204957a 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4684_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4684.html @@ -82,7 +82,8 @@

                                  See

                                  • OWASP Top 10 2021 Category A8 - Software and Data Integrity Failures
                                  • -
                                  • OWASP Top 10 2017 Category A5 - Broken Access Control
                                  • +
                                  • OWASP Top 10 2017 Category A5 - Broken Access Control +
                                  • MITRE, CWE-915 - Improperly Controlled Modification of Dynamically-Determined Object Attributes
                                  • Two Security Vulnerabilities in the Spring diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4684_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4684.json similarity index 93% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4684_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4684.json index c21cfdb1dd1..cf64e0a09d5 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4684_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4684.json @@ -24,6 +24,9 @@ ], "OWASP Top 10 2021": [ "A8" + ], + "ASVS 4.0": [ + "5.1.2" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4719_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4719.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4719_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4719.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4719_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4719.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4719_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4719.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4738_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4738.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4738_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4738.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4738_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4738.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4738_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4738.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4790_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4790.html similarity index 89% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4790_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4790.html index 21dc610dbf2..a957473105b 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4790_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4790.html @@ -26,9 +26,9 @@

                                    Compliant Solution

                                    See

                                    • OWASP Top 10 2021 Category A2 - Cryptographic Failures
                                    • -
                                    • OWASP Top 10 2017 Category A3 - Sensitive Data Exposure -
                                    • -
                                    • OWASP Top 10 2017 Category A6 - Security +
                                    • OWASP Top 10 2017 Category A3 - Sensitive Data + Exposure
                                    • +
                                    • OWASP Top 10 2017 Category A6 - Security Misconfiguration
                                    • Mobile AppSec Verification Standard - Cryptography Requirements
                                    • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4790_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4790.json similarity index 80% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4790_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4790.json index 0296709d8c6..0ac94763ec2 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4790_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4790.json @@ -30,6 +30,15 @@ ], "OWASP Top 10 2021": [ "A2" + ], + "PCI DSS 3.2": [ + "3.4", + "6.5.3", + "6.5.4" + ], + "PCI DSS 4.0": [ + "6.2.4" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4792_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4792.html similarity index 98% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4792_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4792.html index 851ed18d83a..ab6ab8071a0 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4792_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4792.html @@ -135,8 +135,8 @@

                                      See

                                      • OWASP Top 10 2021 Category A9 - Security Logging and Monitoring Failures
                                      • -
                                      • OWASP Top 10 2017 Category A3 - Sensitive Data Exposure -
                                      • +
                                      • OWASP Top 10 2017 Category A3 - Sensitive Data + Exposure
                                      • OWASP Top 10 2017 Category A10 - Insufficient Logging & Monitoring
                                      • MITRE, CWE-117 - Improper Output Neutralization for Logs
                                      • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4792_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4792.json similarity index 70% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4792_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4792.json index d3d97d2d611..2ae7219c6e8 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4792_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4792.json @@ -23,6 +23,19 @@ ], "OWASP Top 10 2021": [ "A9" + ], + "PCI DSS 3.2": [ + "10.1", + "10.2", + "10.3" + ], + "PCI DSS 4.0": [ + "10.2" + ], + "ASVS 4.0": [ + "7.1.1", + "7.1.2" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4830_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4830.html similarity index 93% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4830_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4830.html index 52913864548..350d82d1a5d 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4830_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4830.html @@ -33,7 +33,7 @@

                                        See

                                      • OWASP Top 10 2021 Category A5 - Security Misconfiguration
                                      • OWASP Top 10 2021 Category A7 - Identification and Authentication Failures
                                      • -
                                      • OWASP Top 10 2017 Category A6 - Security +
                                      • OWASP Top 10 2017 Category A6 - Security Misconfiguration
                                      • MITRE, CWE-295 - Improper Certificate Validation
                                      • CERT, MSC61-J. - Do not use insecure or weak cryptographic algorithms
                                      • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4830_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4830.json similarity index 80% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4830_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4830.json index 3bc04528aa9..41939613b45 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4830_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4830.json @@ -39,6 +39,19 @@ "A2", "A5", "A7" + ], + "PCI DSS 3.2": [ + "4.1", + "6.5.4", + "6.5.10" + ], + "PCI DSS 4.0": [ + "4.2.1", + "6.2.4" + ], + "ASVS 4.0": [ + "1.9.2", + "9.2.1" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4838_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4838.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4838_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4838.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4838_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4838.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4838_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4838.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4925_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4925.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4925_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4925.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4925_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4925.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4925_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4925.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4926_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4926.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4926_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4926.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4926_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4926.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4926_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4926.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4929_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4929.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4929_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4929.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4929_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4929.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4929_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4929.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4968_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4968.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4968_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4968.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4968_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4968.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4968_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4968.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4970_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4970.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4970_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4970.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4970_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4970.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4970_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4970.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4973_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4973.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4973_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4973.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4973_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4973.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4973_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4973.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4977_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4977.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4977_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4977.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4977_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4977.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4977_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S4977.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5042_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5042.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5042_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5042.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5042_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5042.json similarity index 89% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5042_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5042.json index 1b5a53e33aa..10592722a59 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5042_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5042.json @@ -30,6 +30,10 @@ "OWASP Top 10 2021": [ "A1", "A5" + ], + "ASVS 4.0": [ + "12.1.2" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5122_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5122.html similarity index 95% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5122_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5122.html index 47322ce4ce4..722ff4d0c49 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5122_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5122.html @@ -148,10 +148,10 @@

                                        See

                                        Authentication Failures
                                      • developer.mozilla.org - CORS
                                      • developer.mozilla.org - Same origin policy
                                      • -
                                      • OWASP Top 10 2017 Category A6 - Security +
                                      • OWASP Top 10 2017 Category A6 - Security Misconfiguration
                                      • -
                                      • OWASP HTML5 Security Cheat Sheet - Cross - Origin Resource Sharing
                                      • +
                                      • OWASP HTML5 Security + Cheat Sheet - Cross Origin Resource Sharing
                                      • MITRE, CWE-346 - Origin Validation Error
                                      • MITRE, CWE-942 - Overly Permissive Cross-domain Whitelist
                                      • SANS Top 25 - Porous Defenses
                                      • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5122_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5122.json similarity index 74% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5122_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5122.json index 4b2484d3b5d..8fc974e2755 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5122_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5122.json @@ -23,6 +23,17 @@ "OWASP Top 10 2021": [ "A5", "A7" + ], + "PCI DSS 3.2": [ + "6.5.8" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "14.5.2", + "14.5.3" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5128_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5128.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5128_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5128.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5128_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5128.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5128_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5128.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5164_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5164.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5164_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5164.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5164_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5164.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5164_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5164.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5194_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5194.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5194_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5194.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5194_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5194.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5194_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5194.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5247_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5247.html similarity index 95% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5247_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5247.html index d82690f503c..5547b3ea59e 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5247_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5247.html @@ -51,8 +51,8 @@

                                        See

                                      • OWASP Top 10 2021 Category A3 - Injection
                                      • OWASP Cheat Sheet - XSS Prevention Cheat Sheet
                                      • -
                                      • OWASP Top 10 2017 Category A7 - Cross-Site Scripting - (XSS)
                                      • +
                                      • OWASP Top 10 2017 Category A7 - Cross-Site + Scripting (XSS)
                                      • MITRE, CWE-79 - Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
                                      diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5247_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5247.json similarity index 76% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5247_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5247.json index a66a02b4f7d..18b448ebbbe 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5247_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5247.json @@ -23,6 +23,16 @@ ], "OWASP Top 10 2021": [ "A3" + ], + "PCI DSS 3.2": [ + "6.5.7" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "5.3.3" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5261_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5261.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5261_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5261.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5261_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5261.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5261_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5261.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5301_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5301.html similarity index 91% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5301_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5301.html index 074b9241200..99fdb21cc08 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5301_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5301.html @@ -21,8 +21,8 @@

                                      See

                                      • OWASP Top 10 2021 Category A8 - Software and Data Integrity Failures
                                      • -
                                      • OWASP Top 10 2017 Category A8 - Insecure Deserialization -
                                      • +
                                      • OWASP Top 10 2017 Category A8 - Insecure + Deserialization
                                      • MITRE, CWE-502 - Deserialization of Untrusted Data
                                      • ActiveMQ ObjectMessage Security Advisory
                                      • CVE-2015-5254
                                      • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5301_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5301.json similarity index 88% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5301_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5301.json index 1dbbcb2394f..6864ae5e419 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5301_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5301.json @@ -23,6 +23,11 @@ ], "OWASP Top 10 2021": [ "A8" + ], + "ASVS 4.0": [ + "1.5.2", + "5.5.1", + "5.5.3" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5320_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5320.html similarity index 96% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5320_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5320.html index d7efcb21e2a..95059a89ff2 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5320_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5320.html @@ -74,7 +74,7 @@

                                        See

                                      • OWASP Top 10 2021 Category A4 - Insecure Design
                                      • Mobile AppSec Verification Standard - Platform Interaction Requirements
                                      • -
                                      • OWASP Mobile Top 10 2016 Category M1 - Improper +
                                      • OWASP Mobile Top 10 2016 Category M1 - Improper Platform Usage
                                      • MITRE, CWE-927 - Use of Implicit Intent for Sensitive Communication
                                      • Android documentation - diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5320_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5320.json similarity index 94% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5320_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5320.json index 0d7bd3bb122..9f5666318da 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5320_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5320.json @@ -24,5 +24,6 @@ "OWASP Top 10 2021": [ "A4" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5322_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5322.html similarity index 96% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5322_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5322.html index 26852c1a614..d15b7c862db 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5322_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5322.html @@ -75,7 +75,7 @@

                                        See

                                        • Mobile AppSec Verification Standard - Platform Interaction Requirements
                                        • -
                                        • OWASP Mobile Top 10 2016 Category M1 - Improper +
                                        • OWASP Mobile Top 10 2016 Category M1 - Improper Platform Usage
                                        • MITRE, CWE-925 - Improper Verification of Intent by Broadcast Receiver
                                        • MITRE, CWE-926 - Improper Export of Android Application Components
                                        • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5322_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5322.json similarity index 93% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5322_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5322.json index 33d3e60bf87..177a378df2e 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5322_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5322.json @@ -23,5 +23,6 @@ "MASVS": [ "MSTG-PLATFORM-2" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5324_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5324.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5324_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5324.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5324_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5324.json similarity index 82% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5324_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5324.json index 971a77131fa..1d5129579cc 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5324_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5324.json @@ -25,6 +25,13 @@ ], "OWASP Top 10 2021": [ "A4" + ], + "PCI DSS 3.2": [ + "6.5.8" + ], + "PCI DSS 4.0": [ + "6.2.4" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5329_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5329.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5329_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5329.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5329_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5329.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5329_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5329.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5332_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5332.html similarity index 92% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5332_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5332.html index 9bfec225644..2da841194b0 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5332_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5332.html @@ -48,7 +48,7 @@

                                          Recommended Secure Coding Practices

                                      • Enable encryption of cloud components communications whenever it’s possible.
                                      • Configure your application to block mixed content when rendering web pages.
                                      • -
                                      • If available, enforce OS level deativation of all clear-text traffic
                                      • +
                                      • If available, enforce OS level deactivation of all clear-text traffic

                                      It is recommended to secure all transport channels (even local network) as it can take a single non secure connection to compromise an entire application or system.

                                      @@ -121,8 +121,8 @@

                                      Exceptions

                                      See

                                      diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5332_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5332.json similarity index 70% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5332_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5332.json index be0360d8781..9b060623389 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5332_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5332.json @@ -27,6 +27,20 @@ ], "OWASP Top 10 2021": [ "A2" + ], + "PCI DSS 3.2": [ + "4.1", + "6.5.4" + ], + "PCI DSS 4.0": [ + "4.2.1", + "6.2.4" + ], + "ASVS 4.0": [ + "1.9.1", + "9.1.1", + "9.2.2" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5344_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5344.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5344_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5344.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5344_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5344.json similarity index 76% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5344_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5344.json index 75188304a0c..6eec6ae392c 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5344_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5344.json @@ -31,6 +31,20 @@ "OWASP Top 10 2021": [ "A2", "A4" + ], + "PCI DSS 3.2": [ + "6.5.3" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "2.10.3", + "2.4.1", + "2.4.2", + "2.4.3", + "2.4.4", + "2.4.5" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5361_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5361.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5361_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5361.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5361_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5361.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5361_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5361.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5411_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5411.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5411_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5411.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5411_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5411.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5411_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5411.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5413_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5413.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5413_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5413.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5413_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5413.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5413_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5413.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5443_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5443.html similarity index 89% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5443_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5443.html index 3403c05ad88..ba416c37291 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5443_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5443.html @@ -74,12 +74,13 @@

                                      Compliant Solution

                                      See

                                      diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5443_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5443.json similarity index 79% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5443_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5443.json index 392f0b50c71..4149c5938f4 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5443_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5443.json @@ -22,6 +22,13 @@ ], "OWASP Top 10 2021": [ "A1" + ], + "PCI DSS 3.2": [ + "6.5.8" + ], + "PCI DSS 4.0": [ + "6.2.4" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5445_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5445.html similarity index 80% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5445_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5445.html index 8377efeec89..2fe2d00ca41 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5445_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5445.html @@ -22,11 +22,11 @@

                                      Compliant Solution

                                      See

                                      diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5445_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5445.json similarity index 86% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5445_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5445.json index 962d8d9718f..e7c2aa21936 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5445_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5445.json @@ -24,6 +24,12 @@ ], "OWASP Top 10 2021": [ "A1" + ], + "PCI DSS 3.2": [ + "6.5.8" + ], + "PCI DSS 4.0": [ + "6.2.4" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5527_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5527.html similarity index 96% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5527_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5527.html index 26cadc43d39..bb1d434aa97 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5527_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5527.html @@ -82,7 +82,7 @@

                                      See

                                    • OWASP Top 10 2021 Category A5 - Security Misconfiguration
                                    • OWASP Top 10 2021 Category A7 - Identification and Authentication Failures
                                    • -
                                    • OWASP Top 10 2017 Category A6 - Security +
                                    • OWASP Top 10 2017 Category A6 - Security Misconfiguration
                                    • MITRE, CWE-295 - Improper Certificate Validation
                                    • Derived from FindSecBugs rule WEAK_HOSTNAME_VERIFIER
                                    • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5527_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5527.json similarity index 84% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5527_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5527.json index 205de58e3b2..23caecc9a4a 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5527_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5527.json @@ -36,6 +36,15 @@ "A2", "A5", "A7" + ], + "PCI DSS 3.2": [ + "4.1", + "6.5.4", + "6.5.10" + ], + "PCI DSS 4.0": [ + "4.2.1", + "6.2.4" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5542_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5542.html similarity index 60% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5542_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5542.html index dbb6f2bc114..63f4260df1c 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5542_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5542.html @@ -1,34 +1,35 @@ -

                                      Encryption operation mode and the padding scheme should be chosen appropriately to guarantee data confidentiality, integrity and authenticity:

                                      +

                                      Encryption algorithms should use secure modes and padding schemes where appropriate to guarantee data confidentiality and integrity.

                                      • For block cipher encryption algorithms (like AES):
                                          +
                                        • The ECB (Electronic Codebook) cipher mode doesn’t provide serious message confidentiality: under a given key any given plaintext block + always gets encrypted to the same ciphertext block. This mode should never be used.
                                        • +
                                        • The CBC (Cipher Block Chaining) mode by itself provides only data confidentiality. This cipher mode is also vulnerable to padding oracle attacks when used with padding. Using CBC along with Message + Authentication Code can provide data integrity and should prevent such attacks. In practice the implementation has many pitfalls and it’s + recommended to avoid CBC with padding completely.
                                        • The GCM (Galois Counter Mode) mode which works internally with zero/no padding scheme, is recommended, as it is designed to provide both data authenticity (integrity) and confidentiality. Other similar modes are CCM, CWC, EAX, IAPM and OCB.
                                        • -
                                        • The CBC (Cipher Block Chaining) mode by itself provides only data confidentiality, it’s recommended to use it along with Message - Authentication Code or similar to achieve data authenticity (integrity) too and thus to prevent padding oracle attacks.
                                        • -
                                        • The ECB (Electronic Codebook) mode doesn’t provide serious message confidentiality: under a given key any given plaintext block always gets - encrypted to the same ciphertext block. This mode should not be used.
                                      • For RSA encryption algorithm, the recommended padding scheme is OAEP.

                                      Noncompliant Code Example

                                      -Cipher c1 = Cipher.getInstance("AES"); // Noncompliant: by default ECB mode is chosen
                                      -Cipher c2 = Cipher.getInstance("AES/ECB/NoPadding"); // Noncompliant: ECB doesn't provide serious message confidentiality
                                      +Cipher.getInstance("AES"); // Noncompliant: by default ECB mode is chosen
                                      +Cipher.getInstance("AES/ECB/NoPadding"); // Noncompliant: ECB doesn't provide serious message confidentiality
                                       
                                      -Cipher c3 = Cipher.getInstance("RSA/None/NoPadding"); // Noncompliant: RSA without OAEP padding scheme is not recommanded
                                      +Cipher.getInstance("AES/CBC/PKCS5Padding"); // Noncompliant: Vulnerable to Padding Oracle attacks
                                      +
                                      +Cipher.getInstance("RSA/None/NoPadding"); // Noncompliant: RSA without OAEP padding scheme is not recommended
                                       

                                      Compliant Solution

                                      -// Recommended for block ciphers
                                      -Cipher c1 = Cipher.getInstance("AES/GCM/NoPadding"); // Compliant
                                      +Cipher.getInstance("AES/GCM/NoPadding");
                                       
                                      -// Recommended for RSA
                                      -Cipher c3 = Cipher.getInstance("RSA/None/OAEPWITHSHA-256ANDMGF1PADDING"); // Compliant
                                      +Cipher.getInstance("RSA/None/OAEPWITHSHA-256ANDMGF1PADDING");
                                       // or the ECB mode can be used for RSA when "None" is not available with the security provider used - in that case, ECB will be treated as "None" for RSA.
                                      -Cipher c3 = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING"); // Compliant
                                      +Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING");
                                       

                                      See

                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5542_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5542.json similarity index 85% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5542_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5542.json index 5971327c023..edd532a7fc2 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5542_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5542.json @@ -38,6 +38,15 @@ ], "OWASP Top 10 2021": [ "A2" + ], + "PCI DSS 3.2": [ + "4.1", + "6.5.3", + "6.5.4" + ], + "PCI DSS 4.0": [ + "4.2.1", + "6.2.4" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5547_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5547.html similarity index 94% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5547_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5547.html index 721a129e694..0b31d9144a9 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5547_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5547.html @@ -49,8 +49,8 @@

                                        Compliant Solution

                                        See

                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5689_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5689.json similarity index 83% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5689_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5689.json index f23992c730d..c54f985df4f 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5689_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5689.json @@ -23,6 +23,12 @@ ], "OWASP Top 10 2021": [ "A5" + ], + "ASVS 4.0": [ + "14.3.3", + "7.3.3", + "8.3.4" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5693_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5693.html similarity index 95% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5693_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5693.html index 22849f52630..18d366ae025 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5693_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5693.html @@ -53,7 +53,7 @@

                                        See

                                      • OWASP Top 10 2021 Category A5 - Security Misconfiguration
                                      • Owasp Cheat Sheet - Owasp Denial of Service Cheat Sheet
                                      • -
                                      • OWASP Top 10 2017 Category A6 - Security +
                                      • OWASP Top 10 2017 Category A6 - Security Misconfiguration
                                      • MITRE, CWE-770 - Allocation of Resources Without Limits or Throttling
                                      • MITRE, CWE-400 - Uncontrolled Resource Consumption
                                      • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5693_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5693.json similarity index 76% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5693_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5693.json index f8bc9593dc7..bb4c2d68bd0 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5693_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5693.json @@ -25,6 +25,17 @@ ], "OWASP Top 10 2021": [ "A5" + ], + "PCI DSS 3.2": [ + "2.2" + ], + "PCI DSS 4.0": [ + "2.2" + ], + "ASVS 4.0": [ + "12.1.1", + "12.1.3" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5738_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5738.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5738_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5738.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5738_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5738.json similarity index 92% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5738_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5738.json index 11d0160bc9f..2701a814fe1 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5738_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5738.json @@ -21,6 +21,9 @@ ], "CERT": [ "MET02-J." + ], + "ASVS 4.0": [ + "1.14.6" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5776_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5776.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5776_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5776.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5776_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5776.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5776_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5776.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5777_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5777.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5777_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5777.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5777_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5777.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5777_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5777.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5778_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5778.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5778_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5778.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5778_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5778.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5778_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5778.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5779_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5779.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5779_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5779.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5779_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5779.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5779_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5779.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5783_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5783.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5783_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5783.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5783_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5783.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5783_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5783.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5785_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5785.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5785_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5785.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5785_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5785.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5785_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5785.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5786_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5786.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5786_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5786.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5786_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5786.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5786_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5786.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5790_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5790.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5790_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5790.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5790_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5790.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5790_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5790.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5793_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5793.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5793_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5793.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5793_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5793.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5793_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5793.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5803_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5803.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5803_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5803.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5803_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5803.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5803_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5803.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5804_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5804.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5804_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5804.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5804_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5804.json similarity index 72% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5804_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5804.json index 50267aa8d2e..6b2bb8725e0 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5804_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5804.json @@ -24,6 +24,18 @@ ], "OWASP Top 10 2021": [ "A1" + ], + "PCI DSS 3.2": [ + "6.5.10" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "14.3.3", + "7.3.3", + "8.3.4" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5808_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5808.html similarity index 96% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5808_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5808.html index c325955ed5b..cda9ab7ff2b 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5808_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5808.html @@ -92,7 +92,8 @@

                                        Exceptions

                                        See

                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5808_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5808.json similarity index 78% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5808_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5808.json index 3434e0b2a3e..e94a227311d 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5808_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5808.json @@ -23,6 +23,16 @@ ], "OWASP Top 10 2021": [ "A1" + ], + "PCI DSS 3.2": [ + "6.5.8" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "4.1.3", + "4.1.5" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5810_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5810.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5810_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5810.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5810_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5810.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5810_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5810.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5826_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5826.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5826_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5826.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5826_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5826.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5826_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5826.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5831_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5831.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5831_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5831.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5831_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5831.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5831_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5831.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5833_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5833.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5833_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5833.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5833_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5833.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5833_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5833.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5838_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5838.html similarity index 95% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5838_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5838.html index 41805870414..8814ef9513a 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5838_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5838.html @@ -49,7 +49,7 @@

                                        assertThat(x.hashCode()).isEqualTo(y.hashCode())

                                        -

                                        assertThat(x).hasSameHashCodeAs(y));

                                        +

                                        assertThat(x).hasSameHashCodeAs(y)

                                        assertThat(getObject() instanceof MyClass).isTrue()

                                        @@ -64,15 +64,15 @@

                                        assertThat(x).isEqualByComparingTo(y)

                                        -

                                        assertThat(x >= y).isGreaterThanOrEqualTo(0)

                                        +

                                        assertThat(x >= y).isTrue()

                                        assertThat(x).isGreaterThanOrEqualTo(y)

                                        -

                                        assertThat(x > y).isPositive()

                                        +

                                        assertThat(x > y).isTrue()

                                        assertThat(x).isGreaterThan(y)

                                        -

                                        assertThat(x <= y).isNotPositive()

                                        +

                                        assertThat(x <= y).isTrue()

                                        assertThat(x).isLessThanOrEqualTo(y)

                                        @@ -88,8 +88,8 @@

                                        assertThat(getString()).isEmpty()

                                        -

                                        assertThat(getString()).hasSize(0)

                                        -

                                        assertThat(getString()).isEmpty()

                                        +

                                        assertThat(getString()).hasSize(0)

                                        +

                                        assertThat(getString()).isEmpty()

                                        assertThat(getString().equals(expected)).isTrue()

                                        @@ -229,7 +229,7 @@

                                        assertThat(getArray().length).isEqualTo(anotherArray.length)

                                        -

                                        assertThat(getArray()).hasSameSizeAs(getAnotherArray())

                                        +

                                        assertThat(getArray()).hasSameSizeAs(anotherArray)

                                        assertThat(getArray().length).isLessThanOrEqualTo(expression)

                                        @@ -293,7 +293,7 @@

                                        assertThat(getMap().values()).contains(value)

                                        -

                                        assertThat(getMap()).containsValue(value)

                                        +

                                        assertThat(getMap()).containsValue(value)

                                        assertThat(getMap().get(key)).isEqualTo(value)

                                        @@ -329,6 +329,7 @@

                                        Noncompliant Code Example

                                        Compliant Solution

                                         assertThat(getObject()).isNull();
                                        +assertThat(getObject()).isNotNull();
                                         
                                         assertThat(getString()).isBlank();
                                         assertThat(getFile()).canRead();
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5838_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5838.json
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5838_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5838.json
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5841_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5841.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5841_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5841.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5841_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5841.json
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5841_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5841.json
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5842_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5842.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5842_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5842.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5842_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5842.json
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5842_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5842.json
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5843_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5843.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5843_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5843.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5843_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5843.json
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5843_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5843.json
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5845_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5845.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5845_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5845.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5845_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5845.json
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5845_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5845.json
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5846_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5846.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5846_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5846.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5846_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5846.json
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5846_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5846.json
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5850_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5850.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5850_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5850.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5850_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5850.json
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5850_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5850.json
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5852_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5852.html
                                        similarity index 96%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5852_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5852.html
                                        index 636231741ba..d5cdd31d3fc 100644
                                        --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5852_java.html
                                        +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5852.html
                                        @@ -102,13 +102,13 @@ 

                                        Compliant Solution

                                        See

                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5876_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5876.json similarity index 81% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5876_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5876.json index c7947c4311c..47adc55c50c 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5876_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5876.json @@ -24,6 +24,15 @@ ], "OWASP Top 10 2021": [ "A7" + ], + "PCI DSS 3.2": [ + "6.5.10" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "3.2.1" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5917_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5917.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5917_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5917.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5917_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5917.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5917_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5917.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5958_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5958.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5958_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5958.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5958_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5958.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5958_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5958.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5960_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5960.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5960_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5960.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5960_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5960.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5960_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5960.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5961_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5961.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5961_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5961.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5961_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5961.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5961_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5961.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5967_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5967.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5967_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5967.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5967_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5967.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5967_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5967.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5969_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5969.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5969_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5969.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5969_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5969.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5969_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5969.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5970_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5970.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5970_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5970.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5970_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5970.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5970_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5970.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5973_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5973.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5973_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5973.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5973_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5973.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5973_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5973.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5976_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5976.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5976_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5976.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5976_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5976.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5976_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5976.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5977_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5977.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5977_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5977.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5977_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5977.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5977_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5977.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5979_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5979.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5979_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5979.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5979_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5979.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5979_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5979.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5993_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5993.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5993_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5993.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5993_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5993.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5993_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5993.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5994_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5994.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5994_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5994.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5994_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5994.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5994_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5994.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5996_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5996.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5996_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5996.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5996_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5996.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5996_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5996.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5998_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5998.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5998_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5998.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5998_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5998.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5998_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S5998.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6001_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6001.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6001_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6001.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6001_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6001.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6001_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6001.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6002_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6002.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6002_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6002.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6002_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6002.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6002_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6002.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6019_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6019.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6019_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6019.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6019_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6019.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6019_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6019.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6035_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6035.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6035_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6035.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6035_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6035.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6035_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6035.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6068_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6068.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6068_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6068.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6068_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6068.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6068_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6068.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6070_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6070.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6070_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6070.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6070_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6070.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6070_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6070.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6073_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6073.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6073_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6073.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6073_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6073.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6073_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6073.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6103_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6103.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6103_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6103.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6103_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6103.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6103_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6103.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6104_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6104.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6104_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6104.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6104_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6104.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6104_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6104.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6126_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6126.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6126_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6126.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6126_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6126.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6126_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6126.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6201_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6201.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6201_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6201.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6201_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6201.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6201_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6201.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6202_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6202.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6202_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6202.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6202_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6202.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6202_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6202.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6203_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6203.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6203_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6203.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6203_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6203.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6203_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6203.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6204_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6204.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6204_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6204.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6204_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6204.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6204_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6204.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6205_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6205.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6205_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6205.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6205_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6205.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6205_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6205.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6206_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6206.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6206_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6206.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6206_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6206.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6206_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6206.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6207_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6207.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6207_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6207.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6207_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6207.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6207_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6207.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6208_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6208.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6208_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6208.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6208_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6208.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6208_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6208.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6209_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6209.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6209_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6209.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6209_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6209.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6209_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6209.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6211_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6211.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6211_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6211.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6211_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6211.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6211_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6211.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6212_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6212.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6212_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6212.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6212_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6212.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6212_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6212.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6213_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6213.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6213_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6213.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6213_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6213.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6213_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6213.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6216_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6216.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6216_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6216.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6216_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6216.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6216_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6216.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6217_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6217.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6217_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6217.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6217_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6217.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6217_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6217.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6218_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6218.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6218_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6218.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6218_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6218.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6218_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6218.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6219_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6219.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6219_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6219.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6219_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6219.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6219_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6219.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6241_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6241.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6241_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6241.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6241_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6241.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6241_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6241.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6242_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6242.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6242_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6242.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6242_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6242.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6242_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6242.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6243_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6243.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6243_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6243.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6243_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6243.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6243_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6243.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6244_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6244.html similarity index 65% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6244_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6244.html index 884f740662b..8b997d7d929 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6244_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6244.html @@ -1,14 +1,8 @@

                                        Some API, like the AWS SDK, heavily rely on the builder pattern to create different data structures. Despite all the benefits, this pattern can -become really verbose,

                                        -
                                        -especially when dealing with nested structures. In order to reach a more concise code, "Consumer Builders", also called "Consumer Interface" are often introduced.
                                        -
                                        -
                                        -The idea is to overload the methods taking others structures in a Builder with a Consumer of Builder instead. This enables to use a
                                        -
                                        -
                                        -lambda instead of nesting another Builder, resulting in more concise and readable code.
                                        -
                                        +become really verbose, especially when dealing with nested structures. In order to reach a more concise code, "Consumer Builders", also called +"Consumer Interface" are often introduced.

                                        +

                                        The idea is to overload the methods taking others structures in a Builder with a Consumer of Builder instead. This enables to use a lambda instead +of nesting another Builder, resulting in more concise and readable code.

                                        This rule reports an issue when the Consumer Builder methods could be used instead of the classical ones.

                                        Noncompliant Code Example

                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6244_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6244.json
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6244_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6244.json
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6246_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6246.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6246_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6246.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6246_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6246.json
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6246_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6246.json
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6262_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6262.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6262_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6262.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6262_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6262.json
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6262_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6262.json
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6263_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6263.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6263_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6263.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6263_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6263.json
                                        similarity index 87%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6263_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6263.json
                                        index 7d85fe2d3ab..2fb090b3d0f 100644
                                        --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6263_java.json
                                        +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6263.json
                                        @@ -12,5 +12,6 @@
                                           "defaultSeverity": "Major",
                                           "ruleSpecification": "RSPEC-6263",
                                           "sqKey": "S6263",
                                        -  "scope": "Main"
                                        +  "scope": "Main",
                                        +  "quickfix": "unknown"
                                         }
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6288_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6288.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6288_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6288.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6288_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6288.json
                                        similarity index 79%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6288_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6288.json
                                        index 7d891572863..6becf9999b3 100644
                                        --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6288_java.json
                                        +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6288.json
                                        @@ -27,6 +27,16 @@
                                             ],
                                             "OWASP Top 10 2021": [
                                               "A4"
                                        +    ],
                                        +    "PCI DSS 3.2": [
                                        +      "6.5.8"
                                        +    ],
                                        +    "PCI DSS 4.0": [
                                        +      "6.2.4"
                                        +    ],
                                        +    "ASVS 4.0": [
                                        +      "2.10.3"
                                             ]
                                        -  }
                                        +  },
                                        +  "quickfix": "unknown"
                                         }
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6291_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6291.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6291_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6291.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6291_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6291.json
                                        similarity index 76%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6291_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6291.json
                                        index db85861f4ef..8f15a2b2f97 100644
                                        --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6291_java.json
                                        +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6291.json
                                        @@ -35,6 +35,20 @@
                                               "A2",
                                               "A4",
                                               "A5"
                                        +    ],
                                        +    "PCI DSS 3.2": [
                                        +      "2.2",
                                        +      "6.5.3"
                                        +    ],
                                        +    "PCI DSS 4.0": [
                                        +      "2.2",
                                        +      "6.2.4"
                                        +    ],
                                        +    "ASVS 4.0": [
                                        +      "6.1.1",
                                        +      "6.1.2",
                                        +      "6.1.3"
                                             ]
                                        -  }
                                        +  },
                                        +  "quickfix": "unknown"
                                         }
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6293_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6293.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6293_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6293.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6293_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6293.json
                                        similarity index 80%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6293_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6293.json
                                        index 1cec66bc478..3251cb59de8 100644
                                        --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6293_java.json
                                        +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6293.json
                                        @@ -26,6 +26,14 @@
                                             ],
                                             "OWASP Top 10 2021": [
                                               "A7"
                                        -    ]
                                        -  }
                                        +    ],
                                        +    "PCI DSS 3.2": [
                                        +      "6.5.10"
                                        +    ],
                                        +    "PCI DSS 4.0": [
                                        +      "6.2.4"
                                        +    ],
                                        +    "ASVS 4.0": []
                                        +  },
                                        +  "quickfix": "unknown"
                                         }
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6300_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6300.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6300_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6300.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6300_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6300.json
                                        similarity index 78%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6300_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6300.json
                                        index f407d37af3c..c2cd9a37028 100644
                                        --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6300_java.json
                                        +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6300.json
                                        @@ -33,6 +33,18 @@
                                             ],
                                             "OWASP Top 10 2021": [
                                               "A4"
                                        +    ],
                                        +    "PCI DSS 3.2": [
                                        +      "6.5.3"
                                        +    ],
                                        +    "PCI DSS 4.0": [
                                        +      "6.2.4"
                                        +    ],
                                        +    "ASVS 4.0": [
                                        +      "6.1.1",
                                        +      "6.1.2",
                                        +      "6.1.3"
                                             ]
                                        -  }
                                        +  },
                                        +  "quickfix": "unknown"
                                         }
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6301_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6301.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6301_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6301.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6301_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6301.json
                                        similarity index 81%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6301_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6301.json
                                        index 1ba43c0d9bd..6eab52a7a8a 100644
                                        --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6301_java.json
                                        +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6301.json
                                        @@ -35,6 +35,17 @@
                                             "OWASP Top 10 2021": [
                                               "A2",
                                               "A4"
                                        +    ],
                                        +    "PCI DSS 3.2": [
                                        +      "6.5.10"
                                        +    ],
                                        +    "PCI DSS 4.0": [
                                        +      "6.2.4"
                                        +    ],
                                        +    "ASVS 4.0": [
                                        +      "6.1.1",
                                        +      "6.1.2",
                                        +      "6.1.3"
                                             ]
                                           },
                                           "quickfix": "unknown"
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6326_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6326.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6326_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6326.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6326_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6326.json
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6326_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6326.json
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6331_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6331.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6331_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6331.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6331_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6331.json
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6331_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6331.json
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6353_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6353.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6353_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6353.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6353_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6353.json
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6353_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6353.json
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6355_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6355.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6355_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6355.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6355_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6355.json
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6355_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6355.json
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6362_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6362.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6362_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6362.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6362_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6362.json
                                        similarity index 77%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6362_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6362.json
                                        index 01cdab5b20e..b17ef6b4e45 100644
                                        --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6362_java.json
                                        +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6362.json
                                        @@ -29,6 +29,17 @@
                                             ],
                                             "OWASP Top 10 2021": [
                                               "A3"
                                        +    ],
                                        +    "PCI DSS 3.2": [
                                        +      "6.5.1",
                                        +      "6.5.7"
                                        +    ],
                                        +    "PCI DSS 4.0": [
                                        +      "6.2.4"
                                        +    ],
                                        +    "ASVS 4.0": [
                                        +      "5.3.3"
                                             ]
                                        -  }
                                        +  },
                                        +  "quickfix": "unknown"
                                         }
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6363_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6363.html
                                        similarity index 100%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6363_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6363.html
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6363_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6363.json
                                        similarity index 81%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6363_java.json
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6363.json
                                        index 2fb0d35824b..bc37ec3d679 100644
                                        --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6363_java.json
                                        +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6363.json
                                        @@ -29,6 +29,16 @@
                                             ],
                                             "OWASP Top 10 2021": [
                                               "A3"
                                        +    ],
                                        +    "PCI DSS 3.2": [
                                        +      "6.5.1",
                                        +      "6.5.7"
                                        +    ],
                                        +    "PCI DSS 4.0": [
                                        +      "6.2.4"
                                        +    ],
                                        +    "ASVS 4.0": [
                                        +      "5.3.3"
                                             ]
                                           },
                                           "quickfix": "unknown"
                                        diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6373_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6373.html
                                        similarity index 93%
                                        rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6373_java.html
                                        rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6373.html
                                        index 6610e0c0418..7a176301552 100644
                                        --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6373_java.html
                                        +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6373.html
                                        @@ -1,7 +1,7 @@
                                         

                                        XML standard allows the inclusion of xml files with the xinclude element.

                                        XML processors will replace an xinclude element with the content of the file located at the URI defined in the href attribute, potentially from an external storage such as file system or network, which may lead, if no restrictions are put in place, to arbitrary file disclosures or server-side request forgery (SSRF) vulnerabilities.

                                        +href="https://owasp.org/www-community/attacks/Server_Side_Request_Forgery">server-side request forgery (SSRF) vulnerabilities.

                                        Noncompliant Code Example

                                        For DocumentBuilder, SAXParser, See

                                        • Oracle Java Documentation - XML External Entity Injection Attack
                                        • -
                                        • OWASP Top 10 2017 Category A4 - XML External Entities - (XXE)
                                        • +
                                        • OWASP Top 10 2017 Category A4 - XML External + Entities (XXE)
                                        • OWASP XXE Prevention Cheat Sheet
                                        • MITRE, CWE-611 - Information Exposure Through XML External Entity Reference
                                        • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6373_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6373.json similarity index 80% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6373_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6373.json index 77a890a001d..038238bcbca 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6373_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6373.json @@ -21,6 +21,15 @@ ], "OWASP Top 10 2021": [ "A5" + ], + "PCI DSS 3.2": [ + "6.5.1" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "5.5.2" ] }, "quickfix": "infeasible" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6374_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6374.html similarity index 93% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6374_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6374.html index 9bc32cd2d71..c3e1491acf1 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6374_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6374.html @@ -1,6 +1,6 @@

                                          By default XML processors attempt to load all XML schemas and DTD (their locations are defined with xsi:schemaLocation attributes and DOCTYPE declarations), potentially from an external storage such as file system or network, which may lead, if no restrictions are put in -place, to server-side request forgery (SSRF) vulnerabilities.

                                          +place, to server-side request forgery (SSRF) vulnerabilities.

                                          Noncompliant Code Example

                                          For DocumentBuilder, SAXParser and See

                                          • Oracle Java Documentation - XML External Entity Injection Attack
                                          • -
                                          • OWASP Top 10 2017 Category A4 - XML External Entities - (XXE)
                                          • +
                                          • OWASP Top 10 2017 Category A4 - XML External + Entities (XXE)
                                          • OWASP XXE Prevention Cheat Sheet
                                          • MITRE, CWE-611 - Information Exposure Through XML External Entity Reference
                                          • diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6374_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6374.json similarity index 79% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6374_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6374.json index b22b9fc7324..a213742e464 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6374_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6374.json @@ -21,6 +21,15 @@ ], "OWASP Top 10 2021": [ "A5" + ], + "PCI DSS 3.2": [ + "6.5.1" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "5.5.2" ] }, "quickfix": "infeasible" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6376_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6376.html similarity index 95% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6376_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6376.html index ece6ab415c1..bf903609b39 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6376_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6376.html @@ -61,8 +61,8 @@

                                            See

                                            • Oracle Java Documentation - XML External Entity Injection Attack
                                            • -
                                            • OWASP Top 10 2017 Category A4 - XML External Entities - (XXE)
                                            • +
                                            • OWASP Top 10 2017 Category A4 - XML External + Entities (XXE)
                                            • OWASP XXE Prevention Cheat Sheet
                                            • MITRE, CWE-776 - Improper Restriction of Recursive Entity References in DTDs ('XML diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6376_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6376.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6376_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6376.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6377_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6377.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6377_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6377.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6377_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6377.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6377_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6377.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6395_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6395.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6395_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6395.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6395_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6395.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6395_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6395.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6396_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6396.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6396_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6396.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6396_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6396.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6396_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6396.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6397_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6397.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6397_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6397.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6397_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6397.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6397_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6397.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6411_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6411.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6411_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6411.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6411_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6411.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6411_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6411.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6418_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6418.html similarity index 94% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6418_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6418.html index efed7c32dc9..32360ef0271 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6418_java.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6418.html @@ -24,7 +24,7 @@

                                              Recommended Secure Coding Practices

                                            Sensitive Code Example

                                            -private static final MY_SECRET = "47828a8dd77ee1eb9dde2d5e93cb221ce8c32b37";
                                            +private static final String MY_SECRET = "47828a8dd77ee1eb9dde2d5e93cb221ce8c32b37";
                                             
                                             public static void main(String[] args) {
                                               MyClass.callMyService(MY_SECRET);
                                            @@ -84,7 +84,8 @@ 

                                            See

                                            diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6418_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6418.json similarity index 73% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6418_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6418.json index 58a199bf64c..e373eea94bf 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6418_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6418.json @@ -26,6 +26,18 @@ ], "OWASP Top 10 2021": [ "A7" + ], + "PCI DSS 3.2": [ + "6.5.10" + ], + "PCI DSS 4.0": [ + "6.2.4" + ], + "ASVS 4.0": [ + "2.10.4", + "3.5.2", + "6.4.1" ] - } + }, + "quickfix": "unknown" } diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6432.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6432.html new file mode 100644 index 00000000000..5efe3a3697a --- /dev/null +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6432.html @@ -0,0 +1,54 @@ +

                                            When encrypting data with Counter (CTR) derived block cipher modes of operation, it is essential not to reuse the same initialization vector (IV) +with a given key, such IV is called a "nonce" (number used only once). Galois/Counter (GCM) and Counter with Cipher Block Chaining-Message +Authentication Code (CCM) are both CTR-based modes of operation.

                                            +

                                            An attacker, who has knowledge of one plaintext (original content) and ciphertext (encrypted content) pair, is able to retrieve the corresponding +plaintext of any other ciphertext generated with the same IV and key. It also drastically decreases the key recovery computational complexity by +downgrading it to a simpler polynomial root-finding problem.

                                            +

                                            When using GCM, NIST recommends a 96 bit length nonce using a 'Deterministic' approach or at least 96 bits using a 'Random Bit Generator (RBG)'. +The 'Deterministic' construction involves a counter, which increments per encryption process. The 'RBG' construction, as the name suggests, generates +the nonce using a random bit generator. Collision probabilities (nonce-key pair reuse) using the 'RBG-based' approach require a shorter key rotation +period, 2^32 maximum invocations per key.

                                            +

                                            Noncompliant Code Example

                                            +
                                            +public void encrypt(byte[] key, byte[] ptxt) {
                                            +    byte[] bytesIV = "7cVgr5cbdCZV".getBytes("UTF-8"); // The initialization vector is a static value
                                            +
                                            +    GCMParameterSpec gcmSpec    = new GCMParameterSpec(128, nonce); // The initialization vector is configured here
                                            +    SecretKeySpec keySpec       = new SecretKeySpec(key, "AES");
                                            +
                                            +    Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
                                            +    cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);  // Noncompliant
                                            +}
                                            +
                                            +

                                            Compliant Solution

                                            +
                                            +public void encrypt(byte[] key, byte[] ptxt) {
                                            +    SecureRandom random = new SecureRandom();
                                            +    byte[] bytesIV = new byte[12];
                                            +    random.nextBytes(bytesIV); // Random 96 bit IV
                                            +
                                            +    GCMParameterSpec gcmSpec    = new GCMParameterSpec(128, nonce);
                                            +    SecretKeySpec keySpec       = new SecretKeySpec(key, "AES");
                                            +
                                            +    Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
                                            +    cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
                                            +}
                                            +
                                            +

                                            See

                                            + + diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6432.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6432.json new file mode 100644 index 00000000000..216384ffb46 --- /dev/null +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6432.json @@ -0,0 +1,35 @@ +{ + "title": "Counter Mode initialization vectors should not be reused", + "type": "VULNERABILITY", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "15min" + }, + "tags": [ + "cwe", + "owasp-a3" + ], + "defaultSeverity": "Critical", + "ruleSpecification": "RSPEC-6432", + "sqKey": "S6432", + "scope": "Main", + "securityStandards": { + "CWE": [ + 323 + ], + "OWASP": [ + "A3" + ], + "OWASP Mobile": [ + "M5" + ], + "MASVS": [ + "MSTG-CRYPTO-6" + ], + "OWASP Top 10 2021": [ + "A2" + ] + }, + "quickfix": "unknown" +} diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6437.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6437.html new file mode 100644 index 00000000000..eb654d36cb8 --- /dev/null +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6437.html @@ -0,0 +1,80 @@ +

                                            A hard-coded secret has been found in your code. You should quickly list where this secret is used, revoke it, and then change it in every system +that uses it.

                                            +

                                            Passwords, secrets, and any type of credentials should only be used to authenticate a single entity (a person or a system).

                                            +

                                            If you allow third parties to authenticate as another system or person, they can impersonate legitimate identities and undermine trust within the +organization.
                                            It does not matter if the impersonation is malicious: In either case, it is a clear breach of trust in the system, as the systems +involved falsely assume that the authenticated entity is who it claims to be.
                                            The consequences can be catastrophic.

                                            +

                                            Keeping credentials in plain text in a code base is tantamount to sharing that password with anyone who has access to the source code and runtime +servers.
                                            Thus, it is a breach of trust, as these individuals have the ability to impersonate others.

                                            +

                                            Secret management services are the most efficient tools to store credentials and protect the identities associated with them.
                                            Cloud providers +and on-premise services can be used for this purpose.

                                            +

                                            If storing credentials in a secret data management service is not possible, follow these guidelines:

                                            +
                                              +
                                            • Do not store credentials in a file that an excessive number of people can access. +
                                                +
                                              • For example, not in code, not in a spreadsheet, not on a sticky note, and not on a shared drive.
                                              • +
                                            • +
                                            • Use the production operating system to protect password access control. +
                                                +
                                              • For example, in a file whose permissions are restricted and protected with chmod and chown.
                                              • +
                                            • +
                                            +

                                            Noncompliant Code Example

                                            +
                                            +import org.h2.security.SHA256;
                                            +
                                            +String inputString = "s3cr37";
                                            +byte[] key         = inputString.getBytes();
                                            +
                                            +SHA256.getHMAC(key, message);  // Noncompliant
                                            +
                                            +

                                            Compliant Solution

                                            +

                                            Using AWS Secrets Manager:

                                            +
                                            +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient;
                                            +import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest;
                                            +import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse;
                                            +import org.h2.security.SHA256;
                                            +
                                            +public static void doSomething(SecretsManagerClient secretsClient, String secretName) {
                                            +  GetSecretValueRequest valueRequest = GetSecretValueRequest.builder()
                                            +    .secretId(secretName)
                                            +    .build();
                                            +
                                            +  GetSecretValueResponse valueResponse = secretsClient.getSecretValue(valueRequest);
                                            +  String secret                        = valueResponse.secretString();
                                            +
                                            +  byte[] key = secret.getBytes();
                                            +  SHA256.getHMAC(key, message);
                                            +}
                                            +
                                            +

                                            Using Azure Key Vault Secret:

                                            +
                                            +import com.azure.identity.DefaultAzureCredentialBuilder;
                                            +import com.azure.security.keyvault.secrets.SecretClient;
                                            +import com.azure.security.keyvault.secrets.SecretClientBuilder;
                                            +import com.azure.security.keyvault.secrets.models.KeyVaultSecret;
                                            +import org.h2.security.SHA256;
                                            +
                                            +public static void doSomething(SecretClient secretClient, String secretName) {
                                            +  KeyVaultSecret retrievedSecret = secretClient.getSecret(secretName);
                                            +  String secret = retrievedSecret.getValue();
                                            +
                                            +  byte[] key = secret.getBytes();
                                            +  SHA256.getHMAC(key, message);
                                            +}
                                            +
                                            +

                                            See

                                            + + diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6437.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6437.json new file mode 100644 index 00000000000..de68d694819 --- /dev/null +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S6437.json @@ -0,0 +1,30 @@ +{ + "title": "Credentials should not be hard-coded", + "type": "VULNERABILITY", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "60min" + }, + "tags": [ + "cwe", + "owasp-a2" + ], + "defaultSeverity": "Blocker", + "ruleSpecification": "RSPEC-6437", + "sqKey": "S6437", + "scope": "Main", + "securityStandards": { + "CWE": [ + 798, + 259 + ], + "OWASP": [ + "A2" + ], + "OWASP Top 10 2021": [ + "A7" + ] + }, + "quickfix": "infeasible" +} diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S818_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S818.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S818_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S818.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S818_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S818.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S818_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S818.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S864_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S864.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S864_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S864.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S864_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S864.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S864_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S864.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S881_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S881.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S881_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S881.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S881_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S881.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S881_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S881.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S888_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S888.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S888_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S888.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S888_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S888.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S888_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S888.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S899_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S899.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S899_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S899.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S899_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S899.json similarity index 93% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S899_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S899.json index 210f8103935..7935355fb04 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S899_java.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S899.json @@ -25,6 +25,9 @@ ], "CWE": [ 754 + ], + "ASVS 4.0": [ + "11.1.7" ] }, "quickfix": "unknown" diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S923_java.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S923.html similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S923_java.html rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S923.html diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S923_java.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S923.json similarity index 100% rename from java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S923_java.json rename to java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S923.json diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/Sonar_way_profile.json b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/Sonar_way_profile.json index dbad2bb44f5..b0ccfcc7da5 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/Sonar_way_profile.json +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/Sonar_way_profile.json @@ -477,6 +477,8 @@ "S6395", "S6396", "S6397", - "S6418" + "S6418", + "S6432", + "S6437" ] } diff --git a/java-checks/src/test/files/checks/CognitiveComplexityMethodCheckMax0.java b/java-checks/src/test/files/checks/CognitiveComplexityMethodCheckMax0.java index ef6980d9cc4..fba3215e9da 100644 --- a/java-checks/src/test/files/checks/CognitiveComplexityMethodCheckMax0.java +++ b/java-checks/src/test/files/checks/CognitiveComplexityMethodCheckMax0.java @@ -310,6 +310,25 @@ void noNestingForIfElseIf() { // Noncompliant {{Refactor this method to reduce i } } + public boolean equals(Object o) { + while (false) { + } + return + a + || b + && c; + } + public int hashCode() { + while (false) { + } + if ( + a + || b + && c) { + return 100; + } + return 42; + } } diff --git a/java-checks/src/test/files/checks/ForLoopFalseConditionCheck.java b/java-checks/src/test/files/checks/ForLoopFalseConditionCheck.java deleted file mode 100644 index c10ee275440..00000000000 --- a/java-checks/src/test/files/checks/ForLoopFalseConditionCheck.java +++ /dev/null @@ -1,29 +0,0 @@ -class A { - void myMethod(int x, int y, int z) { - int j = 0, k = 0; - for (int i = x; true; ) {} - for (int i = x; false; ) {} // Noncompliant [[sc=21;ec=26]] {{This loop will never execute.}} - for (int i = x; true; ) {} - for (int i = x; !true; ) {} // Noncompliant - for (int i = x; !(y=1); ) {} - for (int i = 1; i < 5; ) {} - for (int i = 9; i < 5; ) {} // Noncompliant - for (int i = 9; i > 5; ) {} - for (int i = 1; i > 5; ) {} // Noncompliant - for (int i = 1; i <=5; ) {} - for (int i = 9; i <=5; ) {} // Noncompliant - for (int i = 9; i >=5; ) {} - for (int i = 1; i >=5; ) {} // Noncompliant - for (int i = x; i < 5; ) {} - for (int i = 1; i < x; ) {} - for (int i = 1; i <-x; ) {} - for ( ; j < 5; ) {} - for ( j = 9; j < 5; ) {} // Noncompliant - for ( x += 1; j < 5; ) {} - for (int i ; i < 5; ) {} - for (int i = 1; ; ) {} - for (int i = 0; i < 0x10; ) {} - for (int i = 0; i < 0b10; ) {} - for (int i = 1; i <= 0Xffff; i++) {} - } -} diff --git a/java-checks/src/test/java/org/sonar/java/checks/ArrayForVarArgCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/ArrayForVarArgCheckTest.java index 6f787d6c6e9..87fbc059274 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/ArrayForVarArgCheckTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/ArrayForVarArgCheckTest.java @@ -23,14 +23,14 @@ import org.sonar.java.checks.verifier.CheckVerifier; import static org.sonar.java.checks.verifier.TestUtils.nonCompilingTestSourcesPath; -import static org.sonar.java.checks.verifier.TestUtils.testSourcesPath; +import static org.sonar.java.checks.verifier.TestUtils.mainCodeSourcesPath; class ArrayForVarArgCheckTest { @Test void test() { CheckVerifier.newVerifier() - .onFile(testSourcesPath("checks/ArrayForVarArgCheck.java")) + .onFile(mainCodeSourcesPath("checks/ArrayForVarArgCheck.java")) .withCheck(new ArrayForVarArgCheck()) .verifyIssues(); } diff --git a/java-checks/src/test/java/org/sonar/java/checks/BooleanLiteralCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/BooleanLiteralCheckTest.java index d4cda3706a4..dff3533c121 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/BooleanLiteralCheckTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/BooleanLiteralCheckTest.java @@ -22,17 +22,16 @@ import org.junit.jupiter.api.Test; import org.sonar.java.checks.verifier.internal.InternalCheckVerifier; -import static org.sonar.java.checks.verifier.TestUtils.testSourcesPath; +import static org.sonar.java.checks.verifier.TestUtils.mainCodeSourcesPath; class BooleanLiteralCheckTest { @Test void detected() { InternalCheckVerifier.newInstance() - .onFile(testSourcesPath("checks/BooleanLiteralCheck.java")) + .onFile(mainCodeSourcesPath("checks/BooleanLiteralCheck.java")) .withCheck(new BooleanLiteralCheck()) .withQuickFixes() .verifyIssues(); } - } diff --git a/java-checks/src/test/java/org/sonar/java/checks/CheckListTest.java b/java-checks/src/test/java/org/sonar/java/checks/CheckListTest.java index 7466443b393..763c0ed8565 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/CheckListTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/CheckListTest.java @@ -38,10 +38,9 @@ import org.sonar.api.server.rule.RulesDefinitionAnnotationLoader; import org.sonar.api.utils.AnnotationUtils; import org.sonar.check.Rule; -import org.sonar.java.RspecKey; -import org.sonarsource.analyzer.commons.collections.SetUtils; import org.sonar.java.se.checks.SECheck; import org.sonar.plugins.java.api.JavaCheck; +import org.sonarsource.analyzer.commons.collections.SetUtils; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Fail.fail; @@ -127,8 +126,7 @@ void test() { String simpleName = cls.getSimpleName(); // Handle legacy keys. Rule ruleAnnotation = AnnotationUtils.getAnnotation(cls, Rule.class); - String key = getKey(cls, ruleAnnotation); - keyMap.put(ruleAnnotation.key(), key); + keyMap.put(ruleAnnotation.key(), ruleAnnotation.key()); if (SE_CHEKS.contains(simpleName)) { continue; } @@ -147,10 +145,10 @@ void test() { assertThat(keys).as("Duplicate key " + rule.key()).doesNotContain(rule.key()); keys.add(rule.key()); names.add(rule.name()); - assertThat(getClass().getResource("/org/sonar/l10n/java/rules/" + CheckList.REPOSITORY_KEY + "/" + keyMap.get(rule.key()) + "_java.html")) + assertThat(getClass().getResource("/org/sonar/l10n/java/rules/" + CheckList.REPOSITORY_KEY + "/" + keyMap.get(rule.key()) + ".html")) .overridingErrorMessage("No description for " + rule.key() + " " + keyMap.get(rule.key())) .isNotNull(); - assertThat(getClass().getResource("/org/sonar/l10n/java/rules/" + CheckList.REPOSITORY_KEY + "/" + keyMap.get(rule.key()) + "_java.json")) + assertThat(getClass().getResource("/org/sonar/l10n/java/rules/" + CheckList.REPOSITORY_KEY + "/" + keyMap.get(rule.key()) + ".json")) .overridingErrorMessage("No json metadata file for " + rule.key() + " " + keyMap.get(rule.key())) .isNotNull(); @@ -163,15 +161,6 @@ void test() { } } - private static String getKey(Class cls, Rule ruleAnnotation) { - String key = ruleAnnotation.key(); - RspecKey rspecKeyAnnotation = AnnotationUtils.getAnnotation(cls, RspecKey.class); - if (rspecKeyAnnotation != null) { - return rspecKeyAnnotation.value(); - } - return key; - } - @Test void enforce_CheckList_registration() { List files = (List) FileUtils.listFiles(new File("src/main/java/org/sonar/java/checks/"), new String[] {"java"}, false); @@ -195,8 +184,8 @@ void rules_targeting_tests_should_have_tests_tag() throws Exception { Set> testChecks = new HashSet<>(CheckList.getJavaTestChecks()); for (Class cls : CheckList.getChecks()) { - String key = getKey(cls, AnnotationUtils.getAnnotation(cls, Rule.class)); - URL metadataURL = getClass().getResource("/org/sonar/l10n/java/rules/" + CheckList.REPOSITORY_KEY + "/" + key + "_java.json"); + String key = AnnotationUtils.getAnnotation(cls, Rule.class).key(); + URL metadataURL = getClass().getResource("/org/sonar/l10n/java/rules/" + CheckList.REPOSITORY_KEY + "/" + key + ".json"); File metadataFile = new File(metadataURL.toURI()); assertThat(metadataFile).exists(); try (FileReader jsonReader = new FileReader(metadataFile)) { diff --git a/java-frontend/src/main/java/org/sonar/java/RspecKey.java b/java-checks/src/test/java/org/sonar/java/checks/CounterModeIVShouldNotBeReusedCheckTest.java similarity index 64% rename from java-frontend/src/main/java/org/sonar/java/RspecKey.java rename to java-checks/src/test/java/org/sonar/java/checks/CounterModeIVShouldNotBeReusedCheckTest.java index 9efc4d3ef34..72c799294a1 100644 --- a/java-frontend/src/main/java/org/sonar/java/RspecKey.java +++ b/java-checks/src/test/java/org/sonar/java/checks/CounterModeIVShouldNotBeReusedCheckTest.java @@ -17,18 +17,21 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.java; +package org.sonar.java.checks; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import org.junit.jupiter.api.Test; +import org.sonar.java.checks.verifier.CheckVerifier; + +import static org.sonar.java.checks.verifier.TestUtils.mainCodeSourcesPath; + +class CounterModeIVShouldNotBeReusedCheckTest { + + @Test + void test() { + CheckVerifier.newVerifier() + .onFile(mainCodeSourcesPath("checks/CounterModeIVShouldNotBeReusedCheck.java")) + .withCheck(new CounterModeIVShouldNotBeReusedCheck()) + .verifyIssues(); + } -/** - * This annotation is used for rules with a legacy key to refer to the correct RSPEC. - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface RspecKey { - String value(); } diff --git a/java-checks/src/test/java/org/sonar/java/checks/EmptyMethodsCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/EmptyMethodsCheckTest.java index f68a9e5f192..e4de74ca767 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/EmptyMethodsCheckTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/EmptyMethodsCheckTest.java @@ -22,16 +22,26 @@ import org.junit.jupiter.api.Test; import org.sonar.java.checks.verifier.internal.InternalCheckVerifier; -import static org.sonar.java.checks.verifier.TestUtils.testSourcesPath; +import static org.sonar.java.checks.verifier.TestUtils.mainCodeSourcesPath; class EmptyMethodsCheckTest { @Test void test() { InternalCheckVerifier.newInstance() - .onFile(testSourcesPath("checks/EmptyMethodsCheck.java")) + .onFile(mainCodeSourcesPath("checks/EmptyMethodsCheck.java")) .withCheck(new EmptyMethodsCheck()) .withQuickFixes() .verifyIssues(); } + + @Test + void test_no_semantics() { + InternalCheckVerifier.newInstance() + .onFile(mainCodeSourcesPath("checks/EmptyMethodsCheckNoSemantics.java")) + .withCheck(new EmptyMethodsCheck()) + .withQuickFixes() + .withoutSemantic() + .verifyIssues(); + } } diff --git a/java-checks/src/test/java/org/sonar/java/checks/ForLoopFalseConditionCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/ForLoopFalseConditionCheckTest.java index 2264abc11d8..55bb9873e7d 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/ForLoopFalseConditionCheckTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/ForLoopFalseConditionCheckTest.java @@ -22,12 +22,23 @@ import org.junit.jupiter.api.Test; import org.sonar.java.checks.verifier.CheckVerifier; +import static org.sonar.java.checks.verifier.TestUtils.mainCodeSourcesPath; +import static org.sonar.java.checks.verifier.TestUtils.nonCompilingTestSourcesPath; + class ForLoopFalseConditionCheckTest { @Test void test() { CheckVerifier.newVerifier() - .onFile("src/test/files/checks/ForLoopFalseConditionCheck.java") + .onFile(mainCodeSourcesPath("checks/ForLoopFalseConditionCheck.java")) + .withCheck(new ForLoopFalseConditionCheck()) + .verifyIssues(); + } + + @Test + void test_non_compiling() { + CheckVerifier.newVerifier() + .onFile(nonCompilingTestSourcesPath("checks/ForLoopFalseConditionCheck.java")) .withCheck(new ForLoopFalseConditionCheck()) .verifyIssues(); } diff --git a/java-checks/src/test/java/org/sonar/java/checks/LeastSpecificTypeCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/LeastSpecificTypeCheckTest.java index 6abd11f4032..493406c6346 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/LeastSpecificTypeCheckTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/LeastSpecificTypeCheckTest.java @@ -22,6 +22,7 @@ import org.junit.jupiter.api.Test; import org.sonar.java.checks.verifier.CheckVerifier; +import static org.sonar.java.checks.verifier.TestUtils.mainCodeSourcesPath; import static org.sonar.java.checks.verifier.TestUtils.nonCompilingTestSourcesPath; class LeastSpecificTypeCheckTest { @@ -29,7 +30,7 @@ class LeastSpecificTypeCheckTest { @Test void test() { CheckVerifier.newVerifier() - .onFile("src/test/files/checks/LeastSpecificTypeCheck.java") + .onFile(mainCodeSourcesPath("checks/LeastSpecificTypeCheck.java")) .withCheck(new LeastSpecificTypeCheck()) .verifyIssues(); } @@ -39,7 +40,7 @@ void test_non_compiling() { CheckVerifier.newVerifier() .onFile(nonCompilingTestSourcesPath("checks/LeastSpecificTypeCheck.java")) .withCheck(new LeastSpecificTypeCheck()) - .verifyNoIssues(); + .verifyIssues(); } } diff --git a/java-checks/src/test/java/org/sonar/java/checks/MutableMembersUsageCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/MutableMembersUsageCheckTest.java index 7b68126aeaf..2a3e4a0f7a4 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/MutableMembersUsageCheckTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/MutableMembersUsageCheckTest.java @@ -22,25 +22,25 @@ import org.junit.jupiter.api.Test; import org.sonar.java.checks.verifier.CheckVerifier; +import static org.sonar.java.checks.verifier.TestUtils.mainCodeSourcesPath; import static org.sonar.java.checks.verifier.TestUtils.nonCompilingTestSourcesPath; -import static org.sonar.java.checks.verifier.TestUtils.testSourcesPath; class MutableMembersUsageCheckTest { @Test void test() { CheckVerifier.newVerifier() - .onFile(testSourcesPath("checks/MutableMembersUsageCheck.java")) + .onFile(mainCodeSourcesPath("checks/MutableMembersUsageCheck.java")) .withCheck(new MutableMembersUsageCheck()) .verifyIssues(); } @Test - void test_java_9() { + void test_non_compiling() { CheckVerifier.newVerifier() .onFile(nonCompilingTestSourcesPath("checks/MutableMembersUsageCheck.java")) .withCheck(new MutableMembersUsageCheck()) - .verifyIssues(); + .verifyNoIssues(); } } diff --git a/java-checks/src/test/java/org/sonar/java/checks/PublicStaticMutableMembersCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/PublicStaticMutableMembersCheckTest.java index edb7bf06963..2e7ccae5abf 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/PublicStaticMutableMembersCheckTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/PublicStaticMutableMembersCheckTest.java @@ -23,15 +23,15 @@ import org.junit.jupiter.api.Test; import org.sonar.java.checks.verifier.CheckVerifier; +import static org.sonar.java.checks.verifier.TestUtils.mainCodeSourcesPath; import static org.sonar.java.checks.verifier.TestUtils.nonCompilingTestSourcesPath; -import static org.sonar.java.checks.verifier.TestUtils.testSourcesPath; class PublicStaticMutableMembersCheckTest { @Test void test() { CheckVerifier.newVerifier() - .onFile(testSourcesPath("checks/PublicStaticMutableMembersCheck.java")) + .onFile(mainCodeSourcesPath("checks/PublicStaticMutableMembersCheck.java")) .withCheck(new PublicStaticMutableMembersCheck()) .verifyIssues(); } @@ -41,13 +41,13 @@ void test_non_compiling() { CheckVerifier.newVerifier() .onFile(nonCompilingTestSourcesPath("checks/PublicStaticMutableMembersCheck.java")) .withCheck(new PublicStaticMutableMembersCheck()) - .verifyIssues(); + .verifyNoIssues(); } @Test void test_without_semantic() { CheckVerifier.newVerifier() - .onFile(testSourcesPath("checks/PublicStaticMutableMembersCheck.java")) + .onFile(mainCodeSourcesPath("checks/PublicStaticMutableMembersCheck.java")) .withCheck(new PublicStaticMutableMembersCheck()) .withClassPath(Collections.emptyList()) .verifyIssues(); @@ -59,7 +59,7 @@ void test_non_compiling_without_semantic() { .onFile(nonCompilingTestSourcesPath("checks/PublicStaticMutableMembersCheck.java")) .withCheck(new PublicStaticMutableMembersCheck()) .withClassPath(Collections.emptyList()) - .verifyIssues(); + .verifyNoIssues(); } } diff --git a/java-checks/src/test/java/org/sonar/java/checks/SanityTest.java b/java-checks/src/test/java/org/sonar/java/checks/SanityTest.java index 90d82c0c9d1..95cc19cb715 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/SanityTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/SanityTest.java @@ -31,7 +31,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import javax.annotation.Nullable; -import org.apache.commons.lang.exception.ExceptionUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfSystemProperty; import org.junit.jupiter.api.extension.RegisterExtension; diff --git a/java-checks/src/test/java/org/sonar/java/checks/TooManyParametersCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/TooManyParametersCheckTest.java index b11effa7844..a9fb6e8f470 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/TooManyParametersCheckTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/TooManyParametersCheckTest.java @@ -23,14 +23,14 @@ import org.sonar.java.checks.verifier.CheckVerifier; import static org.sonar.java.checks.verifier.TestUtils.nonCompilingTestSourcesPath; -import static org.sonar.java.checks.verifier.TestUtils.testSourcesPath; +import static org.sonar.java.checks.verifier.TestUtils.mainCodeSourcesPath; class TooManyParametersCheckTest { @Test void test() { CheckVerifier.newVerifier() - .onFile(testSourcesPath("checks/TooManyParametersCheck.java")) + .onFile(mainCodeSourcesPath("checks/TooManyParametersCheck.java")) .withCheck(new TooManyParametersCheck()) .verifyIssues(); } @@ -49,7 +49,7 @@ void custom() { check.maximum = 8; check.constructorMax = 5; CheckVerifier.newVerifier() - .onFile(testSourcesPath("checks/TooManyParametersCustom.java")) + .onFile(mainCodeSourcesPath("checks/TooManyParametersCustom.java")) .withCheck(check) .verifyIssues(); } diff --git a/java-checks/src/test/java/org/sonar/java/checks/helpers/CredentialMethodTest.java b/java-checks/src/test/java/org/sonar/java/checks/helpers/CredentialMethodTest.java new file mode 100644 index 00000000000..3e3e33b4caf --- /dev/null +++ b/java-checks/src/test/java/org/sonar/java/checks/helpers/CredentialMethodTest.java @@ -0,0 +1,53 @@ +/* + * SonarQube Java + * Copyright (C) 2012-2022 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.java.checks.helpers; + +import java.util.Collections; +import java.util.List; +import org.junit.jupiter.api.Test; +import org.sonar.plugins.java.api.semantic.MethodMatchers; + +import static org.assertj.core.api.Assertions.assertThat; + +class CredentialMethodTest { + @Test + void isConstructor() { + var constructor = new CredentialMethod("Object", "Object", Collections.emptyList(), Collections.emptyList()); + assertThat(constructor.isConstructor()).isTrue(); + var nonConstructor = new CredentialMethod("Object", "equals", Collections.emptyList(), Collections.emptyList()); + assertThat(nonConstructor.isConstructor()).isFalse(); + var stringConstructor = new CredentialMethod("java.lang.String", "String", Collections.emptyList(), Collections.emptyList()); + assertThat(stringConstructor.isConstructor()).isTrue(); + var stringCompareTo = new CredentialMethod("java.lang.String", "compareTo", List.of("java.lang.String"), Collections.emptyList()); + assertThat(stringCompareTo.isConstructor()).isFalse(); + var innerClassConstructor = new CredentialMethod("org.sonar.Outer$Inner", "Inner", Collections.emptyList(), Collections.emptyList()); + assertThat(innerClassConstructor.isConstructor()).isTrue(); + } + + @Test + void methodMatcher_is_recycled() { + var constructor = new CredentialMethod("Object", "Object", Collections.emptyList(), Collections.emptyList()); + MethodMatchers constructorMatcher = constructor.methodMatcher(); + assertThat(constructor.methodMatcher()).isSameAs(constructorMatcher); + var equalsMatcher = new CredentialMethod("Object", "equals", Collections.emptyList(), Collections.emptyList()); + MethodMatchers methodMatcher = equalsMatcher.methodMatcher(); + assertThat(equalsMatcher.methodMatcher()).isSameAs(methodMatcher); + } +} diff --git a/java-checks/src/test/java/org/sonar/java/checks/security/HardCodedCredentialsShouldNotBeUsedCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/security/HardCodedCredentialsShouldNotBeUsedCheckTest.java new file mode 100644 index 00000000000..47da3741dc1 --- /dev/null +++ b/java-checks/src/test/java/org/sonar/java/checks/security/HardCodedCredentialsShouldNotBeUsedCheckTest.java @@ -0,0 +1,67 @@ +/* + * SonarQube Java + * Copyright (C) 2012-2022 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.java.checks.security; + + +import java.util.List; +import java.util.stream.Collectors; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.sonar.api.utils.log.LogAndArguments; +import org.sonar.api.utils.log.LogTesterJUnit5; +import org.sonar.api.utils.log.LoggerLevel; +import org.sonar.java.checks.verifier.CheckVerifier; +import org.sonar.java.checks.verifier.TestUtils; + +import static org.assertj.core.api.Assertions.assertThat; + +class HardCodedCredentialsShouldNotBeUsedCheckTest { + @RegisterExtension + final LogTesterJUnit5 logTester = new LogTesterJUnit5(); + + @Test + void uses_empty_collection_when_methods_cannot_be_loaded() { + var check = new HardCodedCredentialsShouldNotBeUsedCheck("non-existing-file.json"); + assertThat(check.getMethods()).isEmpty(); + List logs = logTester.getLogs(LoggerLevel.ERROR).stream() + .map(LogAndArguments::getFormattedMsg) + .collect(Collectors.toList()); + assertThat(logs) + .containsOnly("Could not load methods from \"non-existing-file.json\"."); + } + + + @Test + void test() { + CheckVerifier.newVerifier() + .onFile(TestUtils.mainCodeSourcesPath("checks/security/HardCodedCredentialsShouldNotBeUsedCheck.java")) + .withCheck(new HardCodedCredentialsShouldNotBeUsedCheck()) + .verifyIssues(); + } + + @Test + void test_non_compiling_code() { + CheckVerifier.newVerifier() + .onFile(TestUtils.nonCompilingTestSourcesPath("checks/security/HardCodedCredentialsShouldNotBeUsedCheck.java")) + .withCheck(new HardCodedCredentialsShouldNotBeUsedCheck()) + .verifyIssues(); + } + +} diff --git a/java-frontend/pom.xml b/java-frontend/pom.xml index 3685d775e6d..11674b50bf4 100644 --- a/java-frontend/pom.xml +++ b/java-frontend/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.java java - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT java-frontend @@ -21,7 +21,7 @@ - org.sonarsource.sonarqube + org.sonarsource.api.plugin sonar-plugin-api diff --git a/java-frontend/src/main/java/org/sonar/java/DefaultJavaResourceLocator.java b/java-frontend/src/main/java/org/sonar/java/DefaultJavaResourceLocator.java index 019fb03ddf9..46d9f62a51e 100644 --- a/java-frontend/src/main/java/org/sonar/java/DefaultJavaResourceLocator.java +++ b/java-frontend/src/main/java/org/sonar/java/DefaultJavaResourceLocator.java @@ -31,6 +31,7 @@ import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; import org.sonar.java.classpath.ClasspathForMain; +import org.sonar.java.classpath.ClasspathForTest; import org.sonar.java.annotations.VisibleForTesting; import org.sonar.plugins.java.api.JavaFileScannerContext; import org.sonar.plugins.java.api.JavaResourceLocator; @@ -40,11 +41,13 @@ public class DefaultJavaResourceLocator implements JavaResourceLocator { private static final Logger LOG = Loggers.get(DefaultJavaResourceLocator.class); private final ClasspathForMain javaClasspath; + private final ClasspathForTest javaTestClasspath; @VisibleForTesting Map resourcesByClass; - public DefaultJavaResourceLocator(ClasspathForMain javaClasspath) { + public DefaultJavaResourceLocator(ClasspathForMain javaClasspath, ClasspathForTest javaTestClasspath) { this.javaClasspath = javaClasspath; + this.javaTestClasspath = javaTestClasspath; resourcesByClass = new HashMap<>(); } @@ -80,7 +83,22 @@ public Collection classFilesToAnalyze() { @Override public Collection classpath() { - return javaClasspath.getElements(); + return Collections.unmodifiableList(javaClasspath.getElements()); + } + + @Override + public Collection testClasspath() { + return Collections.unmodifiableList(javaTestClasspath.getElements()); + } + + @Override + public Collection binaryDirs() { + return Collections.unmodifiableList(javaClasspath.getBinaryDirs()); + } + + @Override + public Collection testBinaryDirs() { + return Collections.unmodifiableList(javaTestClasspath.getBinaryDirs()); } @Override diff --git a/java-frontend/src/main/java/org/sonar/java/JavaFrontend.java b/java-frontend/src/main/java/org/sonar/java/JavaFrontend.java index 5063ef5c138..5d031f6ab00 100644 --- a/java-frontend/src/main/java/org/sonar/java/JavaFrontend.java +++ b/java-frontend/src/main/java/org/sonar/java/JavaFrontend.java @@ -44,6 +44,7 @@ import org.sonar.java.ast.visitors.SyntaxHighlighterVisitor; import org.sonar.java.caching.CacheContextImpl; import org.sonar.java.collections.CollectionUtils; +import org.sonar.java.exceptions.ApiMismatchException; import org.sonar.java.filters.SonarJavaIssueFilter; import org.sonar.java.model.JParserConfig; import org.sonar.java.model.VisitorsBridge; @@ -129,7 +130,7 @@ boolean analysisCancelled() { } public void scan(Iterable sourceFiles, Iterable testFiles, Iterable generatedFiles) { - if (isCacheEnabled()) { + if (canOptimizeScanning()) { long successfullyScanned = 0L; long total = 0L; @@ -150,6 +151,8 @@ public void scan(Iterable sourceFiles, Iterable testFiles, successfullyScanned, total ); + } else if (isCacheEnabled()) { + LOG.info("Server-side caching is enabled. The Java analyzer will not try to leverage data from a previous analysis."); } else { LOG.info("Server-side caching is not enabled. The Java analyzer will not try to leverage data from a previous analysis."); } @@ -393,6 +396,14 @@ private boolean isCacheEnabled() { return sonarComponents != null && CacheContextImpl.of(sonarComponents.context()).isCacheEnabled(); } + private boolean canOptimizeScanning() { + try { + return sonarComponents != null && sonarComponents.canSkipUnchangedFiles() && isCacheEnabled(); + } catch (ApiMismatchException e) { + return false; + } + } + private static void scanAndMeasureTask(Iterable files, Consumer> action, String descriptor) { if (CollectionUtils.size(files) > 0) { Duration mainDuration = PerformanceMeasure.start(descriptor); diff --git a/java-frontend/src/main/java/org/sonar/java/classpath/JavaSdkUtil.java b/java-frontend/src/main/java/org/sonar/java/classpath/JavaSdkUtil.java index bdaf9966152..9880ebbe833 100644 --- a/java-frontend/src/main/java/org/sonar/java/classpath/JavaSdkUtil.java +++ b/java-frontend/src/main/java/org/sonar/java/classpath/JavaSdkUtil.java @@ -93,7 +93,7 @@ private static boolean isJarFile(Path path) { private static boolean isNotAlternativeImplementation(Path jarPath) { String jarFileName = jarPath.getFileName().toString(); - return !jarFileName.equals("alt-rt.jar") && !jarFileName.equals("alt-string.jar"); + return !"alt-rt.jar".equals(jarFileName) && !"alt-string.jar".equals(jarFileName); } private static Path[] collectJarDirs(Path home, boolean isMac) { diff --git a/java-frontend/src/main/java/org/sonar/java/model/ExpressionUtils.java b/java-frontend/src/main/java/org/sonar/java/model/ExpressionUtils.java index 67e4146d000..4f0d5de4479 100644 --- a/java-frontend/src/main/java/org/sonar/java/model/ExpressionUtils.java +++ b/java-frontend/src/main/java/org/sonar/java/model/ExpressionUtils.java @@ -20,6 +20,7 @@ package org.sonar.java.model; import java.util.Optional; +import java.util.function.BiFunction; import javax.annotation.CheckForNull; import javax.annotation.Nullable; import org.sonar.plugins.java.api.semantic.Symbol; @@ -238,6 +239,18 @@ public static Object resolveAsConstant(ExpressionTree tree) { if (expression.is(Tree.Kind.OR)) { return resolveOr((BinaryExpressionTree) expression); } + if (expression.is(Tree.Kind.MINUS)) { + return resolveArithmeticOperation((BinaryExpressionTree) expression, (a, b) -> a - b, (a, b) -> a - b); + } + if (expression.is(Tree.Kind.MULTIPLY)) { + return resolveArithmeticOperation((BinaryExpressionTree) expression, (a, b) -> a * b, (a, b) -> a * b); + } + if (expression.is(Tree.Kind.DIVIDE)) { + return resolveArithmeticOperation((BinaryExpressionTree) expression, (a, b) -> a / b, (a, b) -> a / b); + } + if (expression.is(Tree.Kind.REMAINDER)) { + return resolveArithmeticOperation((BinaryExpressionTree) expression, (a, b) -> a % b, (a, b) -> a % b); + } return null; } @@ -291,14 +304,28 @@ private static Object resolvePlus(BinaryExpressionTree binaryExpression) { return ((String) left) + right; } else if (right instanceof String) { return left + ((String) right); - } else if (left instanceof Long && right instanceof Long) { - return ((Long) left) + ((Long) right); - } else if (left instanceof Long && right instanceof Integer) { - return ((Long) left) + ((Integer) right); - } else if (left instanceof Integer && right instanceof Long) { - return ((Integer) left) + ((Long) right); - } else if (left instanceof Integer && right instanceof Integer) { - return ((Integer) left) + ((Integer) right); + } + return resolveArithmeticOperation(left, right, Long::sum, Integer::sum); + } + + @CheckForNull + private static Object resolveArithmeticOperation(BinaryExpressionTree binaryExpression, + BiFunction longOperation, + BiFunction intOperation) { + Object left = resolveAsConstant(binaryExpression.leftOperand()); + Object right = resolveAsConstant(binaryExpression.rightOperand()); + if (left == null || right == null) { + return null; + } + return resolveArithmeticOperation(left, right, longOperation, intOperation); + } + + @CheckForNull + private static Object resolveArithmeticOperation(Object left, Object right, BiFunction longOperation, BiFunction intOperation) { + if (left instanceof Integer && right instanceof Integer) { + return intOperation.apply(((Number) left).intValue(), ((Number) right).intValue()); + } else if ((left instanceof Long || right instanceof Long) && (left instanceof Integer || right instanceof Integer)) { + return longOperation.apply(((Number) left).longValue(), ((Number) right).longValue()); } return null; } diff --git a/java-frontend/src/main/java/org/sonar/java/model/JMethodSymbol.java b/java-frontend/src/main/java/org/sonar/java/model/JMethodSymbol.java index 69f5fad8d73..f944e2cd8c2 100644 --- a/java-frontend/src/main/java/org/sonar/java/model/JMethodSymbol.java +++ b/java-frontend/src/main/java/org/sonar/java/model/JMethodSymbol.java @@ -86,7 +86,7 @@ public List parameterTypes() { public List declarationParameters() { if (parameters == null) { MethodTree declaration = declaration(); - if (declaration != null) { + if (declaration != null && !isCompactConstructor(declaration)) { parameters = declaration.parameters().stream().map(VariableTree::symbol).collect(Collectors.toList()); } else { parameters = new ArrayList<>(); @@ -100,6 +100,10 @@ public List declarationParameters() { return parameters; } + private static boolean isCompactConstructor(MethodTree methodTree) { + return methodTree.closeParenToken() == null; + } + /** * @since 6.0 returns void type for constructors instead of {@code null} */ diff --git a/java-frontend/src/main/java/org/sonar/java/model/JParser.java b/java-frontend/src/main/java/org/sonar/java/model/JParser.java index b85a257b491..834750c3408 100644 --- a/java-frontend/src/main/java/org/sonar/java/model/JParser.java +++ b/java-frontend/src/main/java/org/sonar/java/model/JParser.java @@ -1648,9 +1648,17 @@ private ExpressionStatementTreeImpl convertSuperConstructorInvocation(SuperConst } private YieldStatementTreeImpl convertYield(YieldStatement e) { + InternalSyntaxToken yieldKeyword = null; + if (!e.isImplicit()) { + try { + yieldKeyword = firstTokenIn(e, TerminalTokens.TokenNameRestrictedIdentifierYield); + } catch (AssertionError | IndexOutOfBoundsException error) { + // TODO ECJ bug? should be "TerminalTokens.TokenNameRestrictedIdentifierYield" in all cases + yieldKeyword = firstTokenIn(e, TerminalTokens.TokenNameIdentifier); + } + } return new YieldStatementTreeImpl( - // TODO ECJ bug? should be "TerminalTokens.TokenNameRestrictedIdentifierYield" instead - e.isImplicit() ? null : firstTokenIn(e, TerminalTokens.TokenNameIdentifier), + yieldKeyword, convertExpression(e.getExpression()), lastTokenIn(e, TerminalTokens.TokenNameSEMICOLON) ); diff --git a/java-frontend/src/main/java/org/sonar/java/model/JSema.java b/java-frontend/src/main/java/org/sonar/java/model/JSema.java index 16d49b52a5f..0829b23d6ce 100644 --- a/java-frontend/src/main/java/org/sonar/java/model/JSema.java +++ b/java-frontend/src/main/java/org/sonar/java/model/JSema.java @@ -72,8 +72,11 @@ List types(ITypeBinding[] typeBindings) { return Arrays.asList(result); } - public JPackageSymbol packageSymbol(IPackageBinding packageBinding) { - return (JPackageSymbol) symbols.computeIfAbsent(packageBinding, k -> new JPackageSymbol(this, (IPackageBinding) k)); + public Symbol packageSymbol(@Nullable IPackageBinding packageBinding) { + if (packageBinding == null) { + return Symbols.rootPackage; + } + return symbols.computeIfAbsent(packageBinding, k -> new JPackageSymbol(this, (IPackageBinding) k)); } public JTypeSymbol typeSymbol(ITypeBinding typeBinding) { diff --git a/java-frontend/src/main/java/org/sonar/java/model/JSymbolMetadata.java b/java-frontend/src/main/java/org/sonar/java/model/JSymbolMetadata.java index 1a44e9adb97..e9720e8bc5e 100644 --- a/java-frontend/src/main/java/org/sonar/java/model/JSymbolMetadata.java +++ b/java-frontend/src/main/java/org/sonar/java/model/JSymbolMetadata.java @@ -159,7 +159,15 @@ private NullabilityData resolveNullability(NullabilityTarget target) { return nullabilityDataAtLevel; } - // Not annotated or meta annotated, check upper level... + // Check nullability from the inheritance hierarchy + if (symbol.isMethodSymbol()) { + NullabilityData nullabilityDataFromInheritance = getNullabilityDataFromInheritance((Symbol.MethodSymbol) symbol, target); + if (nullabilityDataFromInheritance.type() != NullabilityType.NO_ANNOTATION) { + return nullabilityDataFromInheritance; + } + } + + // Not annotated or meta annotated, check upper level in the ownership hierarchy... if (symbol.isPackageSymbol()) { return NO_ANNOTATION_NULLABILITY[currentLevel.ordinal()]; } @@ -167,6 +175,19 @@ private NullabilityData resolveNullability(NullabilityTarget target) { return owner == null ? unknownNullabilityAt(currentLevel) : owner.metadata().nullabilityData(target); } + private static NullabilityData getNullabilityDataFromInheritance(Symbol.MethodSymbol methodSymbol, NullabilityTarget target) { + List overridenSymbols = methodSymbol.overriddenSymbols(); + NullabilityLevel level = NullabilityLevel.METHOD; + for (Symbol.MethodSymbol overridenSymbol: overridenSymbols) { + SymbolMetadata metadata = overridenSymbol.metadata(); + NullabilityData nullabilityData = getNullabilityDataAtLevel(metadata, target, level); + if (nullabilityData.type() != NullabilityType.NO_ANNOTATION && !nullabilityData.equals(unknownNullabilityAt(level))) { + return nullabilityData; + } + } + return NO_ANNOTATION_NULLABILITY[level.ordinal()]; + } + @CheckForNull private static Symbol getEffectiveOwner(Symbol symbol, NullabilityLevel currentLevel) { Symbol owner = symbol.owner(); diff --git a/java-frontend/src/main/java/org/sonar/java/model/JavaVersionImpl.java b/java-frontend/src/main/java/org/sonar/java/model/JavaVersionImpl.java index 65df2df8c52..3aabcdce006 100644 --- a/java-frontend/src/main/java/org/sonar/java/model/JavaVersionImpl.java +++ b/java-frontend/src/main/java/org/sonar/java/model/JavaVersionImpl.java @@ -37,7 +37,8 @@ public class JavaVersionImpl implements JavaVersion { private static final int JAVA_15 = 15; private static final int JAVA_16 = 16; private static final int JAVA_17 = 17; - public static final int MAX_SUPPORTED = JAVA_17; + private static final int JAVA_18 = 18; + public static final int MAX_SUPPORTED = JAVA_18; private final int javaVersion; @@ -107,6 +108,16 @@ public boolean isJava16Compatible() { return JAVA_16 <= javaVersion; } + @Override + public boolean isJava17Compatible() { + return JAVA_17 <= javaVersion; + } + + @Override + public boolean isJava18Compatible() { + return JAVA_18 <= javaVersion; + } + private boolean notSetOrAtLeast(int requiredJavaVersion) { return isNotSet() || requiredJavaVersion <= javaVersion; } diff --git a/java-frontend/src/main/java/org/sonar/plugins/java/api/JavaResourceLocator.java b/java-frontend/src/main/java/org/sonar/plugins/java/api/JavaResourceLocator.java index 9f031714e88..bf7c9d70e4a 100644 --- a/java-frontend/src/main/java/org/sonar/plugins/java/api/JavaResourceLocator.java +++ b/java-frontend/src/main/java/org/sonar/plugins/java/api/JavaResourceLocator.java @@ -50,11 +50,29 @@ public interface JavaResourceLocator extends JavaFileScanner { */ Collection classFilesToAnalyze(); + /** + * The folders containing the binary .class files. + * @return a list of folders. + */ + Collection binaryDirs(); + + /** + * The folders containing the binary .class files corresponding to the tests. + * @return a list of folders. + * @since SonarJava 7.15 + */ + Collection testBinaryDirs(); + /** * Classpath configured for the project. - * This classpath method is used by the findbugs plugin to configure the analysis. * @return the list of jar and class files constituting the classpath of the analyzed project. */ Collection classpath(); + /** + * Classpath configured for the project tests. + * @return the list of jar and class files constituting the classpath of the analyzed project. + * @since SonarJava 7.15 + */ + Collection testClasspath(); } diff --git a/java-frontend/src/main/java/org/sonar/plugins/java/api/JavaVersion.java b/java-frontend/src/main/java/org/sonar/plugins/java/api/JavaVersion.java index fad9e875a43..1212bf0e609 100644 --- a/java-frontend/src/main/java/org/sonar/plugins/java/api/JavaVersion.java +++ b/java-frontend/src/main/java/org/sonar/plugins/java/api/JavaVersion.java @@ -99,6 +99,22 @@ public interface JavaVersion { */ boolean isJava16Compatible(); + /** + * Test if java version of the project is greater than or equal to 17. + * Remark - Contrary to other isJava*Compatible methods, this one will NOT return true if version is not set + * @return true if java version used is >= 17 + * @since SonarJava 7.14: Support of Java 18 + */ + boolean isJava17Compatible(); + + /** + * Test if java version of the project is greater than or equal to 18. + * Remark - Contrary to other isJava*Compatible methods, this one will NOT return true if version is not set + * @return true if java version used is >= 18 + * @since SonarJava 7.14: Support of Java 18 + */ + boolean isJava18Compatible(); + /** * get java version as integer * @return an int representing the java version diff --git a/java-frontend/src/test/java/org/sonar/java/DefaultJavaResourceLocatorTest.java b/java-frontend/src/test/java/org/sonar/java/DefaultJavaResourceLocatorTest.java index b1813409bed..80ca854efda 100644 --- a/java-frontend/src/test/java/org/sonar/java/DefaultJavaResourceLocatorTest.java +++ b/java-frontend/src/test/java/org/sonar/java/DefaultJavaResourceLocatorTest.java @@ -27,9 +27,11 @@ import org.sonar.api.batch.fs.InputFile; import org.sonar.java.ast.JavaAstScanner; import org.sonar.java.classpath.ClasspathForMain; +import org.sonar.java.classpath.ClasspathForTest; import org.sonar.java.model.VisitorsBridge; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -37,13 +39,21 @@ class DefaultJavaResourceLocatorTest { private static DefaultJavaResourceLocator javaResourceLocator; + private static final String BINARY_DIRS = "target/test-classes"; + private static final String TEST_BINARY_DIRS = "target/test/test-classes"; + @BeforeAll public static void setup() { ClasspathForMain javaClasspath = mock(ClasspathForMain.class); - when(javaClasspath.getBinaryDirs()).thenReturn(Collections.singletonList(new File("target/test-classes"))); - when(javaClasspath.getElements()).thenReturn(Collections.singletonList(new File("target/test-classes"))); + when(javaClasspath.getBinaryDirs()).thenReturn(Collections.singletonList(new File(BINARY_DIRS))); + when(javaClasspath.getElements()).thenReturn(Collections.singletonList(new File(BINARY_DIRS))); + + ClasspathForTest javaTestClasspath = mock(ClasspathForTest.class); + when(javaTestClasspath.getBinaryDirs()).thenReturn(Collections.singletonList(new File(TEST_BINARY_DIRS))); + when(javaTestClasspath.getElements()).thenReturn(Collections.singletonList(new File(TEST_BINARY_DIRS))); + InputFile inputFile = TestUtils.inputFile("src/test/java/org/sonar/java/DefaultJavaResourceLocatorTest.java"); - DefaultJavaResourceLocator jrl = new DefaultJavaResourceLocator(javaClasspath); + DefaultJavaResourceLocator jrl = new DefaultJavaResourceLocator(javaClasspath, javaTestClasspath); JavaAstScanner.scanSingleFileForTests(inputFile, new VisitorsBridge(jrl)); javaResourceLocator = jrl; } @@ -69,7 +79,42 @@ void resource_by_class_name() throws Exception { @Test void classpath() throws Exception { - assertThat(javaResourceLocator.classpath()).hasSize(1); + var classpath = javaResourceLocator.classpath(); + assertThat(classpath).hasSize(1); + + var file = new File(""); + assertThatThrownBy(() -> classpath.add(file)) + .isInstanceOf(UnsupportedOperationException.class); + } + + @Test + void testClasspath() throws Exception { + var classpath = javaResourceLocator.testClasspath(); + assertThat(classpath).containsExactly(new File(TEST_BINARY_DIRS)); + + var file = new File(""); + assertThatThrownBy(() -> classpath.add(file)) + .isInstanceOf(UnsupportedOperationException.class); + } + + @Test + void binaryDirs() { + var binaryDirs = javaResourceLocator.binaryDirs(); + assertThat(binaryDirs).containsExactly(new File(BINARY_DIRS)); + + var file = new File(""); + assertThatThrownBy(() -> binaryDirs.add(file)) + .isInstanceOf(UnsupportedOperationException.class); + } + + @Test + void testBinaryDirs() { + var binaryDirs = javaResourceLocator.testBinaryDirs(); + assertThat(binaryDirs).containsExactly(new File(TEST_BINARY_DIRS)); + + var file = new File(""); + assertThatThrownBy(() -> binaryDirs.add(file)) + .isInstanceOf(UnsupportedOperationException.class); } @Test diff --git a/java-frontend/src/test/java/org/sonar/java/JavaFrontendTest.java b/java-frontend/src/test/java/org/sonar/java/JavaFrontendTest.java index e2c4f4a4d1f..b3461836bfd 100644 --- a/java-frontend/src/test/java/org/sonar/java/JavaFrontendTest.java +++ b/java-frontend/src/test/java/org/sonar/java/JavaFrontendTest.java @@ -60,6 +60,7 @@ import org.sonar.api.utils.log.LoggerLevel; import org.sonar.java.classpath.ClasspathForMain; import org.sonar.java.classpath.ClasspathForTest; +import org.sonar.java.exceptions.ApiMismatchException; import org.sonar.java.filters.SonarJavaIssueFilter; import org.sonar.java.model.JavaVersionImpl; import org.sonar.plugins.java.api.JavaFileScanner; @@ -75,6 +76,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -199,7 +201,7 @@ void scanning_empty_project_should_be_logged_in_autoscan() throws Exception { } @Test - void test_scan_logs_when_caching_is_enabled() { + void test_scan_logs_when_caching_is_enabled_and_can_skip_unchanged_files() throws ApiMismatchException { File baseDir = temp.getRoot().getAbsoluteFile(); SensorContextTester sensorContextTester = SensorContextTester.create(baseDir); sensorContextTester.setSettings(new MapSettings()); @@ -210,6 +212,7 @@ void test_scan_logs_when_caching_is_enabled() { doReturn(mock(WriteCache.class)).when(spy).nextCache(); var sonarComponents = mock(SonarComponents.class); doReturn(spy).when(sonarComponents).context(); + doReturn(true).when(sonarComponents).canSkipUnchangedFiles(); JavaFrontend frontend = new JavaFrontend( new JavaVersionImpl(), @@ -234,7 +237,114 @@ void test_scan_logs_when_caching_is_enabled() { } @Test - void test_scan_logs_when_caching_is_disabled() { + void test_scan_logs_when_caching_is_enabled_and_cannot_skip_unchanged_files() throws ApiMismatchException { + File baseDir = temp.getRoot().getAbsoluteFile(); + SensorContextTester sensorContextTester = SensorContextTester.create(baseDir); + sensorContextTester.setSettings(new MapSettings()); + + SensorContext spy = spy(sensorContextTester); + doReturn(true).when(spy).isCacheEnabled(); + doReturn(mock(ReadCache.class)).when(spy).previousCache(); + doReturn(mock(WriteCache.class)).when(spy).nextCache(); + var sonarComponents = mock(SonarComponents.class); + doReturn(spy).when(sonarComponents).context(); + doReturn(false).when(sonarComponents).canSkipUnchangedFiles(); + + JavaFrontend frontend = new JavaFrontend( + new JavaVersionImpl(), + sonarComponents, + null, + mock(JavaResourceLocator.class), + mainCodeIssueScannerAndFilter + ); + + frontend.scan(Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); + List logs = logTester.getLogs(LoggerLevel.INFO).stream() + .map(LogAndArguments::getFormattedMsg) + .collect(Collectors.toList()); + assertThat(logs) + .isNotEmpty() + .containsExactly( + "Server-side caching is enabled. The Java analyzer will not try to leverage data from a previous analysis.", + "No \"Main\" source files to scan.", + "No \"Test\" source files to scan.", + "No \"Generated\" source files to scan." + ); + } + + @Test + void test_scan_logs_when_caching_is_enabled_and_cannot_determine_if_unchanged_files_can_be_skipped() throws ApiMismatchException { + File baseDir = temp.getRoot().getAbsoluteFile(); + SensorContextTester sensorContextTester = SensorContextTester.create(baseDir); + sensorContextTester.setSettings(new MapSettings()); + + SensorContext spy = spy(sensorContextTester); + doReturn(true).when(spy).isCacheEnabled(); + doReturn(mock(ReadCache.class)).when(spy).previousCache(); + doReturn(mock(WriteCache.class)).when(spy).nextCache(); + var sonarComponents = mock(SonarComponents.class); + doReturn(spy).when(sonarComponents).context(); + doThrow(new ApiMismatchException(new NoSuchMethodError("BOOM!"))).when(sonarComponents).canSkipUnchangedFiles(); + + JavaFrontend frontend = new JavaFrontend( + new JavaVersionImpl(), + sonarComponents, + null, + mock(JavaResourceLocator.class), + mainCodeIssueScannerAndFilter + ); + + frontend.scan(Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); + List logs = logTester.getLogs(LoggerLevel.INFO).stream() + .map(LogAndArguments::getFormattedMsg) + .collect(Collectors.toList()); + assertThat(logs) + .isNotEmpty() + .containsExactly( + "Server-side caching is enabled. The Java analyzer will not try to leverage data from a previous analysis.", + "No \"Main\" source files to scan.", + "No \"Test\" source files to scan.", + "No \"Generated\" source files to scan." + ); + } + + @Test + void test_scan_logs_when_caching_is_disabled_and_can_skip_unchanged_files() throws ApiMismatchException { + File baseDir = temp.getRoot().getAbsoluteFile(); + SensorContextTester sensorContextTester = SensorContextTester.create(baseDir); + sensorContextTester.setSettings(new MapSettings()); + + SensorContext spy = spy(sensorContextTester); + doReturn(false).when(spy).isCacheEnabled(); + + var sonarComponents = mock(SonarComponents.class); + doReturn(spy).when(sonarComponents).context(); + doReturn(true).when(sonarComponents).canSkipUnchangedFiles(); + + JavaFrontend frontend = new JavaFrontend( + new JavaVersionImpl(), + sonarComponents, + null, + mock(JavaResourceLocator.class), + mainCodeIssueScannerAndFilter + ); + + frontend.scan(Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); + List logs = logTester.getLogs(LoggerLevel.INFO).stream() + .map(LogAndArguments::getFormattedMsg) + .collect(Collectors.toList()); + assertThat(logs) + .isNotEmpty() + .containsExactly( + "Server-side caching is not enabled. The Java analyzer will not try to leverage data from a previous analysis.", + "No \"Main\" source files to scan.", + "No \"Test\" source files to scan.", + "No \"Generated\" source files to scan." + ); + } + + @Test + void test_scan_logs_when_caching_is_disabled_and_cannot_skip_unchanged_files() throws ApiMismatchException { File baseDir = temp.getRoot().getAbsoluteFile(); SensorContextTester sensorContextTester = SensorContextTester.create(baseDir); sensorContextTester.setSettings(new MapSettings()); @@ -244,6 +354,7 @@ void test_scan_logs_when_caching_is_disabled() { var sonarComponents = mock(SonarComponents.class); doReturn(spy).when(sonarComponents).context(); + doReturn(false).when(sonarComponents).canSkipUnchangedFiles(); JavaFrontend frontend = new JavaFrontend( new JavaVersionImpl(), @@ -485,10 +596,10 @@ void exceptions_outside_rules_as_batch_should_interrupt_analysis_if_fail_fast(St @Test void test_preview_feature_in_max_supported_version_do_not_log_message() throws IOException { - // When the actual version match the maximum supported version (currently 17), the preview features flag is + // When the actual version match the maximum supported version (currently 18), the preview features flag is // enabled in the parser config and we made sure to be able to parse preview features, no need to log anything. logTester.setLevel(LoggerLevel.DEBUG); - scan(new MapSettings().setProperty(JavaVersion.SOURCE_VERSION, "17"), + scan(new MapSettings().setProperty(JavaVersion.SOURCE_VERSION, "18"), SONARLINT_RUNTIME, "class A { void m(String s) { switch(s) { case null: default: } } }"); assertThat(sensorContext.allAnalysisErrors()).isEmpty(); String allLogs = String.join("\n", logTester.logs()); @@ -509,7 +620,7 @@ void test_preview_feature_in_version_greater_than_maximum_do_not_log_message() t @Test void test_sealed_classes_in_java_16_log_message() throws IOException { - // When the actual version is lower than the maximum supported version (currently 17), + // When the actual version is lower than the maximum supported version (currently 18), // we can not guarantee that we are still parsing preview features the same way (it may have evolved) and log a message. logTester.setLevel(LoggerLevel.DEBUG); scan(new MapSettings().setProperty(JavaVersion.SOURCE_VERSION, "16"), diff --git a/java-frontend/src/test/java/org/sonar/java/model/ExpressionUtilsTest.java b/java-frontend/src/test/java/org/sonar/java/model/ExpressionUtilsTest.java index 206d528f525..40cf11b1d75 100644 --- a/java-frontend/src/test/java/org/sonar/java/model/ExpressionUtilsTest.java +++ b/java-frontend/src/test/java/org/sonar/java/model/ExpressionUtilsTest.java @@ -337,7 +337,18 @@ void resolve_as_string_constant() { @Test void resolve_as_constant_not_yet_supported() { assertResolveAsConstant("true || true", null); - assertResolveAsConstant("2 * 2", null); + } + + @Test + void resolve_as_constant_arithmetic_operations() { + assertResolveAsConstant("1 + 1 - 1", 1); + assertResolveAsConstant("8 - 3 + 2 * 2", 9); + assertResolveAsConstant("8 - (3 + 2) * 2", -2); + assertResolveAsConstant("8 - (3 + 2) / 5 * 2", 6); + assertResolveAsConstant("8 - (3 + 2) % 5 * 2", 8); + assertResolveAsConstant("8 - (x + 2) % 5 * 2", null); + assertResolveAsConstant("8 - (3 + x) % 5 * 2", null); + assertResolveAsConstant("8 - (x + x) % 5 * 2", null); } @Test diff --git a/java-frontend/src/test/java/org/sonar/java/model/JMethodSymbolTest.java b/java-frontend/src/test/java/org/sonar/java/model/JMethodSymbolTest.java index 8f4309c908b..368e8ed3828 100644 --- a/java-frontend/src/test/java/org/sonar/java/model/JMethodSymbolTest.java +++ b/java-frontend/src/test/java/org/sonar/java/model/JMethodSymbolTest.java @@ -34,6 +34,8 @@ import org.sonar.java.model.declaration.ClassTreeImpl; import org.sonar.java.model.declaration.MethodTreeImpl; import org.sonar.java.model.expression.MethodInvocationTreeImpl; +import org.sonar.java.model.expression.NewClassTreeImpl; +import org.sonar.java.model.statement.ExpressionStatementTreeImpl; import org.sonar.java.model.statement.ReturnStatementTreeImpl; import org.sonar.plugins.java.api.semantic.MethodMatchers; import org.sonar.plugins.java.api.semantic.Symbol; @@ -364,6 +366,25 @@ void support_unexpected_IMethodBinding_null_return_type() { assertThat(methodSymbol.metadata()).isSameAs(Symbols.EMPTY_METADATA); } + @Test + void testParameterDeclarationsOfCompactConstructor() { + JavaTree.CompilationUnitTreeImpl cu = test("" + + "record TestSonar(String arg1, String arg2, String arg3, String arg4, long arg5, String arg6) {\n" + + " public TestSonar {}\n" + + " public static void f() {\n" + + " new TestSonar(null, null, null, null, 0L, null);\n" + + " }\n" + + "}"); + + ClassTreeImpl c = (ClassTreeImpl) cu.types().get(0); + MethodTreeImpl m = (MethodTreeImpl) c.members().get(1); + ExpressionStatementTree statementTree = ((ExpressionStatementTreeImpl) m.block().body().get(0)); + NewClassTreeImpl newClassExpression = ((NewClassTreeImpl) statementTree.expression()); + JMethodSymbol symbol = ((JMethodSymbol) newClassExpression.constructorSymbol()); + + assertThat(symbol.declarationParameters()).hasSize(6); + } + private static CompilationUnitTreeImpl test(String source) { return (CompilationUnitTreeImpl) JParserTestUtils.parse(source); } diff --git a/java-frontend/src/test/java/org/sonar/java/model/JParserConfigTest.java b/java-frontend/src/test/java/org/sonar/java/model/JParserConfigTest.java index a551190c57d..6d8db5006af 100644 --- a/java-frontend/src/test/java/org/sonar/java/model/JParserConfigTest.java +++ b/java-frontend/src/test/java/org/sonar/java/model/JParserConfigTest.java @@ -31,8 +31,9 @@ void should_enable_preview() { assertThat(shouldEnablePreviewFlag(new JavaVersionImpl(8))).isFalse(); assertThat(shouldEnablePreviewFlag(new JavaVersionImpl(11))).isFalse(); assertThat(shouldEnablePreviewFlag(new JavaVersionImpl(16))).isFalse(); - assertThat(shouldEnablePreviewFlag(new JavaVersionImpl(17))).isTrue(); + assertThat(shouldEnablePreviewFlag(new JavaVersionImpl(17))).isFalse(); assertThat(shouldEnablePreviewFlag(new JavaVersionImpl(18))).isTrue(); + assertThat(shouldEnablePreviewFlag(new JavaVersionImpl(19))).isTrue(); assertThat(shouldEnablePreviewFlag(new JavaVersionImpl(42))).isTrue(); assertThat(shouldEnablePreviewFlag(JavaVersionImpl.fromString("1.8"))).isFalse(); diff --git a/java-frontend/src/test/java/org/sonar/java/model/JSymbolTest.java b/java-frontend/src/test/java/org/sonar/java/model/JSymbolTest.java index f84ef48cd06..10a407b0445 100644 --- a/java-frontend/src/test/java/org/sonar/java/model/JSymbolTest.java +++ b/java-frontend/src/test/java/org/sonar/java/model/JSymbolTest.java @@ -28,6 +28,7 @@ import org.sonar.java.model.declaration.VariableTreeImpl; import org.sonar.java.model.statement.BlockTreeImpl; import org.sonar.plugins.java.api.semantic.Symbol; +import org.sonar.plugins.java.api.semantic.Type; import org.sonar.plugins.java.api.tree.ClassTree; import org.sonar.plugins.java.api.tree.IdentifierTree; import org.sonar.plugins.java.api.tree.LambdaExpressionTree; @@ -97,6 +98,9 @@ void owner() { .hasOwner(Symbols.rootPackage) .hasSameHashCodeAs(p.type().symbolType().symbol().hashCode()); + assertThat(cu.sema.packageSymbol(null)) + .isEqualTo(Symbols.rootPackage); + JType uType = cu.sema.type(u.variableBinding.getType()); Symbol.TypeSymbol uTypeSymbol = uType.symbol(); assertThat(uType.isUnknown()).isTrue(); @@ -104,6 +108,36 @@ void owner() { assertThat(uTypeSymbol.owner().isUnknown()).isTrue(); } + @Test + void owner_of_types_without_package_default_to_root_package_instead_of_null() { + JavaTree.CompilationUnitTreeImpl cu = test("class C {\n" + + " Object objectField;\n" + // 'Object' is a regular type from 'java.lang' package + " int intField;\n" + // 'int' is a primitive type without package + " Object[] objectArrayField;\n" + // 'Object[]' is an array type without package + " java.util.List listField;\n" + // '?' is a wildcard type without package + "}\n" + ); + ClassTreeImpl c = (ClassTreeImpl) cu.types().get(0); + + Symbol objectFieldType = ((VariableTree) c.members().get(0)).type().symbolType().symbol(); + assertThat(objectFieldType.owner().name()).isEqualTo("java.lang"); + + Symbol intFieldType = ((VariableTree) c.members().get(1)).type().symbolType().symbol(); + assertThat(intFieldType.owner().name()).isEmpty(); + assertThat(intFieldType.owner()).isEqualTo(Symbols.rootPackage); + + Symbol objectArrayFieldType = ((VariableTree) c.members().get(2)).type().symbolType().symbol(); + assertThat(objectArrayFieldType.owner()).isEqualTo(Symbols.rootPackage); + + Type listFieldTypeTree = ((VariableTree) c.members().get(3)).type().symbolType(); + Symbol.TypeSymbol listType = listFieldTypeTree.symbol(); + assertThat(listType.owner().name()).isEqualTo("java.util"); + assertThat(listFieldTypeTree.typeArguments()).hasSize(1); + Type wildcardType = listFieldTypeTree.typeArguments().get(0); + assertThat(wildcardType.name()).isEqualTo("?"); + assertThat(wildcardType.symbol().owner()).isEqualTo(Symbols.rootPackage); + } + @Test void owner_local_record() { JavaTree.CompilationUnitTreeImpl cu = test("class C1 { void m() { record r(Object p) { } } }"); diff --git a/java-frontend/src/test/java/org/sonar/java/model/JavaVersionImplTest.java b/java-frontend/src/test/java/org/sonar/java/model/JavaVersionImplTest.java index 7f0350c7df7..5dc8dca8f46 100644 --- a/java-frontend/src/test/java/org/sonar/java/model/JavaVersionImplTest.java +++ b/java-frontend/src/test/java/org/sonar/java/model/JavaVersionImplTest.java @@ -20,6 +20,8 @@ package org.sonar.java.model; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.sonar.plugins.java.api.JavaVersion; import static org.assertj.core.api.Assertions.assertThat; @@ -27,175 +29,48 @@ class JavaVersionImplTest { @Test - void no_version_set() throws Exception { + void no_version_set() { JavaVersion version = new JavaVersionImpl(); assertThat(version.isSet()).isFalse(); assertThat(version.isNotSet()).isTrue(); + // not set is considered compatible with everything <= 8 + assertThat(version.isJava6Compatible()).isTrue(); assertThat(version.isJava7Compatible()).isTrue(); assertThat(version.isJava8Compatible()).isTrue(); + // all the rest are incompatible assertThat(version.isJava9Compatible()).isFalse(); assertThat(version.isJava10Compatible()).isFalse(); assertThat(version.isJava12Compatible()).isFalse(); assertThat(version.isJava14Compatible()).isFalse(); assertThat(version.isJava15Compatible()).isFalse(); assertThat(version.isJava16Compatible()).isFalse(); + assertThat(version.isJava17Compatible()).isFalse(); + assertThat(version.isJava18Compatible()).isFalse(); assertThat(version.asInt()).isEqualTo(-1); } - @Test - void java_5() throws Exception { - JavaVersion version = new JavaVersionImpl(5); + @ParameterizedTest(name = "JavaVersion: \"{0}\"") + @ValueSource(ints = {5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 42}) + void java_versions(int javaVersionAsInt) { + JavaVersion version = new JavaVersionImpl(javaVersionAsInt); assertThat(version.isSet()).isTrue(); assertThat(version.isNotSet()).isFalse(); - assertThat(version.isJava6Compatible()).isFalse(); - assertThat(version.isJava7Compatible()).isFalse(); - assertThat(version.isJava8Compatible()).isFalse(); - assertThat(version.isJava9Compatible()).isFalse(); - assertThat(version.isJava10Compatible()).isFalse(); - assertThat(version.isJava12Compatible()).isFalse(); - assertThat(version.isJava14Compatible()).isFalse(); - assertThat(version.isJava15Compatible()).isFalse(); - assertThat(version.isJava16Compatible()).isFalse(); - assertThat(version.asInt()).isEqualTo(5); - } - - @Test - void java_6() throws Exception { - JavaVersion version = new JavaVersionImpl(6); - assertThat(version.isJava6Compatible()).isTrue(); - assertThat(version.isJava7Compatible()).isFalse(); - assertThat(version.isJava8Compatible()).isFalse(); - assertThat(version.isJava9Compatible()).isFalse(); - assertThat(version.isJava10Compatible()).isFalse(); - assertThat(version.isJava12Compatible()).isFalse(); - assertThat(version.isJava14Compatible()).isFalse(); - assertThat(version.isJava15Compatible()).isFalse(); - assertThat(version.isJava16Compatible()).isFalse(); - assertThat(version.asInt()).isEqualTo(6); - } - - @Test - void java_7() throws Exception { - JavaVersion version = new JavaVersionImpl(7); - assertThat(version.isJava6Compatible()).isTrue(); - assertThat(version.isJava7Compatible()).isTrue(); - assertThat(version.isJava8Compatible()).isFalse(); - assertThat(version.isJava9Compatible()).isFalse(); - assertThat(version.isJava10Compatible()).isFalse(); - assertThat(version.isJava12Compatible()).isFalse(); - assertThat(version.isJava14Compatible()).isFalse(); - assertThat(version.isJava15Compatible()).isFalse(); - assertThat(version.isJava16Compatible()).isFalse(); - assertThat(version.asInt()).isEqualTo(7); - } - - @Test - void java_8() throws Exception { - JavaVersion version = new JavaVersionImpl(8); - assertThat(version.isJava6Compatible()).isTrue(); - assertThat(version.isJava7Compatible()).isTrue(); - assertThat(version.isJava8Compatible()).isTrue(); - assertThat(version.isJava9Compatible()).isFalse(); - assertThat(version.isJava10Compatible()).isFalse(); - assertThat(version.isJava12Compatible()).isFalse(); - assertThat(version.isJava14Compatible()).isFalse(); - assertThat(version.isJava15Compatible()).isFalse(); - assertThat(version.isJava16Compatible()).isFalse(); - assertThat(version.asInt()).isEqualTo(8); - } - - @Test - void java_9() throws Exception { - JavaVersion version = new JavaVersionImpl(9); - assertThat(version.isJava6Compatible()).isTrue(); - assertThat(version.isJava7Compatible()).isTrue(); - assertThat(version.isJava8Compatible()).isTrue(); - assertThat(version.isJava9Compatible()).isTrue(); - assertThat(version.isJava10Compatible()).isFalse(); - assertThat(version.isJava12Compatible()).isFalse(); - assertThat(version.isJava14Compatible()).isFalse(); - assertThat(version.isJava15Compatible()).isFalse(); - assertThat(version.isJava16Compatible()).isFalse(); - assertThat(version.asInt()).isEqualTo(9); - } - - @Test - void java_10() throws Exception { - JavaVersion version = new JavaVersionImpl(10); - assertThat(version.isJava6Compatible()).isTrue(); - assertThat(version.isJava7Compatible()).isTrue(); - assertThat(version.isJava8Compatible()).isTrue(); - assertThat(version.isJava9Compatible()).isTrue(); - assertThat(version.isJava10Compatible()).isTrue(); - assertThat(version.isJava12Compatible()).isFalse(); - assertThat(version.isJava14Compatible()).isFalse(); - assertThat(version.isJava15Compatible()).isFalse(); - assertThat(version.isJava16Compatible()).isFalse(); - assertThat(version.asInt()).isEqualTo(10); - } - - @Test - void java_12() { - JavaVersion version = new JavaVersionImpl(12); - assertThat(version.isJava6Compatible()).isTrue(); - assertThat(version.isJava7Compatible()).isTrue(); - assertThat(version.isJava8Compatible()).isTrue(); - assertThat(version.isJava9Compatible()).isTrue(); - assertThat(version.isJava10Compatible()).isTrue(); - assertThat(version.isJava12Compatible()).isTrue(); - assertThat(version.isJava14Compatible()).isFalse(); - assertThat(version.isJava15Compatible()).isFalse(); - assertThat(version.isJava16Compatible()).isFalse(); - assertThat(version.asInt()).isEqualTo(12); - } - - @Test - void java_14() { - JavaVersion version = new JavaVersionImpl(14); - assertThat(version.isJava6Compatible()).isTrue(); - assertThat(version.isJava7Compatible()).isTrue(); - assertThat(version.isJava8Compatible()).isTrue(); - assertThat(version.isJava9Compatible()).isTrue(); - assertThat(version.isJava10Compatible()).isTrue(); - assertThat(version.isJava12Compatible()).isTrue(); - assertThat(version.isJava14Compatible()).isTrue(); - assertThat(version.isJava15Compatible()).isFalse(); - assertThat(version.isJava16Compatible()).isFalse(); - assertThat(version.asInt()).isEqualTo(14); - } - - @Test - void java_15() { - JavaVersion version = new JavaVersionImpl(15); - assertThat(version.isJava6Compatible()).isTrue(); - assertThat(version.isJava7Compatible()).isTrue(); - assertThat(version.isJava8Compatible()).isTrue(); - assertThat(version.isJava9Compatible()).isTrue(); - assertThat(version.isJava10Compatible()).isTrue(); - assertThat(version.isJava12Compatible()).isTrue(); - assertThat(version.isJava14Compatible()).isTrue(); - assertThat(version.isJava15Compatible()).isTrue(); - assertThat(version.isJava16Compatible()).isFalse(); - assertThat(version.asInt()).isEqualTo(15); - } - - @Test - void java_16() { - JavaVersion version = new JavaVersionImpl(16); - assertThat(version.isJava6Compatible()).isTrue(); - assertThat(version.isJava7Compatible()).isTrue(); - assertThat(version.isJava8Compatible()).isTrue(); - assertThat(version.isJava9Compatible()).isTrue(); - assertThat(version.isJava10Compatible()).isTrue(); - assertThat(version.isJava12Compatible()).isTrue(); - assertThat(version.isJava14Compatible()).isTrue(); - assertThat(version.isJava15Compatible()).isTrue(); - assertThat(version.isJava16Compatible()).isTrue(); - assertThat(version.asInt()).isEqualTo(16); + assertThat(version.isJava6Compatible()).isEqualTo(javaVersionAsInt >= 6); + assertThat(version.isJava7Compatible()).isEqualTo(javaVersionAsInt >= 7); + assertThat(version.isJava8Compatible()).isEqualTo(javaVersionAsInt >= 8); + assertThat(version.isJava9Compatible()).isEqualTo(javaVersionAsInt >= 9); + assertThat(version.isJava10Compatible()).isEqualTo(javaVersionAsInt >= 10); + assertThat(version.isJava12Compatible()).isEqualTo(javaVersionAsInt >= 12); + assertThat(version.isJava14Compatible()).isEqualTo(javaVersionAsInt >= 14); + assertThat(version.isJava15Compatible()).isEqualTo(javaVersionAsInt >= 15); + assertThat(version.isJava16Compatible()).isEqualTo(javaVersionAsInt >= 16); + assertThat(version.isJava17Compatible()).isEqualTo(javaVersionAsInt >= 17); + assertThat(version.isJava18Compatible()).isEqualTo(javaVersionAsInt >= 18); + assertThat(version.asInt()).isEqualTo(javaVersionAsInt); } @Test - void compatibilityMesssages() throws Exception { + void compatibilityMesssages() { JavaVersion version; version = new JavaVersionImpl(); assertThat(version.java6CompatibilityMessage()).isEqualTo(" (sonar.java.source not set. Assuming 6 or greater.)"); @@ -210,13 +85,13 @@ void compatibilityMesssages() throws Exception { @Test void test_effective_java_version() { - assertThat(new JavaVersionImpl().effectiveJavaVersionAsString()).isEqualTo("17"); + assertThat(new JavaVersionImpl().effectiveJavaVersionAsString()).isEqualTo("18"); assertThat(new JavaVersionImpl(10).effectiveJavaVersionAsString()).isEqualTo("10"); - assertThat(new JavaVersionImpl(-1).effectiveJavaVersionAsString()).isEqualTo("17"); + assertThat(new JavaVersionImpl(-1).effectiveJavaVersionAsString()).isEqualTo("18"); } @Test - void test_toString() throws Exception { + void test_toString() { JavaVersion version; version = new JavaVersionImpl(); assertThat(version).hasToString("none"); @@ -226,7 +101,7 @@ void test_toString() throws Exception { } @Test - void test_fromString() throws Exception { + void test_fromString() { JavaVersion version; version = JavaVersionImpl.fromString("-1"); assertThat(version.isSet()).isFalse(); diff --git a/java-frontend/src/test/java/org/sonar/java/model/expression/InstanceOfTreeImplTest.java b/java-frontend/src/test/java/org/sonar/java/model/expression/InstanceOfTreeImplTest.java index c56258ecacc..fb78d230bb8 100644 --- a/java-frontend/src/test/java/org/sonar/java/model/expression/InstanceOfTreeImplTest.java +++ b/java-frontend/src/test/java/org/sonar/java/model/expression/InstanceOfTreeImplTest.java @@ -61,18 +61,21 @@ void test_PatternInstanceOfTree() { @Test void test_GuardedPatternInstanceOfTree() { - InstanceOfTreeImpl ioti = instanceOf("o instanceof (String s && s.length() > 10)"); - assertThat(ioti.is(Tree.Kind.PATTERN_INSTANCE_OF)).isTrue(); - - PatternInstanceOfTree piot = ioti; + ExpressionTree condition = ifCondition("o instanceof (String s && s.length() > 10)"); + // ECJ drop the parenthesis and consider it as the two operands of a &&, while this compiles + assertThat(condition.is(Tree.Kind.CONDITIONAL_AND)).isTrue(); + BinaryExpressionTree binaryExpression = (BinaryExpressionTree) condition; + assertThat(binaryExpression.rightOperand().is(Tree.Kind.GREATER_THAN)).isTrue(); + ExpressionTree leftOp = binaryExpression.leftOperand(); + assertThat(leftOp.is(Tree.Kind.PATTERN_INSTANCE_OF)).isTrue(); + PatternInstanceOfTree piot = (PatternInstanceOfTree) leftOp; assertThat(piot.expression()).isNotNull(); assertThat(piot.instanceofKeyword()).isNotNull(); VariableTree variable = piot.variable(); assertThat(variable).isNotNull(); assertThat(variable.simpleName().name()).isEqualTo("s"); assertThat(variable.type().symbolType().is("java.lang.String")).isTrue(); - // instanceof with guarded pattern is not fully parsed by ECJ in this version. - // It does not crash though, and as it is a preview feature anyway, it is fine to not support it completely. + } @Test @@ -80,8 +83,16 @@ void test_PatternInstanceOfAsBinary() { ExpressionTree condition = ifCondition("o instanceof String s && s.length() > 10"); assertThat(condition.is(Tree.Kind.CONDITIONAL_AND)).isTrue(); BinaryExpressionTree binaryExpression = (BinaryExpressionTree) condition; - assertThat(binaryExpression.leftOperand().is(Tree.Kind.PATTERN_INSTANCE_OF)).isTrue(); assertThat(binaryExpression.rightOperand().is(Tree.Kind.GREATER_THAN)).isTrue(); + ExpressionTree leftOp = binaryExpression.leftOperand(); + assertThat(leftOp.is(Tree.Kind.PATTERN_INSTANCE_OF)).isTrue(); + PatternInstanceOfTree piot = (PatternInstanceOfTree) leftOp; + assertThat(piot.expression()).isNotNull(); + assertThat(piot.instanceofKeyword()).isNotNull(); + VariableTree variable = piot.variable(); + assertThat(variable).isNotNull(); + assertThat(variable.simpleName().name()).isEqualTo("s"); + assertThat(variable.type().symbolType().is("java.lang.String")).isTrue(); } @Test diff --git a/java-frontend/src/test/java/org/sonar/java/model/pattern/AbstractPatternTreeTest.java b/java-frontend/src/test/java/org/sonar/java/model/pattern/AbstractPatternTreeTest.java index 6644bb0ae6c..4b6c8d67280 100644 --- a/java-frontend/src/test/java/org/sonar/java/model/pattern/AbstractPatternTreeTest.java +++ b/java-frontend/src/test/java/org/sonar/java/model/pattern/AbstractPatternTreeTest.java @@ -24,6 +24,7 @@ import org.junit.jupiter.api.Test; import org.sonar.java.model.JParserTestUtils; import org.sonar.plugins.java.api.tree.BaseTreeVisitor; +import org.sonar.plugins.java.api.tree.BinaryExpressionTree; import org.sonar.plugins.java.api.tree.CaseGroupTree; import org.sonar.plugins.java.api.tree.CaseLabelTree; import org.sonar.plugins.java.api.tree.ClassTree; @@ -34,7 +35,6 @@ import org.sonar.plugins.java.api.tree.MethodTree; import org.sonar.plugins.java.api.tree.NullPatternTree; import org.sonar.plugins.java.api.tree.ParenthesizedTree; -import org.sonar.plugins.java.api.tree.PatternTree; import org.sonar.plugins.java.api.tree.ReturnStatementTree; import org.sonar.plugins.java.api.tree.SwitchExpressionTree; import org.sonar.plugins.java.api.tree.Tree; @@ -217,12 +217,12 @@ void test_guarded_pattern_parenthesized_nested() { ExpressionTree expression = expressions.get(0); assertThat(expression).is(Tree.Kind.GUARDED_PATTERN); GuardedPatternTree guardedPattern = (GuardedPatternTree) expression; - PatternTree nestedPattern = guardedPattern.pattern(); - assertThat(nestedPattern).is(Tree.Kind.GUARDED_PATTERN); - GuardedPatternTree nestedGuardedPattern = (GuardedPatternTree) nestedPattern; - assertThat(nestedGuardedPattern.pattern()).is(Tree.Kind.TYPE_PATTERN); - assertThat(nestedGuardedPattern.expression()).is(Tree.Kind.GREATER_THAN); - assertThat(guardedPattern.expression()).is(Tree.Kind.BOOLEAN_LITERAL); + assertThat(guardedPattern.pattern()).is(Tree.Kind.TYPE_PATTERN); + // ECJ transform the guarded pattern in and drop the parenthesis + assertThat(guardedPattern.expression()).is(Tree.Kind.CONDITIONAL_AND); + BinaryExpressionTree and = (BinaryExpressionTree) guardedPattern.expression(); + assertThat(and.leftOperand()).is(Tree.Kind.GREATER_THAN); + assertThat(and.rightOperand()).is(Tree.Kind.BOOLEAN_LITERAL); } @Test diff --git a/java-frontend/src/test/java/org/sonar/java/reporting/InternalJavaIssueBuilderTest.java b/java-frontend/src/test/java/org/sonar/java/reporting/InternalJavaIssueBuilderTest.java index 05f2be7c182..355769ebb0e 100644 --- a/java-frontend/src/test/java/org/sonar/java/reporting/InternalJavaIssueBuilderTest.java +++ b/java-frontend/src/test/java/org/sonar/java/reporting/InternalJavaIssueBuilderTest.java @@ -21,7 +21,6 @@ import java.io.File; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -36,8 +35,6 @@ import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; -import org.sonar.api.SonarEdition; -import org.sonar.api.SonarQubeSide; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.TextPointer; import org.sonar.api.batch.fs.TextRange; @@ -50,9 +47,7 @@ import org.sonar.api.batch.sensor.issue.NewIssue; import org.sonar.api.batch.sensor.issue.NewIssueLocation; import org.sonar.api.batch.sensor.issue.internal.DefaultIssue; -import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.rule.RuleKey; -import org.sonar.api.utils.Version; import org.sonar.api.utils.log.LogTesterJUnit5; import org.sonar.api.utils.log.LoggerLevel; import org.sonar.java.SonarComponents; @@ -569,7 +564,7 @@ public NewIssue addLocation(NewIssueLocation secondaryLocation) { throw new IllegalStateException("Not supposed to be tested"); } - // @Override in SonarQube 9.2 + @Override public NewIssue setQuickFixAvailable(boolean b) { isQuickFixAvailable = b; return this; @@ -617,10 +612,20 @@ public List flows() { throw new IllegalStateException("Not supposed to be tested"); } - // @Override in SonarQube 9.2 + @Override public boolean isQuickFixAvailable() { return isQuickFixAvailable; } + + @Override + public Optional ruleDescriptionContextKey() { + return Optional.empty(); + } + + @Override + public NewIssue setRuleDescriptionContextKey(String ruleDescriptionContextKey) { + return this; + } } } diff --git a/java-jsp/pom.xml b/java-jsp/pom.xml index 355e60ef3bd..3a83dd6ab1a 100644 --- a/java-jsp/pom.xml +++ b/java-jsp/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.java java - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT java-jsp @@ -15,7 +15,7 @@ - org.sonarsource.sonarqube + org.sonarsource.api.plugin sonar-plugin-api @@ -26,7 +26,7 @@ org.apache.tomcat.embed tomcat-embed-jasper - 9.0.33 + 9.0.68 org.eclipse.jdt diff --git a/java-surefire/pom.xml b/java-surefire/pom.xml index 207337d4e3d..53a68c50139 100644 --- a/java-surefire/pom.xml +++ b/java-surefire/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.java java - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT java-surefire @@ -14,7 +14,7 @@ - org.sonarsource.sonarqube + org.sonarsource.api.plugin sonar-plugin-api provided diff --git a/java-symbolic-execution/pom.xml b/java-symbolic-execution/pom.xml index 3257a3c53bb..18770789286 100644 --- a/java-symbolic-execution/pom.xml +++ b/java-symbolic-execution/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.java java - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT java-symbolic-execution @@ -19,7 +19,7 @@ ${project.version} - org.sonarsource.sonarqube + org.sonarsource.api.plugin sonar-plugin-api provided @@ -63,17 +63,17 @@ mockito-junit-jupiter test - + commons-io commons-io test - + com.google.guava guava test - + diff --git a/java-symbolic-execution/src/main/java/org/sonar/java/se/ExplodedGraphWalker.java b/java-symbolic-execution/src/main/java/org/sonar/java/se/ExplodedGraphWalker.java index e02326284ef..5f9f3c58918 100644 --- a/java-symbolic-execution/src/main/java/org/sonar/java/se/ExplodedGraphWalker.java +++ b/java-symbolic-execution/src/main/java/org/sonar/java/se/ExplodedGraphWalker.java @@ -126,6 +126,8 @@ public class ExplodedGraphWalker { public static final MethodMatchers EQUALS_METHODS = MethodMatchers.or( EQUALS, MethodMatchers.create().ofTypes("java.util.Objects").names("equals").withAnyParameters().build()); + public static final MethodMatchers BOOLEAN_VALUE_MATCHER = MethodMatchers.create().ofTypes("java.lang.Boolean") + .names("booleanValue").addWithoutParametersMatcher().build(); private final AlwaysTrueOrFalseExpressionCollector alwaysTrueOrFalseExpressionCollector; private MethodTree methodTree; diff --git a/java-symbolic-execution/src/main/java/org/sonar/java/se/NullabilityDataUtils.java b/java-symbolic-execution/src/main/java/org/sonar/java/se/NullabilityDataUtils.java index fa1db1f58e4..97022989da7 100644 --- a/java-symbolic-execution/src/main/java/org/sonar/java/se/NullabilityDataUtils.java +++ b/java-symbolic-execution/src/main/java/org/sonar/java/se/NullabilityDataUtils.java @@ -45,7 +45,7 @@ public static Optional nullabilityAsString(SymbolMetadata.NullabilityDat private static String getAnnotationName(SymbolMetadata.AnnotationInstance annotation) { String name = annotation.symbol().name(); - if (name.equals("Nonnull")) { + if ("Nonnull".equals(name)) { return name + annotationArguments(annotation.values()); } return name; diff --git a/java-symbolic-execution/src/main/java/org/sonar/java/se/checks/DivisionByZeroCheck.java b/java-symbolic-execution/src/main/java/org/sonar/java/se/checks/DivisionByZeroCheck.java index 3d1b59e717a..cfcc66b8875 100644 --- a/java-symbolic-execution/src/main/java/org/sonar/java/se/checks/DivisionByZeroCheck.java +++ b/java-symbolic-execution/src/main/java/org/sonar/java/se/checks/DivisionByZeroCheck.java @@ -441,7 +441,7 @@ private boolean checkZeroLiteral(LiteralTree literalTree) { **/ private static boolean isZeroLiteral(LiteralTree literalTree, String value) { if (value.length() == 1) { - return value.equals("0"); + return "0".equals(value); } int startIndex = 0; int endIndex = value.length() - 1; diff --git a/java-symbolic-execution/src/main/java/org/sonar/java/se/checks/OptionalGetBeforeIsPresentCheck.java b/java-symbolic-execution/src/main/java/org/sonar/java/se/checks/OptionalGetBeforeIsPresentCheck.java index 12dfcdede29..b20d5159b92 100644 --- a/java-symbolic-execution/src/main/java/org/sonar/java/se/checks/OptionalGetBeforeIsPresentCheck.java +++ b/java-symbolic-execution/src/main/java/org/sonar/java/se/checks/OptionalGetBeforeIsPresentCheck.java @@ -19,12 +19,13 @@ */ package org.sonar.java.se.checks; -import org.sonar.java.Preconditions; import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.Optional; import javax.annotation.Nullable; import org.sonar.check.Rule; +import org.sonar.java.Preconditions; import org.sonar.java.se.CheckerContext; import org.sonar.java.se.ProgramState; import org.sonar.java.se.constraint.BooleanConstraint; @@ -191,16 +192,17 @@ public boolean references(SymbolicValue other) { } private static class PreStatementVisitor extends CheckerTreeNodeVisitor { - private final CheckerContext context; private final ConstraintManager constraintManager; private final SECheck check; + private final boolean java11; private PreStatementVisitor(SECheck check, CheckerContext context) { super(context.getState()); this.context = context; this.constraintManager = context.getConstraintManager(); this.check = check; + this.java11 = context.getScannerContext().getJavaVersion().asInt() >= 11; } @Override @@ -209,52 +211,97 @@ public void visitMethodInvocation(MethodInvocationTree tree) { return; } - SymbolicValue peek = programState.peekValue(); - if (OPTIONAL_TEST_METHODS.matches(tree)) { - constraintManager.setValueFactory(() -> new OptionalTestMethodSymbolicValue(peek, tree.symbol())); - } else if (OPTIONAL_GET.matches(tree) && presenceHasNotBeenChecked(programState.peekValueSymbol())) { - context.addExceptionalYield(peek, programState, "java.util.NoSuchElementException", check); - reportIssue(tree); - // continue exploration after reporting, assuming the optional is now present (killing any noise after the initial issue) - programState = programState.addConstraint(peek, OptionalConstraint.PRESENT); + if (OPTIONAL_GET.matches(tree)) { + handleOptionalGetMethod(tree); + } else if (OPTIONAL_TEST_METHODS.matches(tree)) { + handleOptionalTestMethods(tree); } else if (OPTIONAL_FILTER.matches(tree)) { - // filter has one parameter, so optional is next item on stack - SymbolicValue optionalSV = programState.peekValue(1); - - if (programState.getConstraint(optionalSV, OptionalConstraint.class) == OptionalConstraint.NOT_PRESENT) { - // reuse the same optional - filtering a non-present optional is a no-op - constraintManager.setValueFactory(() -> optionalSV); - } else { - constraintManager.setValueFactory(() -> new FilteredOptionalSymbolicValue(optionalSV)); - } + handleOptionalFilterMethod(); } else if (OPTIONAL_ORELSE.matches(tree)) { - ProgramState.Pop pop = programState.unstackValue(2); - SymbolicValue orElseValue = pop.values.get(0); - SymbolicValue optional = pop.values.get(1); - List psEmpty = optional.setConstraint(pop.state.stackValue(orElseValue), OptionalConstraint.NOT_PRESENT); - SymbolicValue symbolicValue; - if(optional instanceof OptionalSymbolicValue) { - symbolicValue = ((OptionalSymbolicValue) optional).wrappedValue; - } else { - symbolicValue = constraintManager.createSymbolicValue(tree); - } - List psPresent = optional.setConstraint(pop.state.stackValue(symbolicValue), OptionalConstraint.PRESENT); - psEmpty.forEach(context::addTransition); - psPresent.forEach(context::addTransition); + handleOptionalOrElseMethod(tree); + } else if (OPTIONAL_OF.matches(tree)) { + handleOptionalOfMethod(); + } else if (OPTIONAL_OF_NULLABLE.matches(tree)) { + handleOptionalOfNullableMethod(); + } + } + + private void handleOptionalOfMethod() { + constraintManager.setValueFactory(() -> new OptionalSymbolicValue(programState.peekValue())); + } + + private void handleOptionalTestMethods(MethodInvocationTree tree) { + constraintManager.setValueFactory(() -> new OptionalTestMethodSymbolicValue(programState.peekValue(), tree.symbol())); + } + + private void handleOptionalGetMethod(MethodInvocationTree tree) { + if (presenceHasNotBeenChecked(programState.peekValueSymbol())) { + SymbolicValue optionalSV = Objects.requireNonNull(programState.peekValue()); + context.addExceptionalYield(optionalSV, programState, "java.util.NoSuchElementException", check); + reportIssue(tree); + // continue exploration after reporting, assuming the optional is now present (killing any noise after the initial issue) + programState = programState.addConstraint(optionalSV, OptionalConstraint.PRESENT); + } + } + + private void handleOptionalFilterMethod() { + // filter has one parameter, so optional is next item on stack + SymbolicValue optionalSV = programState.peekValue(1); + + if (programState.getConstraint(optionalSV, OptionalConstraint.class) == OptionalConstraint.NOT_PRESENT) { + // reuse the same optional - filtering a non-present optional is a no-op + constraintManager.setValueFactory(() -> optionalSV); + } else { + constraintManager.setValueFactory(() -> new FilteredOptionalSymbolicValue(optionalSV)); + } + } + + private void handleOptionalOrElseMethod(MethodInvocationTree tree) { + ProgramState.Pop pop = programState.unstackValue(2); + SymbolicValue orElseValue = pop.values.get(0); + SymbolicValue optional = pop.values.get(1); + List psEmpty = optional.setConstraint(pop.state.stackValue(orElseValue), OptionalConstraint.NOT_PRESENT); + SymbolicValue symbolicValue; + if(optional instanceof OptionalSymbolicValue) { + symbolicValue = ((OptionalSymbolicValue) optional).wrappedValue; + } else { + symbolicValue = constraintManager.createSymbolicValue(tree); + } + List psPresent = optional.setConstraint(pop.state.stackValue(symbolicValue), OptionalConstraint.PRESENT); + psEmpty.forEach(context::addTransition); + psPresent.forEach(context::addTransition); + // interrupt current path to only use transitions + programState = null; + } + + private void handleOptionalOfNullableMethod() { + SymbolicValue ofNullableParameter = Objects.requireNonNull(programState.peekValue()); + ObjectConstraint nullability = programState.getConstraint(ofNullableParameter, ObjectConstraint.class); + if (nullability != null) { + constraintManager.setValueFactory(() -> new OptionalSymbolicValue(ofNullableParameter)); + } else { + SymbolicValue optionalSV = new OptionalSymbolicValue(ofNullableParameter); + ProgramState newState = programState.unstackValue(2).state.stackValue(optionalSV); + // if NULL -> OptionalSV = NOT_PRESENT + ofNullableParameter.setConstraint(newState, ObjectConstraint.NULL).stream() + .map(ps -> optionalSV.setConstraint(ps, OptionalConstraint.NOT_PRESENT)) + .flatMap(List::stream) + .forEach(context::addTransition); + // if NOT_NULL -> OptionalSV = PRESENT + ofNullableParameter.setConstraint(newState, ObjectConstraint.NOT_NULL).stream() + .map(ps -> optionalSV.setConstraint(ps, OptionalConstraint.PRESENT)) + .flatMap(List::stream) + .forEach(context::addTransition); + // interrupt current path to only use transitions programState = null; - } else if (OPTIONAL_OF.matches(tree) || OPTIONAL_OF_NULLABLE.matches(tree)) { - constraintManager.setValueFactory(() -> new OptionalSymbolicValue(peek)); } } private void reportIssue(MethodInvocationTree mit) { - String identifier = getIdentifierPart(mit.methodSelect()); - String issueMsg = identifier.isEmpty() ? "Optional#" : (identifier + "."); Tree reportTree = mit.methodSelect().is(Tree.Kind.MEMBER_SELECT) ? ((MemberSelectExpressionTree) mit.methodSelect()).expression() : mit; - String isEmptySuggestion = context.getScannerContext().getJavaVersion().asInt() >= 11 ? - String.format(" or \"!%sisEmpty()\"", issueMsg) : ""; - context.reportIssue(reportTree, check, - String.format("Call \"%sisPresent()\"%s before accessing the value.", issueMsg, isEmptySuggestion)); + String owner = getIdentifierPart(mit.methodSelect()).map(name -> name + ".").orElse("Optional#"); + String alternative = java11 ? String.format(" or \"!%sisEmpty()\"", owner) : ""; + context.reportIssue(reportTree, check, String.format("Call \"%sisPresent()\"%s before accessing the value.", owner, alternative)); } private boolean presenceHasNotBeenChecked(ProgramState.SymbolicValueSymbol symbolicValueSymbol) { @@ -269,14 +316,14 @@ private boolean presenceHasNotBeenChecked(ProgramState.SymbolicValueSymbol symbo return optionalConstraint != OptionalConstraint.PRESENT; } - private static String getIdentifierPart(ExpressionTree methodSelect) { + private static Optional getIdentifierPart(ExpressionTree methodSelect) { if (methodSelect.is(Tree.Kind.MEMBER_SELECT)) { ExpressionTree expression = ((MemberSelectExpressionTree) methodSelect).expression(); if (expression.is(Tree.Kind.IDENTIFIER)) { - return ((IdentifierTree) expression).name(); + return Optional.of(((IdentifierTree) expression).name()); } } - return ""; + return Optional.empty(); } private static boolean isInvocationOnClassInstanceField(MethodInvocationTree mit) { diff --git a/java-symbolic-execution/src/main/java/org/sonar/java/se/checks/StreamNotConsumedCheck.java b/java-symbolic-execution/src/main/java/org/sonar/java/se/checks/StreamNotConsumedCheck.java index 61d9585cbaa..e8deb33fdc9 100644 --- a/java-symbolic-execution/src/main/java/org/sonar/java/se/checks/StreamNotConsumedCheck.java +++ b/java-symbolic-execution/src/main/java/org/sonar/java/se/checks/StreamNotConsumedCheck.java @@ -54,7 +54,8 @@ public void checkEndOfExecutionPath(CheckerContext context, ConstraintManager co Collections.singletonList(StreamConsumedCheck.StreamPipelineConstraint.class), Collections.emptySet(), FlowComputation.FIRST_FLOW); Flow flow = flows.iterator().next(); - JavaFileScannerContext.Location location = flow.elements().get(0); + var elements = flow.elements(); + JavaFileScannerContext.Location location = elements.get(elements.size() - 1); reportIssue(location.syntaxNode, "Refactor the code so this stream pipeline is used."); }); } diff --git a/java-symbolic-execution/src/main/java/org/sonar/java/se/checks/UnclosedResourcesCheck.java b/java-symbolic-execution/src/main/java/org/sonar/java/se/checks/UnclosedResourcesCheck.java index d189259508c..55e1984e49c 100644 --- a/java-symbolic-execution/src/main/java/org/sonar/java/se/checks/UnclosedResourcesCheck.java +++ b/java-symbolic-execution/src/main/java/org/sonar/java/se/checks/UnclosedResourcesCheck.java @@ -126,7 +126,7 @@ public String valueAsString() { MethodMatchers.create() .ofTypes("org.apache.commons.io.IOUtils") .name(name -> name.startsWith("read") || name.startsWith("copy") || name.startsWith("contentEquals") - || name.startsWith("skip") || name.equals("consume")) + || name.startsWith("skip") || "consume".equals(name)) .withAnyParameters() .build() ); diff --git a/java-symbolic-execution/src/main/java/org/sonar/java/se/constraint/ConstraintManager.java b/java-symbolic-execution/src/main/java/org/sonar/java/se/constraint/ConstraintManager.java index 2a09089879f..fe622847fda 100644 --- a/java-symbolic-execution/src/main/java/org/sonar/java/se/constraint/ConstraintManager.java +++ b/java-symbolic-execution/src/main/java/org/sonar/java/se/constraint/ConstraintManager.java @@ -145,6 +145,8 @@ public SymbolicValue createMethodSymbolicValue(MethodInvocationTree syntaxNode, ProgramState.SymbolicValueSymbol leftOp = values.get(1); ProgramState.SymbolicValueSymbol rightOp = values.get(0); result.computedFrom(Arrays.asList(rightOp, leftOp)); + } else if (ExplodedGraphWalker.BOOLEAN_VALUE_MATCHER.matches(syntaxNode)) { + result = values.get(0).symbolicValue(); } else { result = createDefaultSymbolicValue(); } diff --git a/java-symbolic-execution/src/main/resources/org/sonar/java/se/xproc/org.apache.commons.lang.json b/java-symbolic-execution/src/main/resources/org/sonar/java/se/xproc/org.apache.commons.lang.json index 50b5cf26eb8..f12ee0bb6b2 100644 --- a/java-symbolic-execution/src/main/resources/org/sonar/java/se/xproc/org.apache.commons.lang.json +++ b/java-symbolic-execution/src/main/resources/org/sonar/java/se/xproc/org.apache.commons.lang.json @@ -203,5 +203,545 @@ ] } ] + }, + { + "signature": "org.apache.commons.lang.ArrayUtils#isEmpty([Z)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + }, + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang.ArrayUtils#isEmpty([B)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + }, + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang.ArrayUtils#isEmpty([C)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + }, + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang.ArrayUtils#isEmpty([D)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + }, + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang.ArrayUtils#isEmpty([F)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + }, + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang.ArrayUtils#isEmpty([I)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + }, + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang.ArrayUtils#isEmpty([J)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + }, + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang.ArrayUtils#isEmpty([S)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + }, + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang.ArrayUtils#isEmpty([Ljava/lang/Object;)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + }, + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang.ArrayUtils#isNotEmpty([Z)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "FALSE" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang.ArrayUtils#isNotEmpty([B)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "FALSE" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang.ArrayUtils#isNotEmpty([C)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "FALSE" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang.ArrayUtils#isNotEmpty([D)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "FALSE" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang.ArrayUtils#isNotEmpty([F)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "FALSE" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang.ArrayUtils#isNotEmpty([I)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "FALSE" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang.ArrayUtils#isNotEmpty([J)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "FALSE" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang.ArrayUtils#isNotEmpty([S)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "FALSE" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang.ArrayUtils#isNotEmpty([Ljava/lang/Object;)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "FALSE" + ] + } + ] } ] diff --git a/java-symbolic-execution/src/main/resources/org/sonar/java/se/xproc/org.apache.commons.lang3.json b/java-symbolic-execution/src/main/resources/org/sonar/java/se/xproc/org.apache.commons.lang3.json index 9dd755d0c6a..cbb6e3f4a4a 100644 --- a/java-symbolic-execution/src/main/resources/org/sonar/java/se/xproc/org.apache.commons.lang3.json +++ b/java-symbolic-execution/src/main/resources/org/sonar/java/se/xproc/org.apache.commons.lang3.json @@ -216,5 +216,545 @@ "exception": "java.lang.NullPointerException" } ] + }, + { + "signature": "org.apache.commons.lang3.ArrayUtils#isEmpty([Z)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + }, + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang3.ArrayUtils#isEmpty([B)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + }, + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang3.ArrayUtils#isEmpty([C)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + }, + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang3.ArrayUtils#isEmpty([D)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + }, + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang3.ArrayUtils#isEmpty([F)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + }, + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang3.ArrayUtils#isEmpty([I)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + }, + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang3.ArrayUtils#isEmpty([J)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + }, + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang3.ArrayUtils#isEmpty([Ljava/lang/Object;)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + }, + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang3.ArrayUtils#isEmpty([S)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + }, + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang3.ArrayUtils#isNotEmpty([Z)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "FALSE" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang3.ArrayUtils#isNotEmpty([B)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "FALSE" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang3.ArrayUtils#isNotEmpty([C)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "FALSE" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang3.ArrayUtils#isNotEmpty([D)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "FALSE" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang3.ArrayUtils#isNotEmpty([F)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "FALSE" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang3.ArrayUtils#isNotEmpty([I)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "FALSE" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang3.ArrayUtils#isNotEmpty([J)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "FALSE" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang3.ArrayUtils#isNotEmpty([S)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "FALSE" + ] + } + ] + }, + { + "signature": "org.apache.commons.lang3.ArrayUtils#isNotEmpty([Ljava/lang/Object;)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL" + ] + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "FALSE" + ] + } + ] } ] diff --git a/java-symbolic-execution/src/main/resources/org/sonar/java/se/xproc/org.springframework.util.json b/java-symbolic-execution/src/main/resources/org/sonar/java/se/xproc/org.springframework.util.json index 8e7c3ab8df2..16a563ee698 100644 --- a/java-symbolic-execution/src/main/resources/org/sonar/java/se/xproc/org.springframework.util.json +++ b/java-symbolic-execution/src/main/resources/org/sonar/java/se/xproc/org.springframework.util.json @@ -688,5 +688,33 @@ ] } ] + }, + { + "signature": "org.springframework.util.StringUtils#isEmpty(Ljava/lang/Object;)Z", + "varArgs": false, + "declaredExceptions": [], + "yields": [ + { + "parametersConstraints": [ + [ + "NOT_NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": null + }, + { + "parametersConstraints": [ + [ + "NULL" + ] + ], + "resultIndex": -1, + "resultConstraint": [ + "NOT_NULL", + "TRUE" + ] + } + ] } ] diff --git a/java-symbolic-execution/src/test/java/org/sonar/java/se/ExplodedGraphWalkerTest.java b/java-symbolic-execution/src/test/java/org/sonar/java/se/ExplodedGraphWalkerTest.java index 363988c2dfb..eac788e61b6 100644 --- a/java-symbolic-execution/src/test/java/org/sonar/java/se/ExplodedGraphWalkerTest.java +++ b/java-symbolic-execution/src/test/java/org/sonar/java/se/ExplodedGraphWalkerTest.java @@ -165,7 +165,7 @@ void switchExpression() { } /** - * Checking that Java 17 patterns do not fail SE engine + * Checking that Java 18 patterns do not fail SE engine * TODO once feature is final: make sure learned constraints propagate in branches */ @Test @@ -174,7 +174,7 @@ void switchWithPatterns() { .onFile(TestUtils.nonCompilingTestSourcesPath("symbolicexecution/engine/SwitchWithPatterns.java")) .withChecks(seChecks()) .withClassPath(SETestUtils.CLASS_PATH) - .withJavaVersion(17) + .withJavaVersion(18) .verifyNoIssues(); } diff --git a/java-symbolic-execution/src/test/java/org/sonar/java/se/checks/ConditionAlwaysTrueOrFalseCheckTest.java b/java-symbolic-execution/src/test/java/org/sonar/java/se/checks/ConditionAlwaysTrueOrFalseCheckTest.java index b40e4198e80..2af5d5c178f 100644 --- a/java-symbolic-execution/src/test/java/org/sonar/java/se/checks/ConditionAlwaysTrueOrFalseCheckTest.java +++ b/java-symbolic-execution/src/test/java/org/sonar/java/se/checks/ConditionAlwaysTrueOrFalseCheckTest.java @@ -26,6 +26,7 @@ import org.sonar.java.se.utils.SETestUtils; import static org.assertj.core.api.Assertions.assertThat; +import static org.sonar.java.checks.verifier.TestUtils.mainCodeSourcesPath; import static org.sonar.java.checks.verifier.TestUtils.nonCompilingTestSourcesPath; import static org.sonar.java.checks.verifier.TestUtils.testSourcesPath; @@ -161,4 +162,14 @@ void test_binary_expressions_always_not_null() { .withClassPath(SETestUtils.CLASS_PATH) .verifyIssues(); } + + @Test + void test_nullable_inheritance() { + SECheckVerifier.newVerifier() + .onFile(mainCodeSourcesPath("symbolicexecution/checks/NullableInheritance.java")) + .withChecks(new ConditionalUnreachableCodeCheck()) + .withClassPath(SETestUtils.CLASS_PATH) + .verifyIssues(); + } + } diff --git a/java-symbolic-execution/src/test/java/org/sonar/java/se/checks/NullDereferenceCheckTest.java b/java-symbolic-execution/src/test/java/org/sonar/java/se/checks/NullDereferenceCheckTest.java index c75028f15e2..7052894b539 100644 --- a/java-symbolic-execution/src/test/java/org/sonar/java/se/checks/NullDereferenceCheckTest.java +++ b/java-symbolic-execution/src/test/java/org/sonar/java/se/checks/NullDereferenceCheckTest.java @@ -21,6 +21,9 @@ import org.junit.jupiter.api.Test; import org.sonar.java.se.SECheckVerifier; +import org.sonar.java.se.utils.SETestUtils; + +import static org.sonar.java.checks.verifier.TestUtils.mainCodeSourcesPath; class NullDereferenceCheckTest { @@ -95,4 +98,13 @@ void test_npe_transitive() throws Exception { .withCheck(new NullDereferenceCheck()) .verifyIssues(); } + + @Test + void test_booleanValue_method() throws Exception { + SECheckVerifier.newVerifier() + .onFile(mainCodeSourcesPath("symbolicexecution/checks/NullFromBooleanValueCall.java")) + .withChecks(new NullDereferenceCheck()) + .withClassPath(SETestUtils.CLASS_PATH) + .verifyNoIssues(); + } } diff --git a/java-symbolic-execution/src/test/java/org/sonar/java/se/checks/OptionalGetBeforeIsPresentCheckTest.java b/java-symbolic-execution/src/test/java/org/sonar/java/se/checks/OptionalGetBeforeIsPresentCheckTest.java index e636ee2c1d0..bac682543df 100644 --- a/java-symbolic-execution/src/test/java/org/sonar/java/se/checks/OptionalGetBeforeIsPresentCheckTest.java +++ b/java-symbolic-execution/src/test/java/org/sonar/java/se/checks/OptionalGetBeforeIsPresentCheckTest.java @@ -47,6 +47,16 @@ void test_with_jdk_11() { .verifyIssues(); } + @Test + void test_ofNullable() { + SECheckVerifier.newVerifier() + .onFile(mainCodeSourcesPath("symbolicexecution/checks/OptionalGetBeforeIsPresentCheck_ofNullable.java")) + .withChecks(new OptionalGetBeforeIsPresentCheck(), new NullDereferenceCheck()) + .withClassPath(SETestUtils.CLASS_PATH) + .withJavaVersion(11) + .verifyNoIssues(); + } + @Test void invocation_leading_to_NoSuchElementException() { SECheckVerifier.newVerifier() diff --git a/java-symbolic-execution/src/test/java/org/sonar/java/se/xproc/BehaviorCacheTest.java b/java-symbolic-execution/src/test/java/org/sonar/java/se/xproc/BehaviorCacheTest.java index 40548d2457c..a258805f6ce 100644 --- a/java-symbolic-execution/src/test/java/org/sonar/java/se/xproc/BehaviorCacheTest.java +++ b/java-symbolic-execution/src/test/java/org/sonar/java/se/xproc/BehaviorCacheTest.java @@ -33,20 +33,21 @@ import org.sonar.api.batch.fs.InputFile; import org.sonar.api.utils.log.LogTesterJUnit5; import org.sonar.api.utils.log.LoggerLevel; +import org.sonar.java.checks.verifier.TestUtils; import org.sonar.java.model.DefaultJavaFileScannerContext; import org.sonar.java.model.JavaTree.CompilationUnitTreeImpl; import org.sonar.java.model.JavaVersionImpl; import org.sonar.java.model.Sema; import org.sonar.java.se.CheckerContext; import org.sonar.java.se.CheckerDispatcher; -import org.sonar.java.se.utils.JParserTestUtils; import org.sonar.java.se.Pair; import org.sonar.java.se.ProgramState; -import org.sonar.java.se.utils.SETestUtils; import org.sonar.java.se.SymbolicExecutionVisitor; -import org.sonar.java.checks.verifier.TestUtils; +import org.sonar.java.se.checks.DivisionByZeroCheck; import org.sonar.java.se.checks.NullDereferenceCheck; import org.sonar.java.se.checks.SECheck; +import org.sonar.java.se.utils.JParserTestUtils; +import org.sonar.java.se.utils.SETestUtils; import org.sonar.plugins.java.api.JavaFileScannerContext; import org.sonar.plugins.java.api.semantic.Symbol; import org.sonar.plugins.java.api.tree.MethodInvocationTree; @@ -104,7 +105,7 @@ void compute_behavior_only_once() throws Exception { @Test void explore_method_with_recursive_call() throws Exception { - SymbolicExecutionVisitor sev = createSymbolicExecutionVisitor("src/test/resources/se/RecursiveCall.java", + SymbolicExecutionVisitor sev = createSymbolicExecutionVisitor("src/test/resources/se/RecursiveCall.java", new NullDereferenceCheck()); assertThat(sev.behaviorCache.behaviors).hasSize(1); assertThat(sev.behaviorCache.behaviors.keySet().iterator().next()).contains("#foo"); @@ -112,7 +113,7 @@ void explore_method_with_recursive_call() throws Exception { @Test void interrupted_exploration_does_not_create_method_yields() throws Exception { - SymbolicExecutionVisitor sev = + SymbolicExecutionVisitor sev = createSymbolicExecutionVisitor("src/test/files/se/PartialMethodYieldMaxStep.java", new NullDereferenceCheck()); assertThat(sev.behaviorCache.behaviors.entrySet()).hasSize(2); @@ -127,7 +128,7 @@ void interrupted_exploration_does_not_create_method_yields() throws Exception { @Test void clear_stack_when_taking_exceptional_path_from_method_invocation() throws Exception { - Pair sevAndSemantic = + Pair sevAndSemantic = createSymbolicExecutionVisitorAndSemantic("src/test/files/se/CleanStackWhenRaisingException.java", new NullDereferenceCheck()); SymbolicExecutionVisitor sev = sevAndSemantic.a; Sema semanticModel = sevAndSemantic.b; @@ -149,17 +150,17 @@ void hardcoded_behaviors() throws Exception { List inputFiles = Arrays.asList( "src/test/files/se/Log4jAssert.java", - TestUtils.testSourcesPath("symbolicexecution/behaviorcache/JavaLangMathMethods.java"), - TestUtils.testSourcesPath("symbolicexecution/behaviorcache/CommonsLangValidate.java"), - TestUtils.testSourcesPath("symbolicexecution/behaviorcache/CommonsLang3StringUtilsMethods.java"), - TestUtils.testSourcesPath("symbolicexecution/behaviorcache/CommonsLang2StringUtilsMethods.java"), - TestUtils.testSourcesPath("symbolicexecution/behaviorcache/ObjectsMethodsMethodBehaviors.java"), - TestUtils.testSourcesPath("symbolicexecution/behaviorcache/GuavaPreconditionsMethods.java"), - TestUtils.testSourcesPath("symbolicexecution/behaviorcache/GuavaCommonStrings.java"), - TestUtils.testSourcesPath("symbolicexecution/behaviorcache/GuavaVerifyMethods.java"), - TestUtils.testSourcesPath("symbolicexecution/behaviorcache/CollectionUtilsIsEmpty.java"), - TestUtils.testSourcesPath("symbolicexecution/behaviorcache/SpringAssert.java"), - TestUtils.testSourcesPath("symbolicexecution/behaviorcache/EclipseAssert.java")) + TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/JavaLangMathMethods.java"), + TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/CommonsLangValidate.java"), + TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/CommonsLang3StringUtilsMethods.java"), + TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/CommonsLang2StringUtilsMethods.java"), + TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/ObjectsMethodsMethodBehaviors.java"), + TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/GuavaPreconditionsMethods.java"), + TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/GuavaCommonStrings.java"), + TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/GuavaVerifyMethods.java"), + TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/CollectionUtilsIsEmpty.java"), + TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/SpringAssert.java"), + TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/EclipseAssert.java")) .stream() .map(File::new) .map(SETestUtils::inputFile) @@ -172,53 +173,64 @@ void hardcoded_behaviors() throws Exception { } assertThat(behaviorCache.behaviors).isEmpty(); - assertThat(behaviorCache.hardcodedBehaviors()).hasSize(179); - assertThat(logTester.logs(LoggerLevel.DEBUG)).containsOnly("[SE] Loaded 179 hardcoded method behaviors."); + assertThat(behaviorCache.hardcodedBehaviors()).hasSize(216); + assertThat(logTester.logs(LoggerLevel.DEBUG)).containsOnly("[SE] Loaded 216 hardcoded method behaviors."); } @Test void java_lang_math_methods_should_be_handled() throws Exception { - verifyNoIssueOnFile(TestUtils.testSourcesPath("symbolicexecution/behaviorcache/JavaLangMathMethods.java")); + verifyNoIssueOnFile(TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/JavaLangMathMethods.java")); } @Test void commons_lang3_string_utils_method_should_be_handled() throws Exception { - verifyNoIssueOnFile(TestUtils.testSourcesPath("symbolicexecution/behaviorcache/CommonsLang3StringUtilsMethods.java")); + verifyNoIssueOnFile(TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/CommonsLang3StringUtilsMethods.java")); + } + + @Test + void commons_lang3_array_utils_method_should_be_handled() throws Exception { + verifyNoIssueOnFile(TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/CommonsLang3ArrayUtilsMethods.java")); } @Test void commons_lang2_string_utils_method_should_be_handled() throws Exception { - verifyNoIssueOnFile(TestUtils.testSourcesPath("symbolicexecution/behaviorcache/CommonsLang2StringUtilsMethods.java")); + verifyNoIssueOnFile(TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/CommonsLang2StringUtilsMethods.java")); + } + + + @Test + void commons_lang2_array_utils_method_should_be_handled() throws Exception { + verifyNoIssueOnFile(TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/CommonsLang2ArrayUtilsMethods.java")); } @Test void guava_preconditions_methods_should_be_handled() throws Exception { - verifyNoIssueOnFile(TestUtils.testSourcesPath("symbolicexecution/behaviorcache/GuavaPreconditionsMethods.java")); + verifyNoIssueOnFile(TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/GuavaPreconditionsMethods.java")); } @Test void objects_methods() { - verifyNoIssueOnFile(TestUtils.testSourcesPath("symbolicexecution/behaviorcache/ObjectsMethodsMethodBehaviors.java")); + verifyNoIssueOnFile(TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/ObjectsMethodsMethodBehaviors.java")); } @Test void guava_common_Strings() throws Exception { - verifyNoIssueOnFile(TestUtils.testSourcesPath("symbolicexecution/behaviorcache/GuavaCommonStrings.java")); + verifyNoIssueOnFile(TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/GuavaCommonStrings.java")); } @Test void guava_verify() throws Exception { - verifyNoIssueOnFile(TestUtils.testSourcesPath("symbolicexecution/behaviorcache/GuavaVerifyMethods.java")); + verifyNoIssueOnFile(TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/GuavaVerifyMethods.java")); } @Test void collections_utils_is_empty_method() throws Exception { - verifyNoIssueOnFile(TestUtils.testSourcesPath("symbolicexecution/behaviorcache/CollectionUtilsIsEmpty.java")); + verifyNoIssueOnFile(TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/CollectionUtilsIsEmpty.java")); } @Test void apache_lang_validate() throws Exception { - verifyNoIssueOnFile(TestUtils.testSourcesPath("symbolicexecution/behaviorcache/CommonsLangValidate.java")); + verifyNoIssueOnFile(TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/CommonsLangValidate.java")); } @Test @@ -230,12 +242,17 @@ void log4j_assert() throws Exception { @Test void spring_assert() throws Exception { - verifyNoIssueOnFile(TestUtils.testSourcesPath("symbolicexecution/behaviorcache/SpringAssert.java")); + verifyNoIssueOnFile(TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/SpringAssert.java")); + } + + @Test + void spring_string_utils_should_be_handled() throws Exception { + verifyNoIssueOnFile(TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/SpringStringUtilsMethods.java")); } @Test void eclipse_aspectj_assert() throws Exception { - verifyNoIssueOnFile(TestUtils.testSourcesPath("symbolicexecution/behaviorcache/EclipseAssert.java")); + verifyNoIssueOnFile(TestUtils.mainCodeSourcesPath("symbolicexecution/behaviorcache/EclipseAssert.java")); } @Test @@ -316,7 +333,8 @@ void log_when_unable_to_load_resources_with_invalid_method_behaviors() throws Ex private static void verifyNoIssueOnFile(String fileName) { SECheck nullDereferenceCheck = new NullDereferenceCheck(); - createSymbolicExecutionVisitorAndSemantic(fileName, nullDereferenceCheck); + SECheck divByZeroCheck = new DivisionByZeroCheck(); + createSymbolicExecutionVisitorAndSemantic(fileName, nullDereferenceCheck, divByZeroCheck); // verify we did not raise any issue, if we did, the context will get them reported. JavaFileScannerContext context = mock(JavaFileScannerContext.class); nullDereferenceCheck.scanFile(context); diff --git a/java-symbolic-execution/src/test/java/org/sonar/java/se/xproc/MethodYieldTest.java b/java-symbolic-execution/src/test/java/org/sonar/java/se/xproc/MethodYieldTest.java index f6202414177..2f11dada5ac 100644 --- a/java-symbolic-execution/src/test/java/org/sonar/java/se/xproc/MethodYieldTest.java +++ b/java-symbolic-execution/src/test/java/org/sonar/java/se/xproc/MethodYieldTest.java @@ -32,11 +32,8 @@ import java.util.stream.Stream; import javax.annotation.Nullable; import org.junit.jupiter.api.Test; -import org.sonarsource.analyzer.commons.collections.PCollections; -import org.sonarsource.analyzer.commons.collections.PMap; -import org.sonar.java.se.checks.NullDereferenceCheck; -import org.sonar.java.se.utils.JParserTestUtils; import org.sonar.java.model.JavaTree; +import org.sonar.java.model.JavaVersionImpl; import org.sonar.java.model.Sema; import org.sonar.java.se.ExplodedGraph; import org.sonar.java.se.Flow; @@ -44,12 +41,14 @@ import org.sonar.java.se.ProgramPoint; import org.sonar.java.se.ProgramState; import org.sonar.java.se.SymbolicExecutionVisitor; +import org.sonar.java.se.checks.NullDereferenceCheck; import org.sonar.java.se.checks.SECheck; import org.sonar.java.se.constraint.BooleanConstraint; import org.sonar.java.se.constraint.Constraint; import org.sonar.java.se.constraint.ConstraintsByDomain; import org.sonar.java.se.constraint.ObjectConstraint; import org.sonar.java.se.symbolicvalues.SymbolicValue; +import org.sonar.java.se.utils.JParserTestUtils; import org.sonar.plugins.java.api.JavaFileScannerContext; import org.sonar.plugins.java.api.semantic.Symbol; import org.sonar.plugins.java.api.semantic.Symbol.MethodSymbol; @@ -60,6 +59,8 @@ import org.sonar.plugins.java.api.tree.MethodInvocationTree; import org.sonar.plugins.java.api.tree.MethodTree; import org.sonar.plugins.java.api.tree.Tree; +import org.sonarsource.analyzer.commons.collections.PCollections; +import org.sonarsource.analyzer.commons.collections.PMap; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; @@ -226,6 +227,7 @@ void constraints_on_varargs() throws Exception { JavaFileScannerContext context = mock(JavaFileScannerContext.class); when(context.getTree()).thenReturn(cut); when(context.getSemanticModel()).thenReturn(semanticModel); + when(context.getJavaVersion()).thenReturn(new JavaVersionImpl(11)); sev.scanFile(context); MethodSymbol methodSymbol = ((MethodTree) ((ClassTree) cut.types().get(0)).members().get(0)).symbol(); @@ -310,7 +312,7 @@ void native_methods_behavior_should_not_be_used() throws Exception { @Test void catch_class_cast_exception() throws Exception { - Map behaviorCache = + Map behaviorCache = createSymbolicExecutionVisitor("src/test/files/se/XProcCatchClassCastException.java", new NullDereferenceCheck()) .behaviorCache.behaviors; assertThat(behaviorCache.values()).hasSize(1); diff --git a/jdt/pom.xml b/jdt/pom.xml index 892b1596cdd..c18881ff684 100644 --- a/jdt/pom.xml +++ b/jdt/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.java java - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT jdt @@ -16,7 +16,7 @@ org.eclipse.jdt org.eclipse.jdt.core - 3.29.0 + 3.30.0 org.eclipse.platform @@ -39,32 +39,32 @@ org.eclipse.platform org.eclipse.core.resources - 3.16.100 + 3.17.0 org.eclipse.platform org.eclipse.core.runtime - 3.24.100 + 3.25.0 org.eclipse.platform org.eclipse.osgi - 3.17.200 + 3.18.0 org.eclipse.platform org.eclipse.equinox.common - 3.16.0 + 3.16.100 org.eclipse.platform org.eclipse.core.jobs - 3.12.100 + 3.13.0 org.eclipse.platform org.eclipse.equinox.preferences - 3.9.100 + 3.10.1 org.eclipse.platform @@ -74,7 +74,7 @@ org.eclipse.platform org.eclipse.text - 3.12.0 + 3.12.100 org.eclipse.platform diff --git a/pom.xml b/pom.xml index 9e85af0f813..0d76a4bca69 100644 --- a/pom.xml +++ b/pom.xml @@ -5,12 +5,12 @@ org.sonarsource.parent parent - 61.0.147 + 64.0.211 org.sonarsource.java java - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT pom SonarJava Code Analyzer for Java @@ -81,10 +81,11 @@ true - 9.4.0.54424 + 9.5.0.56709 + 9.8.0.203 6.3.0.36253 - 1.25.0.1003 - 3.35.1.2719 + 2.1.0.1111 + 3.40.0.183 1.24.0.633 -Xmx512m sonar-java @@ -104,9 +105,9 @@ - org.sonarsource.sonarqube + org.sonarsource.api.plugin sonar-plugin-api - ${sonar.version} + ${sonar.plugin.api.version} provided @@ -269,12 +270,7 @@ 2.8.9 compile - - - com.fasterxml.woodstox - woodstox-core - 6.2.6 - + com.fasterxml.staxmate staxmate diff --git a/sonar-java-plugin/pom.xml b/sonar-java-plugin/pom.xml index e0eef7a31dd..909b974993c 100644 --- a/sonar-java-plugin/pom.xml +++ b/sonar-java-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.java java - 7.13.0-SNAPSHOT + 7.16.0-SNAPSHOT sonar-java-plugin @@ -68,7 +68,7 @@ - org.sonarsource.sonarqube + org.sonarsource.api.plugin sonar-plugin-api provided diff --git a/sonar-java-plugin/src/main/java/org/sonar/plugins/java/JavaRulesDefinition.java b/sonar-java-plugin/src/main/java/org/sonar/plugins/java/JavaRulesDefinition.java index e207324224d..6ca3bc8da15 100644 --- a/sonar-java-plugin/src/main/java/org/sonar/plugins/java/JavaRulesDefinition.java +++ b/sonar-java-plugin/src/main/java/org/sonar/plugins/java/JavaRulesDefinition.java @@ -19,31 +19,18 @@ */ package org.sonar.plugins.java; -import com.google.gson.Gson; -import com.google.gson.annotations.SerializedName; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.List; -import java.util.Locale; +import java.util.Collections; +import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; -import javax.annotation.Nullable; -import org.apache.commons.lang.StringUtils; import org.sonar.api.SonarRuntime; -import org.sonar.api.rule.RuleStatus; -import org.sonar.api.rules.RuleType; -import org.sonar.api.server.debt.DebtRemediationFunction; import org.sonar.api.server.rule.RulesDefinition; -import org.sonar.api.server.rule.RulesDefinitionAnnotationLoader; import org.sonar.api.utils.AnnotationUtils; -import org.sonar.api.utils.Version; import org.sonar.java.annotations.VisibleForTesting; import org.sonar.java.checks.CheckList; -import org.sonarsource.analyzer.commons.collections.SetUtils; +import org.sonarsource.analyzer.commons.RuleMetadataLoader; import org.sonarsource.analyzer.commons.annotations.DeprecatedRuleKey; +import org.sonarsource.analyzer.commons.annotations.DeprecatedRuleKeys; +import org.sonarsource.analyzer.commons.collections.SetUtils; /** * Definition of rules. @@ -51,7 +38,6 @@ public class JavaRulesDefinition implements RulesDefinition { private static final String RESOURCE_BASE_PATH = "/org/sonar/l10n/java/rules/java"; - private static final Gson GSON = new Gson(); /** * Rule templates have to be manually defined @@ -63,167 +49,48 @@ public class JavaRulesDefinition implements RulesDefinition { "S3546", "S4011"); - private final boolean isOwaspByVersionSupported; + private static final Map INTERNAL_KEYS = Collections.singletonMap("NoSonar", "S1291"); + + private final SonarRuntime sonarRuntime; public JavaRulesDefinition(SonarRuntime sonarRuntime) { - isOwaspByVersionSupported = sonarRuntime.getApiVersion().isGreaterThanOrEqual(Version.create(9, 3)); + this.sonarRuntime = sonarRuntime; } - @SuppressWarnings("rawtypes") @Override public void define(Context context) { NewRepository repository = context .createRepository(CheckList.REPOSITORY_KEY, Java.KEY) .setName("SonarAnalyzer"); - List> checks = CheckList.getChecks(); - new RulesDefinitionAnnotationLoader().load(repository, checks.toArray(new Class[]{})); - JavaSonarWayProfile.Profile profile = JavaSonarWayProfile.readProfile(); - for (Class ruleClass : checks) { - newRule(ruleClass, repository, profile); - } - repository.done(); - } - - @VisibleForTesting - protected void newRule(Class ruleClass, NewRepository repository, JavaSonarWayProfile.Profile profile) { - org.sonar.check.Rule ruleAnnotation = AnnotationUtils.getAnnotation(ruleClass, org.sonar.check.Rule.class); - if (ruleAnnotation == null) { - throw new IllegalArgumentException("No Rule annotation was found on " + ruleClass); - } - String ruleKey = ruleAnnotation.key(); - if (StringUtils.isEmpty(ruleKey)) { - throw new IllegalArgumentException("No key is defined in Rule annotation of " + ruleClass); - } - NewRule rule = repository.rule(ruleKey); - if (rule == null) { - throw new IllegalStateException("No rule was created for " + ruleClass + " in " + repository.key()); - } - DeprecatedRuleKey deprecatedRuleKeyAnnotation = AnnotationUtils.getAnnotation(ruleClass, DeprecatedRuleKey.class); - if (deprecatedRuleKeyAnnotation != null) { - rule.addDeprecatedRuleKey(deprecatedRuleKeyAnnotation.repositoryKey(), deprecatedRuleKeyAnnotation.ruleKey()); - } else { - // Keep link with legacy "squid" repository key - rule.addDeprecatedRuleKey("squid", ruleKey); - } - String rspecKey = rspecKey(ruleClass, rule); - RuleMetadata ruleMetadata = readRuleMetadata(rspecKey); - addMetadata(rule, ruleMetadata); - String ruleHtmlDescription = readRuleHtmlDescription(rspecKey); - if (ruleHtmlDescription != null) { - rule.setHtmlDescription(ruleHtmlDescription); - } - // 'setActivatedByDefault' is used by SonarLint standalone, to define which rules will be active - boolean activatedInProfile = profile.ruleKeys.contains(ruleKey) || profile.ruleKeys.contains(rspecKey); - boolean isSecurityHotspot = ruleMetadata != null && ruleMetadata.isSecurityHotspot(); - rule.setActivatedByDefault(activatedInProfile && !isSecurityHotspot); - rule.setTemplate(TEMPLATE_RULE_KEY.contains(ruleKey)); - } - - private static String rspecKey(Class ruleClass, NewRule rule) { - org.sonar.java.RspecKey rspecKeyAnnotation = AnnotationUtils.getAnnotation(ruleClass, org.sonar.java.RspecKey.class); - if (rspecKeyAnnotation != null) { - String rspecKey = rspecKeyAnnotation.value(); - rule.setInternalKey(rspecKey); - return rspecKey; - } - return rule.key(); - } - - @Nullable - static RuleMetadata readRuleMetadata(String metadataKey) { - URL resource = JavaRulesDefinition.class.getResource(RESOURCE_BASE_PATH + "/" + metadataKey + "_java.json"); - return resource != null ? GSON.fromJson(readResource(resource), RuleMetadata.class) : null; - } - - private static String readRuleHtmlDescription(String metadataKey) { - URL resource = JavaRulesDefinition.class.getResource(RESOURCE_BASE_PATH + "/" + metadataKey + "_java.html"); - if (resource != null) { - return readResource(resource); - } - return null; - } - - private void addMetadata(NewRule rule, @Nullable RuleMetadata metadata) { - if (metadata == null) { - return; - } - rule.setSeverity(metadata.defaultSeverity.toUpperCase(Locale.US)); - rule.setName(metadata.title); - rule.addTags(metadata.tags); - rule.setType(RuleType.valueOf(metadata.type)); - - rule.setStatus(RuleStatus.valueOf(metadata.status.toUpperCase(Locale.US))); - if (metadata.remediation != null) { - rule.setDebtRemediationFunction(metadata.remediation.remediationFunction(rule.debtRemediationFunctions())); - rule.setGapDescription(metadata.remediation.linearDesc); - } - addSecurityStandards(rule, metadata.securityStandards); - } - private void addSecurityStandards(NewRule rule, SecurityStandards securityStandards) { - for (String s : securityStandards.OWASP_2017) { - rule.addOwaspTop10(RulesDefinition.OwaspTop10.valueOf(s)); - } - if (isOwaspByVersionSupported) { - for (String s : securityStandards.OWASP_2021) { - rule.addOwaspTop10(RulesDefinition.OwaspTop10Version.Y2021, RulesDefinition.OwaspTop10.valueOf(s)); - } - } - rule.addCwe(securityStandards.CWE); - } - - private static String readResource(URL resource) { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource.openStream(), StandardCharsets.UTF_8))) { - return reader.lines().collect(Collectors.joining("\n")); - } catch (IOException e) { - throw new IllegalStateException("Failed to read: " + resource, e); - } - } + RuleMetadataLoader ruleMetadataLoader = new RuleMetadataLoader(RESOURCE_BASE_PATH, JavaSonarWayProfile.SONAR_WAY_PATH, sonarRuntime); + ruleMetadataLoader.addRulesByAnnotatedClass(repository, CheckList.getChecks()); - static class RuleMetadata { - private static final String SECURITY_HOTSPOT = "SECURITY_HOTSPOT"; + TEMPLATE_RULE_KEY.stream() + .map(repository::rule) + .forEach(rule -> rule.setTemplate(true)); - String title; - String status; - @Nullable - Remediation remediation; + INTERNAL_KEYS.forEach((ruleKey, internalKey) -> repository.rule(ruleKey).setInternalKey(internalKey)); - String type; - String[] tags; - String defaultSeverity; - SecurityStandards securityStandards = new SecurityStandards(); + // for all the rules without explicit deprecated key already declared, register them with "squid:key" + CheckList.getChecks().stream() + .filter(rule -> !deprecatesRules(rule)) + .map(JavaRulesDefinition::ruleKey) + .map(repository::rule) + .forEach(rule -> rule.addDeprecatedRuleKey("squid", rule.key())); - boolean isSecurityHotspot() { - return SECURITY_HOTSPOT.equals(type); - } + repository.done(); } - static class SecurityStandards { - int[] CWE = {}; - - @SerializedName("OWASP Top 10 2021") - String[] OWASP_2021 = {}; - - @SerializedName("OWASP") - String[] OWASP_2017 = {}; + private static String ruleKey(Class rule) { + return AnnotationUtils.getAnnotation(rule, org.sonar.check.Rule.class).key(); } - private static class Remediation { - String func; - String constantCost; - String linearDesc; - String linearOffset; - String linearFactor; - - public DebtRemediationFunction remediationFunction(DebtRemediationFunctions drf) { - if (func.startsWith("Constant")) { - return drf.constantPerIssue(constantCost.replace("mn", "min")); - } - if ("Linear".equals(func)) { - return drf.linear(linearFactor.replace("mn", "min")); - } - return drf.linearWithOffset(linearFactor.replace("mn", "min"), linearOffset.replace("mn", "min")); - } + @VisibleForTesting + static boolean deprecatesRules(Class rule) { + // single annotation + return AnnotationUtils.getAnnotation(rule, DeprecatedRuleKey.class) != null + // multiple annotations, for instance java:S4830 + || AnnotationUtils.getAnnotation(rule, DeprecatedRuleKeys.class) != null; } - } diff --git a/sonar-java-plugin/src/main/java/org/sonar/plugins/java/JavaSensor.java b/sonar-java-plugin/src/main/java/org/sonar/plugins/java/JavaSensor.java index 2e2ba1c7e34..26fee19b124 100644 --- a/sonar-java-plugin/src/main/java/org/sonar/plugins/java/JavaSensor.java +++ b/sonar-java-plugin/src/main/java/org/sonar/plugins/java/JavaSensor.java @@ -117,7 +117,7 @@ public void execute(SensorContext context) { private static UnaryOperator> createCheckFilter(boolean isAutoScanCheckFiltering) { if (isAutoScanCheckFiltering) { - Set sonarWayRuleKeys = JavaSonarWayProfile.readProfile().ruleKeys; + Set sonarWayRuleKeys = JavaSonarWayProfile.ruleKeys(); Set> notWorkingChecks = CheckList.getJavaChecksNotWorkingForAutoScan(); return checks -> checks.stream() .filter(c -> !(c instanceof SECheck)) diff --git a/sonar-java-plugin/src/main/java/org/sonar/plugins/java/JavaSonarWayProfile.java b/sonar-java-plugin/src/main/java/org/sonar/plugins/java/JavaSonarWayProfile.java index 82742c82468..9892dcf970d 100644 --- a/sonar-java-plugin/src/main/java/org/sonar/plugins/java/JavaSonarWayProfile.java +++ b/sonar-java-plugin/src/main/java/org/sonar/plugins/java/JavaSonarWayProfile.java @@ -19,26 +19,18 @@ */ package org.sonar.plugins.java; -import com.google.gson.Gson; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; import java.util.HashSet; -import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import org.sonar.api.rule.RuleKey; import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition; -import org.sonar.api.utils.AnnotationUtils; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; import org.sonar.java.annotations.VisibleForTesting; import org.sonar.java.checks.CheckList; +import org.sonarsource.analyzer.commons.BuiltInQualityProfileJsonLoader; import org.sonarsource.api.sonarlint.SonarLintSide; /** @@ -47,103 +39,56 @@ @SonarLintSide public class JavaSonarWayProfile implements BuiltInQualityProfilesDefinition { + private static final Logger LOG = Loggers.get(JavaSonarWayProfile.class); static final String SECURITY_RULES_CLASS_NAME = "com.sonar.plugins.security.api.JavaRules"; static final String DBD_RULES_CLASS_NAME = "com.sonarsource.plugins.dbd.api.JavaRules"; + static final String SECURITY_RULE_KEYS_METHOD_NAME = "getSecurityRuleKeys"; static final String DBD_RULE_KEYS_METHOD_NAME = "getDataflowBugDetectionRuleKeys"; static final String GET_REPOSITORY_KEY = "getRepositoryKey"; + static final String SONAR_WAY_PATH = "/org/sonar/l10n/java/rules/java/Sonar_way_profile.json"; + @Override public void define(Context context) { NewBuiltInQualityProfile sonarWay = context.createBuiltInQualityProfile("Sonar way", Java.KEY); - sonarWay.activateRule("common-" + Java.KEY, "DuplicatedBlocks"); - Profile jsonProfile = readProfile(); - Map keys = legacyKeys(); - for (String key : jsonProfile.ruleKeys) { - sonarWay.activateRule(CheckList.REPOSITORY_KEY, keys.get(key)); - } - getSecurityRuleKeys(isSonarSecurityBefore78()).forEach(key -> sonarWay.activateRule(key.repository(), key.rule())); + BuiltInQualityProfileJsonLoader.load(sonarWay, CheckList.REPOSITORY_KEY, SONAR_WAY_PATH); + + getSecurityRuleKeys().forEach(key -> sonarWay.activateRule(key.repository(), key.rule())); getDataflowBugDetectionRuleKeys().forEach(key -> sonarWay.activateRule(key.repository(), key.rule())); sonarWay.done(); } - private static Map legacyKeys() { - Map result = new HashMap<>(); - for (Class checkClass : CheckList.getChecks()) { - org.sonar.check.Rule ruleAnnotation = AnnotationUtils.getAnnotation(checkClass, org.sonar.check.Rule.class); - String key = ruleAnnotation.key(); - org.sonar.java.RspecKey rspecKeyAnnotation = AnnotationUtils.getAnnotation(checkClass, org.sonar.java.RspecKey.class); - String rspecKey = key; - if (rspecKeyAnnotation != null) { - rspecKey = rspecKeyAnnotation.value(); - } - result.put(rspecKey, key); - } - return result; - } - - static Profile readProfile() { - URL resource = JavaSonarWayProfile.class.getResource("/org/sonar/l10n/java/rules/java/Sonar_way_profile.json"); - return new Gson().fromJson(readResource(resource), Profile.class); - } - - private static String readResource(URL resource) { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource.openStream(), StandardCharsets.UTF_8))) { - return reader.lines().collect(Collectors.joining("\n")); - } catch (IOException e) { - throw new IllegalStateException("Failed to read: " + resource, e); - } + static Set ruleKeys() { + return BuiltInQualityProfileJsonLoader.loadActiveKeysFromJsonProfile(SONAR_WAY_PATH); } @VisibleForTesting - static Set getSecurityRuleKeys(boolean sonarSecurityBefore78) { - String ruleKeysMethod = sonarSecurityBefore78 ? "getRuleKeys" : "getSecurityRuleKeys"; - return getExternalRuleKeys(SECURITY_RULES_CLASS_NAME, ruleKeysMethod, "security", sonarSecurityBefore78); + static Set getSecurityRuleKeys() { + return getExternalRuleKeys(SECURITY_RULES_CLASS_NAME, SECURITY_RULE_KEYS_METHOD_NAME, "security"); } @VisibleForTesting static Set getDataflowBugDetectionRuleKeys() { - return getExternalRuleKeys(DBD_RULES_CLASS_NAME, DBD_RULE_KEYS_METHOD_NAME, "dataflow bug detection", false); + return getExternalRuleKeys(DBD_RULES_CLASS_NAME, DBD_RULE_KEYS_METHOD_NAME, "dataflow bug detection"); } @SuppressWarnings("unchecked") @VisibleForTesting - static Set getExternalRuleKeys(String className, String ruleKeysMethod, String rulesCategory, boolean sonarSecurityBefore78) { + static Set getExternalRuleKeys(String className, String ruleKeysMethod, String rulesCategory) { try { Class javaRulesClass = Class.forName(className); Method getRuleKeysMethod = javaRulesClass.getMethod(ruleKeysMethod); Set ruleKeys = (Set) getRuleKeysMethod.invoke(null); Method getRepositoryKeyMethod = javaRulesClass.getMethod(GET_REPOSITORY_KEY); - String repositoryKey; - if (sonarSecurityBefore78) { - repositoryKey = CheckList.REPOSITORY_KEY; - } else { - repositoryKey = (String) getRepositoryKeyMethod.invoke(null); - } + String repositoryKey = (String) getRepositoryKeyMethod.invoke(null); return ruleKeys.stream().map(k -> RuleKey.of(repositoryKey, k)).collect(Collectors.toSet()); } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { LOG.debug(String.format("[%s], no %s rules added to Sonar way java profile: %s", e.getClass().getSimpleName(), rulesCategory, e.getMessage())); } return new HashSet<>(); } - - private static boolean isSonarSecurityBefore78() { - try { - Class javaRulesClass = Class.forName(SECURITY_RULES_CLASS_NAME); - javaRulesClass.getMethod(GET_REPOSITORY_KEY); - return false; - - } catch (NoSuchMethodException | ClassNotFoundException e) { - return true; - } - } - - static class Profile { - String name; - Set ruleKeys; - } - } diff --git a/sonar-java-plugin/src/main/resources/static/documentation.md b/sonar-java-plugin/src/main/resources/static/documentation.md index 26bb15f411f..330286aa871 100644 --- a/sonar-java-plugin/src/main/resources/static/documentation.md +++ b/sonar-java-plugin/src/main/resources/static/documentation.md @@ -37,11 +37,25 @@ Key | Value ## Project's specific JDK -In some situations, you might have to analyze a project built with a different version of Java than the one executing the analysis. The most common case is to run the analysis with **Java 11**, while the project itself uses **Java 8** or before for its build. This case is normally automatically handled when using Maven or Gradle, as well as with any flavor of SonarLint. - -If it is your case, and you are **NOT** using Maven or Gradle, you will need to set the property `sonar.java.jdkHome` manually (see below). By doing this you'll specify which JDK classes the analyzer must refer to during the analysis. Not setting this property, while it would have been required, usually leads to inconsistent or even impossible to fix issues being reported, especially in relation with native JDK classes. +In some situations, you might have to analyze a project built with a different version of Java than the one executing the analysis. +The most common case is to run the analysis with **Java 11**, while the project itself uses **Java 8** or before for its build. + +If this is your case, you will need to set the `sonar.java.jdkHome` property manually to point the appropriate JDK (see below). +By doing this you will specify which JDK classes the analyzer must refer to during the analysis. +Not setting this property, while it would have been required, usually leads to inconsistent or even impossible to fix issues being reported, especially in relation with native JDK classes. + +When setting `sonar.java.jdkHome`, you need to provide the path to the JDK directory used by the project being analyzed, if different from the Java runtime executing the analysis. +For example, for a Java 8 project, by setting it as follows: `sonar.java.jdkHome=/usr/lib/jvm/jdk1.8.0_211` + +```bash +# Here maven uses the default version of Java on the system but we specify that we want to analyze a Java 8 project. +mvn clean verify sonar:sonar \ + # other analysis parameters + -Dsonar.java.jdkHome=/usr/lib/jvm/java-8-openjdk/ + # other analysis parameters +``` +This option can of course be added to your `sonar.properties` configuration. -When setting `sonar.java.jdkHome`, you need to provide the path to the JDK directory used by the project being analyzed, if different from the Java runtime executing the analysis. For example, for a Java 8 project, by setting it as follow: `sonar.java.jdkHome=/usr/lib/jvm/jdk1.8.0_211` ## Turning issues off @@ -125,6 +139,11 @@ The tutorial [Writing Custom Java Rules 101](https://redirect.sonarsource.com/do ### API changes +#### **7.15** +* New method: `JavaResourceLocator#binaryDirs()`. Use this method to get the directories containing the .class files corresponding to the main code. +* New method: `JavaResourceLocator#testBinaryDirs()`. Use this method to get the directories containing the .class files corresponding to the tests. +* New method: `JavaResourceLocator#testClasspath()`. Use this method to retrieve the classpath configured for the project's tests. + #### **7.12** * New method: `JavaFileScanner#scanWithoutParsing(InputFileScannerContext)`. Use this method to inspect an unchanged file before it is parsed. diff --git a/sonar-java-plugin/src/test/java/org/sonar/plugins/java/JavaRulesDefinitionTest.java b/sonar-java-plugin/src/test/java/org/sonar/plugins/java/JavaRulesDefinitionTest.java index 1a10c97f766..74b364aafcd 100644 --- a/sonar-java-plugin/src/test/java/org/sonar/plugins/java/JavaRulesDefinitionTest.java +++ b/sonar-java-plugin/src/test/java/org/sonar/plugins/java/JavaRulesDefinitionTest.java @@ -19,36 +19,34 @@ */ package org.sonar.plugins.java; -import java.util.LinkedHashSet; +import java.util.List; import java.util.Locale; import java.util.regex.Pattern; +import java.util.stream.Collectors; import org.junit.jupiter.api.Test; +import org.sonar.api.SonarEdition; +import org.sonar.api.SonarQubeSide; import org.sonar.api.SonarRuntime; import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.rule.RuleKey; import org.sonar.api.rules.RuleType; import org.sonar.api.server.rule.RulesDefinition; import org.sonar.api.utils.Version; -import org.sonar.check.Rule; import org.sonar.java.checks.CheckList; -import org.sonar.java.checks.ServletMethodsExceptionsThrownCheck; -import org.sonar.plugins.java.api.JavaCheck; +import org.sonarsource.analyzer.commons.annotations.DeprecatedRuleKey; +import org.sonarsource.analyzer.commons.annotations.DeprecatedRuleKeys; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; class JavaRulesDefinitionTest { private static final String REPOSITORY_KEY = "java"; - private static final SonarRuntime SONAR_RUNTIME_9_3 = SonarRuntimeImpl.forSonarLint(Version.create(9, 3)); + private static final SonarRuntime SONAR_RUNTIME_9_2 = SonarRuntimeImpl.forSonarLint(Version.create(9, 2)); + private static final SonarRuntime SONAR_RUNTIME_9_8 = SonarRuntimeImpl.forSonarQube(Version.create(9, 8), SonarQubeSide.SERVER, SonarEdition.COMMUNITY); @Test void test_creation_of_rules() { - JavaRulesDefinition definition = new JavaRulesDefinition(SONAR_RUNTIME_9_3); + JavaRulesDefinition definition = new JavaRulesDefinition(SONAR_RUNTIME_9_8); RulesDefinition.Context context = new RulesDefinition.Context(); definition.define(context); RulesDefinition.Repository repository = context.repository(REPOSITORY_KEY); @@ -83,7 +81,7 @@ void rules_definition_should_be_locale_independent() { Locale defaultLocale = Locale.getDefault(); Locale trlocale = Locale.forLanguageTag("tr-TR"); Locale.setDefault(trlocale); - JavaRulesDefinition definition = new JavaRulesDefinition(SONAR_RUNTIME_9_3); + JavaRulesDefinition definition = new JavaRulesDefinition(SONAR_RUNTIME_9_8); RulesDefinition.Context context = new RulesDefinition.Context(); definition.define(context); RulesDefinition.Repository repository = context.repository(REPOSITORY_KEY); @@ -94,39 +92,9 @@ void rules_definition_should_be_locale_independent() { Locale.setDefault(defaultLocale); } - @Test - void test_invalid_checks() throws Exception { - RulesDefinition.Context context = new RulesDefinition.Context(); - RulesDefinition.NewRepository newRepository = context.createRepository("test", "java"); - newRepository.createRule("correctRule"); - JavaRulesDefinition definition = new JavaRulesDefinition(SONAR_RUNTIME_9_3); - JavaSonarWayProfile.Profile profile = new JavaSonarWayProfile.Profile(); - profile.ruleKeys = new LinkedHashSet<>(); - try { - definition.newRule(CheckWithNoAnnotation.class, newRepository, profile); - } catch (IllegalArgumentException iae) { - assertThat(iae).hasMessage("No Rule annotation was found on class " + CheckWithNoAnnotation.class.getName()); - } - - try { - definition.newRule(EmptyRuleKey.class, newRepository, profile); - } catch (IllegalArgumentException iae) { - assertThat(iae).hasMessage("No key is defined in Rule annotation of class " + EmptyRuleKey.class.getName()); - } - - try { - definition.newRule(UnregisteredRule.class, newRepository, profile); - } catch (IllegalStateException ise) { - assertThat(ise).hasMessage("No rule was created for class " + UnregisteredRule.class.getName() + " in test"); - } - // no metadata defined, does not fail on registration of rule - definition.newRule(CorrectRule.class, newRepository, profile); - - } - @Test void test_security_hotspot() throws Exception { - JavaRulesDefinition definition = new JavaRulesDefinition(SONAR_RUNTIME_9_3); + JavaRulesDefinition definition = new JavaRulesDefinition(SONAR_RUNTIME_9_2); RulesDefinition.Context context = new RulesDefinition.Context(); definition.define(context); RulesDefinition.Repository repository = context.repository(REPOSITORY_KEY); @@ -134,36 +102,40 @@ void test_security_hotspot() throws Exception { RulesDefinition.Rule hardcodedIdRule = repository.rule("S1313"); assertThat(hardcodedIdRule.deprecatedRuleKeys()).containsExactly(RuleKey.of("squid", "S1313")); assertThat(hardcodedIdRule.type()).isEqualTo(RuleType.SECURITY_HOTSPOT); - assertThat(hardcodedIdRule.activatedByDefault()).isFalse(); + // SonarLint explicitly exclude hotspot on its side. + assertThat(hardcodedIdRule.activatedByDefault()).isTrue(); } @Test void test_security_standards() { - JavaRulesDefinition definition = new JavaRulesDefinition(SONAR_RUNTIME_9_3); + JavaRulesDefinition definition = new JavaRulesDefinition(SONAR_RUNTIME_9_8); RulesDefinition.Context context = new RulesDefinition.Context(); definition.define(context); RulesDefinition.Repository repository = context.repository(REPOSITORY_KEY); - RulesDefinition.Rule rule = repository.rule("S1166"); - assertThat(rule.deprecatedRuleKeys()).containsExactly(RuleKey.of("squid", "S1166")); - assertThat(rule.securityStandards()).containsExactlyInAnyOrder("cwe:778", "owaspTop10:a10", "owaspTop10-2021:a9"); + RulesDefinition.Rule s1166 = repository.rule("S1166"); + assertThat(s1166.deprecatedRuleKeys()).containsExactly(RuleKey.of("squid", "S1166")); + assertThat(s1166.securityStandards()).containsExactlyInAnyOrder("cwe:778", "owaspTop10:a10", "owaspTop10-2021:a9"); + + RulesDefinition.Rule s2053 = repository.rule("S2053"); + assertThat(s2053.securityStandards()).containsExactlyInAnyOrder("cwe:759", "cwe:760", "owaspTop10:a3", "owaspTop10-2021:a2", "pciDss-3.2:6.5.10", "pciDss-4.0:6.2.4"); } @Test void test_security_standards_sq_9_2() { - JavaRulesDefinition definition = new JavaRulesDefinition(SonarRuntimeImpl.forSonarLint(Version.create(9, 2))); + JavaRulesDefinition definition = new JavaRulesDefinition(SONAR_RUNTIME_9_2); RulesDefinition.Context context = new RulesDefinition.Context(); definition.define(context); RulesDefinition.Repository repository = context.repository(REPOSITORY_KEY); - RulesDefinition.Rule rule = repository.rule("S1166"); - assertThat(rule.deprecatedRuleKeys()).containsExactly(RuleKey.of("squid", "S1166")); - assertThat(rule.securityStandards()).containsExactlyInAnyOrder("cwe:778", "owaspTop10:a10"); + RulesDefinition.Rule s1166 = repository.rule("S1166"); + assertThat(s1166.deprecatedRuleKeys()).containsExactly(RuleKey.of("squid", "S1166")); + assertThat(s1166.securityStandards()).containsExactlyInAnyOrder("cwe:778", "owaspTop10:a10"); } @Test void test_deprecated_key() { - JavaRulesDefinition definition = new JavaRulesDefinition(SONAR_RUNTIME_9_3); + JavaRulesDefinition definition = new JavaRulesDefinition(SONAR_RUNTIME_9_8); RulesDefinition.Context context = new RulesDefinition.Context(); definition.define(context); RulesDefinition.Repository repository = context.repository(REPOSITORY_KEY); @@ -171,11 +143,49 @@ void test_deprecated_key() { RulesDefinition.Rule rule = repository.rule("S1104"); assertThat(rule.activatedByDefault()).isTrue(); assertThat(rule.deprecatedRuleKeys()).containsExactly(RuleKey.of("squid", "ClassVariableVisibilityCheck")); + + // FIXME SONAR-17167: S4830 should have references to java:S4244 and squid:S4244 + RulesDefinition.Rule s4830 = repository.rule("S4830"); + assertThat(s4830.deprecatedRuleKeys()).containsExactlyInAnyOrder(RuleKey.of("squid", "S4830")); + + // FIXME SONAR-17167: Rules can not have multiple links to deprecated keys, especially if one of the deprecated key is a droppped rule + List rulesWithManyDeprecatedKeys = repository.rules().stream() + .filter(r -> r.deprecatedRuleKeys().size() >= 2) + .map(RulesDefinition.Rule::key) + .collect(Collectors.toList()); + assertThat(rulesWithManyDeprecatedKeys).isEmpty(); + } + + @Test + void test_deprecates_rules() { + @DeprecatedRuleKey(repositoryKey = "repo", ruleKey = "SXXXX") + class RuleA { + } + + @DeprecatedRuleKey(repositoryKey = "repo", ruleKey = "SXXXX") + @DeprecatedRuleKey(repositoryKey = "repo", ruleKey = "SYYYY") + class RuleB { + } + + @DeprecatedRuleKeys({ + @DeprecatedRuleKey(repositoryKey = "repo", ruleKey = "SXXXX"), + @DeprecatedRuleKey(repositoryKey = "repo", ruleKey = "SYYYY") + }) + class RuleC { + } + + class RuleD { + } + + assertThat(JavaRulesDefinition.deprecatesRules(RuleA.class)).isTrue(); + assertThat(JavaRulesDefinition.deprecatesRules(RuleB.class)).isTrue(); + assertThat(JavaRulesDefinition.deprecatesRules(RuleC.class)).isTrue(); + assertThat(JavaRulesDefinition.deprecatesRules(RuleD.class)).isFalse(); } @Test void rules_should_not_have_legacy_key() { - JavaRulesDefinition definition = new JavaRulesDefinition(SONAR_RUNTIME_9_3); + JavaRulesDefinition definition = new JavaRulesDefinition(SONAR_RUNTIME_9_8); RulesDefinition.Context context = new RulesDefinition.Context(); definition.define(context); Pattern pattern = Pattern.compile("^S[0-9]{3,5}$"); @@ -184,35 +194,11 @@ void rules_should_not_have_legacy_key() { // NoSonar key can't be changed to RSPEC key if (!r.key().equals("NoSonar")) { assertThat(pattern.matcher(r.key()).matches()).isTrue(); + assertThat(r.internalKey()).isNull(); + } else { + assertThat(r.internalKey()).isEqualTo("S1291"); } }); } - @Test - void test_security_standards_not_set_when_unsupported() throws Exception { - JavaRulesDefinition definition = new JavaRulesDefinition(SONAR_RUNTIME_9_3); - RulesDefinition.NewRepository repository = mock(RulesDefinition.NewRepository.class); - RulesDefinition.NewRule newRule = mock(RulesDefinition.NewRule.class); - when(repository.rule(any())).thenReturn(newRule); - definition.newRule(ServletMethodsExceptionsThrownCheck.class, repository, JavaSonarWayProfile.readProfile()); - - verify(newRule, never()).addOwaspTop10(); - verify(newRule, never()).addCwe(); - } - - private class CheckWithNoAnnotation implements JavaCheck { - } - - @Rule(key = "") - private class EmptyRuleKey implements JavaCheck { - } - - @Rule(key = "myKey") - private class UnregisteredRule implements JavaCheck { - } - - @Rule(key = "correctRule") - private class CorrectRule implements JavaCheck { - } - } diff --git a/sonar-java-plugin/src/test/java/org/sonar/plugins/java/JavaSensorTest.java b/sonar-java-plugin/src/test/java/org/sonar/plugins/java/JavaSensorTest.java index 5c3fdecdd0d..505e1ab2716 100644 --- a/sonar-java-plugin/src/test/java/org/sonar/plugins/java/JavaSensorTest.java +++ b/sonar-java-plugin/src/test/java/org/sonar/plugins/java/JavaSensorTest.java @@ -128,7 +128,7 @@ private void testIssueCreation(InputFile.Type onType, int expectedIssues) throws DefaultFileSystem fs = context.fileSystem(); fs.setWorkDir(tmp.newFolder().toPath()); SonarComponents sonarComponents = createSonarComponentsMock(context); - DefaultJavaResourceLocator javaResourceLocator = new DefaultJavaResourceLocator(new ClasspathForMain(settings.asConfig(), fs)); + DefaultJavaResourceLocator javaResourceLocator = createDefaultJavaResourceLocator(settings.asConfig(), fs); JavaSensor jss = new JavaSensor(sonarComponents, fs, javaResourceLocator, settings.asConfig(), noSonarFilter, null); jss.execute(context); @@ -174,6 +174,13 @@ private static SonarComponents createSonarComponentsMock(SensorContextTester con return sonarComponents; } + private static DefaultJavaResourceLocator createDefaultJavaResourceLocator(Configuration settings, DefaultFileSystem fs) { + ClasspathForMain classpathForMain = new ClasspathForMain(settings, fs); + ClasspathForTest classpathForTest = new ClasspathForTest(settings, fs); + + return new DefaultJavaResourceLocator(classpathForMain, classpathForTest); + } + @Test void should_invoke_visitors_on_generated_code() throws Exception { assertJasperIsInvoked(new MapSettings()); @@ -406,7 +413,7 @@ private SensorContextTester analyzeTwoFilesWithIssues(MapSettings settings) thro when(fileLinesContextFactory.createFor(any(InputFile.class))).thenReturn(mock(FileLinesContext.class)); ClasspathForTest javaTestClasspath = new ClasspathForTest(context.config(), fs); ClasspathForMain javaClasspath = new ClasspathForMain(context.config(), fs); - DefaultJavaResourceLocator resourceLocator = new DefaultJavaResourceLocator(new ClasspathForMain(context.config(), fs)); + DefaultJavaResourceLocator resourceLocator = createDefaultJavaResourceLocator(context.config(), fs); CheckRegistrar[] checkRegistrars = new CheckRegistrar[] {new CustomRegistrar()}; @@ -439,7 +446,7 @@ private void executeJavaSensorForPerformanceMeasure(MapSettings settings, Path w DefaultFileSystem fs = context.fileSystem(); fs.setWorkDir(workDir); SonarComponents components = createSonarComponentsMock(context); - DefaultJavaResourceLocator resourceLocator = new DefaultJavaResourceLocator(new ClasspathForMain(configuration, fs)); + DefaultJavaResourceLocator resourceLocator = createDefaultJavaResourceLocator(context.config(), fs); JavaSensor jss = new JavaSensor(components, fs, resourceLocator, configuration, mock(NoSonarFilter.class), null); jss.execute(context); } diff --git a/sonar-java-plugin/src/test/java/org/sonar/plugins/java/JavaSonarWayProfileTest.java b/sonar-java-plugin/src/test/java/org/sonar/plugins/java/JavaSonarWayProfileTest.java index 871ef80c27e..0ca551cb509 100644 --- a/sonar-java-plugin/src/test/java/org/sonar/plugins/java/JavaSonarWayProfileTest.java +++ b/sonar-java-plugin/src/test/java/org/sonar/plugins/java/JavaSonarWayProfileTest.java @@ -49,7 +49,7 @@ void should_create_sonar_way_profile() { BuiltInQualityProfilesDefinition.BuiltInQualityProfile profile = context.profile("java", "Sonar way"); assertThat(profile.language()).isEqualTo(Java.KEY); List activeRules = profile.rules(); - assertThat(activeRules.stream().filter(r -> r.repoKey().equals("common-java"))).hasSize(1); + assertThat(activeRules.stream().filter(r -> r.repoKey().equals("common-java"))).isEmpty(); assertThat(activeRules).as("Expected number of rules in profile").hasSizeGreaterThanOrEqualTo(268); assertThat(profile.name()).isEqualTo("Sonar way"); Set keys = new HashSet<>(); @@ -79,12 +79,11 @@ void should_activate_hotspots_when_supported() { void should_contains_security_rules_if_present() { // no security rules available com.sonar.plugins.security.api.JavaRules.ruleKeys = new HashSet<>(); - assertThat(JavaSonarWayProfile.getSecurityRuleKeys(true)).isEmpty(); + assertThat(JavaSonarWayProfile.getSecurityRuleKeys()).isEmpty(); // one security rule available com.sonar.plugins.security.api.JavaRules.ruleKeys = new HashSet<>(Arrays.asList("S3649")); - assertThat(JavaSonarWayProfile.getSecurityRuleKeys(true)).containsOnly(RuleKey.of("java", "S3649")); - assertThat(JavaSonarWayProfile.getSecurityRuleKeys(false)).containsOnly(RuleKey.of("security-repo-key", "S3649")); + assertThat(JavaSonarWayProfile.getSecurityRuleKeys()).containsOnly(RuleKey.of("security-repo-key", "S3649")); } @Test @@ -100,20 +99,20 @@ void should_contains_dataflow_bug_detection_rules_if_present() { @Test void external_rule_keys_missing_class() { - JavaSonarWayProfile.getExternalRuleKeys("silly.name", "getDataflowBugDetectionRuleKeys", "ruleCategory", false); + JavaSonarWayProfile.getExternalRuleKeys("silly.name", "getDataflowBugDetectionRuleKeys", "ruleCategory"); assertThat(logTester.logs(LoggerLevel.DEBUG)).containsExactly("[ClassNotFoundException], no ruleCategory rules added to Sonar way java profile: silly.name"); } @Test void external_rule_keys_missing_method() { - JavaSonarWayProfile.getExternalRuleKeys(DBD_RULES_CLASS_NAME, "nonExistingRuleKeysMethod", "ruleCategory", false); + JavaSonarWayProfile.getExternalRuleKeys(DBD_RULES_CLASS_NAME, "nonExistingRuleKeysMethod", "ruleCategory"); assertThat(logTester.logs(LoggerLevel.DEBUG)) .containsExactly("[NoSuchMethodException], no ruleCategory rules added to Sonar way java profile: com.sonarsource.plugins.dbd.api.JavaRules.nonExistingRuleKeysMethod()"); } @Test void external_rule_keys_method_throws_exception() { - JavaSonarWayProfile.getExternalRuleKeys(DBD_RULES_CLASS_NAME, "methodThrowingException", "ruleCategory", false); + JavaSonarWayProfile.getExternalRuleKeys(DBD_RULES_CLASS_NAME, "methodThrowingException", "ruleCategory"); assertThat(logTester.logs(LoggerLevel.DEBUG)).containsExactly("[InvocationTargetException], no ruleCategory rules added to Sonar way java profile: null"); } } diff --git a/sonarpedia.json b/sonarpedia.json index 0c0ecc8aa65..86d61741690 100644 --- a/sonarpedia.json +++ b/sonarpedia.json @@ -3,9 +3,9 @@ "languages": [ "JAVA" ], - "latest-update": "2022-05-13T14:10:46.371635Z", + "latest-update": "2022-10-25T09:41:34.432584Z", "options": { - "no-language-in-filenames": false, + "no-language-in-filenames": true, "preserve-filenames": false } } \ No newline at end of file diff --git a/wss-unified-agent.config b/wss-unified-agent.config index d7a19c7f342..be41185b433 100644 --- a/wss-unified-agent.config +++ b/wss-unified-agent.config @@ -4,7 +4,6 @@ resolveAllDependencies=False maven.aggregateModules=True maven.downloadMissingDependencies=False -maven.ignoredScopes=None maven.m2RepositoryPath=.m2/repository maven.resolveDependencies=True maven.runPreStep=False