From: Duarte Meneses Date: Tue, 3 Jan 2023 21:00:42 +0000 (-0600) Subject: SONAR-14584 Analysis of the project can fail if path of the file exceeds 400 characte... X-Git-Tag: 9.9.0.65466~108 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a62476dc4ebbb8760d1df58275b12cc9f6124597;p=sonarqube.git SONAR-14584 Analysis of the project can fail if path of the file exceeds 400 character limit --- diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentValidator.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentValidator.java index 8fc1e36618f..ae15fef81d9 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentValidator.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentValidator.java @@ -29,7 +29,6 @@ public class ComponentValidator { // b_name column is 500 characters wide public static final int MAX_COMPONENT_NAME_LENGTH = 500; public static final int MAX_COMPONENT_DESCRIPTION_LENGTH = 2_000; - private static final int MAX_COMPONENT_TAGS_LENGTH = 500; private static final int MAX_COMPONENT_QUALIFIER_LENGTH = 10; private ComponentValidator() { @@ -62,16 +61,6 @@ public class ComponentValidator { return value; } - public static String checkTags(@Nullable String value) { - if (value == null) { - return null; - } - - checkArgument(value.length() <= MAX_COMPONENT_NAME_LENGTH, "Component tags length (%s) is longer than the maximum authorized (%s). '%s' was provided.", - value.length(), MAX_COMPONENT_TAGS_LENGTH, value); - return value; - } - public static String checkComponentKey(String key) { checkArgument(!isNullOrEmpty(key), "Component key can't be empty"); checkArgument(key.length() <= MAX_COMPONENT_KEY_LENGTH, "Component key length (%s) is longer than the maximum authorized (%s). '%s' was provided.", diff --git a/sonar-core/src/main/java/org/sonar/core/component/ComponentKeys.java b/sonar-core/src/main/java/org/sonar/core/component/ComponentKeys.java index b8003dfc2d6..4128a54f585 100644 --- a/sonar-core/src/main/java/org/sonar/core/component/ComponentKeys.java +++ b/sonar-core/src/main/java/org/sonar/core/component/ComponentKeys.java @@ -27,6 +27,9 @@ import static com.google.common.base.Preconditions.checkArgument; public final class ComponentKeys { + /** + * Should be in sync with DefaultIndexedFile.MAX_KEY_LENGTH + */ public static final int MAX_COMPONENT_KEY_LENGTH = 400; public static final String ALLOWED_CHARACTERS_MESSAGE = "Allowed characters are alphanumeric, '-', '_', '.' and ':', with at least one non-digit"; diff --git a/sonar-plugin-api-impl/src/main/java/org/sonar/api/batch/fs/internal/DefaultIndexedFile.java b/sonar-plugin-api-impl/src/main/java/org/sonar/api/batch/fs/internal/DefaultIndexedFile.java index d803e27fc37..2346a8e65d8 100644 --- a/sonar-plugin-api-impl/src/main/java/org/sonar/api/batch/fs/internal/DefaultIndexedFile.java +++ b/sonar-plugin-api-impl/src/main/java/org/sonar/api/batch/fs/internal/DefaultIndexedFile.java @@ -38,6 +38,8 @@ import org.sonar.api.utils.PathUtils; */ @Immutable public class DefaultIndexedFile extends DefaultInputComponent implements IndexedFile { + // should match limit in org.sonar.core.component.ComponentKeys + private static final Integer MAX_KEY_LENGTH = 400; private static final AtomicInteger intGenerator = new AtomicInteger(0); private final String projectRelativePath; @@ -73,6 +75,14 @@ public class DefaultIndexedFile extends DefaultInputComponent implements Indexed this.sensorStrategy = sensorStrategy; this.absolutePath = absolutePath; this.oldRelativeFilePath = oldRelativeFilePath; + validateKeyLength(); + } + + private void validateKeyLength() { + String key = key(); + if (key.length() > MAX_KEY_LENGTH) { + throw new IllegalStateException(String.format("Component key (%s) length (%s) is longer than the maximum authorized (%s)", key, key.length(), MAX_KEY_LENGTH)); + } } @Override diff --git a/sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/fs/internal/DefaultIndexedFileTest.java b/sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/fs/internal/DefaultIndexedFileTest.java new file mode 100644 index 00000000000..29edc62eaed --- /dev/null +++ b/sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/fs/internal/DefaultIndexedFileTest.java @@ -0,0 +1,38 @@ +/* + * SonarQube + * Copyright (C) 2009-2023 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.api.batch.fs.internal; + +import java.nio.file.Path; +import java.nio.file.Paths; +import org.apache.commons.lang.StringUtils; +import org.assertj.core.api.Assertions; +import org.junit.Test; + +public class DefaultIndexedFileTest { + @Test + public void fail_to_index_if_file_key_too_long() { + String path = StringUtils.repeat("a", 395); + String projectKey = "12345"; + Path baseDir = Paths.get(""); + Assertions.assertThatThrownBy(() -> new DefaultIndexedFile(projectKey, baseDir, path, null)) + .isInstanceOf(IllegalStateException.class) + .hasMessageEndingWith("length (401) is longer than the maximum authorized (400)"); + } +}